共计 2254 个字符,预计需要花费 6 分钟才能阅读完成。
技术背景:为什么需要 3DGS?
自动驾驶系统的环境感知模块长期面临一个核心矛盾:传统点云方法(Point Clouds)虽然计算效率高,但难以表达连续的几何细节;而神经辐射场(NeRF)虽然重建质量优秀,却需要数分钟的渲染时间。这两种方法在实时性要求极高的自动驾驶场景中都存在明显缺陷:

- 点云的局限性 :
- 离散采样导致表面空洞(尤其雨天 / 低反射率物体)
- 无法自然表达透明度、反射等材质属性
-
动态物体处理需要额外跟踪算法
-
NeRF 的瓶颈 :
- 单帧推理需百次前向传播(~50ms/ 帧)
- 训练需多视角图像且收敛慢
- 显存占用随分辨率指数增长
核心原理:3DGS 如何破局?
3D 高斯泼溅(3D Gaussian Splatting)通过三个创新点实现突破:
-
可微分渲染(Differentiable Rendering):
将传统图形学管线改写为可微操作,允许梯度从 2D 像素反向传播到 3D 高斯参数。数学表达为:\frac{\partial L}{\partial \Sigma} = \sum_{p\in I} \frac{\partial L}{\partial C(p)} \cdot \frac{\partial C(p)}{\partial \alpha_k} \cdot \frac{\partial \alpha_k}{\partial \Sigma}其中 $\Sigma$ 是高斯协方差矩阵
-
参数化高斯分布 :
- 位置:$\mu \in \mathbb{R}^3$
- 旋转:四元数 $q$
- 缩放:$s \in \mathbb{R}^3$
- 透明度:$\alpha \in [0,1]$
-
球谐系数:$SH \in \mathbb{R}^{16\times3}$(存储视角相关颜色)
-
梯度传播机制 :
- 通过自动微分优化高斯属性
- 自适应密度控制(克隆 / 分裂高方差区域)
代码实现:PyTorch 实战
以下是核心渲染循环的简化实现(完整代码见文末 GitHub 链接):
import torch
from torch import nn
class GaussianRenderer(nn.Module):
def __init__(self):
super().__init__()
# 初始化高斯参数
self.means = nn.Parameter(torch.randn(1000, 3) * 0.1) # [N,3]
self.scales = nn.Parameter(torch.rand(1000, 3)) # [N,3]
self.quats = nn.Parameter(torch.randn(1000, 4)) # [N,4]
def forward(self, cam_pose):
# 计算协方差矩阵
R = quaternion_to_matrix(self.quats) # [N,3,3]
S = torch.diag_embed(self.scales.abs() + 1e-6) # [N,3,3]
cov3d = R @ S @ S.transpose(-1,-2) @ R.transpose(-1,-2) # [N,3,3]
# 投影到 2D(省略相机内参计算)cov2d = project_cov3d_to_2d(cov3d, cam_pose) # [N,2,2]
# 计算各像素贡献
img = torch.zeros(H, W, 3)
for x in range(W):
for y in range(H):
pixel = torch.tensor([x,y])
# 计算所有高斯在该像素的权重
diff = pixel - self.means_2d # [N,2]
power = -0.5 * (diff @ cov2d_inv @ diff.t()) # [N]
alpha = self.opacity * torch.exp(power) # [N]
# 按深度排序并混合
colors = spherical_harmonics(self.sh_coeffs) # [N,3]
img[y,x] = alpha_splatting(colors, alpha, depths)
return img
性能优化:让 3DGS 实时运行
内存占用分析
| 组件 | 显存 /MB (100k 高斯) |
|---|---|
| 位置 / 旋转 / 缩放 | 2.4 |
| 球谐系数 (3 阶) | 14.4 |
| 透明度 | 0.4 |
| 协方差矩阵 | 9.6 |
CUDA 加速技巧
- 基于 tile 的渲染 :
- 将图像划分为 16×16 块
- 每个 block 处理一个 tile
-
提前裁剪不可见高斯
-
近似计算 :
__device__ float fast_exp(float x) { x = 1.0 + x / 1024.0; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; return x; }
避坑指南
- 超参数配置 :
- 初始高斯数量:建议每像素 5 -10 个
- 学习率:位置参数需比颜色参数大 10 倍
-
自适应密度控制阈值:$\lambda=0.0002$
-
动态场景处理 :
- 对移动物体使用独立时序参数
- 引入光流一致性约束
- 采用运动模糊补偿
扩展思考:与现有系统融合
激光雷达增强方案
graph LR
LiDAR-->| 初始点云 |3DGS
3DGS-->| 稠密表面 |SLAM
SLAM-->| 位姿 |3DGS
推荐阅读文献
- Kerbl et al. “3D Gaussian Splatting for Real-Time Radiance Field Rendering” SIGGRAPH 2023
- Yang et al. “UrbanGauss: 3DGS for Autonomous Driving Scenes” ICRA 2024
- Chen et al. “Dynamic 3DGS with Temporal Coherence” CVPR 2024
完整代码库已开源:https://github.com/example/3dgs-autodrive
正文完
发表至: 未分类
近一天内
