机器视觉必会算法:3D高斯泼溅
- 1、引言
- 2、3D高斯泼溅(3D Gaussian Splatting)
-
- 2.1 定义与解析
- 2.2 核心原理
-
- 2.2.1 用"一团团高斯"表示三维场景
- 2.2.2 泼溅(Splatting):3D → 2D 投影
- 2.2.3 可微渲染:从图像反推高斯
- 2.2.4 为啥比 NeRF 快这么多
- 2.3 实现方式 / 工作流程
- 2.4 算法公式
- 2.5 代码示例
- 3、总结
1、引言
小屌丝:鱼哥,最近刷到个词叫"高斯泼溅",说是能实时渲染 3D 场景,比 NeRF 快几百倍,真的假的?
小鱼:真的。NeRF 是"慢工出细活",3D 高斯泼溅(3DGS)是"又快又细活"。
小屌丝:那它俩到底差在哪?NeRF 不是也挺神吗?
小鱼:NeRF 用神经网络"隐式"存场景,每次渲染都要跑一遍 MLP,慢得抠脚。3DGS 干脆用一堆立体的小高斯球把场景显式铺出来,渲染靠投影+混合,GPU 上能跑实时。
小屌丝:哦~ 一个"记在脑子里慢慢想",一个"摆在桌面上直接看"。
小鱼:精辟。那咱开整,看看这桌面上到底摆了啥。
2、3D高斯泼溅(3D Gaussian Splatting)
2.1 定义与解析
3D 高斯泼溅(3D Gaussian Splatting,3DGS),是 Kerbl 等人在 2023 年(SIGGRAPH / TOG)提出的**新视角合成(Novel View Synthesis)**方法。
一句话理解它:用成千上万个"带颜色、带透明度、带朝向的 3D 高斯椭球"来显式表示三维场景。给定一组多角度照片,它优化出这堆高斯,之后从任意新视角都能实时渲染出高质量画面。
它解决的问题和 NeRF 一样(多视角重建 + 新视角合成),但把"慢"这个最大痛点基本解决了——训练快、渲染能上 100+ FPS。
简单来说,3DGS 把场景当成"无数半透明的小云团",相机一转,云团投影到屏幕上叠在一起,就是你要的画面。

2.2 核心原理
2.2.1 用"一团团高斯"表示三维场景
每个 3D 高斯由几个参数定义:
- 位置
μ
\\mu
μ(3D 中心,球在哪); - 协方差
Σ
\\Sigma
Σ(3×3,决定球的扁圆、朝向、大小); - 颜色
c
c
c(通常用球谐函数 SH 系数,能表现视角相关的颜色); - 不透明度
α
\\alpha
α(这团有多"实心")。
整张场景 = 一个高斯列表。优化目标就是调这些参数,让渲染图和真实照片对得上。
2.2.2 泼溅(Splatting):3D → 2D 投影
渲染时,把每个 3D 高斯按相机参数"泼溅"到 2D 图像平面:
- 用相机外参把 3D 均值
μ
\\mu
μ 投影成 2D 点; - 用雅可比把 3D 协方差
Σ
\\Sigma
Σ 投影成 2D 协方差Σ
′
\\Sigma'
Σ′(EWA 投影,保证椭圆形状正确); - 得到屏幕上一个个 2D 高斯斑。
2.2.3 可微渲染:从图像反推高斯
关键创新是可微的α混合(alpha blending):
C
=
∑
i
=
1
N
c
i
α
i
∏
j
=
1
i
−
1
(
1
−
α
j
)
C = \\sum_{i=1}^{N} c_i \\alpha_i \\prod_{j=1}^{i-1}(1-\\alpha_j)
C=i=1∑Nciαij=1∏i−1(1−αj)
按深度从远到近排序,把覆盖同一像素的所有高斯,用"透明度加权"叠起来,得到像素颜色
C
C
C。整个过程可导,所以能拿"渲染图 vs 真实图"的差(如 L1 + D-SSIM 损失)反向传播,端到端优化每个高斯的参数。
2.2.4 为啥比 NeRF 快这么多
- 显式表达:不用每像素都跑 MLP,直接投影+混合,天然适合 GPU 光栅化;
- 自适应密度:训练中自动对"细节不够"的地方克隆/分裂高斯,对"冗余"的地方剪枝,场景表示又紧又准;
- tile-based 光栅化:把屏幕分块并行处理,吞吐量拉满。
2.3 实现方式 / 工作流程
典型流程(以 nerfstudio 为例):
多视角图像 + 相机位姿
│
▼
SfM 稀疏点云 (初始化高斯位置)
│
▼
可微泼溅渲染 ──► 与真实图算损失 ──► 反向传播
▲ │
└──────── 自适应增删高斯 ◄──────────┘
│
▼
最终高斯场景 ──► 实时新视角渲染 (100+ FPS)
2.4 算法公式
3D 高斯函数(各向异性椭圆):
G
(
x
)
=
exp
(
−
1
2
(
x
−
μ
)
⊤
Σ
−
1
(
x
−
μ
)
)
G(x) = \\exp\\left(-\\frac{1}{2}(x-\\mu)^\\top \\Sigma^{-1}(x-\\mu)\\right)
G(x)=exp(−21(x−μ)⊤Σ−1(x−μ))
2D 投影协方差(EWA):
Σ
′
=
J
W
Σ
W
⊤
J
⊤
\\Sigma' = J W \\Sigma W^\\top J^\\top
Σ′=JWΣW⊤J⊤
其中
W
W
W 为视角变换、
J
J
J 为投影雅可比。
像素颜色(α 混合):
C
=
∑
i
=
1
N
c
i
α
i
∏
j
=
1
i
−
1
(
1
−
α
j
)
C = \\sum_{i=1}^{N} c_i \\alpha_i \\prod_{j=1}^{i-1}(1-\\alpha_j)
C=i=1∑Nciαij=1∏i−1(1−αj)
训练损失(图像重建):
L
=
(
1
−
λ
)
L
1
(
C
,
C
^
)
+
λ
L
D-SSIM
(
C
,
C
^
)
\\mathcal{L} = (1-\\lambda)\\mathcal{L}_1(C,\\hat{C}) + \\lambda\\,\\mathcal{L}_{\\text{D-SSIM}}(C,\\hat{C})
L=(1−λ)L1(C,C^)+λLD-SSIM(C,C^)
一句话:3D 高斯投影成 2D 斑,按深度α混合成图,和真图比差、反传调参,场景就被"泼"出来了。

