3D Gaussian Splatting 学习笔记(一) | 路人乙の小窝
0%

3D Gaussian Splatting 学习笔记(一)

前言

最近开始学习3D高斯泼溅,本文可以认为是跑通官网代码后写下的实验报告。


环境配置

我使用的实验环境为:

项目 详情
操作系统 Windows 11 Home China (10.0.26200)
GPU NVIDIA RTX 4060 Laptop,8GB 显存,Compute Capability 8.9
CUDA Toolkit 11.8
PyTorch 2.7.1 + cu118
Python 3.9.25
MSVC Visual Studio 2022 Community,MSVC 14.44.35207
Conda 25.5.1

首先从克隆官网仓库到本地:

1
2
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
cd gaussian-splatting

问题一:项目根目录存在environment.yml,但实际测试中 windows 系统不能够直接使用 conda 直接安装。对此,ai 给出解释是 conda 版 pytorch 在 windows 上缺少 CUDA DDL。

解决方案:选择放弃 yml,手动用 pip 安装 Pytorch 和其他依赖。

问题二:CUDA 扩展编译失败 unsupported MSVC version。ai 解释是 VS2022 版本过新,CUDA 11.8 的 host_config.h 不认。

解决方案:在 setup.py 添加-D_ALLOW_COMPILER_AND_STL_VERSION_MISMATCH

问题三:import _C 返回 not found。ai 解释扩展的 .pyd 依赖 cudart64_110.dll,但不在 PATH 中

解决方案:用 dumpbin 定位依赖找到 torch/lib 目录,创建 .pth 文件让 Python 自动加载 DLL 路径

数据集下载

Mip-NeRF 360 数据集是一组用于 真实世界 360°新视角合成与三维重建 的高质量图像数据集,场景由真实相机环绕拍摄得到,并通过 COLMAP 估计相机位姿。它包含室外和室内两类场景,例如 bicycle、garden、stump、treehill、flowers 等室外无界场景,以及 room、counter、kitchen、bonsai 等室内场景。相比早期 NeRF 常用的合成数据或前向拍摄数据,它更接近真实应用:场景范围大、背景复杂、存在远近尺度差异、遮挡和真实光照变化,因此常被用来测试 NeRF、3D Gaussian Splatting 等方法在真实 360°场景中的重建质量、渲染清晰度和抗伪影能力。

mipnerf360 发布页面 下载了 flowerstreehill 两个数据集。

alt text

alt text

在实际运行时,我使用了 360_extra_scenes/treehill 作为数据集。

训练

数据集存在了 data/treehill 目录。由于资源受限,先跑了7000轮,并在运行一半和运行结束时分别保存一次,使用以下命令开始训练:

1
python train.py -s data/treehill -m output/treehill_baseline --iterations 7000 --save_iterations 3500 7000 -r 1

最开始的训练就遇到了 OOM 问题,原始图像分辨率过高,rtx 4060 laptop 显存不足。去掉 -r 1参数即可正常训练。

前面一半的迭代很快,后面越来越慢,因为高斯数量在膨胀,从初始的 5w 高斯到后面的几百万,训练会越来越慢。实际上,完成前 70% 的迭代只用了几十分钟,而后面 30% 的部分进行了两个多小时。

在后面进一步学习之后,我会去租 gpu 跑一遍完整实现。

训练的最终产物是 point_clound.ply,可以用于后续的渲染,也可以在这个网站体验3d效果。

渲染和评估

1
2
3
# 上面是渲染,下面是评估
python render.py -m output/treehill_baseline --iteration 7000
python metrics.py -m output/treehill_baseline

output/treehill_baseline/train/ 目录会出现两个文件夹,gt和renders一一对应
alt text
alt text

我跑的结果如下:

指标 数值
SSIM 0.6471134
PSNR 21.4450645
LPIPS 0.3957949

SSIM是结构相似性,范围 0-1,越高越好;PSNR 是峰值信噪比,单位 dB,越高越好,一般 30+ 算不错;LPIPS 是感知相似度,范围 0-1,越低越好。

这三个值并不是很理想,因为训练时使用的图片并非完整分辨率图片,迭代次数也远低于论文中的数值,不过图片主体(那棵树)已经相当清晰,说明整体的实现是比较成功的。在3d视图中,我甚至能够看清椅子上刻着的文字。

最后

这篇文章仅作为跑官方代码的实验报告,而不是我学习3dgs的终点。预计会在后面的一段时间更深入的阅读源码,精读论文,并做一些有意思的事情。

我很可爱,请给我钱qwq