指令驱动NeRF到NeRF:使用指令编辑3D场景
这是指令驱动NeRF到NeRF的官方实现。
安装
1. 安装Nerfstudio依赖项
指令驱动NeRF到NeRF基于Nerfstudio构建,因此有相同的依赖要求。具体需要PyTorch和tinycudann。
按照这个链接上的说明创建环境并安装依赖项。只需跟随到tinycudann的部分。依赖项安装完成后,返回此处继续操作。
2. 安装指令驱动NeRF到NeRF
依赖项安装完成后,可以使用以下命令安装指令驱动NeRF到NeRF:
pip install git+https://github.com/ayaanzhaque/instruct-nerf2nerf
可选: 如果您想直接使用代码,可以克隆并安装仓库:
git clone https://github.com/ayaanzhaque/instruct-nerf2nerf.git
cd instruct-nerf2nerf
pip install --upgrade pip setuptools
pip install -e .
3. 检查安装
以下命令应该包含in2n
作为选项之一:
ns-train -h
使用指令驱动NeRF到NeRF
要编辑NeRF,首先必须使用您的数据训练一个常规的nerfacto
场景。关于如何处理您的自定义数据,请参考此文档。
一旦您有了自定义数据,就可以使用以下命令训练初始NeRF:
ns-train nerfacto --data {PROCESSED_DATA_DIR}
关于训练NeRF的更多细节,请参阅Nerfstudio文档。
训练完场景后,检查点会被保存到outputs
目录。复制nerfstudio_models
文件夹的路径。
要开始编辑NeRF的训练,请运行以下命令:
ns-train in2n --data {PROCESSED_DATA_DIR} --load-dir {outputs/.../nerfstudio_models} --pipeline.prompt {"prompt"} --pipeline.guidance-scale 7.5 --pipeline.image-guidance-scale 1.5
{PROCESSED_DATA_DIR}
必须与训练原始NeRF时使用的路径相同。使用CLI命令,您可以选择用于InstructPix2Pix的提示和指导尺度。
NeRF训练完成后,您可以使用标准的Nerfstudio工作流程进行渲染,详见此处。
训练注意事项
重要
请注意,如果训练NeRF的图像分辨率大于512,InstructPix2Pix很可能会抛出OOM错误。而且,InstructPix2Pix在更高分辨率的图像上的性能明显下降。我们建议以大约512(最大尺寸)的分辨率进行训练,因此在您的nerfacto
和in2n
训练命令后面添加以下标签:nerfstudio-data --downscale-factor {2,4,6,8}
。或者,您可以自己缩小数据集并更新transforms.json
文件(缩小w,h,fl_x,fl_y,cx,cy),或者使用Nerfstudio提供的较小的图像尺度。
我们建议使用Polycam拍摄的数据,因为较小的数据集可以更好、更快地与我们的方法配合使用。
如果您有多个GPU,可以将InstructPix2Pix放在单独的GPU上来加快训练速度。要这样做,请添加--pipeline.ip2p-device cuda:{device-number}
到您的训练命令。
我们的方法使用约16K光线和LPIPS,但并非所有GPU都有足够的内存来运行此配置。因此,我们提供了两种使用更少内存的替代配置,但请注意这些配置会降低性能。差异在于InstructPix2Pix使用的精度,以及是否使用LPIPS(需要4倍的光线)。每种配置的详细信息如下表所示:
方法 | 描述 | 内存 | 质量 |
---|---|---|---|
in2n | 完整模型,用于论文 | ~15GB | 最佳 |
in2n-small | 半精度模型 | ~12GB | 良好 |
in2n-tiny | 半精度无LPIPS | ~10GB | 一般 |
目前,我们将in2n
训练的最大迭代次数设置为15000次。通常在大约10000次迭代后,编辑效果就已经很好了。如果您想训练更长时间,只需重新加载最后的in2n
检查点并继续训练,或者将--max-num-iterations
改为30000。
技巧
如果您的编辑效果不如您所愿,可能是因为InstructPix2Pix难以处理您的图像和提示。我们建议先使用这个 HuggingFace空间,尝试对您的训练视图进行2D编辑,这可以帮助您更好地了解如何获得良好的编辑效果。关于获得良好编辑的更多提示,可以在这里找到。
扩展指令驱动NeRF到NeRF
我们为基于高斯绽放的方法构建了一个指令驱动NeRF到NeRF的扩展,称为Instruct-GS2GS。他们的仓库可用作如何基于指令驱动NeRF到NeRF构建未来项目的示例。
问题
如果您在安装或使用过程中遇到任何问题,请在Github上提出issue。我们已经尽力支持尽可能广泛的GPU,但可能还需要提供更多低内存占用的版本。如果您有任何改进内存使用的变更,欢迎贡献!
代码结构
要在指令驱动NeRF到NeRF的基础上构建,我们提供了核心代码组件的解释。
in2n_datamanager.py
: 这个文件与Nerfstudio中的base_datamanager.py
几乎一样。主要区别在于,整个数据集张量是在setup_train
方法中预先计算,而不是在每次next_train
方法中采样。
in2n_pipeline.py
: 这个文件建立在Nerfstudio的pipeline模块之上。get_train_loss_dict
方法采样图像并将编辑后的图像放回数据集。
ip2p.py
: 这个文件包含InstructPix2Pix模型(使用diffusers
实现)。edit_image
方法是使用扩散模型去噪一个图像,还包含一些辅助方法。
in2n.py
: 我们重写了get_loss_dict
方法,使用LPIPS损失和L1损失。
引用
您可以在arXiv上找到我们的论文。
如果您发现这段代码或论文对您的研究有帮助,请考虑引用:
@inproceedings{instructnerf2023,
author = {Haque, Ayaan and Tancik, Matthew and Efros, Alexei and Holynski, Aleksander and Kanazawa, Angjoo},
title = {Instruct-NeRF2NeRF: Editing 3D Scenes with Instructions},
booktitle = {Proceedings of the IEEE/CVF International Conference on Computer Vision},
year = {2023},
}