MVDream 论文学习

论文链接:https://arxiv.org/abs/2308.16512

代码链接:https://github.com/bytedance/MVDream

解决了什么问题?

3D 内容生成是现代游戏和媒体产业中的关键环节,然而这是一个劳动密集型的任务,创建一个 3D 资产就需要训练有素的设计师花费数小时甚至几天的时间来完成。因此,一个能够以简单方式为非专业用户生成 3D 内容的系统是非常有价值的。现有的 3D 对象生成方法可以分为三类:

  • 基于模板的生成流程;
  • 3D 生成模型;
  • 2D 提升方法;

由于可利用的 3D 模型数量有限,而且数据复杂,基于模板的生成器和 3D 生成模型都难以有效地泛化到任意对象的生成。它们生成的内容通常局限于拓扑结构相对简单、纹理常见的对象。然而在产业中,受欢迎的3D资产通常是结构复杂,具有一定艺术性的,有时甚至是非现实主义结构和风格的混合体。

最近,2D 提升方法证明了预训练 2D 生成模型可以被用于 3D 生成。DreamFusion 和 Magic3D 使用 2D 扩散模型作为监督,通过 score distillation sampling 监督 3D 表示的优化。在大规模 2D 图像数据集上训练的 2D 模型能够生成没见过的、反现实的场景,它们仅需一段文本描述的输入,为艺术资产创作提供了强有力的工具。

尽管如此,在 2D 提升技术中,由于在 score distillation 过程中缺乏全面的多视图知识和 3D 感知,会有一些挑战。这些挑战包括:

  • 多面性 Janus 问题:系统在不同视图中重复生成相同文本描述的内容。多面性问题有多种因素,比如某些物体如刀片在某些角度几乎不可见。同时,角色或动物的重要部分可能在特定视点被隐藏或自我遮挡。虽然人类可以从多个角度评估这些对象,但2D扩散模型不能这样做,产生冗余和不一致的内容。
  • 不同视图之间的内容漂移,如下图所示。

虽然 2D 提升方法有许多弱点,作者认为大规模 2D 数据对于 3D 生成的泛化性至关重要。因此,作者提出了多视图扩散模型,可以被用作与 3D 表示无关的多视图 3D 先验。本文模型同时生成一组彼此一致的多视图图像。它能利用预训练的 2D 扩散模型进行迁移学习,继承泛化能力。然后,通过在多视图图像(来自 3D 资产)和 2D 图像-文本对上进行联合训练,作者发现它能够实现良好的一致性和泛化性。将 score distillation 应用于 3D 生成时,多视图监督要比单视图 2D 扩散模型更加稳定。我们仍然可以像纯 2D 扩散模型一样,创建未见过的、反事实的 3D 内容。受到 DreamBooth 启发,我们也可以利用多视图扩散模型,从一系列的 2D 图像中融合身份信息,并在微调后保持多视图的一致性。MVDream 生成的 3D NeRF 模型没有多视图一致性问题,生成多样化的 3D 内容。

3D Generative Models

3D 生成推动了几乎所有深度生成模型在这一任务中的应用。Handerson 等人探索了用于带纹理的 3D 生成的 VAE,然而他们的工作主要针对利用多视图数据的较简单的模型。由于 GAN 在图像合成方面取得了进展,许多研究探索了具有 3D 感知的 GANs。这些方法缺乏真实 3D 或多视图数据的重建损失,仅使用单目图像进行训练。因此,3D-aware GANs 仍然存在泛化和稳定性的问题。因此最近,扩散模型成为了 3D 生成研究的焦点。针对 tri-planes 和特征网格引入了不同的 3D 扩散模型。然而,这些模型主要针对特定的对象,在 2D 对应物体范围内的泛化能力尚未得到验证,可能是由于 3D 表示的限制或架构设计问题。

Diffusion Models for Object Novel View Synthesis

最近的一些研究尝试直接合成 3D 新视图,不进行重建。例如,Watson 等人基于 ShapeNet 数据集使用扩散模型做视角合成。Zhou&Tulsiani 等人使用一个极线特征 transformer 扩展 Stable Diffusion 模型的隐式空间。Chen 等人在扩散去噪时,将隐式特征重新投影,从而增强了视图之间的一致性。这些方法受到训练数据的丰富程度限制,没有证据表明它们能泛化到其它多样的图像输入。Liu 提出在 3D 渲染数据集上微调一个预训练的图像变化扩散模型。该数据集是用于新视图合成的。但是,合成图像仍然有几何一致性的问题,造成 3D 输出模型存在明显的模糊。

Lifting 2D Diffusion for 3D Generation

