3D Gaussian Splatting 论文阅读笔记
3D Gaussian Splatting 论文阅读笔记
论文标题: 3D Gaussian Splatting for Real-Time Radiance Field Rendering
作者: Bernhard Kerbl et al.
发表: SIGGRAPH 2023
摘要
本文提出了一种基于 3D 高斯的新型辐射场表示方法,能够实现实时的高质量新视角合成。与 NeRF 相比,3DGS 通过显式的 3D 高斯表示和可微分的光栅化,实现了更快的训练和渲染速度。
核心思想
1. 3D 高斯表示
使用 3D 高斯函数来表示场景中的每个点:
其中:
- $\mu$ 是高斯中心位置
- $\Sigma$ 是协方差矩阵,控制高斯的形状和方向
协方差矩阵的参数化:
其中 $R$ 是旋转矩阵(用四元数表示),$S$ 是缩放矩阵。
2. 可微分光栅化
对于每个像素,颜色通过 alpha blending 计算:
算法实现
初始化
使用 SfM 点云初始化高斯:
<span class="hljs-keyword">def</span> <span class="hljs-title function_">initialize_gaussians</span>(<span class="hljs-params">point_cloud</span>):
<span class="hljs-string">"""从点云初始化3D高斯"""</span>
positions = point_cloud.points <span class="hljs-comment"># [N, 3]</span>
colors = point_cloud.colors <span class="hljs-comment"># [N, 3]</span>
<span class="hljs-comment"># 初始化协方差矩阵(各向同性)</span>
scales = estimate_scales(point_cloud) <span class="hljs-comment"># [N, 3]</span>
rotations = np.array([<span class="hljs-number">1</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>, <span class="hljs-number">0</span>]) <span class="hljs-comment"># [N, 4] 四元数</span>
<span class="hljs-comment"># 初始化不透明度</span>
opacities = inverse_sigmoid(<span class="hljs-number">0.1</span> * np.ones(N))
<span class="hljs-keyword">return</span> {
<span class="hljs-string">'positions'</span>: positions,
<span class="hljs-string">'colors'</span>: colors,
<span class="hljs-string">'scales'</span>: scales,
<span class="hljs-string">'rotations'</span>: rotations,
<span class="hljs-string">'opacities'</span>: opacities
}
自适应密度控制
算法会根据梯度自适应地添加和删除高斯:
<span class="hljs-keyword">def</span> <span class="hljs-title function_">adaptive_density_control</span>(<span class="hljs-params">gaussians, gradients, iteration</span>):
<span class="hljs-string">"""自适应密度控制"""</span>
grad_threshold = <span class="hljs-number">0.0002</span>
<span class="hljs-comment"># 1. 克隆:梯度大的小高斯</span>
large_grads = gradients > grad_threshold
small_gaussians = scales < percent_dense
clone_mask = large_grads & small_gaussians
<span class="hljs-comment"># 2. 分裂:梯度大的大高斯</span>
split_mask = large_grads & ~small_gaussians
<span class="hljs-comment"># 3. 删除:不透明度低的高斯</span>
prune_mask = opacities < min_opacity
<span class="hljs-keyword">return</span> clone_mask, split_mask, prune_mask
实验结果
性能对比
| 方法 | FPS | PSNR | 训练时间 |
|---|---|---|---|
| NeRF | 0.1 | 31.0 | 24h |
| Instant-NGP | 30 | 30.5 | 5min |
| 3DGS | 150 | 32.1 | 7min |
可视化结果
实际应用中的渲染效果:

优化思路
1. 内存优化
对于大规模场景,可以采用分块策略:
<span class="hljs-keyword">def</span> <span class="hljs-title function_">hierarchical_rendering</span>(<span class="hljs-params">scene, camera</span>):
<span class="hljs-string">"""分层渲染"""</span>
<span class="hljs-comment"># 使用八叉树组织高斯</span>
octree = build_octree(scene.gaussians)
<span class="hljs-comment"># 视锥剔除</span>
visible_nodes = frustum_culling(octree, camera)
<span class="hljs-comment"># 层次细节(LOD)</span>
gaussians_to_render = []
<span class="hljs-keyword">for</span> node <span class="hljs-keyword">in</span> visible_nodes:
distance = compute_distance(node, camera)
lod_level = select_lod(distance)
gaussians_to_render.extend(node.get_gaussians(lod_level))
<span class="hljs-keyword">return</span> render(gaussians_to_render, camera)
2. 训练加速
梯度累积策略:
<span class="hljs-keyword">def</span> <span class="hljs-title function_">train_with_gradient_accumulation</span>(<span class="hljs-params">model, dataloader, steps=<span class="hljs-number">4</span></span>):
<span class="hljs-string">"""使用梯度累积训练"""</span>
optimizer.zero_grad()
<span class="hljs-keyword">for</span> i, batch <span class="hljs-keyword">in</span> <span class="hljs-built_in">enumerate</span>(dataloader):
loss = compute_loss(model, batch) / steps
loss.backward()
<span class="hljs-keyword">if</span> (i + <span class="hljs-number">1</span>) % steps == <span class="hljs-number">0</span>:
optimizer.step()
optimizer.zero_grad()
局限性与未来方向
动态场景: 当前方法主要针对静态场景,如何扩展到动态场景是重要研究方向
材质建模: 缺乏对复杂材质(如镜面反射)的建模
内存消耗: 复杂场景需要大量高斯,内存占用较大
视频演示
可以嵌入 YouTube 视频展示渲染效果:
<span class="hljs-tag"><<span class="hljs-name">iframe</span> <span class="hljs-attr">width</span>=<span class="hljs-string">"100%"</span> <span class="hljs-attr">height</span>=<span class="hljs-string">"400"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"https://www.youtube.com/embed/your-video-id"</span>
<span class="hljs-attr">frameborder</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">allowfullscreen</span>></span><span class="hljs-tag"></<span class="hljs-name">iframe</span>></span>
参考文献
Kerbl, B., et al. (2023). 3D Gaussian Splatting for Real-Time Radiance Field Rendering. SIGGRAPH 2023.
Mildenhall, B., et al. (2020). NeRF: Representing Scenes as Neural Radiance Fields. ECCV 2020.
Müller, T., et al. (2022). Instant Neural Graphics Primitives. SIGGRAPH 2022.
总结
3D Gaussian Splatting 是一个优雅且高效的解决方案,通过显式表示和可微分渲染实现了实时的高质量新视角合成。其核心创新在于:
- ✅ 显式的 3D 高斯表示
- ✅ 高效的可微分光栅化
- ✅ 自适应的密度控制
- ✅ 实时渲染性能
对于后续研究,可以考虑:
- 扩展到动态场景
- 改进材质建模
- 优化内存占用
最后更新: 2025年11月9日
如果你喜欢这篇文章,欢迎点个赞或分享给更多人。