重要提示

您正在查看 NeMo 2.0 文档。此版本引入了 API 的重大更改和一个新的库,NeMo Run。我们目前正在将 NeMo 1.0 中的所有功能移植到 2.0。有关先前版本或 2.0 中尚不可用的功能的文档,请参阅 NeMo 24.07 文档

DreamFusion#

模型介绍#

DreamFusion [MM-MODELS-DF1] 使用预训练的文本到图像扩散模型来执行文本到 3D 合成。该模型使用基于概率密度蒸馏的损失函数,从而能够使用 2D 扩散模型作为先验来优化参数化图像生成器。

通过在类似 DeepDream 的过程中使用此损失函数,该模型通过梯度下降优化随机初始化的 3D 模型(神经辐射场,或 NeRF),使其从随机角度进行的 2D 渲染实现低损失。给定文本的最终 3D 模型可以从任何角度查看,通过任意照明重新照明,或合成到任何 3D 环境中。这种方法不需要 3D 训练数据,也不需要修改图像扩散模型,这证明了预训练图像扩散模型作为先验的有效性。

可以使用 DreamFusion 类实例化 Dreamfusion 模型。

DreamFsuion, overview of the model

图像引导#

DreamFusion 的这一部分涉及模型将文本输入解释和转换为视觉概念的初始阶段。DreamFusion 利用基于扩散的文本到图像模型,处理文本输入,提取关键视觉元素,并将这些元素转换为初始 2D 图像。此过程确保生成的 3D 模型不仅在文本描述方面准确,而且通过根据视角调节 2D 图像,在视觉上也是连贯且详细的。

NeRF(前景)网络#

神经辐射场网络是 DreamFusion 3D 渲染功能的核心。在 DreamFusion 中,NeRF 网络采用从文本描述生成的 2D 图像并构建 3D 模型。该模型表示为连续的体场景函数,其编码空间中点的颜色和密度,从而实现高度详细和逼真的渲染。

背景层#

DreamFusion 可以利用专用于背景建模的背景层。

在需要动态背景的场景中,DreamFusion 可以配置为使用辅助 NeRF 网络来生成背景。该网络与主 NeRF 网络并行运行,专注于为主场景创建连贯且在上下文中合适的背景。它可以动态调整光照和视角变化,保持与前景模型的一致性。

或者,DreamFusion 允许集成静态背景颜色,这在主要关注生成的对象且需要非干扰性背景的场景中特别有用。实现静态颜色背景涉及设置统一的色值,该色值包含 3D 模型的周边。这种方法简化了渲染过程,并且有助于减少计算负载,同时保持对主要对象的关注。

材质网络#

DreamFusion 中的材质网络负责通过准确模拟不同材质的物理特性来为 3D 模型增加真实感。该网络考虑了纹理、反射率和透明度等各个方面。通过这样做,它增加了另一层细节,使 DreamFusion 生成的对象不仅在结构上准确,而且在视觉和触觉上都逼真。

渲染器层#

渲染器层充当 DreamFusion 处理流程的最终阶段。它将来自 NeRF 和材质网络的合成体数据转换为可感知的图像。该层采用光线追踪算法,计算光与 3D 场景的交互,生成具有精确阴影投射、动态光照和透视校正渲染等复杂属性的图像。

模型配置#

可以使用 DreamFusion 类实例化 DreamFusion 模型。模型配置文件分为以下几个部分

_target_: nemo.collections.multimodal.models.nerf.dreamfusion.DreamFusion
defaults:
  - nerf: torchngp
  - background: static
  - material: basic_shading
  - renderer: torchngp_raymarching
  - guidance: sd_huggingface
  - optim: adan
  - loss: dreamfusion
  - data: data
  - _self_

### model options
resume_from_checkpoint:
prompt: 'a hamburger'
negative_prompt: ''
front_prompt: ', front view'
side_prompt: ', side view'
back_prompt: ', back view'
update_extra_interval: 16
guidance_scale: 100
export_video: False

iters: ${trainer.max_steps}
latent_iter_ratio: 0.2
albedo_iter_ratio: 0.0
min_ambient_ratio: 0.1
textureless_ratio: 0.2

data:
  train_dataset:
    width: 64
    height: 64
  val_dataset:
    width: 800
    height: 800
  test_dataset:
    width: 800
    height: 800
  • defaults:定义不同组件(如 nerf、background、material 等)的默认模块。

  • resume_from_checkpoint:用于初始化模型的检查点文件的路径。

  • prompt:用于描述要生成的对象的主文本输入。

  • negative_prompt:描述要避免在生成的对象中出现的内容的文本输入。

  • front_promptside_promptback_prompt:附加到提示的文本输入,用于更详细的定向引导。

  • update_extra_interval:更新内部模块参数的间隔。

  • guidance_scale:与扩散模型一起使用的引导比例。

  • export_video:布尔值,用于确定是否导出生成的对象的 360 度视频。

  • iterslatent_iter_ratioalbedo_iter_ratiomin_ambient_ratiotextureless_ratio:定义迭代行为和输出的视觉特征的各种比率和参数。

  • data:定义用于训练、验证和测试的数据集维度。

