3D 高斯溅射重建技术
3D Gaussian Splatting(3DGS)是 2023 年最具影响力的 3D 重建技术,用 3D 高斯函数替代 NeRF 的隐式神经表示,实现了从照片到实时可渲染 3D 场景的重建,训练速度和渲染效率均大幅超越 NeRF。
核心思想
3DGS 用大量 3D 高斯椭球体显式表示场景:
每个高斯由以下参数定义:
- 位置 μ:3D 空间中心点
- 协方差 Σ:3×3 协方差矩阵,控制椭球形状和朝向
- 不透明度 α:透明度
- 球谐系数 SH:视角相关颜色的球谐函数表示
python
import torch
class GaussianSplat:
"""单个 3D 高斯表示"""
def __init__(self, num_gaussians=100000):
self.means = torch.randn(num_gaussians, 3) # 位置
self.scales = torch.randn(num_gaussians, 3) # 缩放
self.rotations = torch.randn(num_gaussians, 4) # 四元数旋转
self.opacities = torch.sigmoid(torch.randn(num_gaussians)) # 不透明度
self.sh_coefficients = torch.randn(num_gaussians, 16, 3) # 球谐系数
def compute_covariance(self):
"""从缩放和旋转计算协方差矩阵"""
# 四元数转旋转矩阵
R = quaternion_to_matrix(self.rotations) # [N, 3, 3]
S = torch.diag_embed(torch.exp(self.scales)) # [N, 3, 3]
# Σ = R S S^T R^T
RS = torch.bmm(R, S)
cov = torch.bmm(RS, RS.transpose(1, 2))
return cov
def render(self, viewpoint_camera):
"""从指定视角渲染"""
# 1. 投影到 2D
# 2. 排序(按深度)
# 3. Alpha 混合
pass渲染管线
3DGS 的渲染过程包括:
- 投影:将 3D 高斯投影到 2D 屏幕空间
- 排序:按深度对高斯排序(从远到近)
- 分块:将屏幕划分为 16×16 的 tile
- Alpha 混合:在每个 tile 内按深度顺序混合颜色
实时渲染
3DGS 的渲染速度可达 100+ FPS(1080p),比 NeRF 快 2-3 个数量级,使其适用于实时 VR/AR 应用。关键优化包括 tile-based 渲染和自定义 CUDA 核函数。
自适应密度控制
训练过程中,3DGS 动态调整高斯数量:
- 分裂(Split):梯度大的高斯分裂为两个小高斯
- 克隆(Clone):梯度大但尺度小的高斯复制一个
- 删除(Prune):删除不透明度极低的高斯
- 重置:周期性重置不透明度,避免冗余
与 NeRF 的对比
| 特性 | NeRF | 3D Gaussian Splatting |
|---|---|---|
| 场景表示 | 隐式(MLP) | 显式(高斯集合) |
| 训练时间 | 小时级 | 分钟级(~10min) |
| 渲染速度 | 秒级 | 实时(100+ FPS) |
| 编辑能力 | 困难 | 直观(操作高斯) |
| 存储开销 | 小(MLP 权重) | 大(百万高斯参数) |
后续工作
- 4D Gaussian Splatting:动态场景重建
- Gaussian Grouping:语义分割与编辑
- SuGaR:提取网格表面
- GS-LRM:前馈式大规模重建
存储开销
3DGS 的主要缺点是存储开销大,一个场景可能需要数百万个高斯,占用数百 MB 空间。压缩方法如 Compact3DGS 正在解决此问题。