Gaussian Splatting变体与优化

概述

自3D Gaussian Splatting (3DGS)提出以来,研究社区开发了大量变体和优化技术来改进原始方法的各个方面。这些改进主要集中于:

  1. 动态场景建模:处理非刚性变形和运动物体
  2. 压缩与加速:减少内存占用和提高渲染速度
  3. 表面质量提升:改进几何重建精度
  4. 编辑与控制:增强场景可控性

动态场景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的训练需要有效的时序采样:

  1. 均匀采样
  2. 重要性采样:优先采样运动剧烈的时间点
  3. 对比采样:同时采样两个时间点,增强时间一致性

Dynamic 3D Gaussians

Luiten等人提出的Dynamic 3D Gaussians专注于单目视频的动态场景重建。

核心方法

  1. 跟踪3D高斯:每帧跟踪高斯运动
  2. 刚体分组:将高斯分组为刚体部件
  3. 变形建模:为每组学习独立变换

轨迹表示

每个高斯的轨迹表示为:

其中 是时间相关的旋转和平移。


高效优化技术

内存压缩

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中提取高质量表面网格。

核心思想

  1. 约束高斯分布靠近表面
  2. 提取等值面
  3. 纹理映射

表面约束损失

其中:

  • :深度一致性损失
  • :法向量一致性损失
  • :SDF正则化

GauU-SDF: Unified SDF Representation

GauU-SDF将高斯与有符号距离场(SDF)统一表示:

其中 是可学习权重, 是等值面阈值。

紧凑表示

LightGaussians

LightGaussians通过以下技术压缩场景:

  1. 渐进式剪枝:迭代移除不重要高斯
  2. 特征聚类:K-means聚类球谐特征
  3. 矩阵分解:对高斯参数矩阵进行低秩分解
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_after

Compact 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高效splattinggithub.com/antmarklohaus/gsplat
diff-gaussian-rasterization可微渲染github.com/ingridkyu
3DGS-tensorpath快速渲染学术实现

总结与展望

当前局限

  1. 无纹理区域处理:仍需改进
  2. 远距离场景:大规模场景效率低
  3. 语义理解:缺乏高级语义表示
  4. 实时编辑:复杂编辑操作不够流畅

未来方向

  1. 神经渲染+物理先验:结合物理仿真
  2. 语义3DGS:集成语义分割
  3. 跨模态监督:利用语言、深度等多种信号
  4. 端到端优化:从原始图像直接学习高斯表示

参考论文


相关资源