1. 3DGS与NeRF的区别
NeRF(Neural Radiance Fields)和3DGS(3D Gaussian Splatting)是当前三维场景重建与渲染领域的两大主流技术,它们在表示方式、渲染流程、性能和应用场景上存在显著差异。
1.1 表示方式
NeRF:采用隐式神经表示。场景被建模为一个连续函数,输入空间位置
和观察方向
,输出该点的颜色
和体密度
。
# NeRF隐式函数表示 (F_{\theta}(\mathbf{x}, \mathbf{d}) \rightarrow (\mathbf{c}, \sigma))3DGS:采用显式3D高斯表示。场景由一组离散的、可学习的3D高斯椭球构成。每个高斯椭球由以下参数定义:
- 位置(均值)
- 协方差矩阵
(控制椭球的形状和方向)
- 不透明度
- 颜色(通过球谐函数SH系数表示)
1.2 渲染流程
NeRF:基于体渲染(Volume Rendering)。沿相机光线采样多个点,通过神经网络查询每个点的颜色和密度,然后通过数值积分(如分层采样)合成最终像素颜色。
体渲染公式:
其中为透射率。
3DGS:基于可微光栅化(Differentiable Rasterization)。将每个3D高斯椭球投影到2D图像平面,形成2D高斯核,然后通过alpha-blending(按深度排序)合成像素颜色。
投影后的2D协方差矩阵:
其中为视图变换矩阵,
为投影雅可比矩阵。
像素颜色合成公式(alpha-blending):
其中为按深度排序后覆盖该像素的高斯集合。
1.3 性能与特性对比
| 特性 | NeRF | 3DGS |
|---|---|---|
| 表示方式 | 隐式(神经网络) | 显式(3D高斯集合) |
| 渲染速度 | 慢(需多次网络前向) | 快(可微光栅化,实时) |
| 训练速度 | 慢(数小时至数天) | 快(数分钟至数小时) |
| 显存占用 | 较低(网络参数) | 较高(存储大量高斯参数) |
| 编辑性 | 困难(隐式表示) | 容易(显式,可增删改高斯) |
| 压缩性 | 一般(网络权重) | 较好(可量化、剪枝) |
| 质量 | 高(连续,细节好) | 高(近年已接近NeRF) |
2. 3DGS优化全流程
3DGS的优化是一个从稀疏点云初始化为起点,通过可微渲染、损失计算、参数更新、自适应密度控制等步骤迭代优化的过程。
2.1 初始化
通常从运动恢复结构(SfM)得到的稀疏点云开始。每个点云点被初始化为一个各向同性的3D高斯:
- 位置
:点云坐标
- 协方差
(初始为球体)
- 不透明度
- 颜色(SH系数):初始为视图无关的漫反射颜色
2.2 可微渲染与损失函数
每一轮迭代,对训练视图进行可微渲染,得到预测图像,并与真实图像
比较计算损失。
常用损失函数为L1损失与SSIM损失的加权和:
其中,
,
。
2.3 参数优化
使用梯度下降法(如Adam)更新所有高斯的参数:
- 位置
- 协方差矩阵
(实际优化缩放
和旋转四元数
)
- 不透明度
- 球谐系数
协方差矩阵由缩放和旋转参数重建:
其中,
为由四元数
转换的旋转矩阵。
2.4 自适应密度控制
这是3DGS优化的核心机制,用于动态增加(克隆/分裂)或删除(修剪)高斯,以更好地覆盖场景几何。
克隆:对于位置梯度大的高斯(位于重建不足区域),将其复制一份,并沿位置梯度方向轻微扰动。
分裂:对于尺度过大(协方差矩阵特征值过大)的高斯,将其分裂为两个更小的高斯,以增加局部细节。
修剪:定期移除不透明度低于阈值(如0.005)或体积过小的高斯,以控制总数。
2.5 优化流程伪代码
# 初始化 gaussians = initialize_from_sfm(point_cloud) optimizer = Adam(gaussians.parameters()) for iteration in range(max_iterations): # 1. 可微渲染 rendered_image = differentiable_rasterization(gaussians, camera_pose) # 2. 计算损失 loss = (1 - lambda) * L1_loss(rendered_image, gt_image) + lambda * (1 - SSIM(rendered_image, gt_image)) # 3. 反向传播 loss.backward() optimizer.step() optimizer.zero_grad() # 4. 自适应密度控制(每N次迭代执行) if iteration % density_control_interval == 0: # 克隆梯度大的高斯 clone_gaussians_with_large_gradients(gaussians) # 分裂尺度过大的高斯 split_large_gaussians(gaussians) # 修剪不透明度过低的高斯 prune_opaque_gaussians(gaussians, threshold=0.005) # 5. 重置不透明度(可选,避免饱和) reset_opacity(gaussians)2.6 收敛与输出
优化完成后,得到一组优化的3D高斯集合,可用于:
- 实时渲染:在新视角下通过光栅化快速生成图像。
- 场景编辑:直接修改、添加或删除特定高斯。
- 压缩与传输:对高斯参数