训练 3D 生成模型的方法大致可分为两类:
-
使用 2D 数据的路径:2D 数据是对 3D 的空间采样。要仅用 2D 数据学习 3D,我们需要对这种采样过程进行建模
- 在算法上是 NeRF:NeRF 提供了连续的隐式场景表示和基于神经网络的可微体渲染。Neural Radiance Field(NeRF)用隐式表示建模 3D 场景:这是一个神经网络,给定三维位置和视角可以查询颜色与不透明度;然后可以通过射线行进(ray marching)进行可微渲染。这里是原始 NeRF 论文提供的可视化:在空间中采样点,通过射线行进得到图像,然后可以用这些图像构建重建损失并优化 3D 表示。
- 在架构上是 StyleGAN
- 在扩散模型时代之前,StyleGAN 在生成领域占据主导,具有若干重要特性:一是基于样式的架构提供了属性解缠(disentanglement)以及不同细节层次的解耦能力;在某些领域(如人脸)到今天为止,扩散模型在控制程度上还无法完全达到 StyleGAN 的水平;二是它展示了改进潜在空间的重要性。StyleGAN 是一种革命性的架构,在某些领域(例如人脸)实现了接近产品级的生成效果。他们提出了一个映射网络(mapping network)以获得更好的潜变量空间(latent space)用于采样,并提出了一种基于风格的架构,通过向网络不同层注入风格(style injection)。
- 在 NeRF 出现之前,早期的开创性尝试受 StyleGAN启发,使用常数潜向量和风格注入,并结合 3D 变换与投影模块。
- 之后几乎所有方法都采用了辐射场(radiance field)和随机技术,例如 GIRAFFE、π-GAN、VolumeGAN、GRAM 等等,它们在各自的管线中都不同程度地使用了 StyleGAN 的技术。其中有一种方法成功地把 StyleGAN 的“风格调制+可控潜空间”直接和 NeRF 的“可微体渲染/隐式场”合在一起:不是把 StyleGAN 技术零散并入各种管线,而是 StyleNeRF(或类似方法)从 StyleGAN 架构本身出发,结合了 NeRF 架构,视觉效果显著提高,量化指标上也有明显提升。
- 随后的一些工作(如 EG3D)成为如今用于 3D 感知生成的基础模型。它们提出的最重要技术之一是三平面(tri-plane)表示,这在当前的 3D 乃至 4D 生成中仍然起着关键作用。
- 神经隐式表示通常用全连接网络表示场景,查询速度较慢;另一方面,显式网格或混合变体使用小型隐式解码器,查询快但在分辨率上扩展性差。三平面是一种折中表示——它是一种超表示(hyper representation),既查询快速又能随分辨率有效扩展,使得在相同容量下能获得更好的细节。三平面表示通过三张相互正交的 2D 特征平面来编码 3D 场景;整体的 3D 架构通常包括一个将噪声映射到三通道特征的神经网络、基于这些三平面的 NeRF 渲染以得到 2D 图像(并随机采样相机角度),随后跟上采样器来提升分辨率。因此,这些三平面表示及其用法如今在 3D 生成管线中仍然非常常见和流行。从结果上看,它们基本上继承了 StyleGAN 的生成质量,同时使其变得“3D 感知”,并保留了 StyleGAN 的可操作性(manipulation);在数值指标上也以较大幅度超过了先前的方法。谈到操控能力和 StyleGAN 的风格控制时,我们之前还有一个有趣的项目,尝试学习那些实际上并不存在真实 3D 的艺术域(例如卡通或像素艺术),并能在 3D 中进行属性编辑,就像 StyleGAN 在 2D 上能做的一样。
- EG3D 存在的问题包括:一,摄像机参数是从手工选择的分布中采样的;二,几何是以相对较低的分辨率学习的。因此我们注意到多数结果来自特定域(如人脸与猫),原因在于对数据有强假设:对象需要可对齐(alignable),相机分布在数据中要简单。可对齐的意思是每个面孔大致位于中心,且相机的位姿分布容易定义。原始 EG3D 论文在数据整理和清洗上投入了大量工作以确保模型可训练。
- 针对对象大小不一、图片中可能有多个物体的数据,新研发了 3DGP。这是第一个可以在上千个多样类别上训练的 3D-aware 生成模型。高层上加入了可学习的相机先验(camera prior / camera generator)来替代预定义的相机分布;为提升几何质量,我们在判别器中加入了深度条件,并提出了“深度适配器”(depths adapter)。由于生成器预测的是相对深度且深度并不理想,为了对齐生成深度与真实深度分布,加了一个可训练的适配器。不过它只是具有有限相机控制的基于图像的方法,通常我们称之为“3D-aware 图像生成”或戏称为“2.5D 生成”。
- Learn 3D using 2D diffusion models
- 使用优化方法SDS, Score Distillation Sampling。我们通过把噪声混入干净的图像或干净的潜向量(如果使用潜在扩散模型)来得到带噪分布。噪声调度器 rtr_t 和 σt\sigma_t 是时间步的函数。在最初的 SDS 工作中,时间步是在训练迭代中随机采样的,然而随机采样并不理想:在训练后期加入大量噪声可能导致去噪输出发散,并改变或平均化 3D 形状。一种替代方法是对时间步进行调度(time-step scheduling)而非随机采样:简单的时间步调度是在训练迭代中线性确定并逐步减小时间步,这样得到的结果比随机时间步采样更好。在一些论文里提出了平方根采样策略(square-root sampling),其思想是:在开始阶段需要较少的优化步骤,但在较小时间步时需要更多步骤,以便快速稳定几何并用更多步骤精细化纹理细节。我们强调这些采样策略都是基于经验评估,目前并没有理论证明哪种时间步采样策略在 SDS 中是最优的。
- 使用SDS变体。
- 3D representation:在实践中多使用 NeRF 作为 3D 表示,但这在从 NeRF 提取网格(mesh)时会导致粗糙的几何(用 marching cubes 提取时尤为明显)。为避免这一点,人们也直接使用网格表示以获得更好的几何,然后优化这些网格的外观与材质属性,这能带来更好的视觉效果并更适配需要网格的下游 3D 任务。此外,NeRF 在高分辨率渲染上计算代价昂贵。为了解决这一点,Magic3D 首先生成低分辨率的 radiance field,提取 3D 网格,然后继续用 SDS 精细化该网格。该两阶段方法能提供高分辨率的 3D 网格模型并加快训练速度。相比之下,3D Gaussian splatting(高斯点云渲染)是一种更好的表示,因为它能实现更快的优化和更快的收敛。
-
尽管取得了一些成果,使用 2D 先验进行 3D 生成仍存在若干限制:一个显著问题是“多头/多面”问题(多视角下生成了多重不一致的面/形态),即从不同视角生成了互不一致的几何;此外,要在几分钟内得到每个 3D 对象仍然相对较慢,人们更偏好能在几秒甚至实时生成的方法。
-
使用 3D 数据的路径:用 3D 数据训练显然是真正的 3D 生成
- 3D Representation,分部级(part-level)表示、CAD/可编辑设计表示
- 在用 3D 数据训练时,方法的分类比较简单,比如下图的 4 * 7 个:
尝试用 3D 表示替代 2D 数据,通过修改架构(比如把 2D CNN 变为 3D CNN,或用点云卷积)来适配即可 - 从逐例优化(per-instance optimization)到前向(feed-forward)技术的发展历程
- 3D 物体生成要把任务分解为两阶段:
- 第一阶段用扩散模型(从头训练或微调现有模型)生成多视图图像
- 生成多视图可以通过同步多视图扩散模型(synchronized multi-view diffusion model)来实现,该模型捕捉多视图图像的联合分布
- 方法是把单张图像的扩散模型扩展为多视图版本。该模型可以在像 ObjectVerse 之类的 3D 数据集上训练,以便在多视图生成过程中注入更多 3D 信息。为此工作在多视图图像扩散过程中加入了三平面(tri-plane)特征作为中间表示:在这种情况下,Transformer 以带噪的多视图图像为输入,预测干净的 tri-plane 特征作为输出,然后在渲染图像上略微再加噪以进行下一步的去噪迭代。
- 另一种有代表性的方法是为多视图准备一个特殊的特征体(feature volume),然后把它作为注意力特征输入到扩散单元以生成最终目标视图。这里是生成多视图的推理过程示意。除了生成 RGB 图像外,我们还可以生成辅助的几何信息,例如该工作同时生成了表面法线图(surface normal maps)与 RGB。除了法线外,还有其它几何信息也可用于训练扩散模型,如深度图(depth)、反照率(albedo)以及 3D 坐标图。
- 除了以同步方式生成预定义的目标视图外,还有一种方法通过以目标相机(target cameras)和一个源视图(source view)作为条件来生成无限视角(infinite views),从而可以按序列生成多个视图。
- 生成多视图可以通过同步多视图扩散模型(synchronized multi-view diffusion model)来实现,该模型捕捉多视图图像的联合分布
- 第二阶段使用重建技术从这些多视图图像重建 3D。
- 一种直接的方式是对多视图应用多视图 SDS(multi-view Score Distillation Sampling):在这种情形下,我们认为多视图生成器已经从 3D 数据中学习到某种 3D 先验,能够为 3D 优化提供有用的多视图 SDS 梯度。左侧展示了仅用 2D 先验的 SDS 结果,这会出现“多头/多面”问题并生成多个不一致面;这种不一致与不真实的视图生成源于缺乏对 3D 结构的理解
- 通过将改进的 2D 与 3D 先验结合起来,进一步提升了外观质量;此外,一些个性化技术(如 DreamBooth)也被用来保持外观重建的保真度。
- 为实现更快的重建,研究者提出了前向(feed-forward)模型,可以在几秒内从多视图图像重建 3D 形状。一个示例方法是将多视图图像表示为 tri-plane 特征,并通过体渲染将该 tri-plane 特征解码为 radiance 视图;该方法在 ObjectVerse 数据集上训练,从而实现更通用的 3D 重建。可视化的 3D 结果在下方。要构建这样一个前向重建流水线,多视图图像先被输入到 Transformer 中作为 key 和 value,可学习的 tri-plane token 用来查询图像特征并生成 tri-plane 特征;获得 tri-plane 特征后,应用体渲染技术将这些特征转换为 radiance field。类似我们之前提到的 SDS,从 radiance field 中提取网格通常会导致视觉质量损失,因此一些方法先生成 radiance view 作为初始步骤,然后通过用可微分的网格替换 radiance field 来微调整个模型,从而增强网格外观。额外的后处理微调步骤也可用于进一步提升网格外观细节;例如某项工作微调了颜色 MLP 和 tri-representation,这一步相当高效,单实例仅需约 4 秒,却能显著改善外观重建细节。这些是稀疏视角重建结果,以及图像或文本到 3D 的生成结果。
- 另有一项非常新的工作(几天前发布)提出了单阶段三维生成——换句话说,推理时没有将多视图作为中间表示。该模型以图像或文本提示为输入,直接生成网格。模型架构类似于 2D 扩散模型,但扩展到 3D 空间:具体地,使用 Transformer 编码器和卷积解码器构成 VAE 编码器主干,输入为点云,输出为 tri-plane;VAE 能高效地将高分辨率 3D 形状编码到紧凑连续的潜在空间,接着一个 MLP 将该特征解码为网格。一旦训练完毕,便在三平面潜空间训练一个扩散 Transformer。这里是给定单张图像所生成网格的可视化。这类方法的另一个限制是它们通常只能生成以物体为中心的 3D(object-centric),难以处理复杂且昂贵的场景(scene)。未来方向包括生成更通用的 3D、可编辑的 3D,以及动态的 3D 或 4D。总之,人们的目标是实现前向(feed-forward)3D 生成,并使 3D 生成更快、更准确、可编辑且更通用。
- 第一阶段用扩散模型(从头训练或微调现有模型)生成多视图图像
- 3D场景生成
- 我们至少需要使它具备组合感知(composition-aware),也可以从不同视角来分解场景生成(scene generation),包括数据、模型与先验的使用——这部分与物体生成类似,室内与室外场景通常单独处理,以及表示是隐式还是显式等差异。但各方法关注的属性不同。
- 有的注重可通行性(traversability)
- 先从类似物体那样以 2D 数据训练开始,通常从室内场景(indoor)出发;这些样本大多是可通行的(traversible),意思是虽然不是完整的 3D,但具有 3D 感知特性。开创性工作如 GSN,其方法较为标准:构建 3D 空间、采样相机并渲染图像,然后用生成对抗网络训练模型;该方法要求训练时有连续图像和对应的相机轨迹。后续工作 GDI 采用类似框架但用扩散模型训练:它先为每个样本优化潜表示与相机参数,然后用扩散模型学习生成这些潜表示。扩散模型易于加条件,因此能实现多种条件生成,例如以第一张图像为条件生成不同轨迹,或以文本提示为条件(如“穿过走廊”或“上楼梯”)。
- 对于室外场景(outdoor),也有工作尝试,例如 Infinite Nature;严格说来这是一个迭代的图像预测流水线,并不保证任何 3D 属性,它是基于初始图像与相机轨迹生成图像序列,你可以看到随相机移动场景会变化,但 3D 一致性较差。后续工作 Persistent Nature 在相机前后移动或原地旋转时提升了 3D 一致性,但由于方法本质上并非真实 3D,因此难以做到完全一致。
- 有的注重组合性(compositionality)
- 尽管训练数据是图像,但通常需要某些 3D 布局先验,这意味着底层数据实际上仍然是 3D。像 SceneComposer 这类方法利用布局先验,实现场景的组合:分离的物体生成器与背景生成器,并配有场景判别器与物体判别器,从而实现一定程度的场景分解。
- 再说在 3D 数据上训练的情况——有很多相关工作,原因显而易见:收集场景级别(scene-level)3D 数据、且规模合理是非常困难的。我们之前做过一个有趣的项目 Infinite City,它旨在通过结合 2D 与 3D 模型生成任意规模的城市级场景。第一阶段使用 Infinite Pixel Generation 技术生成任意规模的类别深度与法线图,然后将这些图提升(lift)为稀疏 3D 体素并用基于 AR 的模型做 3D 完形补全以提高计算效率,最后以基于网格的神经渲染呈现场景。那时我们没有使用扩散模型只是因为当时 Stable Diffusion 尚不可用。总体来看,3D 结构不错,2D 渲染效果还行,但以今天标准看尚有不足。
- 如何实现“组合性”(compositionality)。主要有三种途径:一是把组合作为输入提供;二是把组合作为可学习参数;三是把组合当作先验来帮助生成。
- 首先,如果给定了 bounding boxes,场景是简化情形,可以用常规 SDS 做生成,这里有一些结果。其次可以利用 L(指语言或标签)先验:有很多方式利用 L,例如只用 L 来识别感兴趣的对象(object of interest)。比如给定“卧室”场景的提示,模型会知道常见感兴趣对象包括床、椅子、桌子,且组合在生成过程中是可学习的。总体思路是用混合表示分别处理前景与背景,感兴趣对象可以由用户指定或由 L 作为先验辅助,然后用粒子群优化(particle swarm optimization)来优化配置,其他步骤类似:使用多种先验(全景深度、透视图等)并用 SDS 做全场景优化。可视化结果显示,给定提示后可生成 3D 场景,前景对象可被操控,前景与背景细节不错,并能支持不同风格与多样场景类别(户外、写实、想象场景等)。
- 另一项工作用图谱(scene graph)和语言模型:GraphStreamer 让 LM 遵循 Visual Genome 的 scene-graph 格式,根据输入文本生成 scene graph,然後把 scene-graph 解码为全局与逐节点的文本描述,再用这些描述去优化基于 SDF 的 3D 对象。示例展示了 scene graph 与对应输出。该 SCA 3D 能直接由 LM 提供一组 3D bounding box,令人印象深刻:在仅用基于文本的数据训练后,LM 展现出隐式的 3D 理解,生成结果质量相当高。但此类成果更像是小型 3D 场景资产,而非我们为更大规模、可通行(traversible)的 VR/AR 场景所需的大场景。
- 有的注重可通行性(traversability)
- Data / Model Usage
- Train on 2D data:只用普通照片训练,优点是数据多、训练容易,但难保证真实的3D一致性。
- Train on 3D data:用点云/多视角/重建数据,能学到真正的几何关系,但数据采集和存储成本高。
- 2D diffusion model as priors:把强大的图像扩散模型当“美学/细节先验”来引导场景生成(比如先生成某帧的图像,再扩展为序列)。
- LLM as priors:用大语言模型提供高层次指令或布局(“从门进入、穿过走廊”),把自然语言变为生成条件。
- Scope
- Indoor(室内):房间、走廊、楼梯——结构规则、可通行性更容易建模,适合从2D到伪3D的训练起步。
- 我们至少需要使它具备组合感知(composition-aware),也可以从不同视角来分解场景生成(scene generation),包括数据、模型与先验的使用——这部分与物体生成类似,室内与室外场景通常单独处理,以及表示是隐式还是显式等差异。但各方法关注的属性不同。