L5 · 模块二 · 工程实践 预计阅读 16 分钟 ← 课程目录

Gaussian Splatting 工程实践 — 训练与实时渲染

本课紧接 L4。你在 L4 中用 nerfacto 训练了一个 NeRF,现在用同一数据集训练 3D Gaussian Splatting,亲自感受两种方法在速度、质量和交互性上的差异。

为什么同一框架里比较两种方法

L2 你已经理解了原理差异:NeRF 用隐式 MLP,3DGS 用显式高斯点云。但原理差异和工程差异是两回事。真正做项目时,你需要回答的是:

nerfstudio 同时支持 nerfacto(NeRF)和 splatfacto(3DGS),用同一数据、同一评估 pipeline 做对比,是建立选型直觉的最佳方式。

核心结论(先预告)

在大多数静态场景上,3DGS 的训练速度快 10-100 倍,渲染速度快 100+ 倍,质量与 NeRF 相当甚至更好。代价是显存占用更高(高斯参数显式存储),且对透明/反射物体处理较差。

splatfacto:nerfstudio 中的 3DGS

splatfacto 是 nerfstudio 对 3D Gaussian Splatting 的实现。与原始 3DGS 代码相比,splatfacto 做了以下工程改进:

特性原始 3DGSsplatfacto
训练接口独立仓库,自定义脚本ns-train splatfacto,统一 CLI
数据格式COLMAP 输出复用 nerfstudio 的 transforms.json
Viewer原生实时 viewernerfstudio Web Viewer
评估手动计算指标ns-eval 统一评估
导出PLY 点云PLY + 多种格式
超参调节修改源码Hydra 配置系统

如果你已经装好了 nerfstudio(L4 完成),splatfacto 无需额外安装,直接可用。

实战:训练你的第一个 3DGS

用 L4 相同的 poster 数据集,训练 splatfacto,然后逐项对比。

Step 1:训练

ns-train splatfacto --data data/nerfstudio/poster

注意几个与 nerfacto 训练的不同体验:

Step 2:评估

ns-eval --load-config outputs/poster/splatfacto/.../config.yml \
    --output-path eval-splatfacto.json

将结果与 L4 的 nerfacto 评估结果对比,填入下表:

指标nerfacto (NeRF)splatfacto (3DGS)
训练时间~30 min (30k iters)~5-10 min (30k iters)
PSNR ↑~30-33 dB~31-34 dB
SSIM ↑~0.90-0.95~0.92-0.97
LPIPS ↓~0.05-0.12~0.04-0.10
渲染速度~1-2 fps (全分辨率逐帧推理;Viewer 交互时通过自适应分辨率可达更高帧率)~60+ fps (光栅化)
模型大小~10-50 MB (MLP 权重)~100-500 MB (高斯参数)
显存占用 (训练)~4-8 GB~6-12 GB

典型结果:3DGS 在各项指标上持平或略优,训练速度和渲染速度则有数量级提升。

splatfacto 的核心参数解读

3DGS 的训练逻辑与 NeRF 完全不同。NeRF 是「优化一个 MLP 的权重」,3DGS 是「优化一组高斯点的参数,并在训练过程中动态增删高斯点」。因此它的超参数含义也不同。

初始化

ns-train splatfacto \
    --pipeline.model.num-random 50000 \
    --pipeline.model.sh-degree 3 \
    --data data/custom/
参数含义默认值调整建议
num-random初始随机高斯点数量50000场景大/细节多时增加;显存受限时减少
sh-degree球谐函数阶数3阶数越高颜色越丰富;0 阶=视角无关颜色,3 阶=全彩
random-init随机初始化 vs SfM 点云初始化false有 COLMAP 点云时设为 false(更好);无点云时设为 true

自适应密度控制

这是 3DGS 最核心的机制。训练过程中,系统根据梯度自动决定:分裂大的高斯、克隆透明区域的高斯、删除透明度过低的高斯

ns-train splatfacto \
    --pipeline.model.densify-grad-thresh 0.0002 \
    --pipeline.model.densify-size-thresh 0.01 \
    --pipeline.model.cull-alpha-thresh 0.1 \
    --data data/custom/
