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

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.mfbz.cn/a/875896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MFC工控项目实例之十五定时刷新PC6325A模拟量输入

承接专栏《MFC工控项目实例之十四模拟量信号名称从文件读写》 1、在BoardTest.h文件中添加代码 class CBoardTest : public CDialog { public:short m_saveData[32];unsigned short m_cardAddr;CBoardTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnS…

【新时代概论】新时代概论书目的结构(LP)

文章目录 前言一、结构导论第一章、新时代坚持和发展中国特色社会主义第二章、以中国式现代化全面推进中华民族伟大复兴第三章、坚持党的全面领导第四章、坚持以人民为中心第五章、全面深化改革开放第六章、推动高质量发展第七章、社会主义现代化建设的教育、科技、人才战略第八…

海外云手机怎么实现TikTok多账号防关联?

TikTok多账号运营&#xff0c;作为众多用户选择的引流策略&#xff0c;旨在通过多账号的协同作用&#xff0c;更快速、高效地推动主账号的流量增长。然而&#xff0c;这一策略面临着一个关键难题——TikTok账号防关联。本文将简要介绍海外云手机如何解决这一问题。 在TikTok多账…

2023年408真题计算机网络篇

https://zhuanlan.zhihu.com/p/6954228062023年网络规划设计师上午真题解析TCP流量计算_哔哩哔哩_bilibili 1 1在下图所示的分组交换网络中&#xff0c;主机H1和H2通过路由器互联&#xff0c;2段链路的数据传输速率为100 Mb/s、时延带宽积 &#xff08;即单向传播时延带宽&am…

Solana核心漏洞技术详解

8月9日&#xff0c;Solana团队齐心协力解决了一个严重的安全漏洞。这次秘密修复详情可以在GitHub上查询到。CertiK团队对这一漏洞进行了深入分析。 1. Solana漏洞起因 8月9日&#xff0c;Solana验证者和客户端团队齐心协力解决了一个严重的安全漏洞。Solana验证者Laine表示&am…

redis底层—数据结构

1.动态字符串sds redis没有直接使用c语言的字符串&#xff0c;是因为c语言的字符串存在一下问题&#xff1a; 1.获取字符串长度的需要通过运算 2.非二进制安全 3.不可修改 优点&#xff1a; 1.获取字符串长度的时间复杂度为0&#xff08;1&#xff09; 2.支持动态扩容 3.减少内…

linux命令用于删除文本文件中的重复行的命令uniq详解

目录 一、概述 二、基本用法 1、uniq 命令的基本语法 2、常用选项 3、获取帮助 三、主要功能 1. 识别并删除相邻重复行 2. 保留重复行的第一个实例 3. 统计重复次数 4. 忽略指定列的比较 四、示例 1. 删除相邻重复行 2. 显示每一行及其重复次数 3. 只显示重复行 4. …

Vue | Vue深入浅出——Vue中的render函数详解

1.render函数 在编写vue单文件的大多数情况下&#xff0c;我们都是使用template模板来创建HTML。然而在一些条件判断比较复杂的场景下&#xff0c;使用JavaScript去描绘HTML的生成逻辑会显得更加的简洁直观。 使用Vue官网的例子来简单说明&#xff1a; 如果自己在开发的时候…

RabbitMQ(高阶使用)延时任务

文章内容是学习过程中的知识总结&#xff0c;如有纰漏&#xff0c;欢迎指正 文章目录 1. 什么是延时任务&#xff1f; 1.1 和定时任务区别 2. 延时队列使用场景 3. 常见方案 3.1 数据库轮询 优点 缺点 3.2 JDK的延迟队列 优点 缺点 3.3 netty时间轮算法 优点 缺点 3.4 使用消息…

2024非常全的接口测试面试题及参考答案

一、前言 接口测试最近几年被炒的火热了&#xff0c;越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢&#xff1f; 主要是平常的功能点点点&#xff0c;大家水平都一样&#xff0c;是个人都能点&#xff0c;面试时候如果问你平常在公司怎么测试的&…

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…

计算机网络八股总结

这里写目录标题 网络模型划分&#xff08;五层和七层&#xff09;及每一层的功能五层网络模型七层网络模型&#xff08;OSI模型&#xff09; 三次握手和四次挥手具体过程及原因三次握手四次挥手 TCP/IP协议组成UDP协议与TCP/IP协议的区别Http协议相关知识网络地址&#xff0c;子…

学习笔记 - 知识图谱的符号表示方法

学习笔记 - 知识图谱的符号表示方法 说明&#xff1a; 首次发表日期&#xff1a;2024-09-13个人阅读学习并摘录成笔记 知识表示的相关名词定义 以下内容摘录自 Knowledge Graphs Applied 2.3小节&#xff0c;然后AI翻译人工润色。 实体&#xff08;Entities&#xff09;—表…

共享单车轨迹数据分析:以厦门市共享单车数据为例(四)

副标题&#xff1a;共享单车与地铁接驳距离探究——以厦门市为例 关于轨道交通站点接驳范围的研究早已屡见不鲜&#xff0c;通常认为以站点为圆心、800米作为地铁站直接的服务范围是合理的。近年来&#xff0c;随着轨道、公交和慢行交通三网融合概念的提出&#xff0c;慢行交通…

【人工智能】Transformers之Pipeline(十七):文本分类(text-classification)

目录 一、引言 二、文本分类&#xff08;text-classification&#xff09; 2.1 概述 2.2 DistilBERT—BERT 的精简版&#xff1a;更小、更快、更便宜、更轻便 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 …

探索2B法则—趋势反转的高效策略

在之前&#xff0c;我们曾讲过123法则&#xff0c;这是一种基于道氏理论的分析方法&#xff0c;用于确认趋势反转和识别开仓信号。而今日我们就再来聊聊与之相似的2B法则&#xff0c;这是123法则的一种变形&#xff0c;用途和123法则一样&#xff0c;但比之成功率会更高&#x…

白盒测试与黑盒测试

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

GIS在线监测SF6密度微水定量检漏仪传感器专用波纹管免焊接格兰头

SF6密度微水在线监测装置配套M12母头5孔格兰头穿波纹管连接器&#xff0c;该传感器能够监测SF6气体的露点&#xff0c;从而实现对SF6气体在线监测。 原理 SF6露点在线监测传感器是一种可以监测SF6气体露点的传感器它的工作原理是通过吸收SF6气体中的水分子来测量SF6气体的露点。…

k8s 资源管理

文章目录 ResourceQuota什么是资源配额定义一个ResourceQuotaResourceQuota的使用 LimitRangeLimitRange的用途示例1&#xff1a;配置默认的requests和limits示例2&#xff1a;配置requests和limits的范围 QoS什么是服务质量保证示例1&#xff1a;实现QoS为Guaranteed的Pod示例…

git的快速合并fast-forward merge详解

文章目录 1. 什么是快进合并&#xff1f;2. 快进合并的前提条件3. 快进合并的工作原理3.1 示例场景&#xff1a;3.2 使用命令&#xff1a;3.3 快进合并的视觉效果&#xff1a; 4. 快进合并的优点5. 快进合并的缺点6. 快进合并 vs 非快进合并6.1 非快进合并&#xff1a;6.2 非快…