利用 Zero-1-2-3 进行多视图 3D 重建:从单图像到多视图 3D 模型的生成

news2024/12/26 10:44:40

3D 模型生成在计算机视觉领域有着广泛的应用,从虚拟现实到自动驾驶,基于单张图像的 3D 重建技术正在迅速发展。这篇博客将带你深入探索如何使用 Zero-1-2-3 框架进行多视图 3D 重建,通过详细解析该框架中的代码结构和功能,帮助你理解其工作原理并实际应用到 3D 模型生成中。

一、项目概述

Zero-1-2-3 是一个通过扩散模型(Diffusion Models)将单张 2D 图像转换为 3D 网格模型的项目。与传统的 3D 重建技术不同,Zero-1-2-3 采用了一个基于图像生成的多阶段流程,利用不同视角的多张图片推理,生成高精度的 3D 模型。

该项目使用了以下几个重要的组件:

  • Zero-1-2-3 模型:基于预训练的扩散模型,生成目标图像的多视角图像。
  • Segment Anything Model (SAM):用于处理图像中的前景和背景。
  • 多视角生成:从单张输入图像开始,通过多阶段生成多个视角下的图片,再进行 3D 重建。
二、代码解析

Zero-1-2-3 的代码逻辑分为多个部分,包括图像预处理、多视角生成、推理过程、3D 模型重建等。在本博客中,我们会详细解析每一部分的核心功能。

1. 图像预处理

在 3D 重建过程中,输入图像的预处理尤为重要。首先我们使用 Segment Anything Model (SAM) 对图像进行分割,去除背景噪声,将前景进行提取,并对图像进行缩放,使其适应网络的输入。

def preprocess(predictor, raw_im, lower_contrast=False):
    raw_im.thumbnail([512, 512], Image.Resampling.LANCZOS)
    image_sam = sam_out_nosave(predictor, raw_im.convert("RGB"), pred_bbox(raw_im))
    input_256 = image_preprocess_nosave(image_sam, lower_contrast=lower_contrast, rescale=True)
    torch.cuda.empty_cache()
    return input_256

在这个函数中,我们首先对图像进行了缩放,确保其尺寸适应 512x512 的输入格式。然后通过 SAM 模型预测并分割图像中的前景部分,最后将图像数据转换为张量供后续的模型使用。

2. 第一阶段视角生成

在第一阶段,我们从输入图像生成多视角的图片。通过生成不同角度的图像,Zero-1-2-3 可以在生成过程中推理出物体的深度和形状。

def stage1_run(model, device, exp_dir, input_im, scale, ddim_steps):
    stage1_dir = os.path.join(exp_dir, "stage1_8")
    os.makedirs(stage1_dir, exist_ok=True)

    output_ims = predict_stage1_gradio(model, input_im, save_path=stage1_dir, adjust_set=list(range(4)), device=device, ddim_steps=ddim_steps, scale=scale)
    
    stage2_steps = 50
    zero123_infer(model, exp_dir, indices=[0], device=device, ddim_steps=stage2_steps, scale=scale)
    polar_angle = estimate_elev(exp_dir)
    gen_poses(exp_dir, polar_angle)

    if polar_angle <= 75:
        output_ims_2 = predict_stage1_gradio(model, input_im, save_path=stage1_dir, adjust_set=list(range(4,8)), device=device, ddim_steps=ddim_steps, scale=scale)
    else:
        output_ims_2 = predict_stage1_gradio(model, input_im, save_path=stage1_dir, adjust_set=list(range(8,12)), device=device, ddim_steps=ddim_steps, scale=scale)
    
    torch.cuda.empty_cache()
    return 90 - polar_angle, output_ims + output_ims_2

第一阶段使用 predict_stage1_gradio 函数生成四个不同视角下的图像,并通过极角估计 (estimate_elev) 计算输入图像的极角位置,进而根据极角生成更多视角的图片。这个过程有助于模拟物体在不同视角下的外观。

3. 第二阶段视角推理

第二阶段我们为每一个视角进一步生成四张图片,从而获得更详细的 3D 信息。这使得物体的表面和轮廓可以通过多个角度的图像捕获。

def stage2_run(model, device, exp_dir, elev, scale, stage2_steps=50):
    if 90 - elev <= 75:
        zero123_infer(model, exp_dir, indices=list(range(1,8)), device=device, ddim_steps=stage2_steps, scale=scale)
    else:
        zero123_infer(model, exp_dir, indices=list(range(1,4)) + list(range(8,12)), device=device, ddim_steps=stage2_steps, scale=scale)

第二阶段将为每个生成的视角图像推理更多细节,从而为最终的 3D 重建提供更多的信息。

4. 3D 重建

在视角生成完成之后,我们进入最终的 3D 重建阶段。该过程基于生成的多视角图像,通过扩展方法将它们重建为 3D 网格模型。

