快速入门 3DGS(3D Gaussian Splatting):从原理到跑通第一个案例
目标:读完这篇,你能理解 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) 个高斯(椭球)来说,常见可学习参数包括:
-
位置(均值):
-
形状(协方差):
(各向异性椭球)
-
不透明度(opacity):
-
颜色(视角相关):用低阶球谐函数 SH系数表示(官方默认最高 3 阶)。(GitHub)
3.1 3D 高斯的基本公式(必须会写)
3D 高斯密度(写成椭球形式):
3.2 为啥不直接学
?——正定性是坑
直接优化 容易变成非正定矩阵。常见做法是学旋转 + 缩放再构造协方差:
其中 来自四元数(rotation),
来自尺度向量(scale)。这也是 3DGS 经典实现思路之一。
4. 渲染原理:从 3D 椭球到 2D 椭圆,再到像素颜色
4.1 3D → 2D:协方差如何投影?
高斯中心 通过相机投影得到屏幕中心 (\boldsymbol{u})。关键是协方差投影(常用雅可比近似):
是投影函数对 3D 点的雅可比矩阵(在
处线性化)。
4.2 一个高斯对某个像素的贡献
对像素坐标 ,2D 高斯权重:
像素不透明度(直觉写法):
4.3 深度排序 + 透明度合成(alpha compositing)
把会影响同一 tile/像素的高斯按深度从近到远排序,逐个累积:
其中 是该高斯在当前视角方向下的颜色(通常由 SH 解码出来)。
这套“tile 并行 + 深度排序 + 一次遍历”就是 3DGS 渲染能快的重要原因之一。
5. 训练怎么做:优化目标(Loss)写清楚就懂一半
3DGS 常用的重建损失是+ D-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)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)