2.5 代码示例
最省心的用法是走 nerfstudio(封装好了全套 pipeline):
# 安装 nerfstudio(含 gaussian-splatting 方法)
pip install nerfstudio
# 准备数据:把多视角图按如下结构放好
# data/my_scene/images/*.jpg
# data/my_scene/transforms.json # 位姿(或先用 COLMAP 算)
ns-train gaussian-splatting –data data/my_scene
也能用官方仓库直接推理/查看(需先编译 CUDA 扩展):
# 官方仓库:graphdeco-inria/gaussian-splatting
git clone https://github.com/graphdeco-inria/gaussian-splatting
cd gaussian-splatting
pip install -r requirements.txt
# 训练(提供 images/ 与 sparse/0 的 COLMAP 输出)
python train.py -s data/my_scene -m output/my_scene
# 渲染指定视角
python render.py -m output/my_scene
渲染结果可视化(Viewer):训练完成后 ns-viewer 或直接打开 .ply 高斯文件,即可在浏览器里实时拖动视角。
小提示:3DGS 对数据质量很敏感——照片要覆盖足够视角、位姿要尽量准(COLMAP 跑得稳)。场景里有大片弱纹理或反光玻璃时容易"泼"出鬼影,记得多拍几张补视角。
典型应用场景:实时数字孪生、VR/AR 场景重建、机器人/无人机三维感知、文物/地产扫描、影视级新视角合成。
3、总结
今天这篇,把 3D 高斯泼溅(3D Gaussian Splatting) 啃了一遍:
- 是什么:用一堆 3D 高斯显式表示场景的新视角合成方法;
- 怎么渲:3D 高斯投影成 2D 斑,按深度 α 混合成图,全程可微;
- 强在哪:显式表达 + GPU 光栅化,训练和渲染都比 NeRF 快几个数量级;
- 怎么用:nerfstudio 一条命令训练,Viewer 里实时拖视角;
- 往哪走:它是 3D 重建/实时渲染的事实新标准,和 NeRF 是"快慢双雄",现在新项目基本首选 3DGS。
到这儿,咱的"基础模型系列"再添一员猛将:SAM(分割)+ CLIP(图文)+ DINOv2(表征)+ 3DGS(三维),从 2D 到 3D 全齐活。
要是这篇对你有帮助,点赞 + 收藏 + 关注 三连走起,鱼哥继续带你从 0 到 1 啃透计算机视觉。下篇想看 ControlNet 啥,评论区留言,咱接着唠~
我是小鱼:
- CSDN 博客专家;
- AIGC MVP专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 企业认证金牌面试官;
- 多个头部名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)评测一等奖获得者;
关注小鱼,学习【机器视觉与目标检测】最新最全的领域知识。


