Basile Van Hoorick、Rundi Wu、Ege Ozguroglu、Kyle Sargent、刘若诗、Pavel Tokmakov、Achal Dave、Changxi Cheng、Carl Vondrick
哥伦比亚大学、斯坦福大学、丰田研究所
发表于ECCV 2024(口头)
纸|网站 |结果 |数据集 |型号
该存储库包含作为我们的论文“生成相机多莉:极端单目动态小说视图合成” (缩写为GCD )的一部分发布的 Python 代码。
我们提供设置说明、预训练模型、推理代码、训练代码、评估代码和数据集生成。
请注意,我重构并清理了公开发布的代码库,主要是为了简化结构以及增强可读性和模块化,但我还没有彻底审查所有内容,所以如果您遇到任何问题,请通过打开问题告诉我们,如果有任何可能的错误修复,请随时提出建议。
目录:
我建议设置虚拟环境并安装必要的软件包,如下所示:
conda create -n gcd python=3.10
conda activate gcd
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia
pip install git+https://github.com/OpenAI/CLIP.git
pip install git+https://github.com/Stability-AI/datapipelines.git
pip install -r requirements.txt
该项目主要是使用 PyTorch 2.0.1 版本开发的,但是,它也应该适用于更高版本。特别是,到目前为止,我在使用 PyTorch 2.3.1 时没有遇到任何问题,这是撰写本文时的最新版本。
请注意,需求文件没有指定包版本,因为我喜欢灵活性(添加版本约束将使在新项目中采用现有代码库变得更加麻烦)。但是,如果您遇到任何问题,请通过提出问题来告知我们。我还在requirements_versions.txt
中提供了确切的版本供您参考。
子文件夹gcd-model
最初基于官方 Stability AI 生成模型存储库。
以下是我们在实验中训练和使用的主要Kubric-4D检查点,以及测试集上的 PSNR 值。左栏表示相机水平旋转的最大位移。
方位角 | 循序渐进 | 直接的 |
---|---|---|
最大90度 | 链路(17.88 分贝) | 链路(17.23 分贝) |
最大180度 | 链路(17.81 分贝) | 链路(16.65 分贝) |
以下是我们在实验中训练和使用的主要ParallelDomain-4D检查点,以及测试集上的 PSNR 或 mIoU 值。左列表示预测的输出模式(输入始终为 RGB)。
模态 | 循序渐进 | 直接的 |
---|---|---|
颜色(RGB) | 链路(23.47 分贝) | 链路(23.32 分贝) |
语义学 | 链接 (39.0%) | 链接 (36.7%) |
以上所有检查点的大小均为 20.3 GB。将它们放在pretrained/
中,使其与相应的 config .yaml
文件具有相同的名称。
本部分用于在自定义视频上随意运行我们的模型。要对 Kubric-4D 或 ParallelDomain-4D 进行彻底的定量评估,或在这两个数据集之外将结果和可视化保存到磁盘的任何命令行推理,请参阅下面的评估部分。
对于Kubric-4D模型,运行:
cd gcd-model/
CUDA_VISIBLE_DEVICES=0 python scripts/gradio_app.py --port=7880
--config_path=configs/infer_kubric.yaml
--model_path=../pretrained/kubric_gradual_max90.ckpt
--output_path=../eval/gradio_output/default/
--examples_path=../eval/gradio_examples/
--task_desc='Arbitrary monocular dynamic view synthesis on Kubric scenes up to 90 degrees azimuth'
要尝试其他模型,只需更改config_path
、 model_path
和task_desc
,例如ParallelDomain-4D模型:
cd gcd-model/
CUDA_VISIBLE_DEVICES=1 python scripts/gradio_app.py --port=7881
--config_path=configs/infer_pardom.yaml
--model_path=../pretrained/pardom_gradual_rgb.ckpt
--output_path=../eval/gradio_output/default/
--examples_path=../eval/gradio_examples/
--task_desc='Upward monocular dynamic view synthesis on ParallelDomain scenes (RGB output)'
对于 Kubric-4D 和/或 ParallelDomain-4D 的训练和评估,您需要预处理数据集并存储合并的点云。这是因为数据集本身仅提供来自某些视点的 RGB-D 视频,但我们希望在 4D 场景中自由飞行,并允许学习任意相机控制(和插值轨迹)。
对于Kubric-4D :
cd data-gen/
python convert_pcl_kubric.py --gpus=0,0,1,1 --start_idx=0 --end_idx=3000
--input_root=/path/to/Kubric-4D/data
--output_root=/path/to/Kubric-4D/pcl
这里, /path/to/Kubric-4D/data
应该是包含scn00000
、 scn00001
等的文件夹。该脚本将从data
中读取数据并写入pcl/
(确保您有 7.0 TB 的可用空间)。
对于ParallelDomain-4D :
cd data-gen/
python convert_pcl_pardom.py --gpus=0,0,1,1 --start_idx=0 --end_idx=1600
--input_root=/path/to/ParallelDomain-4D/data
--output_root=/path/to/ParallelDomain-4D/pcl
这里, /path/to/ParallelDomain-4D/data
应该是包含scene_000000
、 scene_000001
等的文件夹。该脚本将从data/
读取并写入pcl/
(确保您有 4.4 TB 的可用空间)。
上述两个转换脚本主要依靠GPU进行快速处理,并且可以在进程级别应用并行化。例如, --gpus=0,0,1,1
表示生成 4 个工作线程(每个 GPU 2 个)。在训练期间,大部分磁盘 I/O 将集中在pcl/
文件夹中,因此我建议将其存储在快速的本地 SSD 上。
如果您正在对自己的数据集进行训练,我建议使用提供的代码作为参考来创建新的数据加载器。如果您正在使用我们的数据,请首先按照上面的数据集处理部分进行操作。
首先,下载以下两个可用的稳定视频扩散检查点之一:SVD(14 帧)或 SVD-XT(25 帧),并将其放置在pretrained/
中(或更新下面引用的配置文件中的检查点路径)。由于资源限制,我们在实验中仅使用 14 帧版本的 SVD,因此如果您使用 25 帧 SVD-XT,请更改其他相关配置值。
要在Kubric-4D上开始 GCD 训练(逐渐,最大 90 度):
cd gcd-model/
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py
--base=configs/train_kubric_max90.yaml
--name=kb_v1 --seed=1234 --num_nodes=1 --wandb=0
model.base_learning_rate=2e-5
model.params.optimizer_config.params.foreach=False
data.params.dset_root=/path/to/Kubric-4D/data
data.params.pcl_root=/path/to/Kubric-4D/pcl
data.params.frame_width=384
data.params.frame_height=256
data.params.trajectory=interpol_linear
data.params.move_time=13
data.params.camera_control=spherical
data.params.batch_size=4
data.params.num_workers=4
data.params.data_gpu=0
lightning.callbacks.image_logger.params.batch_frequency=50
lightning.trainer.devices="1,2,3,4,5,6,7"
要切换到直接视图合成模型(无插值),请调整此值: data.params.move_time=0
。要增加最大水平旋转(方位角)角度,请选择另一个配置文件: train_kubric_max180.yaml
。
生成的模型将能够对任何 RGB 视频执行 3-DoF 单目动态新颖视图合成,但通常在 Kubric 域和其他不包含人类的视频中表现最佳。
要在ParallelDomain-4D上开始 GCD 训练(渐变,RGB):
cd gcd-model/
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py
--base=configs/train_pardom_rgb.yaml
--name=pd_v1 --seed=1234 --num_nodes=1 --wandb=0
model.base_learning_rate=2e-5
model.params.optimizer_config.params.foreach=False
data.params.dset_root=/path/to/ParallelDomain-4D/data
data.params.pcl_root=/path/to/ParallelDomain-4D/pcl
data.params.split_json=../eval/list/pardom_datasplit.json
data.params.frame_width=384
data.params.frame_height=256
data.params.output_modality=rgb
data.params.trajectory=interpol_sine
data.params.move_time=13
data.params.modal_time=0
data.params.camera_control=none
data.params.batch_size=4
data.params.num_workers=4
data.params.data_gpu=0
lightning.callbacks.image_logger.params.batch_frequency=50
lightning.trainer.devices="1,2,3,4,5,6,7"
要切换到直接视图合成模型(无插值),请调整此值: data.params.move_time=0
。要将输出模式更改为语义类别,请选择另一个配置文件: train_pardom_semantic.yaml
。
由此产生的模型将能够在任何 RGB 视频上执行向上单目动态新颖视图合成,但通常在街道层面记录的面向前方的驾驶场景(合成的和真实的)上表现最佳。我还拥有能够在此数据集上进行 3-DoF 相机控制(自我到环绕以及环绕到环绕变换)的内部模型,尽管它们不是我们论文中实验的一部分,但我可能会这样做。将来在这里展示和/或发布它们。
请注意,在上述所有命令中,GPU 索引 0 ( data.params.data_gpu
) 保留用于在从pcl/
中缓存的合并点云加载数据期间动态构建(输入、地面实况)视频对。我建议不要在同一个 GPU 上训练网络,这就是为什么lightning.trainer.devices
是不相交的,而是覆盖所有剩余的 GPU。
在提供的示例中,每个 GPU 的 VRAM 使用量约为 50 GB。 VRAM 的三个最大决定因素是:(1) 批量大小、(2) 空间分辨率( frame_width
和frame_height
)、(3) 帧数(SVD 与 SVD-XT)以及 (4) 是否使用 EMA 权重平均已激活。我们的大多数实验都是在具有 8 个 NVIDIA A100 或 8 个 NVIDIA A6000 设备的单节点上完成的,由于计算有限,所有实验都没有使用 EMA。
日志和可视化将存储到logs/
文件夹内的一个带日期的子文件夹中,该文件夹与gcd-model/
位于同一级别。对于每次运行,训练可视化都存储在visuals/
子文件夹中。如果训练被中断,您可以通过将--resume_from_checkpoint
指向最新的有效检查点文件来恢复,例如--resume_from_checkpoint=../logs/2024-02-30T12-15-05_kb_v1/checkpoints/last.ckpt
。
以下脚本生成多种类型的输出用于目视检查和评估,并且必须针对每个基准进行调整。对于更简单的操作,请参阅上面的推理部分。如果您使用我们的数据,请确保首先遵循上面的数据集处理部分。如果您正在使用真实数据评估自己的自定义数据集,我建议创建一个新的数据加载器并修改下面的测试脚本。
要在Kubric-4D上评估 GCD 微调模型,请更新kubric_test20.txt
中的路径并运行:
cd gcd-model/
CUDA_VISIBLE_DEVICES=0,1 python scripts/test.py --gpus=0,1
--config_path=configs/infer_kubric.yaml
--model_path=../logs/*_kb_v1/checkpoints/epoch=00000-step=00010000.ckpt
--input=../eval/list/kubric_test20.txt
--output=../eval/output/kubric_mytest1
--control_json=../eval/list/kubric_valtest_controls_gradual.json
--control_idx=0 --autocast=1 --num_samples=2 --num_steps=25
为了一致性和公平性,此命令应用与每个场景关联的一组确定性摄像机角度和帧边界,如kubric_valtest_controls_gradual.json
中所述。这些数字仅随机生成一次,随后保持固定,但输入视角(即spherical_src
)与数据集中的视图索引 4 对齐。如果您正在评估直接视图综合模型,请将其更改为kubric_valtest_controls_direct.json
。此外,您可以通过增加--num_samples
(相同的控件)或改变--control_idx
(每个场景的不同控件)来评估多个样本。
要在ParallelDomain-4D上评估 GCD 微调模型,请更新pardom_test20.txt
中的路径并运行:
cd gcd-model/
CUDA_VISIBLE_DEVICES=0,1 python scripts/test.py --gpus=0,1
--config_path=configs/infer_pardom.yaml
--model_path=../logs/*_pd_v1/checkpoints/epoch=00000-step=00010000.ckpt
--input=../eval/list/pardom_test20.txt
--output=../eval/output/pardom_mytest1
--control_json=../eval/list/pardom_valtest_controls.json
--control_idx=0 --autocast=1 --num_samples=2 --num_steps=25
与之前类似,同样为了一致性和公平性,控制信号pardom_valtest_controls.json
仅包含每个场景的帧边界(即偏移和间隔)。
在所有情况下,对于--model_path
参数, grep
都用于处理通配符,这样您就不必担心必须写入日期。相应的地面实况帧也会被渲染并存储在输出文件夹中,以便进行数值评估(请参阅下面的指标)。
如果您想忽略提供的 JSON 控件,而是使用 Kubric-4D 中选定的角度和帧边界以更自由的方式运行评估:
cd gcd-model/
CUDA_VISIBLE_DEVICES=0,1 python scripts/test.py --gpus=0,1
--config_path=configs/infer_kubric.yaml
--model_path=../logs/*_kb_v1/checkpoints/epoch=00000-step=00010000.ckpt
--input=../eval/list/kubric_test20.txt
--output=../eval/output/kubric_mytest2_cc
--azimuth_start=70.0 --elevation_start=10.0 --radius_start=15.0
--delta_azimuth=30.0 --delta_elevation=15.0 --delta_radius=1.0
--frame_start=0 --frame_stride=2 --frame_rate=12
--reproject_rgbd=0 --autocast=1 --num_samples=2 --num_steps=25
在 ParallelDomain-4D 中,六个与姿势相关的参数不适用,但仍然可以选择视频剪辑帧边界。
上面的test.py
脚本将每个场景的*_metrics.json
文件保存在extra/
子文件夹下,其中包含整体以及每帧的 PSNR 和 SSIM 数字。它还将所有单独的输入、预测和目标帧保存为模型处理的每个示例的图像。如果您想计算附加和/或聚合指标,请随意在您自己的定量评估工作流程中使用这些不同的输出。
与主要评估部分相比,该脚本不依赖于可能不存在的基本事实。与推理(渐变)部分相比,此脚本导出更多信息和可视化。
准备视频文件或图像文件夹的直接路径,或者视频文件或图像文件夹的列表(在具有完整路径的.txt
文件中),然后运行:
cd gcd-model/
CUDA_VISIBLE_DEVICES=0 python scripts/infer.py --gpus=0
--config_path=configs/infer_kubric.yaml
--model_path=../pretrained/kubric_gradual_max90.ckpt
--input=/path/to/video.mp4
--output=../eval/output/kubric_myinfer1
--delta_azimuth=30.0 --delta_elevation=15.0 --delta_radius=1.0
--frame_start=0 --frame_stride=2 --frame_rate=12
--autocast=1 --num_samples=2 --num_steps=25
请注意, --frame_rate
应反映输入视频的时间子采样之后的目标 FPS,而不是之前。如果您想评估多个示例,我建议通过设置--input=/path/to/list.txt
使用列表来减少模型加载开销。
如果您想使用与我们实验中相同的数据,请参阅此下载链接以获取 Kubric-4D 和 ParallelDomain-4D 的说明和副本。本节的其余部分重点讨论您是否希望调整我们的管道和/或生成您自己的合成数据。
请按照以下说明安装 OpenEXR 库。然后,运行以下命令来准备您的环境:
conda activate gcd
pip install bpy==3.4.0
pip install pybullet
pip install OpenEXR
cd data-gen/kubric/
pip install -e .
子文件夹data-gen/kubric
与官方 Google Research Kubric 存储库的提交基本相同,但我添加了一个小错误修复,以避免处理深度图时的竞争条件。
这是我们用来生成最终 Kubric-4D 数据集的命令(注意rm -rf /tmp/
行):
cd data-gen/
for i in {1..110}
do
python export_kub_mv.py --mass_est_fp=gpt_mass_v4.txt
--root_dp=/path/to/kubric_mv_gen
--num_scenes=3000 --num_workers=10 --restart_count=30
--seed=900000 --num_views=16 --frame_width=576 --frame_height=384
--num_frames=60 --frame_rate=24 --save_depth=1 --save_coords=1
--render_samples_per_pixel=16 --focal_length=32
--fixed_alter_poses=1 --few_views=4
rm -rf /tmp/
done
该数据集基本上是 TCOW Kubric 的变体,包括更多动态对象和增加的质量真实性等改进。详细信息请参阅 TCOW 补充材料。
出于 GCD 的目的,我们渲染来自静态摄像机的 16 个同步多视图视频。四个视点位于45度的高仰角,另外十二个视点位于5度的低仰角。我建议检查export_kub_mv.py
以更深入地了解其参数和逻辑。
所有场景都是生成 iid,因此在我们的数据集版本中,我们将前 2800 个场景定义为训练集,最后 100 + 100 个分别定义为验证集 + 测试集。外部 for 循环定期清除/tmp/
文件夹以避免磁盘空间问题。
该数据集来自服务,无法重新生成。请参阅我们副本的下载链接。
请注意,某些场景文件夹不存在(有 1531 个场景文件夹,但索引高达 2143),并且某些场景有几个丢失的帧,这就是为什么我们的数据加载器被设计为对这两个问题都具有鲁棒性。在训练期间您可能会看到一些警告消息,但这是正常的。此外,与 Kubric 不同,场景与索引不相关,因此在pardom_datasplit.json
中,我们预先选择了随机子集进行训练、验证和测试。
我们将验证集 + 测试集大小分别定义为 61 + 61 个场景(每个场景约占总数据集的 4%)。
我编写了一些基于 TRI camviz 的工具,可以在本地计算机上以交互方式可视化来自 Kubric-4D 和 ParallelDomain-4D 的示例场景。我可能稍后会在这里发布它们,但请随时与我(Basile)联系以获取源代码。
如果您在工作中使用此代码库(或其任何重要部分,例如微调 SVD 所需的更改),请引用我们的论文:
@article{vanhoorick2024gcd,
title={Generative Camera Dolly: Extreme Monocular Dynamic Novel View Synthesis},
author={Van Hoorick, Basile and Wu, Rundi and Ozguroglu, Ege and Sargent, Kyle and Liu, Ruoshi and Tokmakov, Pavel and Dave, Achal and Zheng, Changxi and Vondrick, Carl},
journal={European Conference on Computer Vision (ECCV)},
year={2024}
}
我还建议引用原始 SVD 论文:
@article{blattmann2023stable,
title={Stable video diffusion: Scaling latent video diffusion models to large datasets},
author={Blattmann, Andreas and Dockhorn, Tim and Kulal, Sumith and Mendelevitch, Daniel and Kilian, Maciej and Lorenz, Dominik and Levi, Yam and English, Zion and Voleti, Vikram and Letts, Adam and others},
journal={arXiv preprint arXiv:2311.15127},
year={2023}
}
如果您在工作中使用我们的数据集之一,请同时引用相应的来源:
@article{greff2021kubric,
title = {Kubric: a scalable dataset generator},
author = {Klaus Greff and Francois Belletti and Lucas Beyer and Carl Doersch and Yilun Du and Daniel Duckworth and David J Fleet and Dan Gnanapragasam and Florian Golemo and Charles Herrmann and others},
booktitle = {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
year = {2022},
}
@misc{parallel_domain,
title = {Parallel Domain},
year = {2024},
howpublished={url{https://paralleldomain.com/}}
}