def reconstruct(exp_dir, output_format=".ply", device_idx=0, resolution=256):
    exp_dir = os.path.abspath(exp_dir)
    main_dir_path = os.path.abspath(os.path.dirname("./"))
    os.chdir('reconstruction/')

    bash_script = f'CUDA_VISIBLE_DEVICES={device_idx} python exp_runner_generic_blender_val.py \
                    --specific_dataset_name {exp_dir} \
                    --mode export_mesh \
                    --conf confs/one2345_lod0_val_demo.conf \
                    --resolution {resolution}'
    print(bash_script)
    os.system(bash_script)
    os.chdir(main_dir_path)

    ply_path = os.path.join(exp_dir, f"mesh.ply")
    if output_format == ".ply":
        return ply_path
    return convert_mesh_format(exp_dir, output_format=output_format)

在这个函数中,使用 Blender 等工具进行 3D 网格重建,并将生成的 3D 模型导出为 .ply 格式。用户可以选择将其转换为 .obj.glb 格式,方便在不同平台上查看和使用。

三、整体流程
  1. 图像输入:首先,用户输入一张 2D 图像,模型会对其进行预处理,提取图像中的前景部分。
  2. 多视角生成:通过多阶段推理,模型生成该图像在不同视角下的表现,涵盖物体的多个角度。
  3. 极角估计:根据生成的图像,模型估算出输入图像的极角,并根据极角生成更多细节图像。
  4. 3D 重建:最终,所有视角图像被用来进行 3D 重建,生成 3D 网格模型。
四、总结

Zero-1-2-3 项目展示了基于扩散模型的 3D 重建技术,其核心优势在于无需复杂的每个形状优化过程,通过简单的前向推理即可生成高质量的 3D 模型。对于希望快速进行 3D 模型生成的开发者,该框架提供了强大的功能和便捷的使用方式。希望本文能帮助你理解该项目的工作原理,并激发你对 3D 重建领域的兴趣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BUUCTF 之Basic 1(BUU LFI COURSE 1)

1、启动靶场&#xff0c;会生成一个URL地址&#xff0c;打开给的URL地址&#xff0c;会看到一个如下界面 可以看到是一个PHP文件&#xff0c;非常的简单&#xff0c;就几行代码&#xff0c;判断一下是否有一个GET的参数&#xff0c;并且是file名字&#xff0c;如果是并且加载&a…

C语言 预处理详解(二) #命令行定义 #条件编译 #文件包含 #其他预处理指令

文章目录 前言 一、命令行定义 二、条件编译 三、文件包含 什么叫做文件包含&#xff1f; (一)、本地文件包含 (二)、库文件包含 如何做才能避免头文件被多次包含呢&#xff1f; 方法一&#xff1a;利用条件编译&#xff1a; 方法二&#xff1a;利用 #pragma once 四、其他预处…

鸿蒙界面开发——组件(8):图形绘制

绘制几何图形——父组件Shape 绘制组件的父组件&#xff0c;父组件中会描述所有绘制组件均支持的通用属性。 1、绘制组件使用Shape作为父组件&#xff0c;实现类似SVG的效果。 2、绘制组件单独使用&#xff0c;用于在页面上绘制指定的图形。 Shape(value?: PixelMap) value …

指针之旅(4)—— 指针与函数:函数指针、转移表、回调函数

目录 1. 函数名的理解 1.1 “函数名”和“&函数名”的含义 1.2 函数(名)的数据类型 2. 函数指针(变量) 2.1 函数指针(变量)的创建格式 2.2 函数指针(变量)的使用格式 2.3 例子 判别 3. typedef 关键字 3.1 typedef的作用 3.2 typedef的运作逻辑 和 函数指针类型…

全球瞩目丨2024深圳秋季糖酒会火热招商中

第 111 届深圳秋季全国糖酒会 2024 年 10 月29-31日 将在深圳国际会展中心&#xff08;宝安新馆&#xff09;盛大举行。 这是一场备受瞩目的行业盛会&#xff0c; 为企业提供了一个展示产品、 拓展市场、加强合作的绝佳机会。 作为亚洲地区食品行业规模最大、最具影响力的…

stm32之硬件SPI读写W25Q64存储器应用案例

系列文章目录 1. stm32之SPI通信协议 2. stm32之软件SPI读写W25Q64存储器应用案例 3. stm32之SPI通信外设 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例代码分析3.1 基本思路3.2 相关库函数介绍3.3 MySPI模块3.3.1 模块初始化3.3.2 SPI基本时序单元模…

指挥中心操作台厂家哪家好?选择时需要注意哪些?

