Fantasia3D: 解耦几何和外观以高质量文本生成3D内容
Rui Chen*, Yongwei Chen*, Ningxin Jiao, Kui Jia
ICCV2023
*共同贡献
https://user-images.githubusercontent.com/128572637/fe5a05d3-33af-41c4-a5c0-e74485797f08
https://user-images.githubusercontent.com/128572637/691a1c2d-0c55-4b2e-8dd6-82fddc2685a6
https://user-images.githubusercontent.com/128572637/99ab7e61-eb81-4b75-8138-3321b6633d78
https://user-images.githubusercontent.com/128572637/405fe77e-25c0-410f-b463-e1e3ded2f065
更新日志
请拉取最新代码以提高性能!!
- (2023.10.17)
- 增加关于官方代码和重现版本threestudio性能的FAQ,即Q8。
- (2023.10.13)
- 增加关于过饱和和过平滑外观问题的FAQ,即Q7。
- (2023.09.01)
- 注意:添加负提示可以提高外观建模的视觉质量。详见最新的画廊。
- (2023.08.30)
- 增加两个FAQ。
- (2023.08.29)
- 跳过一些几何建模中不必要的材料预测过程,略微减少训练时间。
- (2023.08.22)
- 注意:对于网格面数要求不高的情况,建议使用128的DMTet分辨率以平衡质量和生成速度。使用128或更低分辨率时,生成速度会明显加快。
- (2023.08.20)
- 注意:不同版本的稳定扩散似乎有不同的性能。在生成头像方面,版本1.5比版本2.1表现更好。
- (2023.08.11)
- 修复了一些情况下几何不平滑的bug。
- (2023.08.06)
- 增加了提高外观真实感的提示。
- (2023.08.05)
- 修复了不同GPU之间种子相同的问题,这可能不会加速收敛。
- 在代码中增加了直接执行UV填充的部分,因此不需要在blender中进行额外操作。
- (2023.07.26)
- 修复了使用切线空间法线的bug。
常见问题
Q1: 关于使用法线图和遮罩图作为稳定扩散模型输入的分析
答案:我们最初的假设是法线图和遮罩图分别代表形状的局部和轮廓信息,可以有助于几何学习。此外,我们观察到法线图的数值范围被归一化为(-1, 1),这与潜空间扩散所需的数据范围一致。我们的实证研究验证了这一假设。进一步支持我们假设的是,在用于训练稳定扩散的LAION-5B数据集中存在法线图(参见网站以检索LAION-5B中的法线数据)。因此,法线数据不被视为稳定扩散的分布外(OOD)输入。为了解决早期学习中粗糙的几何问题,我们直接使用64 × 64 × 4(法线,遮罩)图像作为潜代码,受到Latent-NeRF的启发,以实现更好的收敛。然而,在世界坐标系中不使用VAE编码的法线图可能会导致与VAE训练的潜空间数据分布的不一致。这种不一致可能导致生成的几何偏离文本描述。为了解决这个问题,我们通过随机旋转当前视图渲染的法线图来进行数据增强。这种方法使法线图的分布更接近潜空间数据的分布。我们实验性地观察到它提高了生成几何与文本描述的一致性。随着学习的进展,渲染512 × 512 × 3的高分辨率法线图以捕捉更精细的几何细节变得至关重要,我们选择在后期阶段仅使用法线图。这种策略在几何优化过程中实现了精度和效率的平衡。
Q2: 解耦表示的假设验证分析
答案:之前的方法(例如DreamFusion和Magic3D)将几何和外观生成结合在一起,遵循NeRF。我们采用解耦表示主要是因为生成表面几何和外观的问题性质不同。事实上,当处理从多视图图像中恢复表面几何时,明确考虑表面建模的方法(例如VolSDF,nvdiffrec等)表现更好;我们的解耦表示享有类似于这些方法的优势。解耦表示还使我们能够在外观建模中加入BRDF材料表示,通过BRDF物理先验实现更好地逼真渲染。
Q3: Fantasia3D可以直接调优用户给定的网格吗?
答案:可以,Fantasia3D可以接收用户给定的任何网格并使用我们的方法进行用户引导生成进行调优。它还可以自然地与3D生成方法如shape-e和point-e接口。总之,Fantasia3D可以基于用户给定的低质量网格或椭球生成高度详细和高保真的3D内容。
Q4: 使用官方配置文件时,为什么在使用4或更少的GPU时无法复制相同的结果?
答案:官方配置通常在8个GPU下使用。补充材料中提出的采样算法有助于外观和几何建模中的全球一致性,这需要大批量尺寸。在使用较少的GPU时,总批量大小显著减小,这可能导致无法在官方配置中复制相同的结果。一种可能的解决方案是在配置文件中手动增加批量大小。
Q5: 外观建模中的策略0、 1和2是如何制定的?
答案:策略权重是一个超参数。在DreamFusion中使用的参数,即$\omega(t) =\sigma ^{2}$,是一个随着时间步t增加而增加的方程。这可能适用于体渲染,但不适用于表面渲染。在实践中,我发现使用原始版本的权重会使渲染图像过饱和且缺乏细节和真实感。这可能是由于大t的权重过大引起的。因此,我希望采用随着t增加逐渐减少的权重,所以得到了策略0。至于策略1的提出,我观察到在某些情况下,使用策略0可以产生更逼真的外观,但经常会出现奇怪的颜色。因此,我希望切换到更合适的权重。我随即意识到得分函数本质上是一个指向目标分布的方向梯度,并且它可以随估计噪声转换,所以我提出了策略1,即
s(z_{t};t) =-\frac{1}{\sigma _{t}}\varepsilon(z_{t};t),
其中$s$是得分函数。在实践中,我观察到它可以有效缓解在与时间步范围[0.02, 0.98]结合使用时出现的奇怪颜色问题。然而,在某些情况下,使用策略1可能会导致不真实的结果,因为小t的权重过大,导致向目标分布的小步,始终处于分布外(OOD)状态。因此,提出了策略2来结合策略0和策略1的优点。
Q6: 如何使生成结果更加多样化?
答案:与基于Nerf的体积渲染不同,直接使用表面渲染生成3D资产可以实现多样化。您只需要在配置文件中更改参数即可实现。例如,不同的"sdf_init_shape_scale","translation_y","camera_random_jitter","fovy_range","negative_text”等可以带来不同的结果。
Q7: Fantasia3D能否生成没有过饱和和过平滑的逼真外观? 回答:是的,可以。单独使用原始的SDS损失结合消极提示和Fantasia3D中提出的策略2,就足以解决过度饱和和过度平滑的问题。Sweetdreamer中的DMTet画廊的外观是使用Fantasia3D中的外观建模代码生成的。你可以看到,所有的结果都高度详细,并且没有过度饱和和过度平滑的问题。我认为关键在于解耦表示以及采用了消极提示和策略2。推荐的消极提示是“影子,过度饱和,低质量,不现实”。推荐的积极提示是“单反相机拍摄的...”。
问题8:官方代码和threestudio重现版本之间有什么区别?
回答:在几何建模方面,官方代码具有更强的泛化能力,更稳定的训练过程和更平滑的几何形状。在外观建模方面,官方代码没有过度饱和和过度平滑的问题,并且具有目前最先进的文本到纹理生成性能,如问题7所述。
你想要什么?
考虑到参数调优可能需要一些经验,请告诉我你想要生成什么样的对象?请在问题区随意发言。我会花一些时间实现一些需求,并更新相应的配置文件,以方便你的重现。
对Fantasia3D的贡献
首先,使用这个网站将gif转换为视频,包括几何或外观,并将其上传到画廊。写下生成对象的文本,性能,几何建模的四面体的分辨率,以及外观建模采用的策略。
随后,在configs
目录下上传配置文件。如果你要上传用户引导生成的文件,指导网格也应上传到data
目录下。文件的命名规则如下:
对于零样本几何建模的文件:
{文本关键词}_geometry_zero_shot_{gpu数量}_gpu.json
对于用户引导几何建模的文件:
{文本关键词}_geometry_user_guided_{gpu数量}_gpu.json
对于外观建模的文件:
{文本关键词}_appearance_strategy{采用的策略}_{gpu数量}_gpu.json
安装
- 系统要求:Ubuntu20.04
- 测试的GPU:RTX3090,RTX4090,A100,V100
我们提供了两种安装环境的选择。
-
(选项1)使用requirements.txt文件逐个安装所有包。由于某些包的复杂性,可能会失败。
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install -r requirements.txt
-
(选项2)使用Docker镜像在Ubuntu系统下快速部署环境。
docker pull registry.cn-guangzhou.aliyuncs.com/baopin/fantasia3d:1.0
(可选)由于网络延迟,该Docker镜像中未安装xformers包。创建Docker容器后手动安装,以加速几何和外观建模的训练。
pip install git+https://github.com/facebookresearch/xformers.git@main#egg=xformers
环境成功部署后,克隆Fantasia3D的库并开始。
git clone https://github.com/Gorilla-Lab-SCUT/Fantasia3D.git
cd Fantasia3D
开始
论文中的所有结果都使用8块3090 GPU生成。我们不能保证少于8块GPU可以达到相同的效果。
- 零样本生成
# 多GPU训练
...
# 使用8块GPU进行几何建模
python3 -m torch.distributed.launch --nproc_per_node=8 train.py --config configs/car_geometry.json
# 使用4块GPU进行几何建模
python3 -m torch.distributed.launch --nproc_per_node=4 train.py --config configs/car_geometry.json
# 使用8块GPU进行外观建模
python3 -m torch.distributed.launch --nproc_per_node=8 train.py --config configs/car_appearance_strategy0.json
# 使用4块GPU进行外观建模
python3 -m torch.distributed.launch --nproc_per_node=4 train.py --config configs/car_appearance_strategy0.json
...
# 单GPU训练(只在菠萝上测试)。
# 几何建模。在3090 GPU上大约需要15分钟。
python3 train.py --config configs/pineapple_geometry_single_gpu.json
# 外观建模。在3090 GPU上大约需要15分钟。
python3 train.py --config configs/pineapple_appearance_strategy0_single_gpu.json
- 用户引导生成
# 多GPU训练
...
# 使用8块GPU进行几何建模
python3 -m torch.distributed.launch --nproc_per_node=8 train.py --config configs/Gundam_geometry.json
# 使用4块GPU进行几何建模
python3 -m torch.distributed.launch --nproc_per_node=4 train.py --config configs/Gundam_geometry.json
# 使用8块GPU进行外观建模
python3 -m torch.distributed.launch --nproc_per_node=8 train.py --config configs/Gundam_appearance.json
# 使用4块GPU进行外观建模
python3 -m torch.distributed.launch --nproc_per_node=4 train.py --config configs/Gundam_appearance.json
...
# 单GPU训练
# 几何建模(未测试)
python3 train.py --config configs/Gundam_geometry.json
# 外观建模(未测试)
python3 train.py --config configs/Gundam_appearance.json
提示
-
(两者) 训练更长时间。 训练更长时间可能有助于细节的提高。你可以通过设置参数"iter"来延长训练时间。
-
(两者) 更大的批量大小。 更大的批量大小可以帮助更快地收敛。相应的参数是"batch"。
-
(两者) 尝试不同的种子。 不同的种子可以带来多样的结果。
-
(两者) 缩放对象。 增加初始化对象在视野=45屏幕中的比例可以增强几何和外观建模的质量。对于几何建模,它可以获得更多的局部几何细节。对于外观建模,这种方法可以减少出现饱和或奇怪颜色的概率,因为它减少了图像中背景颜色的比例。我们发现,如果背景颜色的比例太高,容易导致饱和和奇怪的颜色。
-
(几何建模) 提供目标形状的比例先验。 你可以将默认的半径为1的球体缩放为椭球体。例如,如果你想生成“由奶酪制成的车”,可以使椭球体在z轴上的半径更大。
"mode": "geometry_modeling", "sdf_init_shape": "ellipsoid", "sdf_init_shape_scale": [0.56, 0.56, 0.84]
有些情况椭球体不能提供比例先验,例如生成某些动物时,使用椭球体初始化容易导致生成的动物有多个脚。可使用以下命令检查:
python3 -m torch.distributed.launch --nproc_per_node=8 train.py --config configs/elephant_geometry_fail_multi_face.json
相反,你可以使用四足动物的草图形状作为比例先验来生成任何你想要的动物形状。
python3 -m torch.distributed.launch --nproc_per_node=8 train.py --config configs/elephant_geometry_succeed.json
在其他情况中,如生成类似人类的形体,可以使用人类草图形状。
python3 -m torch.distributed.launch --nproc_per_node=8 train.py --config configs/Gundam_geometry.json
-
(几何建模) 增加早期阶段的迭代次数。 早期阶段对于创造一个粗略且正确的形状非常关键。后期阶段只注重获得更精细的几何细节,所以整体形状不会有显著变化。如果你发现几何形状的轮廓不符合文本描述,可以增加参数"coarse_iter"的次数。
-
(几何建模) 使用更高的四面体分辨率。 在对网格面的数量要求不高的情况下,我推荐使用128的DMTet分辨率,以在质量和生成速度之间取得平衡。当使用128或更低分辨率时,生成速度显著加快。更高的分辨率能带来更多的局部几何细节。你可以通过将参数"dmtet_grid"的值修改为128或256来轻松改变分辨率。如果你发现在使用256分辨率时网格快速消失或分散,将SDS损失的指导权重从默认的100减少到50。据我的经验,单个GPU适合使用128分辨率而不是256。如果你想在256分辨率下获得高细节模型,多GPU训练是必要的。此外,对于明显具有方向性的物体,如人头雕像,多GPU效果比单GPU要好得多。顺便提一下,使用梯度累积技术可能可以使单个GPU达到多GPU的效果,但我还没有测试过。
-
(几何建模) 在早期阶段使用不同的时间步长范围。 我们通常在早期阶段使用时间步长范围[0.02,0.5]。但在某些情况下,如果你想基于初始化形状“生长”更多部件,可能无法生成所有部件。例如,文本“一个骑马的宇航员”可能无法在使用[0.02, 0.5]范围内“生长”宇航员部分,因为较低的时间步长对显著变形贡献较少。为了解决这个问题,我们建议使用较高的范围,例如[0.4, 0.6]。你可以尝试不同的范围并在问题中发布你的发现。
-
(几何建模) 旋转物体。 根据实际情况旋转物体可以缓解janus问题或帮助网络寻找模式。例如,在生成人头雕像时,将初始化的椭球体绕x轴旋转一些角度,以匹配人物后脑勺有一定曲率的情况。
-
(几何建模) 微调输入网格。 在用户引导生成任务下,如果你对输入网格的轮廓满意,只想增加几何细节,可以将参数“coarse_iter”设置为400。此设置将直接进入几何建模的后期阶段,以加强输入形状的局部几何细节。
-
(外观建模) 采用不同策略。 我们通过设置参数“sds_weight_strategy”提供三种策略(0 或 1 或 2)来优化外观。策略0会有更强的光影变化,表现出更逼真的最终外观。策略1或策略2的最终外观会更平滑、更舒适。如果目标外观过于简单,例如“一个细节丰富的西奥多罗斯·科洛科特罗尼斯石膏像”、“一个站立的大象”和“米开朗基罗风格的雕像正在看手机新闻的狗狗”,使用策略0可能会导致外观过饱和和颜色奇怪。在这种情况下,策略1或策略2比策略0能生成更自然的颜色。
策略0可以按以下方式使用:
"sds_weight_strategy": 0, "early_time_step_range": [0.02, 0.98], "late_time_step_range": [0.02, 0.5]
或
"sds_weight_strategy": 0, "early_time_step_range": [0.02, 0.98], "late_time_step_range": [0.02, 0.98]
策略1可以按以下方式使用:
"sds_weight_strategy": 1, "early_time_step_range": [0.02, 0.98], "late_time_step_range": [0.02, 0.7]
或
"sds_weight_strategy": 1, "early_time_step_range": [0.02, 0.98], "late_time_step_range": [0.02, 0.98]
策略2可以按以下方式使用:
"sds_weight_strategy": 2, "early_time_step_range": [0.02, 0.98], "late_time_step_range": [0.02, 0.98]
-
(外观建模) 使用不同的HDR环境贴图。 学习PBR材料是一个不适定问题。如果材料和光照一起学,会增加学习的难度。因此,我们使用固定的HDR光来优化外观。我们注意到,亮度分布均匀的HDR贴图(如多云天)有利于外观颜色的均匀性。一些不均匀的亮度分布可能会产生更逼真的效果(未经测试)。
-
(外观建模) 使用一些附加提示。 使用一些附加提示,例如“一个单反相机拍摄的 {你的文本},黑色背景”,可以在大多数情况下提高外观的真实性(但不是所有情况)。
-
(外观建模) 添加负面提示。 设置适当的负面提示可以提高外观建模中的视觉质量。
坐标系统
演示
你可以在Google drive 下载并观看一些演示的训练过程。 更多演示请参见这里
https://user-images.githubusercontent.com/128572637/e3e8bb82-6be0-42d0-9da3-1e59664354dd
https://user-images.githubusercontent.com/128572637/856c12bf-f100-47fc-a22c-80f123bd0a6d
https://user-images.githubusercontent.com/128572637/5872edbf-f87f-4dfe-9f71-f3941b84b8d7
https://user-images.githubusercontent.com/128572637/17ce275c-26bc-482e-ab61-a61f442de458
https://user-images.githubusercontent.com/128572637/a0d6fe70-b055-44a9-a34d-1449672dca7f
https://user-images.githubusercontent.com/128572637/ed0c303c-7554-4589-a1f5-56c9c1916aef
https://user-images.githubusercontent.com/128572637/c9867d8e-8e61-4a09-afd2-5599d6a85074
https://user-images.githubusercontent.com/128572637/01b1cc2c-5c5f-478a-83d0-1dd0ae2ee9e2
https://user-images.githubusercontent.com/128572637/0a909afb-e18c-4450-8ac8-35d50ced754a
https://user-images.githubusercontent.com/128572637/dcc5c159-fc3e-4eb8-9017-72153196f5b4
https://user-images.githubusercontent.com/128572637/af266a61-afd4-451b-b4b8-89e77e96233e
https://user-images.githubusercontent.com/128572637/c0a09f43-c07f-43e9-ab9f-c49aa3bc3e2c
https://user-images.githubusercontent.com/128572637/0071b97a-93ce-4332-9f80-a3297b54f8c3
https://user-images.githubusercontent.com/128572637/27d2bce3-f126-4f91-9bcd-1199563618e8
https://user-images.githubusercontent.com/128572637/4c3e3783-2297-4b52-b67d-3c5cff4db4f4
https://user-images.githubusercontent.com/128572637/5d8f7b7f-141d-4800-8772-8fc132522390
https://user-images.githubusercontent.com/128572637/3e23c5f1-31d8-49a8-9013-123a6e97ac3b
https://user-images.githubusercontent.com/128572637/162adc7d-a416-49e5-8dde-73590119b1a9
https://user-images.githubusercontent.com/128572637/2b20a978-df20-4150-b272-5dac58d64908
待办事项
- 发布代码。(2023.06.15)
- 支持单GPU训练的梯度累积技术。
- 支持由ProlificDreamer提出的VSD损失。
致谢
引文
@InProceedings{chen2023fantasia3d,
author={Chen, Rui and Chen, Yongwei and Jiao, Ningxin and Jia, Kui},
title={Fantasia3D: Disentangling Geometry and Appearance for High-quality Text-to-3D Content Creation},
booktitle={Proceedings of the IEEE/CVF International Conference on Computer Vision (ICCV)},
month={October},
year={2023},
pages={22246-22256}
}