第一次看到3D Gaussian Splatting生成的模型时,那种细腻的表面质感和流畅的动态效果让我瞬间决定要亲手复现这个技术。但没想到,从环境配置到最终渲染的每一步都暗藏玄机。本文将用5000字详细记录我在云服务器上完整复现3DGS技术时遇到的所有"坑",以及如何系统性地解决它们。
在租用云服务器时,我选择了配备NVIDIA A100显卡的实例,本以为硬件到位就成功了一半,结果刚起步就遭遇连环问题。
官方推荐CUDA 11.8,但服务器预装的是CUDA 13.0。通过nvidia-smi和nvcc --version两个命令的对比,发现系统存在多版本CUDA共存的情况:
bash复制# 查看驱动支持的CUDA最高版本
nvidia-smi
# 查看当前生效的CUDA工具链版本
nvcc --version
解决方法不是简单降级,而是采用版本隔离方案:
bash复制export PATH=/home/yourname/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/home/yourname/cuda-11.8/lib64:$LD_LIBRARY_PATH
直接使用官方提供的environment.yml文件创建环境时,出现了Python 3.7与CUDA 11.8不兼容的问题。经过多次尝试,发现需要调整的关键配置:
| 原配置项 | 修改方案 | 原因 |
|---|---|---|
| python=3.7 | python=3.9 | 新版对CUDA支持更好 |
| pytorch=1.12 | pytorch=2.0 | 避免旧版bug |
| cudatoolkit=11.3 | cudatoolkit=11.8 | 与本地CUDA版本匹配 |
正确的环境创建命令应改为:
bash复制conda env create -n 3dgs --file environment.yml
conda install -n 3dgs python=3.9 pytorch=2.0 cudatoolkit=11.8 -c pytorch
使用FFmpeg提取视频帧时,直接全帧率提取会导致数据量爆炸。经过测试发现这些参数组合效果最佳:
bash复制ffmpeg -i input.mp4 -vf "fps=10,scale=1920:-1" -qscale:v 2 input/input_%04d.jpg
关键参数说明:
fps=10:将帧率降至10fpsscale=1920:-1:保持宽高比,宽度设为1920qscale:v 2:JPEG质量参数(2-5较合适)COLMAP自动重建时经常失败,总结出三个必备检查项:
--SiftExtraction.max_image_size 4000参数--Mapper.init_min_tri_angle 10--database_path指定SSD存储位置完整的重建命令示例:
bash复制colmap automatic_reconstructor \
--workspace_path $WORKSPACE \
--image_path $IMAGE_DIR \
--dense 1 \
--quality extreme \
--SiftExtraction.max_image_size 4000
遇到ModuleNotFoundError: No module named 'diff_gaussian_rasterization'错误时,发现需要手动编译所有子模块:
bash复制# 编译diff-gaussian-rasterization
cd submodules/diff-gaussian-rasterization
pip install -e .
# 编译simple-knn
cd ../simple-knn
pip install -e .
注意:必须在激活conda环境后执行,且需要确保gcc版本与CUDA兼容
默认参数在小场景表现良好,但面对复杂场景时需要调整:
| 参数 | 默认值 | 推荐调整范围 | 作用 |
|---|---|---|---|
| iterations | 30,000 | 50,000-100,000 | 迭代次数 |
| position_lr_init | 0.00016 | 0.0001-0.0002 | 位置学习率 |
| feature_lr | 0.0025 | 0.001-0.005 | 特征学习率 |
| opacity_lr | 0.05 | 0.01-0.1 | 透明度学习率 |
优化后的训练命令:
bash复制python train.py -s ./data -m ./output \
--iterations 50000 \
--position_lr_init 0.0001 \
--feature_lr 0.001 \
--opacity_lr 0.01
官方Viewer工具仅支持Windows,在Linux服务器上可通过这些替代方案:
Web可视化:使用SIBR的web viewer
bash复制python -m http.server 8000
然后访问http://服务器IP:8000/viewers/web
Blender插件:导出为.ply格式后使用GaussianSplatting插件
运行metrics.py后,关键指标这样理解:
| 指标 | 优秀值 | 可接受值 | 改进方向 |
|---|---|---|---|
| PSNR | >30dB | 25-30dB | 增加迭代次数 |
| SSIM | >0.9 | 0.8-0.9 | 调整学习率 |
| LPIPS | <0.2 | 0.2-0.3 | 优化数据质量 |
典型评估命令:
bash复制python metrics.py -m ./output \
--iteration 30000 \
--output_path ./eval_results
在完成第一个完整流程后,我又尝试了不同场景的视频输入,发现室内场景的重建质量普遍优于室外。特别是在处理透明物体(如玻璃窗)时,需要额外增加5-10%的迭代次数才能获得清晰边缘。