通过微调 default 部分中各种组件的参数,可以精确调整管道的行为。某些组件支持不同的后端和实现,完整的组件目录可以在配置目录 {NEMO_ROOT/examples/multimodal/generative/nerf/conf/model} 中查看。

图像引导#

_target_: nemo.collections.multimodal.modules.nerf.guidance.stablediffusion_huggingface_pipeline.StableDiffusion
precision: ${trainer.precision}
model_key: stabilityai/stable-diffusion-2-1-base
t_range: [0.02, 0.98]
  • precision:设置计算精度(例如,FP32 或 FP16)。

  • model_key:指定用于图像引导的预训练模型。

  • t_range:用于引导稳定性的阈值范围。

NeRF(前景)网络#

_target_: nemo.collections.multimodal.modules.nerf.geometry.torchngp_nerf.TorchNGPNerf
num_input_dims: 3
bound: 1
density_activation: exp
blob_radius: 0.2
blob_density: 5
normal_type: central_finite_difference

encoder_cfg:
  encoder_type: 'hashgrid'
  encoder_max_level:
  log2_hashmap_size: 19
  desired_resolution: 2048
  interpolation: smoothstep

sigma_net_num_output_dims: 1
sigma_net_cfg:
  num_hidden_dims: 64
  num_layers: 3
  bias: True

features_net_num_output_dims: 3
features_net_cfg:
  num_hidden_dims: 64
  num_layers: 3
  bias: True

描述 NeRF 网络的架构,包括密度激活函数、网络配置以及 sigma 和特征网络的规范。

背景层#

_target_: nemo.collections.multimodal.modules.nerf.background.static_background.StaticBackground
background: [0, 0, 1]

静态背景,其中背景键是 RGB 颜色。

_target_: nemo.collections.multimodal.modules.nerf.background.torchngp_background.TorchNGPBackground

encoder_type: "frequency"
encoder_input_dims: 3
encoder_multi_res: 6

num_output_dims: 3
net_cfg:
  num_hidden_dims: 32
  num_layers: 2
  bias: True

动态背景,其中背景由 NeRF 网络生成。

材质网络#

_target_: nemo.collections.multimodal.modules.nerf.materials.basic_shading.BasicShading

定义材质网络的基本着色模型。基本着色模型支持无纹理、朗伯和 Phong 着色。

渲染器层#

_target_: nemo.collections.multimodal.modules.nerf.renderers.torchngp_volume_renderer.TorchNGPVolumeRenderer
bound: ${model.nerf.bound}
update_interval: 16
grid_resolution: 128
density_thresh: 10
max_steps: 1024
dt_gamma: 0

配置渲染器,指定更新间隔、网格分辨率和渲染阈值等参数。

DreamFusion-DMTet#

NeRF 模型通过体渲染集成几何形状和外观。因此,当需要捕获表面的复杂细节以及材质和纹理时,使用 NeRF 进行 3D 建模的效果可能较差。

DMTet 微调解耦了几何形状和外观模型的学习,从而可以生成精细的表面和丰富的材质/纹理。为了实现这种解耦学习,使用了 [DMTet](https://nv-tlabs.github.io/DMTet/) 的混合场景表示。

DMTet 模型维护一个可变形四面体网格,该网格编码离散化的有符号距离函数和一个可微的行进四面体层,该层将隐式有符号距离表示转换为显式表面网格表示。

模型配置#

可以使用与 DreamFusion 相同的类 DreamFusion 实例化 DreamFusion 模型。但是,需要对训练管道进行以下更改

_target_: nemo.collections.multimodal.models.nerf.dreamfusion.DreamFusion
defaults:
  - nerf: torchngp
  - background: torchngp
  - material: basic_shading
  - renderer: nvdiffrast            # (1)
  - guidance: sd_huggingface
  - optim: adan
  - loss: dmtet                     # (2)
  - data: data
  - _self_

### model options
resume_from_checkpoint: "/results/DreamFusion/checkpoints/DreamFusion-step\\=10000-last.ckpt"   # (3)
prompt: 'a hamburger'
negative_prompt: ''
front_prompt: ', front view'
side_prompt: ', side view'
back_prompt: ', back view'
update_extra_interval: 16
guidance_scale: 100
export_video: False

iters: ${trainer.max_steps}
latent_iter_ratio: 0.0
albedo_iter_ratio: 0
min_ambient_ratio: 0.1
textureless_ratio: 0.2

data:
  train_dataset:
    width: 512         # (4)
    height: 512        # (4)
  val_dataset:
    width: 800
    height: 800
  test_dataset:
    width: 800
    height: 800

我们注意到以下更改:1. 渲染模块已从基于体积的方法更新为使用 nvdiffrast 的基于栅格化的方法。2. 模型损失已更改,以考虑几何表示中的更改。3. DreamFusion-DMTet 微调预训练的 DreamFusion 模型,预训练的检查点使用 resume_from_checkpoint 提供。4. 训练形状增加到 512x512。

参考文献#

[MM-MODELS-DF1]

Ben Poole、Ajay Jain、Jonathan T. Barron 和 Ben Mildenhall。《Dreamfusion:使用 2D 扩散的文本到 3D》。2022 年。URL:https://arxiv.org/abs/2209.14988