深入理解3D扩散生成式模型

news2024/11/17 7:45:21

Stable Dreamfusion 上的这个存储库启发了这个博客。

我认为 3D 扩散和 3D 生成似乎是每个人心中的下一件大事。 Stability AI 开始招聘才华横溢的 3D AI 工程师,谷歌和学术界每天似乎都在进行令人印象深刻的即时 3D 模型生成器研究。 然而,虽然我对这些模型的工作原理有一个模糊的了解,但我绝对没有具体的理解。

所以,这篇博客的目标是理解以下两篇论文

  • DreamFusion: Text-to-3D using 2D Diffusion可以说开启了将文本转换为 3D 模型的整个想法。
  • Zero-1-to-3: Zero-shot One Image to 3D Object ,这是Stable Dreamfusion 存储库中用于将图像转换为 3D 模型的模型。

现在,让我们从 DreamFusion 开始。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 

这是一个相当出色的工作,坦白说让我有些震惊。 这个想法是我们可以使用扩散模型来生成图像,例如稳定扩散,并用它来生成3D模型!

1、什么是扩散?

现在,如果你想回顾一下扩散模型,请查看此处,但主要回顾如下:

扩散过程具有向图像添加噪声的正向过程和从图像中去除噪声的反向过程。 你可以将这个前向过程视为只是将先前的输入乘以某个数量,并向正态分布添加一些常数倍。 就这样吧!

噪声图像 = a ⋅ 噪声较小的图像 + b ⋅ 噪声

这些 a 和 b 在去噪过程的某个阶段发生变化,但几乎所有扩散模型都完全遵循上述想法!

每执行一次上述操作,我们就前进一步。 所以,原始图像是 z₀,但如果我们进行上述噪声处理 2 次,我们就会得到 z2。

然后,似乎很明显

噪声较小的图像 = (噪声图像 - b⋅ 噪声)/a

事实上,由于所有这些 as和 b 都是常数,我们有时可以说

