Stable Dreamfusion 上的这个存储库启发了这个博客。
我认为 3D 扩散和 3D 生成似乎是每个人心中的下一件大事。 Stability AI 开始招聘才华横溢的 3D AI 工程师,谷歌和学术界每天似乎都在进行令人印象深刻的即时 3D 模型生成器研究。 然而,虽然我对这些模型的工作原理有一个模糊的了解,但我绝对没有具体的理解。
所以,这篇博客的目标是理解以下两篇论文
现在,让我们从 DreamFusion 开始。
NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包
这是一个相当出色的工作,坦白说让我有些震惊。 这个想法是我们可以使用扩散模型来生成图像,例如稳定扩散,并用它来生成3D模型!
现在,如果你想回顾一下扩散模型,请查看此处,但主要回顾如下:
扩散过程具有向图像添加噪声的正向过程和从图像中去除噪声的反向过程。 你可以将这个前向过程视为只是将先前的输入乘以某个数量,并向正态分布添加一些常数倍。 就这样吧!
噪声图像 = a ⋅ 噪声较小的图像 + b ⋅ 噪声
这些 a 和 b 在去噪过程的某个阶段发生变化,但几乎所有扩散模型都完全遵循上述想法!
每执行一次上述操作,我们就前进一步。 所以,原始图像是 z₀,但如果我们进行上述噪声处理 2 次,我们就会得到 z2。
然后,似乎很明显
噪声较小的图像 = (噪声图像 - b⋅ 噪声)/a
事实上,由于所有这些 as和 b 都是常数,我们有时可以说
图像=(噪声图像 - b'·噪声)/a'
对于一些修改后的常数 b' 和 a'。 这种方法有相当多的错误,但它对于以随机时间步长猜测初始图像非常有用!
一旦我们训练了一个模型以便我们可以找到噪声,我们几乎就拥有了一个可以从纯噪声生成图像的扩散模型!
主要步骤是,
这就是扩散模型背后的主要思想! 至于它是如何训练的等,我之前曾在这里写过。 但主要思想是:
在 Dreamfusion 中,这种损失被引入为:
E 基本上是期望值。 因此,你可以将其视为所有可能数据的平均值。 w(t) 只是时间步 t 的某个常数,我们可以轻松地忽略它。 αₜx + σₜε 是我们的噪声图像。 我们可以从中获得
图像=(噪声图像 - b'·噪声)/a'
我们之前讨论过。 然后,
噪声图像 = a'⋅ 图像+b'⋅ 噪声
中间的噪音部分几乎就是我们讨论的内容!
因此,我们尝试正确猜测噪声,以在任何给定时间步对噪声图像进行去噪! 如果这部分令人困惑,请告诉我。 我绝对可以修改。
现在 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 等其他研究中所见,当噪声水平较低时,ϵ'几乎完全忽略文本,并专注于使噪声图像看起来像正常图像。 这对我们的情况适得其反,因为它不一定强制我们生成的图像遵循文本提示。 所以结果是次优的。
现在,这篇论文所做的是,因为这个术语对我们的损失几乎没有任何贡献,而且只会让它变得更大,所以让我们删除它! 我们得到
现在,虽然删除导数似乎有点违反直觉,但这可以正式导出。 它非常有趣,所以一旦我完全消化它就会把它放在这里。
现在,总的来说,就是这样。 这种方法最酷的一点是我们永远不需要扩散模型的梯度! 我们可以从扩散模型中采样并将其用于 θ 的梯度!
首先我们来了解一下光线追踪! 光线追踪背后的主要思想是,对于图像中的每个像素,我们都会发射激光。 如果它击中一个物体,我们就会看到它。 如果它没有击中任何东西,我们就什么也看不见。 下图帮助我有了这种直觉
现在假设我有 3d 点 μ。 我们将其通过 MLP(单层神经网络),我们得到
所以本质上,我们将相机的 3D 坐标和来自它们的光线映射到颜色以及颜色的密度。
在dreamfusion代码中,在训练期间,它似乎像这样随机化姿势
if self.training:
# random pose on the fly
poses, dirs, thetas, phis, radius = rand_poses(....
所以本质上它获取 3d 坐标和射线角度。
总的来说,我们希望通过训练来优化这个函数,以便它可以将任何角度的任何点映射到颜色和 RGB,以便我们可以从不同角度拍摄生成的图像! 管道如下图所示
然而,这是我们想要从文本生成 3D 模型的情况下的一种技术。 我们可以使用相同的技术从图像生成 3D 模型吗? 答案是不。 主要问题是这个损失函数
这里的y是我们的文本条件,它迫使我们的模型生成文本。 所以这个程序中没有任何地方可以告诉它我们想要它是什么样的图像。
现在,我们可以更改它,以便条件 y 接受图像吗?
这正是我们下一篇研究论文所做的!
本文的主要思想是我们可以微调稳定的扩散模型以便我们可以转动物体吗? 答案是肯定的!
更详细地说,他们首先使用名为 CLIP 的强大图像编码器对输入图像进行编码。 然后我们添加相机旋转和平移(R,T)。 我们将所有这些连接在一起。 现在,我们有了图像、所需的新相机旋转 (R) 和所需的新相机平移 (T),我们希望它使用这些参数生成新图像。 现在,当我第一次读到这个想法时,我很好奇这样一个用于训练这样的模型的数据集已经存在。 事实上,确实如此! 这是数据集 objaverse ,它是一个开源项目。 这似乎是由“艾伦人工智能研究所、华盛顿大学、哥伦比亚大学、Stability AI、LAION 和加州理工学院”合作完成的。 这就是为什么它如此优秀并且同时开源是有道理的!
总的来说,在stable dreamfusion中,当我仍在消化代码时,该模型已与 NeRF 相结合,以便你可以通过用我们的剪辑图像嵌入替换 y 来从图像生成 3D 模型。 我不确定stable dreamfusion是否利用了我们可以转动图像的事实。 我希望如此,因为这是一个了不起的功能。
但总的来说,这个主题就这样了。 希望大家喜欢这篇文章!
原文链接:理解3D扩散模型 - BimAnt