目标:读完这篇,你能理解 3DGS 在“学什么、怎么渲染、怎么训练”,并且能用官方代码跑通一个数据集,最后知道怎么把自己的照片做成可训练的工程。


1. 3DGS 是什么?它解决了 NeRF 的哪两个痛点

3D Gaussian Splatting(3DGS)是一种新型的辐射场(Radiance Field)表示方法:它不用 MLP 去隐式表示场,而是用一堆可学习的 3D 高斯椭球(Gaussians)直接表示场景,并通过可微分的“splatting”光栅化实现训练与渲染。

它最出圈的原因基本就两点:

  • 渲染快:面向实时显示,论文目标是 1080p 实时帧率级别(>=30fps 甚至更高)。(arXiv)

  • 训练也不慢:从 COLMAP 的稀疏点初始化,边优化边密度控制(densify/prune),避免在空空间浪费算力。(arXiv)


2. 一句话看懂 3DGS 工作流(你跑案例也就是跑这条链)

图片/视频 → COLMAP(相机位姿+稀疏点云)→ 初始化 Gaussians → 可微渲染对齐真值图像 → densify/prune → 导出模型 → 实时 viewer 渲染

官方实现明确把系统拆成优化器、网络viewer、OpenGL实时viewer、数据集转换脚本四块。(GitHub)


3. 3DGS 的核心表示:一个高斯点到底“学”哪些参数?

对第 (i) 个高斯(椭球)来说,常见可学习参数包括:

  • 位置(均值)\boldsymbol{\mu}_i\in\mathbb{R}^3

  • 形状(协方差)\boldsymbol{\Sigma}_i\in\mathbb{R}^{3\times 3}(各向异性椭球)

  • 不透明度(opacity)\alpha_i\in(0,1)

  • 颜色(视角相关):用低阶球谐函数 SH系数表示(官方默认最高 3 阶)。(GitHub)

3.1 3D 高斯的基本公式(必须会写)

3D 高斯密度(写成椭球形式):

G(\mathbf{x})=\exp\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^\top \boldsymbol{\Sigma}^{-1}(\mathbf{x}-\boldsymbol{\mu})\right)

3.2 为啥不直接学 \Sigma?——正定性是坑

直接优化 \boldsymbol{\Sigma}容易变成非正定矩阵。常见做法是学旋转 + 缩放再构造协方差:

\boldsymbol{\Sigma} = \mathbf{R}\mathbf{S}\mathbf{S}^\top\mathbf{R}^\top

其中 \mathbf{R}来自四元数(rotation),\mathbf{S}来自尺度向量(scale)。这也是 3DGS 经典实现思路之一。


4. 渲染原理:从 3D 椭球到 2D 椭圆,再到像素颜色

4.1 3D → 2D:协方差如何投影?

高斯中心 \boldsymbol{\mu}通过相机投影得到屏幕中心 (\boldsymbol{u})。关键是协方差投影(常用雅可比近似):

\boldsymbol{\Sigma}{2D} = \mathbf{J},\boldsymbol{\Sigma}{3D},\mathbf{J}^\top

\mathbf{J}是投影函数对 3D 点的雅可比矩阵(在 \boldsymbol{\mu}处线性化)。

4.2 一个高斯对某个像素的贡献

对像素坐标 \mathbf{p},2D 高斯权重:

w(\mathbf{p})=\exp\left(-\frac{1}{2}(\mathbf{p}-\boldsymbol{u})^\top \boldsymbol{\Sigma}_{2D}^{-1}(\mathbf{p}-\boldsymbol{u})\right)

像素不透明度(直觉写法):

a(\mathbf{p})=\alpha\cdot w(\mathbf{p})

4.3 深度排序 + 透明度合成(alpha compositing)

把会影响同一 tile/像素的高斯按深度从近到远排序,逐个累积:

\mathbf{C}=\sum_{i} T_i,a_i,\mathbf{c}i,\quad T_i=\prod{j<i}(1-a_j)

其中 \mathbf{c}_i是该高斯在当前视角方向下的颜色(通常由 SH 解码出来)。

这套“tile 并行 + 深度排序 + 一次遍历”就是 3DGS 渲染能快的重要原因之一。


5. 训练怎么做:优化目标(Loss)写清楚就懂一半

3DGS 常用的重建损失是\ell_1+ D-SSIM 的加权和:

\mathcal{L}=(1-\lambda)\mathcal{L}{1}+\lambda\mathcal{L}{D\text{-}SSIM}

这在综述里有明确公式表达。
官方代码里也给了 --lambda_dssim,默认值 0.2(表示 SSIM 项的权重)。(GitHub)


