Paper: Instruct-GS2GS: Editing 3D Gaussian Splats with Instructions
Introduction: https://instruct-gs2gs.github.io/
Code: https://github.com/cvachha/instruct-gs2gs
Instruct-GS2GS 复用了 Instruct-NeRF2NeRF 1 的架构,将基于 NeRF 的三维场景编辑方法迁移到基于 3D GS 的三维场景中。
与 Instruct-NeRF2NeRF 不同的是,Instruct-GS2GS 并不采取 Instruct-NeRF2NeRF 中 Iterative DU 的迭代方式,而是在每一轮的迭代中更新所有训练视图,然后训练 GS 场景。
目录
- 一. 研究思路
- 二. Instruct-GS2GS 模型
- 三. 训练方法
- 四. 实验结果
- 五. 总结
- 六. 复现
一. 研究思路
二. Instruct-GS2GS 模型
三. 训练方法
在每一轮训练中,先使用 InstructPix2Pix 编辑 所有 训练视图并更新,然后使用全新的训练集训练当前 GS 场景 2.5k 轮。不断重复上述迭代直至收敛。
Instruct-GS2GS 并不采取 Instruct-NeRF2NeRF 中 Iterative DU 的迭代方式,而是在每一轮的迭代中更新所有训练视图,然后再训练 GS 场景。这是因为 NeRF 是基于像素优化的,而 GS 是基于图像优化的,需要一次性光栅化整个图像并计算其损失。如果 Instruct-GS2GS 只更新部分数据集,那么光栅化时必然有一些视角下的图像对应的场景是混合包含已编辑和未编辑图像信息,那么此时计算基于整张图像的损失函数就会失真,导致错误的更新。2
四. 实验结果
五. 总结
六. 复现
Instruct-GS2GS 基于 Nerfstudio:
- 平台:AutoDL
- 显卡:RTX 4090 24GB
- 镜像:PyTorch 2.0.0、Python 3.8(ubuntu20.04)、Cuda 11.8
- 源码:https://github.com/cvachha/instruct-gs2gs
实验记录:
-
先按照 nerfstudio 教程 创建虚拟环境并激活:
source activate nerfstudio
。然后安装依赖包,执行到conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit
即可; -
安装 Instruct-GS2GS 包,然后克隆 Instruct-GS2GS 仓库并更新组件和包;
-
在 instruct-gs2gs 文件夹下克隆并安装 Nerfstudio 3,随后执行
ns-train -h
就可以成功验证;
-
Nerfstudio 安装完成后,就可以训练了。因为系统盘空间有限,因此将训练数据放在数据盘,使用 garden 数据集进行训练:
ns-train splatfacto --data ../autodl-tmp/data/garden
。需要注意的是,这里使用的是 1.0 版本的 Nerfstudio,不再有gaussian-splatting
参数,这里选用splatfacto
:
上一版本的 Instruct-GS2GS 因为 dataparser 的问题,训练时解析 colmap 数据时还会出现路径错误,新版本使用 Nerfstudio V1.0 修复了该问题:
-
训练时遇到
FileNotFoundError
报错,找不到 colmap 数据中的.json
文件:
一开始以为是 colmap 处理数据时的命名歧义,将instruct-gs2gs/nerfstudio/nerfstudio/data/dataparsers/nerfstudio_dataparser.py
第 94 行的"transforms.json"
修改为"cameras.json"
,事实上并非如此。后来发现是训练数据中缺少transforms.json
文件 4,尝试先安装 COLMAP 5,然后自行处理数据 6:ns-process-data images --data ../autodl-tmp/data/garden --output-dir ../autodl-tmp/data/garden
。随后就可以成功训练; -
garden 场景训练完成后,就可以进行编辑:
ns-train igs2gs --data ../autodl-tmp/data/garden --load-dir outputs/garden/splatfacto/2024-05-11_142858/nerfstudio_models --pipeline.prompt "Delete the vase on the table" --pipeline.guidance-scale 12.5 --pipeline.image-guidance-scale 1.5
:
-
如果是在服务器上训练的,想要使用监视窗口,需要转发:
ssh -p <port> -L 7007:localhost:7007 <username>@<training-host-ip>
;
-
训练和编辑后的场景可以再次查看:
ns-viewer --load-config outputs/garden/splatfacto/2024-05-11_142858/config.yml
,也可以渲染成视频:ns-render camera-path --load-config outputs/garden/splatfacto/2024-05-11_142858/config.yml --camera-path-filename ../autodl-tmp/data/garden/camera_paths/2024-05-11_142858.json --output-path renders/garden/2024-05-11_142858.mp4
。渲染场景时,出现RuntimeError: stack expects a non-empty TensorList
报错:
查询发现是camera_paths
下keyframes
为空导致的 7,机位为空应该是处理数据过程中的问题,目前还没找到解决办法。可以在 Nerfstudio 的可视化界面自行处理数据或者直接使用其他数据集处理得到的机位文件,但后者可能会失真。本次实验使用 Bear 场景的机位进行渲染:
实验结果:
借用 Bear 场景的机位路径渲染编辑前后的 garden 场景视频如下:
garden场景训练效果
garden场景编辑效果
Instruct-NeRF2NeRF:通过用户指令编辑 NeRF 三维场景 ↩︎
A question about Dataset Update #4 ↩︎
Fresh install error #72 ↩︎
Colab Notebook not generating transforms.json file for custom data #2272 ↩︎
Nerfstudio | Installing COLMAP ↩︎
Nerfstudio | Processing Data ↩︎
Unable to render to mp4 with RuntimeError: stack expects a non-empty TensorList #2916 ↩︎