返回首页

3D Gaussian Splatting 论文阅读笔记

2025年11月09日
15分钟
论文3DGS计算机视觉

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 高斯函数来表示场景中的每个点:

G(x)=e12(xμ)TΣ1(xμ)G(x) = e^{-\frac{1}{2}(x-\mu)^T \Sigma^{-1} (x-\mu)}

其中:

  • $\mu$ 是高斯中心位置
  • $\Sigma$ 是协方差矩阵,控制高斯的形状和方向

协方差矩阵的参数化

Σ=RSSTRT\Sigma = RSS^TR^T

其中 $R$ 是旋转矩阵(用四元数表示),$S$ 是缩放矩阵。

2. 可微分光栅化

对于每个像素,颜色通过 alpha blending 计算:

C=i=1Nciαij=1i1(1αj)C = \sum_{i=1}^N c_i \alpha_i \prod_{j=1}^{i-1}(1-\alpha_j)

算法实现

初始化

使用 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">&quot;&quot;&quot;从点云初始化3D高斯&quot;&quot;&quot;</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">&#x27;positions&#x27;</span>: positions,
        <span class="hljs-string">&#x27;colors&#x27;</span>: colors,
        <span class="hljs-string">&#x27;scales&#x27;</span>: scales,
        <span class="hljs-string">&#x27;rotations&#x27;</span>: rotations,
        <span class="hljs-string">&#x27;opacities&#x27;</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">&quot;&quot;&quot;自适应密度控制&quot;&quot;&quot;</span>
    grad_threshold = <span class="hljs-number">0.0002</span>
    
    <span class="hljs-comment"># 1. 克隆:梯度大的小高斯</span>
    large_grads = gradients &gt; grad_threshold
    small_gaussians = scales &lt; percent_dense
    clone_mask = large_grads &amp; small_gaussians
    
    <span class="hljs-comment"># 2. 分裂:梯度大的大高斯</span>
    split_mask = large_grads &amp; ~small_gaussians
    
    <span class="hljs-comment"># 3. 删除:不透明度低的高斯</span>
    prune_mask = opacities &lt; 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

可视化结果

实际应用中的渲染效果:

3D Gaussian Splatting 渲染效果

优化思路

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">&quot;&quot;&quot;分层渲染&quot;&quot;&quot;</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">&quot;&quot;&quot;使用梯度累积训练&quot;&quot;&quot;</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()

局限性与未来方向

  1. 动态场景: 当前方法主要针对静态场景,如何扩展到动态场景是重要研究方向

  2. 材质建模: 缺乏对复杂材质(如镜面反射)的建模

  3. 内存消耗: 复杂场景需要大量高斯,内存占用较大

视频演示

可以嵌入 YouTube 视频展示渲染效果:

<span class="hljs-tag">&lt;<span class="hljs-name">iframe</span> <span class="hljs-attr">width</span>=<span class="hljs-string">&quot;100%&quot;</span> <span class="hljs-attr">height</span>=<span class="hljs-string">&quot;400&quot;</span> <span class="hljs-attr">src</span>=<span class="hljs-string">&quot;https://www.youtube.com/embed/your-video-id&quot;</span> 
        <span class="hljs-attr">frameborder</span>=<span class="hljs-string">&quot;0&quot;</span> <span class="hljs-attr">allowfullscreen</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">iframe</span>&gt;</span>

参考文献

  1. Kerbl, B., et al. (2023). 3D Gaussian Splatting for Real-Time Radiance Field Rendering. SIGGRAPH 2023.

  2. Mildenhall, B., et al. (2020). NeRF: Representing Scenes as Neural Radiance Fields. ECCV 2020.

  3. Müller, T., et al. (2022). Instant Neural Graphics Primitives. SIGGRAPH 2022.

总结

3D Gaussian Splatting 是一个优雅且高效的解决方案,通过显式表示和可微分渲染实现了实时的高质量新视角合成。其核心创新在于:

  • ✅ 显式的 3D 高斯表示
  • ✅ 高效的可微分光栅化
  • ✅ 自适应的密度控制
  • ✅ 实时渲染性能

对于后续研究,可以考虑:

  1. 扩展到动态场景
  2. 改进材质建模
  3. 优化内存占用

最后更新: 2025年11月9日

如果你喜欢这篇文章,欢迎点个赞或分享给更多人。

我爱你,王新婷!

为媳妇儿特别制作的开屏礼花彩蛋,欢迎进入我们的线上小家~