在构建高效、稳定的指挥中心过程中&#xff0c;操作台作为核心设备之一&#xff0c;其选择至关重要。面对市场上琳琅满目的指挥中心操作台厂家&#xff0c;如何挑选出既符合需求又品质卓越的合作伙伴&#xff0c;成为众多采购者关注的焦点。接下来就给大家从以下几个方面探讨指…

uniapp设置隐藏qiun-data-charts数据标签

隐藏前&#xff1a; 隐藏后&#xff1a; 具体代码实现&#xff1a; 在opts配置中传入 "dataLabel": false 即可

个性化推荐兴趣社交社交平台

1 项目介绍 社交兴趣平台是一个基于 spring boot、vue3 的社交平台&#xff0c;旨在为用户提供一个分享、交流和发现各种有趣内容的场所。 该平台的核心功能是让用户能够创建个人主页并发布自己的动态、经历、见解和创意。用户可以自由发表各种主题的内容&#xff0c;涵盖但不…

《向量数据库指南》——非结构化数据大爆发,向量数据库引领电商推荐新潮流

在当今数据驱动的时代,数据作为企业的核心资产,其价值挖掘的深度与广度直接关乎到企业的竞争力和创新能力。长久以来,结构化数据因其规整的格式和易于分析的特性,成为了数据科学家和工程师们研究的热点,其潜力在多个领域已被充分挖掘和应用。然而,随着互联网的飞速发展,…

C语言常见运算符

C语言提供了丰富的运算符&#xff0c;这些运算符用于执行各种类型的操作&#xff0c;比如算术运算、比较运算、逻辑运算、位运算等。下面是一些基本的C语言运算符分类及其示例&#xff1a; 1. 算术运算符 加法 (): a b 表示a和b的和。减法 (-): a - b 表示a和b的差。乘法 (*…

2024年Ai智能绘画Stable Diffusion软件+整合包+保姆式教程

前言 在2024年的科技浪潮中&#xff0c;一款名为Stable Diffusion的AI智能绘画软件吸引了全球的目光。它不仅为艺术家和设计师提供了无限创意的可能&#xff0c;也让我们每个人都能轻松体验绘画的乐趣。那么&#xff0c;Stable Diffusion究竟有何魅力&#xff1f;它又是如何工…

消息队列实现多人聊天

消息队列实现多人聊天 分析&#xff1a; 每个程序都有两个任务&#xff0c;一个任务是负责接收消息&#xff0c;一个任务是负责发送消息&#xff0c;通过 fork 创建子进程实现多任务。 一个进程负责接收信息&#xff0c;它只接收某种类型的消息&#xff0c;只要别的进程发送…

2024i春秋第四届长城杯网络安全大赛暨京津冀网络安全技能竞赛初赛wp-flowershop+easyre

flowershop 如图所示&#xff0c;v8是钱的数量&#xff0c;strncpy从src复制三个字符给dest的数组里&#xff0c;最后一个元素是0&#xff0c;相当于字符串截断&#xff0c;strcmp是比较c和dest中的内容&#xff0c;如果相等就不会exit(0)&#xff1b;双击c进去看&#xff0c;c…

Pr:新建序列 - 设置

在“新建序列”对话框中&#xff0c;“设置” Settings选项卡的主要用途是选择预设或手动配置序列的参数&#xff0c;以确保与用户的素材和输出需求相匹配。 可以根据项目的具体要求自定义序列中的视频和音频格式&#xff0c;包括帧速率、分辨率、工作色彩空间、音频采样率等以…

nvm install 16.14.1报错“Node.js v16.14.1 is not yet released or available.”

原因&#xff1a; 使用命令nvm ls available&#xff0c;结果列出的可供下载的版本列表为空&#xff0c;这就是原因了 解决办法&#xff1a;修改镜像 nvm node_mirror https://npmmirror.com/mirrors/node/ nvm npm_mirror https://npmmirror.com/mirrors/npm/ 结果&#xf…

基于SpringBoot+Vue+MySQL的校园生活服务平台

系统展示 用户前台界面 管理员后台界面 系统背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域的鸿沟&#xff0c;信息的…

springboot优雅停机无法关闭进程,kill无法停止springboot必须kill -9,springboot线程池使用

背景最近项目在jenkins部署的时候发现部署很慢&#xff0c;查看部署日志发现kill命令执行后应用pid还存在&#xff0c;导致必须在60秒等待期后kill -9杀死springboot进程 应用环境 springboot <dependency><groupId>org.springframework.boot</groupId>&l…

u盘怎么制作win10启动盘_win10启动盘制作详细教程

u盘怎么制作win10启动盘&#xff1f;制作win10启动盘方法有很多&#xff0c;有官方制作方法&#xff0c;有第三方u盘启动盘制作方法&#xff0c;下面小编就教大家制作win10启动盘详细教程。 u盘怎么制作win10启动盘&#xff1f; 制作win10启动通常有两种方法&#xff1a;直接安…