3D Gaussian splatting 02: 快速评估
目录
- 3D Gaussian splatting 01: 环境搭建
- 3D Gaussian splatting 02: 快速评估
- 3D Gaussian splatting 03: 用户数据训练和结果查看
- 3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云
- 3D Gaussian splatting 05: 代码阅读-训练整体流程
- 3D Gaussian splatting 06: 代码阅读-训练参数
- 3D Gaussian splatting 07: 代码阅读-训练载入数据和保存结果
- 3D Gaussian splatting 08: 自建模型展示网页
快速评估
以下使用 Inria 提供的数据集运行训练过程, 验证和评估重建效果, 数据输入是一组静态场景的图像以及摄像机位置, 表示为稀疏的点云, 通过colmap处理得到.
下载示例数据
在项目 GitHub 仓库 的首页找到 Running 部分, 能找到这个下载链接
You can find our SfM data sets for Tanks&Temples and Deep Blending here: https://repo-sam.inria.fr/fungraph/3d-gaussian-splatting/datasets/input/tandt_db.zip If you do not provide an output model directory (-m), trained models are written to folders with randomized unique names inside the output directory. At this point, the trained models may be viewed with the real-time viewer (see further below).
下载 tandt_db.zip 到本地并解压缩. 这个数据集里面带了4个场景, 两个室内的, 两个室外的, 都是两三百张图片, 图片比较小, 单图几百K到几千K, 适合验证测试.
每一个数据集, 都会包含一系列的目录和文件, 其中input是原始图片输入, images 和 sparse 目录是下一步训练要用到的文件.
训练
用 conda 启用之前创建的 3dgs 环境, 然后在项目目录下执行
python train.py -s [素材路径]
# 例如
python train.py -s ./data/tandt/truck
如果要进行评估, 训练时需要增加--eval
参数
python train.py -s ./data/tandt/truck --eval
执行过程中可以通过 nvidia-smi 和 nvtop 查看GPU的情况, 可以看到运行的功率, 显存的使用率, 推荐使用 nvtop, 可以实时监控. 训练时间根据显卡不同, 从十几分钟到一个多小时都有可能. 训练的输出目录在 output 目录下, 每次训练都会随机产生一个目录名, 可以通过创建时间辨别.
在结果目录中可以看到两个目录, iteration_7000 和 iteration_30000, 分别是迭代7000次和30000次的 point cloud 文件. 这个文件可以直接用于3D渲染.
一般来讲, 迭代7000次之后的效果就已经接近最终效果, 而30000次迭代的训练时间是7000次迭代的5-6倍, 如果想快速评估模型结果, 训练时可以加上--iterations 7000
参数让其在7000次迭代后结束.
查看
快速查看可以用第三方的网页工具, 例如 https://poly.cam/tools/gaussian-splatting, 可以注册后免费上传 ply 文件.
评估
用带--eval
训练的模型结果, 分别对训练使用的镜头进行渲染, 需要指定训练结果路径(在output下的随机目录名), 以及训练的输入数据
python render.py -m [训练结果路径] -s [素材路径]
例如
python render.py -m ./output/89ea0caf-3 -s ./data/tandt/truck
会在训练结果目录下创建 train 和 test 两个目录, 分别对应训练数据和测试数据, 每一组数据分 gt 和 renders 两个目录, 分别是素材原图和渲染结果图.
在渲染完成后, 计算渲染结果和原图的 SSIM, PSNR 和 LPIPS
python metrics.py -m [训练结果路径]
例如
python metrics.py -m ./output/89ea0caf-3
如果训练时没有指定 --eval
参数, 也没有人工区分训练集和测试集, render.py 产生的 test 目录是空的, 执行上面的命令会产生空结果.
Scene: ./output/89ea0caf-3
Method: ours_30000
Metric evaluation progress: 0%| | 0/106 [00:00<?, ?it/s]Downloading: "https://raw.githubusercontent.com/richzhang/PerceptualSimilarity/master/lpips/weights/v0.1/vgg.pth" to /home/milton/.cache/torch/hub/checkpoints/vgg.pth
100%|█████████████████████████████████████████████████████| 7.12k/7.12k [00:00<00:00, 9.46MB/s]
Metric evaluation progress: 100%|████████████████████████████| 106/106 [02:31<00:00, 1.43s/it]
SSIM : 0.9513068
PSNR : 31.6362495
LPIPS: 0.0676759
高级选项
optimizer_type 训练加速
这个功能是 2024年7月在核心模块 diff-gaussian-rasterization 的 3dgs_accel 分支加入的.
默认的导出不带这个选项, 要启用此选项, 需要将之前安装的 submodules/diff-gaussian-rasterization 模块删除,
pip uninstall diff_gaussian_rasterization
将模块切换到 3dgs_accel 分支后重新 pip install,
$ cd submodules/diff-gaussian-rasterization/
$ git branch -a
* (HEAD detached at 9c5c202)
main
remotes/origin/3dgs_accel
remotes/origin/HEAD -> origin/main
remotes/origin/debug
remotes/origin/dr_aa
remotes/origin/fast_culling
remotes/origin/main
$ git checkout -b 3dgs_accel origin/3dgs_accel
$ cd ../..
$ pip install submodules/diff-gaussian-rasterization/
而后在训练时, 可以使用参数 --optimizer_type
, 可以指定default
, sparse_adam
两种加速方式
python train.py -s /home/milton/WorkPython/data2/ --optimizer_type sparse_adam
- 4060Ti显卡, 使用
sparse_adam
参数实测速度提升明显, 训练时间只有未开启加速的一半. 从显卡功耗看, 比未开启加速功耗增加20%. - P104-100显卡, 使用
sparse_adam
参数实测速度无明显提升, 显卡功耗无明显变化.
猜测这个加速会充分利用GPU的并行处理, 会增加GPU功耗, 4060Ti在正常模式下温度仅到63度, 而P104-100在非加速情况下温度83度已经达到温度墙, 功率受到限制, 因此没有提升.
antialiasing: 抗锯齿
--antialiasing
抗锯齿选项是 2024年8月在核心模块 diff-gaussian-rasterization 的 dr_aa 分支加入的. 来源于 mip-splatting 项目.
这个参数可以作用于训练和查看, 实测在训练中使用这个参数后效果反而变差, 边缘尖刺增加. 在SIBR Viewer中查看时, 勾选此参数可以改善远景的图像质量.
问题
显卡温度过高
长时间运行时, 建议控制显卡GPU温度在75摄氏度以下. 如果在nvtop中温度超过75, 需要使用 nvidia-smi 限制显卡频率以降低功率.
通过 nvidia-smi 查看 GPU 温度设置
nvidia-smi -q -d temperature
输出为
Attached GPUs : 1
GPU 00000000:01:00.0
Temperature
GPU Current Temp : 35 C
GPU T.Limit Temp : N/A
GPU Shutdown Temp : 96 C
GPU Slowdown Temp : 93 C
GPU Max Operating Temp : N/A
GPU Target Temperature : 83 C
Memory Current Temp : N/A
Memory Max Operating Temp : N/A
默认的 Target Temp 是 83, 设置 Target Temp 的命令是 sudo nvidia-smi -gtt [温度]
. 在散热不佳 GPU 温度过高时, 执行这个命令可以立即观察到频率的下降, 可以用这个命令给GPU降温.