K2E-B-G6-3 · Paper Note

3D Gaussian Splatting

Created 2024-03-31Updated 2026-06-11slam / papers / g-geometry-rendering / g6-radiance-field-foundations

  • Description:3DGS 论文笔记 — 各向异性 3D 高斯显式表示 + 可微 tile 光栅化,1080p ≥ 30 FPS 实时渲染,质量达 SOTA;3DGS-SLAM 系列的基石
  • My Notion Note ID:K2E-B-G6-3
  • Created:2024-03-31
  • Updated:2026-06-11
  • License转载欢迎:转载请注明作者 Yu Zhang 并附原文出处(yuzhang.io

Table of Contents


1. Summary

Title: 3D Gaussian Splatting for Real-Time Radiance Field Rendering Authors: Bernhard Kerbl, Georgios Kopanas, Thomas Leimkühler, George Drettakis (Inria / Max-Planck-Institut für Informatik) Paper: arXiv:2308.04079 (ACM ToG / SIGGRAPH 2023 Best Paper) Github: graphdeco-inria/gaussian-splatting

3DGS 用一组各向异性 3D 高斯表示辐射场,配合可微 tile 光栅化做渲染,实现1080p ≥ 30 FPS 实时新视角合成——同时质量对标或超过 Mip-NeRF360(Barron et al. 2022,针对无界 360° 室外场景的多尺度抗锯齿 NeRF,当时室外场景 SOTA)(室外场景 PSNR 27.21 vs 27.69 dB,但 SSIM/LPIPS 反超),训练 41 分钟,渲染帧率 134 FPS(vs Mip-NeRF360 的 0.06 FPS)。核心突破:把 NeRF 的隐式 MLP + 逐光线体渲染换成显式点云 + 光栅化,绕开了逐射线 MLP 查询的速度瓶颈。

高斯的三个核心属性——位置 μ\boldsymbol{\mu}、协方差 Σ\Sigma(旋转 × 缩放参数化,保证 PSD)、不透明度 α\alpha + 球谐系数——均通过可微渲染管线联合优化。优化过程穿插自适应密度控制(欠重建区域克隆、过重建区域分裂、低不透明度剪枝),从 SfM(Structure from Motion,运动恢复结构,离线 COLMAP 等工具产出的稀疏点云)稀疏点云出发自动增密到足够细节。

3DGS 是 SplaTAM 等 3DGS-SLAM 的基石。相比 Instant-NGP(隐式哈希表),3DGS 是显式表示,渲染更快但内存占用更大(200–500 MB/场景 vs Mip-NeRF360 的 8.6 MB),且依赖 SfM 初始化。

3DGS 训练进度(自行车场景):从 SfM 稀疏点出发,7K / 30K 迭代后质量变化;同时展示 Instant-NGP、Mip-NeRF360 对比


2. Key Contributions

  • 各向异性 3D 高斯表示:显式点云 + 旋转-缩放协方差参数化,永远合法 PSD,各向异性可拉长贴合表面/边缘
  • 可微 tile 光栅化:屏幕分 16×16 tile,高斯按深度全局 radix 排序后并行 alpha 混合,梯度无限制反传;渲染速度 ~2000× 快于 Mip-NeRF360
  • 自适应密度控制:克隆(欠重建)/ 分裂(过重建)/ 剪枝(低不透明度)的交错优化,从 SfM 稀疏点自动增密
  • 联合优化框架:位置 / 协方差 / 不透明度 / SH 系数全部端到端可微,L1 + D-SSIM(SSIM 差异度量,= (1−SSIM)/2,值越小越相似)联合监督

3. Method

3.1 3D 高斯表示

场景 = 一组 3D 高斯,每个高斯(Eq. 4):

G(x)=exp ⁣(12(xμ)TΣ1(xμ))(4)G(\mathbf{x}) = \exp\!\left(-\frac{1}{2}(\mathbf{x} - \boldsymbol{\mu})^T \Sigma^{-1} (\mathbf{x} - \boldsymbol{\mu})\right) \tag{4}

μ\boldsymbol{\mu}:均值(3D 位置);Σ\Sigma:3×3 协方差矩阵(决定形状/朝向)。

每个高斯的可学习属性:位置 μ\boldsymbol{\mu}、协方差 Σ\Sigma、不透明度 α\alpha、球谐系数 SH(0–3 阶,视角相关颜色)。

3.2 协方差参数化

直接优化 Σ\Sigma 会破坏半正定约束。3DGS 分解为旋转 × 缩放(Eq. 6):

Σ=RSSTRT(6)\Sigma = RSS^TR^T \tag{6}

SS:对角缩放矩阵(各向异性,3 个 scale 分量);RR:旋转矩阵(由四元数 q\mathbf{q} 导出)。优化 q\mathbf{q}ss 而非 Σ\Sigma → 任意参数组合都产生合法 PSD 矩阵。各向异性让高斯能拉成椭球贴合细长结构(草叶、发丝、边缘)。

3.3 投影到 2D(Splatting)

渲染时把 3D 高斯投影到图像平面(Eq. 5):

Σ=JWΣWTJT(5)\Sigma' = JW\Sigma W^TJ^T \tag{5}

WW:视图变换(world → camera);JJ:投影变换仿射近似的 Jacobian。Σ\Sigma' 左上 2×22 \times 2 子块 = 屏幕空间 2D 协方差,决定该高斯的椭圆 footprint。

3.4 可见性感知 Alpha 混合

每像素颜色 = 覆盖该像素的高斯按深度从前到后 alpha 混合(Eq. 3):

C=iNciαij=1i1(1αj)(3)C = \sum_{i \in \mathcal{N}} c_i \alpha_i \prod_{j=1}^{i-1}(1 - \alpha_j) \tag{3}

cic_i:第 ii 个高斯在当前视角的颜色(SH 求值);αi=oiGi2D(x)\alpha_i = o_i \cdot G_i^{2D}(\mathbf{x})(Eq. 2):不透明度 oio_i(学习参数)× 投影 2D 高斯在像素 x\mathbf{x} 处的值(由式 5 的 Σ\Sigma' 决定);\prod 项为累积透射率。与 NeRF 离散体渲染 同源(αi=1eσiδi\alpha_i = 1 - e^{-\sigma_i \delta_i}),但改用显式高斯而非射线积分。

Tile-based 光栅化:

  • 屏幕分 16×16 像素 tile
  • 高斯按 64-bit 键(高 32 bit = tile ID,低 32 bit = 深度)做全局 radix 排序(CUB 库,一次排序,非逐像素)
  • 每个 tile 并行处理 → 完全可微,梯度反传无限制(消融实验证明这一点极关键)

3.5 自适应密度控制

每 100 次迭代交错执行(warm-up 后):

  • Clone(克隆):view-space 位置梯度 >τpos=0.0002> \tau_{\text{pos}} = 0.0002 且高斯小 → 复制并沿梯度方向移动(补欠重建区域)
  • Split(分裂):梯度 >τpos> \tau_{\text{pos}} 且高斯大(σ>τS\|\sigma\| > \tau_S)→ 替换成 2 个,scale 除以 ϕ=1.6\phi = 1.6(压制过重建区域)
  • Prune(剪枝):不透明度 α<1/255\alpha < 1/255 的高斯删除;过大或相机附近的高斯也删除
  • 每 3000 步 reset α0\alpha \approx 0,强迫优化器重新评估,控制漂浮物 (floaters)

从 SfM 稀疏点云初始化(初始协方差 = 等向高斯,scale = 与最近 3 个 SfM 点的平均距离)。

3DGS 自适应密度控制:上方 Clone 处理欠重建(小高斯、大梯度);下方 Split 处理过重建(大高斯替换为 2 个更小的)

3.6 损失函数

L=(1λ)L1+λLD-SSIM,λ=0.2(7)\mathcal{L} = (1 - \lambda)\mathcal{L}_1 + \lambda \mathcal{L}_{\text{D-SSIM}}, \quad \lambda = 0.2 \tag{7}

像素级 L1 + 结构相似性 (D-SSIM)。球谐系数 SH 按阶数渐进引入:前 1000 步只用 0 阶(颜色常量),之后每 1000 步加一阶,4 阶全开。


4. Experiments & Results

Mip-NeRF360 数据集(30K 迭代,真实室外场景)

方法 PSNR ↑ SSIM ↑ LPIPS ↓ 训练时间 FPS
Mip-NeRF360 27.69 0.792 0.237 ~48 h 0.06
Instant-NGP-Big 25.59 0.699 0.331 ~7.5 min 9.43
3DGS (30K) 27.21 0.815 0.214 ~41.5 min 134

PSNR 略低于 Mip-NeRF360,但 SSIM / LPIPS 反超,渲染帧率 2233× 快

Tanks & Temples(30K 迭代)

3DGS 23.14 dB / SSIM 0.841;Mip-NeRF360 22.22 dB,154 FPS vs 0.14 FPS。

Deep Blending(30K 迭代)

3DGS 29.41 dB / SSIM 0.903;Mip-NeRF360 29.40 dB,近乎持平质量,137 FPS vs 0.09 FPS。

NeRF Synthetic(30K 迭代)

平均 PSNR 33.32 dB;Mip-NeRF 33.09 dB,Instant-NGP-Base 33.18 dB,三者相当。


5. Ablation & Discussion

Table 3 (PSNR 影响,Truck 场景为主):

去掉的组件 PSNR 变化 说明
SfM 初始化 → 随机点 −~5.6 dB 初始化很重要(Table 3 均值:Full 26.05 dB vs Random Init 20.42 dB)
各向异性 → 等向协方差 −~0.8 dB 各向异性贴合几何
Clone 密度控制 −~0.1 dB 贡献较小
Split 密度控制 −~2.2 dB 背景大面积失真
梯度反传限制(仅前 10 个高斯) −~11 dB 最关键:24.81 → 13.84 dB
球谐系数 −~0.7 dB 视角相关外观

梯度无限制反传是 3DGS 可微渲染的核心——限制到前 10 个高斯时质量崩塌,说明深层高斯的梯度信号对优化不可或缺。


6. Strengths / Limitations / Future Work

优势:

  • 实时:134 FPS @ 1080p,Mip-NeRF360 的 2000×+
  • 质量:SSIM / LPIPS 超过 Mip-NeRF360,PSNR 略低但视觉质量 on par
  • 显式表示:可直接操纵单个高斯(移动、删除),比隐式 MLP 更直观
  • 训练快:41 分钟 vs Mip-NeRF360 约 48 小时

局限:

  • 内存大:典型场景 200–500 MB(Mip-NeRF360 仅 8.6 MB),百万级高斯
  • 无几何约束:高斯可飘移到空中产生 floaters,拓扑不受控
  • 依赖 SfM 初始化:无 SfM 点云时质量大幅下降(~5.6 dB,Table 3 均值)
  • Popping 伪影:朴素深度排序 + guard band culling 导致视角切换时闪烁
  • 高训练显存:原型实现 >20 GB(大场景),未优化

后续:

  • 几何约束方向:2DGS(二维高斯贴面)、SuGaR(正则化高斯提取 mesh)
  • 结构化:Scaffold-GS(锚点约束)
  • SLAM 方向:SplaTAM 等 3DGS-SLAM;显式表示天然支持场景编辑和 map 更新

7. Code Walkthrough

仓库:graphdeco-inria/gaussian-splatting。PyTorch + 自定义 CUDA 光栅化(diff-gaussian-rasterization),SIBR viewer 做交互播放。

训练入口

python train.py -s <COLMAP 或 NeRF Synthetic 数据集路径>
# 主要参数:
#   -m <输出目录>       --iterations 30000
#   --eval              # 开启 train/test split
#   --densify_until_iter 15000

关键文件

文件 作用
train.py 主优化循环:高斯参数更新 + 密度控制调用
gaussian_renderer/__init__.py 可微光栅化接口(调用 CUDA 扩展)
scene/gaussian_model.py 高斯参数存储 + 初始化 + clone/split/prune
scene/__init__.py 数据集加载(COLMAP / NeRF Synthetic)
render.py 加载 checkpoint,渲染测试视角
metrics.py 计算 PSNR / SSIM / LPIPS

关键超参默认值

参数 默认值 说明
--iterations 30000 总训练步数
--densify_until_iter 15000 密度控制截止步数
--densification_interval 100 每 100 步做一次密度控制
--densify_grad_threshold (τpos\tau_{\text{pos}}) 0.0002 Clone/Split 触发阈值
--opacity_reset_interval 3000 reset α\alpha 周期
--lambda_dssim (λ\lambda) 0.2 D-SSIM loss 权重
--sh_degree 3 球谐最高阶(对应 4 阶带)
--position_lr_init 0.00016 位置学习率,代码默认值(指数衰减到 0.0000016);论文仅述采用类 Plenoxels 指数衰减调度,未给出具体数值

Paper vs Code

  • Paper 描述 SH 渐进引入(每 1000 步加一阶);代码在 train.pyoneupSHdegree() 调用实现,完全一致
  • Paper 描述 warm-up 用 4× 降采样(250 / 500 步升分辨率);代码可选,非默认开启
  • --antialiasing / --exposure_lr_init 等现代特性为 paper 后增补,原论文实验不含

References