参数含义默认值调整建议
densify-grad-thresh梯度阈值,超过则触发分裂/克隆0.0002场景细节不足时降低(更激进地增加高斯)
densify-size-thresh高斯大小阈值,超过则分裂0.01大场景中提高(避免过早分裂)
cull-alpha-thresh透明度阈值,低于则删除高斯0.1出现「空洞」时降低;出现噪点时提高
密度控制的可视化理解

想象你在用橡皮泥捏一个雕像:

训练结束后,高斯数量通常会从 5 万增长到 50-200 万。数量越多,细节越丰富,显存占用也越高。

Viewer 体验:实时漫游的震撼

3DGS 的 Viewer 体验与 NeRF 有本质差异。NeRF 的 Viewer 是「实时发送相机位置 → 服务器推理 → 返回像素」,每次视角移动都需要网络传输 + GPU 计算。3DGS 的 Viewer 是「高斯参数一次性上传到 GPU → 本地光栅化渲染」,视角移动完全在本地完成。

实际感受:

操作nerfacto Viewersplatfacto Viewer
旋转视角略有延迟,低分辨率预览 → 高分辨率填充即时响应,全分辨率
缩放远近等待推理即时响应
相机路径录制需要后台渲染实时预览最终效果
导出视频逐帧推理,耗时光栅化,快 10-100 倍

这种实时性不仅是「体验好」,它直接决定了 3DGS 能否用于实时应用(VR/AR、游戏、Web 展示),而 NeRF 目前主要还是离线渲染。

导出与下游应用

3DGS 的显式表示让它在导出方面有独特优势。

PLY 格式:高斯点云的标准交换格式

ns-export gaussian-splat \
    --load-config outputs/poster/splatfacto/.../config.yml \
    --output-dir exports/poster_gs/

导出后得到一个 .ply 文件,包含每个高斯的完整参数:

PLY 文件可以被以下工具直接加载:

导出的局限

3DGS 导出为网格(mesh)比 NeRF 更困难。因为高斯是「模糊的球体」,没有明确的表面边界。如果需要三角网格用于传统图形管线,通常需要额外做表面提取(如 Poisson 重建),效果不如 NeRF 的 marching cubes 稳定。

NeRF vs 3DGS:一个直观的选型框架

经过 L4 和 L5 的实践,你现在可以建立一个简单的选型决策树:

场景需求推荐方案理由
需要实时渲染 / VR / Web3DGS光栅化天然实时
需要导出紧凑模型 (<100MB)NeRFMLP 权重远小于高斯参数
需要精确三角网格NeRF密度场 → marching cubes 成熟
快速迭代实验 / 大量场景3DGS训练快 10 倍,迭代效率高
透明物体 / 反射面两者都差3DGS 更难处理;NeRF 可尝试反射建模
低显存环境 (<6GB)NeRFnerfacto 可在 4GB 运行;3DGS 需要更多
动态场景 / 4D前沿研究两者都有扩展方法,但都不够成熟

更详细的对比参考:3DGS vs NeRF 技术选型对比表

1. splatfacto 与原始 3DGS 代码相比,最大的优势是什么?
2. 3DGS 训练中,哪个机制负责在训练过程中自动增加高斯点数量?
3. 以下哪个场景最适合选择 3DGS 而非 NeRF?

动手任务

  1. 对比训练:用 poster 数据集分别训练 nerfacto 和 splatfacto,记录训练时间、最终 PSNR/SSIM/LPIPS。
  2. Viewer 对比:同时打开两个 Viewer(不同端口),快速切换对比交互流畅度。
  3. 密度控制实验:修改 densify-grad-thresh(如 0.0001 和 0.0005),观察高斯数量和重建细节的变化。
  4. 导出体验:用 ns-export gaussian-splat 导出 PLY,尝试用 在线 viewer 加载查看。

延伸阅读

有问题?

如果在 splatfacto 训练、参数调节或导出过程中遇到任何问题,随时问我。下一课(L6)我们将深入做 NeRF 和 3DGS 的系统性技术选型对比。

← L4: NeRF 工程实践