鉴于3D生成模型的泛化能力有限,另一系列研究尝试通过将其与 3D 表示(如 NeRF)耦合,将2D扩散先验应用于3D生成。这些方法的关键技术是由Poole等人提出的 Score Distillation Sampling,其中扩散先验作为分数函数使用,以指导3D表示的优化。与 DreamFusion 同时,SJC(Wang等人)提出了一种使用公开可用的 Stable DIffusion 模型(Rombach 等人)的类似技术。后续工作进一步改进了 3D 表示、sampling schedules、损失设计。尽管这些方法能够在不训练任何3D数据的情况下生成逼真和任意类型的物体,但它们已知会遭受多视图一致性问题。此外,如(Poole 等人)所讨论的,每个生成的3D模型都通过调整提示和超参数进行单独优化,以避免生成失败。然而,MVDream 可以使用统一的参数集生成满意的 3D 模型,而不需要针对每个模型单独地调整参数。

提出了什么方法?

MVDream 是一个扩散模型,能从一个给定的文本提示生成连续的多视图图像。通过学习 2D 和 3D 数据,多视图扩散模型能实现 2D 扩散模型的泛化性和 3D 渲染的一致性。作者证明这个多视图扩散模型作为一个隐式的可泛化的 3D 先验(不依赖于特定的 3D 表示)能适用于不同的 3D 场景。它可以通过 Score Distillation Sampling 应用于 3D 生成,显著地增强 2D 提升方法的连续性和稳定性。MVDream 具备从少量2D图像中快速学习并生成3D内容的能力,类似于DreamBooth技术。

Multi-view Diffusion Model

为了减轻 2D 提升方法中的多视图一致性问题,一个典型的解决方案是++改进其视点意识++。例如,Poole 等人将视点描述添加到文本条件中。一个更复杂的方法就是融合精确的相机参数,就像在新视图合成方法中那样(Liu等人)。但是,本文假设即使是一个完美的相机条件模型,也不足以解决问题,不同视图的内容仍可能不匹配。例如,一只鹰可能在正面视图中向前看,而在背面视图中向右转头,其中只有它的身体符合相机条件。

另一个灵感来自于视频扩散模型。由于人类没有真正的3D传感器,感知3D对象的典型方式是从所有可能的视角观察它,这类似于观看一个旋转视频。最近关于视频生成的研究展示了将图像扩散模型适应于生成时间上一致内容的可能性。然而,将这样的视频模型适应于我们的问题并非易事,因为几何一致性可能比时间一致性更为复杂。我们的初步实验表明,在视点变化较大时,视频扩散模型的帧之间仍可能发生内容漂移。此外,视频扩散模型通常在动态场景上进行训练,当应用于生成静态场景时,可能会遭遇 domain gap 的问题。

基于这些观测,作者发现直接训练一个多视图扩散模型很重要,我们可以利用 3D 渲染数据集来生成静态场景,这些场景具有准确的相机参数。下图展示了本文的 text-to-multi-view 扩散模型。作者利用了3D 数据集渲染连续的多视图图像,监督扩散模型的训练。给定一组噪声图像 x t ∈ R F × H × W × C \mathbf{x}_t\in \mathbb{R}^{F\times H\times W\times C} xt∈RF×H×W×C、一个文本提示 y y y、一组相机外参 c ∈ R F × 16 \mathbf{c}\in\mathbb{R}^{F\times 16} c∈RF×16,我们训练一个多视图扩散模型来产生一组相同场景的图像 x 0 ∈ R F × H × W × C \mathbf{x}_0\in \mathbb{R}^{F\times H\times W\times C} x0∈RF×H×W×C,这些图像来自于 F F F 个不同的观测视角。训练完成后,模型可作为多视图先验来优化 3D 表示,结合 score distillation sampling 技术使用。

为了继承 2D 扩散模型的泛化能力,作者想在微调时尽可能地保留其结构。但是这些模型一次只能生成一张图片,输入不包含相机条件信息。那么问题就是:

  • 如何从相同的文本提示生成一组连续的图像?
  • 如何加入相机姿态控制?
  • 如何保留模型生成结果的质量和泛化能力?

Multi-view Consistent Generation with Inflated 3D Self-attention