6. Quickstart:用官方仓库跑通第一个案例(最稳路线)

下面以 graphdeco-inria/gaussian-splatting 官方实现为主。(GitHub)

6.1 克隆(一定要带子模块)

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

官方明确仓库包含 submodules。(GitHub)

6.2 建环境(Conda 推荐)

官方提供 environment.yml 的创建方式,并提示:默认流程假设你本机装的是 CUDA SDK 11(不是 12)。(GitHub)

conda env create --file environment.yml
conda activate gaussian_splatting

如果你用的是更新的 PyTorch / CUDA,也不是完全不行,但要保证 PyTorch 自带的 CUDA runtime 和你机器上 CUDA SDK 的大版本不要“差太多”。官方也提到在更高版本环境下可工作,但要注意匹配关系。(GitHub)

6.3 下载一个现成 COLMAP 数据(跑通最重要)

官方提供了 Tanks&Temples + Deep Blending 的 COLMAP 输入包。(GitHub)

(你可以按 README 的链接下载并解压到某个目录,例如 data/tandt_db/

6.4 开训:一条命令

python train.py -s /path/to/colmap_dataset --eval

-s/--source_path 指向包含 COLMAP 或 NeRF Synthetic 格式的数据目录。(GitHub)

训练常用的“救命参数”(显存/速度相关):

  • --resolution / -r:把输入图缩小(默认如果宽 >1600 会自动缩到 1600)。(GitHub)

  • --data_device cpu:把图像数据放 CPU,省显存但稍慢。(GitHub)

  • --sh_degree:SH 阶数(默认 3,不要大于 3)。(GitHub)

  • --lambda_dssim 0.2:SSIM 权重(默认 0.2)。(GitHub)

6.5 训练完怎么评估?

官方给了完整链路:训练 → 渲染 → 指标计算。(GitHub)

python render.py -m /path/to/output_model
python metrics.py -m /path/to/output_model

7. 用自己的照片做数据:COLMAP 最容易踩的 5 个坑

你只要记住一句话:3DGS 很强,但它强的前提是 COLMAP 不拉胯。

7.1 拍摄建议(直接影响 COLMAP 稀疏点质量)

  • 保证相邻照片重叠区域足够(>60% 很常见)

  • 避免纯白墙、纯玻璃、强反光(特征点少)

  • 尽量锁定曝光/对焦(减少跨帧亮度漂移)

  • 物体/场景要“绕一圈”,不要只在一条线上拍

7.2 COLMAP 输出目录你需要什么?

最核心的是:

  • 相机内外参(poses)

  • 稀疏点云(sparse points)

3DGS 论文/实现就是从“相机标定产生的稀疏点”开始初始化高斯集合的。(arXiv)


8. 常见问题速查(跑不动/跑不稳基本都在这)

Q1:显存不够怎么办?

  • 先用 --resolution 2/4/8 缩小输入(最有效)(GitHub)

  • --data_device cpu 把图像数据放 CPU(GitHub)

  • 少一点迭代:--iterations 10000 先跑通再说(别一上来 30000)

Q2:训练很慢?

  • 官方在 2024 年更新里提到集成了训练加速,并兼容 depth regularization / anti-aliasing / exposure compensation 等特性(如果你用的是更新版本代码,记得看对应开关)。(GitHub)

Q3:结果“糊”“飘”“表面不准”?

这不是你一个人的问题:3DGS 的 3D 高斯在多视角下容易出现“表面一致性不足”的现象,所以后来有 **2DGS(用 2D oriented disks / surfels)**去加强几何准确性。(arXiv)


9. 进阶阅读:为什么大家开始看 2DGS?

如果你后续想做科研或者想让几何更“硬”,2DGS 的出发点很清晰:

  • 3DGS 很快、效果好,但表面几何可能不够“板正”

  • 2DGS 用 **2D oriented disks(surfels)**表示,再做可微光栅化与正则,追求几何更准(arXiv)


10. 参考资料”

  • Kerbl 等:3D Gaussian Splatting for Real-Time Radiance Field Rendering(SIGGRAPH / TOG 2023)(arXiv)

  • 官方代码:graphdeco-inria/gaussian-splatting(GitHub)

  • 综述里对损失、协方差参数化等的公式总结(含 (\mathcal{L}=(1-\lambda)\mathcal{L}1+\lambda\mathcal{L}{D\text{-}SSIM}) )

  • 2DGS:2D Gaussian Splatting for Geometrically Accurate Radiance Fields(SIGGRAPH 2024)(arXiv)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