图像=(噪声图像 - b'·噪声)/a'

对于一些修改后的常数 b' 和 a'。 这种方法有相当多的错误,但它对于以随机时间步长猜测初始图像非常有用!

一旦我们训练了一个模型以便我们可以找到噪声,我们几乎就拥有了一个可以从纯噪声生成图像的扩散模型!

主要步骤是,

  • 从纯噪声开始作为噪声图像
  • 使用模型预测噪声,将图像推向噪声较少的图像
  • 进行上述计算以获得噪声较少的图像!

这就是扩散模型背后的主要思想! 至于它是如何训练的等,我之前曾在这里写过。 但主要思想是:

  • 从输入图像 z₀ 开始
  • 添加一些随机噪声 ϵ 以获得噪声图像 zₜ
  • 最后,预测可用于对 zₜ 进行去噪的噪声 ϵ’(zₜ, t),最终得到 z₀。
  • 损失为 (ϵ’(zₜ, t)-ϵ)²

在 Dreamfusion 中,这种损失被引入为:

E 基本上是期望值。 因此,你可以将其视为所有可能数据的平均值。 w(t) 只是时间步 t 的某个常数,我们可以轻松地忽略它。 αₜx + σₜε 是我们的噪声图像。 我们可以从中获得

图像=(噪声图像 - b'·噪声)/a'

我们之前讨论过。 然后,

噪声图像 = a'⋅ 图像+b'⋅ 噪声

中间的噪音部分几乎就是我们讨论的内容!

因此,我们尝试正确猜测噪声,以在任何给定时间步对噪声图像进行去噪! 如果这部分令人困惑,请告诉我。 我绝对可以修改。

2、回到DreamFusion

现在 Dreamfusion 所说的是,假设有一个带有一些参数 θ 的可微生成器 g,其中 g(θ) 输出图像! 你可以将其视为通过特定摄像机角度和照明 (g) 渲染的 3d 场景 (θ)。

现在,我们如何使 g(θ) 看起来像扩散模型的输出? 第一个想法是优化 θ,使生成器的输出成为扩散模型的输出,就像这样!

这里, ϕ是扩散模型的参数。 这里的主要思想是我们假设我们的扩散模型 ϕ 对图像有很好的理解。 然后,它必须知道哪些图像看起来正常,哪些图像看起来不正常。 如果我们的扩散损失很高并且我们的模型无法预测首先添加了哪些噪声,则意味着从 g(θ) 生成的图像看起来不像实际图像。 所以我们可以反向传播这个损失来更新 θ,我们应该可以开始了!

然而,奇怪的是,他们发现这样做效果并不好。 让我们看看为什么! 所以我们的扩散损失是

然后,我们用 g(θ) 重置 x,我们想要获得相对于 θ 的梯度! 然后,我们几乎只使用链式法则

这里的y 是扩散模型的输入,在这种情况下是文本! 所以这里我们尝试生成 θ ,使其输出图像对应于文本提示。

我怀疑有一个拼写错误,对于正确的链式法则,δ ϵ’/zₜ 应该是 δ ϵ’/δ zₜ。

对于为什么 δ zₜ/δ x 缺失,图像 x 可以用噪声图像来近似,如下所示

zₜ = a'x+b'⋅ 噪声

所以 δ zₜ/δ x=a' 这是一个常数,所以我们可以将它放入 w(t) 中。 除此之外,这似乎是一个非常标准的链式规则。

这里,δ ϵ'/δ zₜ 是昂贵的。 这是有道理的,因为我们需要遍历生成这些图像的扩散模型并通过它计算梯度。 然而,这个术语对于小噪声水平也没有用,正如论文所说,“因为它经过训练以近似边缘密度的缩放 Hessian 矩阵。” 如果有人对此有很好的解释,请告诉我。 我目前的理解是,正如 EDiffi 等其他研究中所见,当噪声水平较低时,ϵ'几乎完全忽略文本,并专注于使噪声图像看起来像正常图像。 这对我们的情况适得其反,因为它不一定强制我们生成的图像遵循文本提示。 所以结果是次优的。

现在,这篇论文所做的是,因为这个术语对我们的损失几乎没有任何贡献,而且只会让它变得更大,所以让我们删除它! 我们得到

现在,虽然删除导数似乎有点违反直觉,但这可以正式导出。 它非常有趣,所以一旦我完全消化它就会把它放在这里。

现在,总的来说,就是这样。 这种方法最酷的一点是我们永远不需要扩散模型的梯度! 我们可以从扩散模型中采样并将其用于 θ 的梯度!

3、NeRF:我们如何从 θ 生成 3D 模型?

首先我们来了解一下光线追踪! 光线追踪背后的主要思想是,对于图像中的每个像素,我们都会发射激光。 如果它击中一个物体,我们就会看到它。 如果它没有击中任何东西,我们就什么也看不见。 下图帮助我有了这种直觉

现在假设我有 3d 点 μ。 我们将其通过 MLP(单层神经网络),我们得到

  • τ = 该点的不透明程度
  • c= 点的 RGB。

所以本质上,我们将相机的 3D 坐标和来自它们的光线映射到颜色以及颜色的密度。

在dreamfusion代码中,在训练期间,它似乎像这样随机化姿势

if self.training:
  # random pose on the fly
  poses, dirs, thetas, phis, radius = rand_poses(....

所以本质上它获取 3d 坐标和射线角度。

总的来说,我们希望通过训练来优化这个函数,以便它可以将任何角度的任何点映射到颜色和 RGB,以便我们可以从不同角度拍摄生成的图像! 管道如下图所示

然而,这是我们想要从文本生成 3D 模型的情况下的一种技术。 我们可以使用相同的技术从图像生成 3D 模型吗? 答案是不。 主要问题是这个损失函数

这里的y是我们的文本条件,它迫使我们的模型生成文本。 所以这个程序中没有任何地方可以告诉它我们想要它是什么样的图像。

现在,我们可以更改它,以便条件 y 接受图像吗?

这正是我们下一篇研究论文所做的!

4、Zero-1-to-3:零样本单图像生成 3D 对象

本文的主要思想是我们可以微调稳定的扩散模型以便我们可以转动物体吗? 答案是肯定的!

更详细地说,他们首先使用名为 CLIP 的强大图像编码器对输入图像进行编码。 然后我们添加相机旋转和平移(R,T)。 我们将所有这些连接在一起。 现在,我们有了图像、所需的新相机旋转 (R) 和所需的新相机平移 (T),我们希望它使用这些参数生成新图像。 现在,当我第一次读到这个想法时,我很好奇这样一个用于训练这样的模型的数据集已经存在。 事实上,确实如此! 这是数据集 objaverse ,它是一个开源项目。 这似乎是由“艾伦人工智能研究所、华盛顿大学、哥伦比亚大学、Stability AI、LAION 和加州理工学院”合作完成的。 这就是为什么它如此优秀并且同时开源是有道理的!

总的来说,在stable dreamfusion中,当我仍在消化代码时,该模型已与 NeRF 相结合,以便你可以通过用我们的剪辑图像嵌入替换 y 来从图像生成 3D 模型。 我不确定stable dreamfusion是否利用了我们可以转动图像的事实。 我希望如此,因为这是一个了不起的功能。

但总的来说,这个主题就这样了。 希望大家喜欢这篇文章!


原文链接:理解3D扩散模型 - BimAnt

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

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

相关文章

GuitarPro和Earmaster那个适合新手

许久没发文了,最近在网上刷到了一位音乐UP主从容Free,他把自己对GuitarPro和Earmaster这2款软件的使用感受进行了详细分享,还没看过的朋友可以戳下面的链接跳转到小破站看完整的: 我不允许还有人不知道这个学吉他的神器&#xff…

专业140+总分420+复旦大学957信号与系统考研经验复旦电子信息与通信

今年专业957信号与系统140,数二140,总分420,顺利上岸复旦大学,回顾这一年的复习,有起有落,也有过犹豫和放弃,好在都坚持下来了,希望大家考研复习要不忘初心,困难肯定是很…

深度学习(5)--Keras实战

目录 一.Keras基础概念 二.如何跑通Keras项目 2.1.在cmd上跑通 2.2.在PyCharm上跑通 一.Keras基础概念 Keras是深度学习中的一个神经网络框架,是一个高级神经网络API,用Python编写,可以在TensorFlow,CNTK或Theano之上运行。 …

【labVIEW】学习记录

【labVIEW】学习记录 一、简介二、安装及激活三、使用 回到目录 一、简介 labVIEW(Laboratory Virtual Instrument Engineering Workbench)是一款由美国国家仪器公司(National Instruments)开发的可视化编程环境和开发平台。LabV…

Windows在局域网内开启共享文件夹

局域网内多台电脑开启共享文件夹可以提高使用舒适度,而共享文件夹的设置方式也非常简单。 1、开启网络共享 1.1 确定网络类型:公用or专用 首先我们需要确定自己的网络类型,首先从网络和共享中心可以看到我的电脑连接了一个wifi&#xff0c…

snmp网管服务MIB Browser使用

MIB Browser 软件打开显示界面,首先需要配置地址、端口号、团体名、snmp版本点击Advanced,弹出配置界面 配置成功后双击走测列表信息就可以查看交换机端口状态、版本号等信息; 例如:我的交换机8号端口是正常,其他端口是…

基于FPGA的高效除法器

FPGA可以通过除号直接实现除法,但是当除数或被除数位宽较大时,计算会变得缓慢,导致时序约束不能通过。此时可以通过在除法IP中加入流水线来提高最大时钟频率,这种方式提高时钟频率也很有限。如果还不能达到要求,就只能…

牛客刷题之列表

文章目录 生成数字列表列表的长度添加列表元素append() 列表尾添加insert(index,elem) 在任意位置插入 删除列表元素pop(index) 删除下标为index 的元素并返回remove(x) 删除指定元素 生成数字列表 方法一(普通方法) num input() newnum num.split() a…

Flutter中实现中国省份地图

效果展示(这里只展示局部,完全展示违规): 可以点击省份改变颜色,更多功能可以自行拓展。 注:非完整中国地图!!! 本文用于记录在Flutter项目中安卓端实现中国地图,因为实现过程是通过…

vue项目中debugger不生效问题解决

Vue中使用debugger在chrome谷歌浏览器中失效问题(已解决)_vue debugger不生效-CSDN博客 卡了半天,最后解决了

Python中安全删除列表元素的实用技巧详解

概要 在 Python 中,列表是一种常用的数据结构,用于存储一组有序的元素。然而,有时候需要从列表中删除特定的元素,以满足需求。本文将介绍一些安全删除列表元素的实用技巧,以及如何处理各种情况下可能出现的异常。 使用…

​第20课 在Android Native开发中加入新的C++类

​这节课我们开始利用ffmpeg和opencv在Android环境下来实现一个rtmp播放器,与第2课在PC端实现播放器的思路类似,只不过在处理音视频显示和播放的细节略有不同。 1.压缩备份上节课工程文件夹并修改工程文件夹为demo20,将demo20导入到Eclipse或…

代码随想录算法训练营29期|day30 任务以及具体安排

332.重新安排行程 class Solution {private LinkedList<String> res;private LinkedList<String> path new LinkedList<>();public List<String> findItinerary(List<List<String>> tickets) {Collections.sort(tickets, (a, b) -> a.…

Spring基于dynamic-datasource实现MySQL多数据源

目录 多数据源实现 引入依赖 yml配置文件 业务代码 案例演示 多数据源实现 引入依赖 <dependency><groupId>com.baomidou</groupId><artifactId>dynamicdatasourcespringbootstarter</artifactId><version>3.5.0</version> &…

Java玩转《啊哈算法》排序之桶排序

过去心不可得&#xff0c;现在心不可得&#xff0c;未来心不可得 目录在这里 楔子代码地址桶排序代码核心部分优缺点 完整代码演示 升级版核心代码完整代码演示 楔子 大家好&#xff01;本人最近看了下《啊哈算法》&#xff0c;写的确实不错&#xff0c;生动形象又有趣&#x…

AR 自回归模型

文章目录 总的代码ADF 检验(是否平稳)差分操作拟合AR 模型预测可视化总的代码 import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.ar_model import AutoReg from statsmodels.tsa.stattools import adfuller# 生成一个示例时间序…

【开源】基于JAVA语言的假日旅社管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统介绍2.2 QA 问答 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿评论4.3 查询民宿新闻4.4 新建民宿预订单4.5 查询我的民宿预订单 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的假日旅社…

Java-HashMap如何找落点

顾名思义&#xff0c;HashMap采用的是哈希方式来找落点&#xff0c;通过数据的某些特征&#xff0c;计算出一个哈希值&#xff0c;然后用哈希值与节点建立映射关系&#xff0c;从而确定这个数据应该在哪个节点上&#xff0c;下图是一个具有16个节点的分布式集群&#xff0c;本文…

JVM篇--垃圾回收器高频面试题

1 你知道哪几种垃圾收集器&#xff0c;各自的优缺点是啥&#xff0c;重点讲下cms和G1&#xff0c;包括原理&#xff0c;流程&#xff0c;优缺点&#xff1f; 1&#xff09;首先简单介绍下 有以下这些垃圾回收器 Serial收集器&#xff1a; 单线程的收集器&#xff0c;收集垃圾时…

【K8S 云原生】K8S的图形化工具——Rancher

目录 一、rancher概述 1、rancher概念 2、rancher和K8S的区别&#xff1a; 二、实验 1、安装部署 2、给集群添加监控&#xff1a; 3、创建命名空间&#xff1a; 4、创建deployment&#xff1a; 5、创建service&#xff1a; 6、创建ingress&#xff1a; 7、创建hpa 8…