Gaussian Splatting变体与优化
概述
自3D Gaussian Splatting (3DGS)提出以来,研究社区开发了大量变体和优化技术来改进原始方法的各个方面。这些改进主要集中于:
- 动态场景建模:处理非刚性变形和运动物体
- 压缩与加速:减少内存占用和提高渲染速度
- 表面质量提升:改进几何重建精度
- 编辑与控制:增强场景可控性
动态场景3DGS
4D Gaussian Splatting
原始3DGS仅能处理静态场景。4D Gaussian Splatting扩展了高斯表示以建模随时间变化的动态场景。
核心思想
4DGS将每个高斯扩展为包含空间位置和形变参数:
其中 是高斯 在时间 的位置,通常通过MLP建模:
时空高斯分解
分解表示法:
时序高斯属性:
- 位置:
- 缩放:
- 旋转:
- 颜色:
4DGS架构
class DynamicGaussianModel:
def __init__(self, num_gaussians):
# 静态/共享参数
self.sh_features = ... # 球谐特征
self.base_scales = ... # 基础缩放
self.base_rotations = ... # 基础旋转
# 时间变形网络
self.mlp_position = MLP(hidden_dim=64, output_dim=3)
self.mlp_scale = MLP(hidden_dim=64, output_dim=3)
self.mlp_rotation = MLP(hidden_dim=64, output_dim=4)
def get_gaussian_at_time(self, gaussian_id, t):
"""获取时间t时的高斯参数"""
base_pos = self.positions[gaussian_id]
base_scale = self.base_scales[gaussian_id]
base_rot = self.base_rotations[gaussian_id]
# 应用时间变形
delta_pos = self.mlp_position(base_pos, t)
delta_scale = self.mlp_scale(base_pos, t)
delta_rot = self.mlp_rotation(base_pos, t)
return {
'position': base_pos + delta_pos,
'scale': base_scale + delta_scale,
'rotation': compose_quaternion(base_rot, delta_rot),
'feature': self.sh_features[gaussian_id]
}时间采样策略
4DGS的训练需要有效的时序采样:
- 均匀采样:
- 重要性采样:优先采样运动剧烈的时间点
- 对比采样:同时采样两个时间点,增强时间一致性
Dynamic 3D Gaussians
Luiten等人提出的Dynamic 3D Gaussians专注于单目视频的动态场景重建。
核心方法
- 跟踪3D高斯:每帧跟踪高斯运动
- 刚体分组:将高斯分组为刚体部件
- 变形建模:为每组学习独立变换
轨迹表示
每个高斯的轨迹表示为:
其中 和 是时间相关的旋转和平移。
高效优化技术
内存压缩
Gaussian Quantine (GQ)
通过自适应量化减少高斯存储:
def quantize_gaussians(gaussians, bits=8):
"""量化高斯参数"""
quantized = {}
for key, value in gaussians.items():
if value.dtype == torch.float32:
# 均匀量化
scale = (value.max() - value.min()) / (2**bits - 1)
quantized[key] = ((value - value.min()) / scale).round()
else:
quantized[key] = value
return quantized, scale_dict剪枝策略
基于不透明度的剪枝:
基于大小的剪枝:
计算加速
Tile-based光栅化
将图像分割为tiles,每个tile独立渲染:
def tile_based_rasterize(gaussians, image_size, tile_size=16):
"""Tile-based光栅化"""
num_tiles_x = (image_size[0] + tile_size - 1) // tile_size
num_tiles_y = (image_size[1] + tile_size - 1) // tile_size
for tile_x in range(num_tiles_x):
for tile_y in range(num_tiles_y):
# 获取tile边界
x_start = tile_x * tile_size
x_end = min(x_start + tile_size, image_size[0])
y_start = tile_y * tile_size
y_end = min(y_start + tile_size, image_size[1])
# 过滤落在tile内的高斯
in_tile = filter_gaussians_in_tile(gaussians,
x_start, x_end,
y_start, y_end)
# 对tile内高斯排序并渲染
render_tile(in_tile, x_start, y_start)多尺度渲染
细节层次(LOD):
| 距离范围 | 高斯数量 | 渲染分辨率 |
|---|---|---|
| 近景 | 全部 | 完整 |
| 中景 | 75% | 1/2 |
| 远景 | 50% | 1/4 |
渲染质量优化
SuGaR: Surface-Aligned Gaussians
SuGaR专注于从3DGS中提取高质量表面网格。
核心思想:
- 约束高斯分布靠近表面
- 提取等值面
- 纹理映射
表面约束损失:
其中:
- :深度一致性损失
- :法向量一致性损失
- :SDF正则化
GauU-SDF: Unified SDF Representation
GauU-SDF将高斯与有符号距离场(SDF)统一表示:
其中 是可学习权重, 是等值面阈值。
紧凑表示
LightGaussians
LightGaussians通过以下技术压缩场景:
- 渐进式剪枝:迭代移除不重要高斯
- 特征聚类:K-means聚类球谐特征
- 矩阵分解:对高斯参数矩阵进行低秩分解
class LightGaussians:
def compress(self, target_ratio=0.3):
"""压缩到目标比例"""
# 1. 重要性评估
importance = self.compute_importance()
# 2. 剪枝不重要高斯
mask = importance > np.percentile(importance, 100*(1-target_ratio))
self.filter(mask)
# 3. 特征聚类
self.sh_features = self.cluster_features(num_clusters=64)
# 4. 验证压缩质量
psnr_before = self.evaluate()
psnr_after = self.evaluate()
return psnr_before, psnr_afterCompact Gaussian Representation
紧凑高斯表示使用:
- 八叉树空间划分:加速空间查询
- 层次化细节:多分辨率表示
- 特征共享:相邻高斯共享特征
处理无纹理区域
法向量引导
对于无纹理区域,法向导引提供额外约束:
法向量可从深度图通过有限差分估计:
几何先验
单目法向量估计网络(如MiDaS)提供初始几何约束:
然后通过3DGS优化精化。
深度-法向量一致性
自适应控制策略
自适应密集化
根据场景复杂度自适应调整密集化策略:
def adaptive_densify(gaussians, gradients, scene_complexity):
"""自适应密集化"""
if scene_complexity > complexity_threshold:
# 高复杂度区域:更积极的克隆
densify_mode = "clone"
threshold = high_grad_threshold
else:
# 低复杂度区域:更保守的分裂
densify_mode = "split"
threshold = low_grad_threshold
for g in gaussians:
if g.gradient_magnitude > threshold:
if densify_mode == "clone":
clone_gaussian(g)
else:
split_gaussian(g)渐进式训练
阶段1:仅优化位置和缩放
阶段2:添加旋转优化
阶段3:完整优化(包括颜色SH)
性能对比
渲染速度对比
| 方法 | FPS@1080p | 内存占用 | 质量(PSNR) |
|---|---|---|---|
| Original 3DGS | ~100 | ~400MB | ~32 |
| Compact GS | ~150 | ~200MB | ~31 |
| Tile-based优化 | ~200 | ~400MB | ~32 |
| LOD优化 | ~300 | ~150MB | ~30 |
质量-速度权衡
PSNR
32 | * Original
| * * Compact
31 | * * * Tile
| *
30 | * LOD
|___________________
50 100 150 200 FPS
应用场景
实时AR/VR
高效3DGS变体支持:
- 移动设备实时重建
- 低延迟视角合成
- 云端渲染+流式传输
自动驾驶
动态3DGS用于:
- 实时场景重建
- 动态物体跟踪
- 传感器仿真
电影制作
高质量3DGS用于:
- 虚拟制片
- 数字资产创建
- 视效预览
工具与库
| 工具 | 用途 | 链接 |
|---|---|---|
| Nerfstudio | 统一工具链 | github.com/nerfstudio-project |
| gsplat | 高效splatting | github.com/antmarklohaus/gsplat |
| diff-gaussian-rasterization | 可微渲染 | github.com/ingridkyu |
| 3DGS-tensorpath | 快速渲染 | 学术实现 |
总结与展望
当前局限
- 无纹理区域处理:仍需改进
- 远距离场景:大规模场景效率低
- 语义理解:缺乏高级语义表示
- 实时编辑:复杂编辑操作不够流畅
未来方向
- 神经渲染+物理先验:结合物理仿真
- 语义3DGS:集成语义分割
- 跨模态监督:利用语言、深度等多种信号
- 端到端优化:从原始图像直接学习高斯表示