与视频扩散模型类似,作者希望调整注意力层来模拟不同视图之间的依赖性,同时保持网络的其余部分作为一个只在单一图像内操作的2D模型。但是,作者发现简单的时间注意力机制无法学习多视图一致性,即使在 3D 渲染数据集上微调了模型,内容漂移仍然会发生。于是作者选择了 3D 注意力。具体来说,我们可以通过在自注意力中连接所有不同视图,将原始的2D自注意力层扩展到3D,如下图所示,我们发现这种方法即使在视图差距很大的情况下也能生成相当一致的图像。具体来说,给定一个形状为 B × F × H × W × C B\times F\times H\times W\times C B×F×H×W×C 的张量,将其转换为 B × F H W × C B\times FHW\times C B×FHW×C 输入自注意力,其中第二个维度表示 tokens 的序列维度。这样,我们可以继承原始 2D 自注意力的所有模块的权重。请注意,作者还尝试过引入一个新的 3D 自注意力层,而不是修改现有的 2D 自注意力层。然而,作者发现这样的设计会损害多视图图像生成的质量。

Camera Embeddings

类似于视频扩散模型,对本文模型来说,位置编码也是必要的,因为它可以区分不同的视角。于是,作者比较了相对位置编码、rotary embeddings、绝对相机参数等方法。作者发现,用一个两层的 MLP 编码相机参数所产生的图像质量是最佳的,可以区分不同的视角。作者使用了两个方法来注入相机参数:

  • 将相机 embeddings 作为残差信息加入到时间 embeddings;
  • 将相机 embeddings 加入到文本 embeddings 中,计算交叉注意力。

实验表明这两个方法都可以,但是前者要更加鲁棒,因为相机 embeddings 与文本输入的纠缠较少。

Training Loss Function

作者发现数据管理和训练策略对于图像生成的质量也很重要。数据处理的细节可以参考附录的内容。对于训练,作者基于 Stable Diffusion v2.1 基线模型( 512 × 512 512\times 512 512×512分辨率)做微调,作者保留了优化器的设定和 ϵ \epsilon ϵ-预测,但是降低了图像分辨率为 256 × 256 256\times 256 256×256。作者发现,使用更大规模的 text-to-image 数据集做联合训练对于微调模型的泛化性很有用。给定 text-image 数据集 χ \chi χ 和多视图数据集 χ m v \chi_{mv} χmv,对于训练样本 { x , y , c } ∈ χ ∪ χ m v \left\{ \mathbf{x}, y,\mathbf{c} \right\} \in \chi \cup \chi_{mv} {x,y,c}∈χ∪χmv(对于 χ \chi χ, c \mathbf{c} c为空),多视图扩散损失定义如下:

L M V ( θ , χ , χ m v ) = E x , y , c , t , ϵ [ ∥ ϵ − ϵ θ ( x t ; y , c , t ) ∥ 2 2 ] \mathcal{L}{MV}(\theta,\chi,\chi{mv}) = \mathbb{E}{\mathbf{x},y,\mathbf{c},t,\epsilon}\left[ \left\| \epsilon - \epsilon\theta(\mathbf{x}_t; y, \mathbf{c}, t) \right\|_2^2 \right] LMV(θ,χ,χmv)=Ex,y,c,t,ϵ[∥ϵ−ϵθ(xt;y,c,t)∥22]

其中 x t \mathbf{x}t xt 是由随机噪声 ϵ \epsilon ϵ和图像 x \mathbf{x} x 产生的噪声图像, y y y是条件输入, c \mathbf{c} c是相机条件输入, ϵ θ \epsilon\theta ϵθ 是多视图扩散模型。通过关闭 3D 注意力和相机 embeddings,有 30 % 30\% 30% 的概率,多视图模型是作为一个简单的 2D text-to-image 模型基于 LAION 数据集训练的。

Text-To-3D Generation

作者通过下面两个方式,利用多视图扩散模型做 3D 生成,

  • 将生成的多视图图像输入一个少样本 3D 重建方法。
  • 将多视图苦涩哦按模型作为 SDS 的先验。

尽管 3D 重建需要一个鲁棒的少样本 3D 重建方法,但目前这个项目期间还没有可用的方法。因此,我们将实验重点放在后者,即通过用我们的多视图扩散模型替换现有的 Stable Diffusion 来修改 SDS 流程。这需要做两个地方的修改:

  • 修改相机的采样策略;
  • 将相机参数作为输入。

与DreamFusion(Poole等人,2023年)中使用方向注释的提示不同,作者使用原始提示来提取文本 embeddings。

尽管这种多视图SDS能够生成一致的3D模型,但其内容的丰富性和纹理质量仍然不如直接通过去噪扩散过程采样的图像。因此,作者提出了几种技术来缓解这个问题。首先,在优化过程中,对 SDS 的最小和最大时间步进行线性退火。第二,为了防止模型生成数据集中低质量3D模型的风格,我们在SDS过程中添加了一些固定的负面提示。最后,为了减轻大量 classifier-free guidance (CFG) 导致的颜色饱和度问题,作者使用了诸如动态阈值(Saharia等人,2022年)或来自(Lin等人,2023b)的 CFG rescale 等 clamping 技术。由于这些方法只应用于 x ^ 0 \hat{\mathbf{x}}_0 x^0,作者提出使用一个 x 0 \mathbf{x}_0 x0 重建损失,而不是原始的 SDS 损失:

L S D S ( ϕ , x = g ( ϕ ) ) = E t , c , ϵ [ ∥ x − x ^ 0 ∥ 2 2 ] \mathbf{L}{SDS}(\phi, \mathbf{x}=g(\phi)) = \mathbb{E}{t,\mathbf{c}, \epsilon}\left[ \left\| \mathbf{x} - \hat{\mathbf{x}}_0 \right\|_2^2\right] LSDS(ϕ,x=g(ϕ))=Et,c,ϵ[∥x−x^0∥22]

上述等式和原始的带 w ( t ) w(t) w(t) 的 SDS 等价, w ( t ) w(t) w(t) 是 SDS 的一个超参,等于信噪比。这里 x = g ( ϕ ) \mathbf{x}=g(\phi) x=g(ϕ) 是从 3D 表示 ϕ \phi ϕ 而来的渲染图像, x ^ \hat{\mathbf{x}} x^是由 ϵ θ ( x t ; y , c , t ) \epsilon_\theta(\mathbf{x}_t; y, \mathbf{c}, t) ϵθ(xt;y,c,t) 预测的 x 0 \mathbf{x}_0 x0。作者发现, x 0 \mathbf{x}_0 x0-重建损失与原始的 SDS 效果类似,但当我们对 x ^ 0 \hat{\mathbf{x}}_0 x^0使用 CFG rescale 技术后,能缓解其色彩饱和度问题。

之前一些方法加入了许多正则化技术,与之相比,上述等式的重建损失就相对简单,能够从头进行 3D 生成,说明多视图扩散模型可以作为一个强大的 3D 先验。话虽如此,作者也使用了 point lighting、soft shading 来改善输出的几何质量。对于正则损失,作者只用了朝向角损失。这两项技术只会让生成的几何更加平滑,对生成内容做的调整微乎其微。作者没有用 sparsity loss 来强迫前景和背景区分开来,而是通过对背景使用随机颜色来做到的。

Multi-view DreamBooth for 3D Generation

如上图右边所示,训练完多视图扩散模型后,我们将它扩展为一个 DreamBooth 模型,给 3D DreamBooth 使用。由于多视图扩散模型的泛化性,作者发现微调后也能保留其多视图能力。使用了两类损失,一个是图像微调损失、一个参数保留损失。以 χ i d \chi_{id} χid 表示一组身份图像,DreamBooth 损失如下:

L D B ( θ , χ i d ) = L L D M ( χ i d ) + λ ∥ θ − θ 0 ∥ 1 N θ \mathcal{L}{DB}(\theta, \chi{id})=L_{LDM}(\chi_{id}) + \lambda \frac{\left\| \theta - \theta_0 \right\|1}{N\theta} LDB(θ,χid)=LLDM(χid)+λNθ∥θ−θ0∥1

L L D M \mathcal{L}{LDM} LLDM 是图像扩散损失, θ 0 \theta_0 θ0 是原始多视图扩散模型的初始参数, N θ N\theta Nθ 是参数的个数, λ = 1 \lambda=1 λ=1 是平衡参数。

为了得到一个 3D 模型,作者将扩散模型替换为 DreamBooth 模型。原始的 DreamBooth3D 使用一个三阶段优化手段:partial DreamBooth、多视图数据生成、多视图 DreamBooth。本文方法通过直接训练一个多视图(MV)DreamBooth模型,然后是对 3D NeRF 的优化,它利用了扩散模型的一致性优势,并简化了 3D 建模的过程。

相关推荐
Charles Ray23 分钟前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
我要吐泡泡了哦1 小时前
GAMES104:15 游戏引擎的玩法系统基础-学习笔记
笔记·学习·游戏引擎
骑鱼过海的猫1231 小时前
【tomcat】tomcat学习笔记
笔记·学习·tomcat
贾saisai3 小时前
Xilinx系FPGA学习笔记(九)DDR3学习
笔记·学习·fpga开发
北岛寒沫3 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
铁匠匠匠5 小时前
从零开始学数据结构系列之第六章《排序简介》
c语言·数据结构·经验分享·笔记·学习·开源·课程设计
架构文摘JGWZ6 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
小齿轮lsl7 小时前
PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
笔记·学习·matlab
Aic山鱼7 小时前
【如何高效学习数据结构:构建编程的坚实基石】
数据结构·学习·算法
qq11561487077 小时前
Java学习第八天
学习