高斯泼溅技术-从入门到精通
自适应密度控制(Adaptive Density Control)
训练从稀疏点云初始化,经过几万步梯度下降,最终得到数百万个高斯体。这中间,高斯体的数量和位置是如何从初始状态演变到最终状态的?答案就是本文的主题——自适应密度控制。
对应原论文第5节"Optimization"中关于密度控制的部分,这是3DGS区别于纯粹梯度下降的关键机制。
目录
- 1. 为什么单靠梯度下降不够
- 2. 密度控制的三种操作
- 2.1 克隆(Clone)
- 2.2 分裂(Split)
- 2.3 剪枝(Prune)
- 3. 触发条件与阈值设置
- 3.1 密度控制的触发时机
- 3.2 各操作的判断阈值
- 4. 密度控制对渲染质量的影响
- 5. 超参数调优指南
- 6. 参考资料
1. 为什么单靠梯度下降不够
纯粹的梯度下降只能移动和调整已有高斯体的参数,不能凭空创造或删除高斯体。这在两种情况下会导致问题:
欠重建区域(Under-Reconstruction):场景中某些细节区域(如树叶的纹理、窗框边缘)初始点云太稀疏,高斯体数量不够,无论怎么调参也表示不好,因为根本没有足够的高斯体来覆盖这些区域。梯度下降会把已有的高斯体拉向这些区域,但一个太大的高斯体试图覆盖过大范围时,精度必然下降。
过重建区域(Over-Reconstruction):某些区域的高斯体不合理地变大,一个高斯体试图表示太复杂的局部结构,导致渲染模糊或出现伪影。
自适应密度控制的作用:让高斯体的分布"进化"——在需要的地方增殖,在不需要的地方裁剪,最终让高斯体的密度自然地匹配场景复杂度。
2. 密度控制的三种操作
2.1 克隆(Clone)
触发条件:高斯体的位置梯度∥ ∇ μ L ∥ \|\nabla_\mu \mathcal{L}\|∥∇μL∥超过阈值τ p o s \tau_{pos}τpos,且高斯体当前尺度较小(max ( s x , s y , s z ) ≤ τ s c a l e \max(s_x, s_y, s_z) \leq \tau_{scale}max(sx,sy,sz)≤τscale)。
操作:在原高斯体旁边创建一个完全相同的复制体(相同的μ \boldsymbol{\mu}μ,Σ \boldsymbol{\Sigma}Σ,α \alphaα, SH),然后沿梯度方向轻微偏移其位置。
直觉解释:位置梯度大意味着"这里渲染误差大,需要调整",尺度小意味着"这个高斯体本身很小,但还不够用来覆盖这个区域"。克隆一个一样的放旁边,用更多的高斯体覆盖同一区域,增加局部密度。
原始状态: 克隆后: [Gs] ←大梯度 [Gs][Gs'] 小高斯体,复制一个放旁边,一起覆盖细节区域2.2 分裂(Split)
触发条件:高斯体的位置梯度∥ ∇ μ L ∥ \|\nabla_\mu \mathcal{L}\|∥∇μL∥超过τ p o s \tau_{pos}τpos,且高斯体尺度较大(max ( s x , s y , s z ) > τ s c a l e \max(s_x, s_y, s_z) > \tau_{scale}max(sx,sy,sz)>τscale)。
操作:删除原高斯体,用原协方差矩阵对应的概率分布采样两个新的中心位置,生成两个尺度缩小(各方向乘以1 / 1.6 1/1.61/1.6的系数)的高斯体替代原高斯体。
直觉解释:位置梯度大 + 尺度大意味着"一个大高斯体试图表示复杂的细节区域,需要拆小"。分裂后,两个更小的高斯体可以各自聚焦于原来那个大高斯体覆盖范围内的不同子区域。
分裂前: 分裂后: [ Large Gs ] [Gs1] [Gs2] 大高斯体覆盖复杂区域 两个小高斯体各自负责子区域克隆 vs 分裂的判断逻辑:高斯体"小但不够密"→克隆;高斯体"太大导致模糊"→分裂。两者的判断依据都是梯度大小(需要密度增加),区别只在当前高斯体的尺度。
2.3 剪枝(Prune)
密度控制不只是增加高斯体,还包括删除无用的高斯体:
条件1(透明度剪枝):α < ϵ α \alpha < \epsilon_\alphaα<ϵα(约0.005 0.0050.005)。几乎透明的高斯体对渲染几乎没有贡献,保留只会占用内存和计算资源。
条件2(尺度剪枝):高斯体在世界坐标或图像坐标中的尺寸超过阈值。过大的高斯体通常出现在场景边界或空旷区域,是"浮云"效应(floaters)的来源,会在某些视角产生伪影。
条件3(定期不透明度重置):每隔固定步数,对所有高斯体的不透明度做一次强制重置(乘以一个小于1的系数),之后通过训练恢复。这个操作的目的是让那些位置不好的高斯体在重置后梯度大、透明度低,最终在下一轮剪枝中被删除。不重置的话,这些"占位置"的高斯体会在整个训练过程中一直存在。
前瞻:3DGS的密度控制是基于启发式规则的,参数调整不当容易导致高斯体数量爆炸(占满显存)或不足(欠拟合)。后续工作 3DGS-MCMC(2024)提出用马尔可夫链蒙特卡洛方法替代这套启发式规则,让密度控制变成一个有原则的概率推断过程。
3. 触发条件与阈值设置
3.1 密度控制的触发时机
密度控制不是每一步训练都做,而是按固定间隔执行:
| 操作 | 频率 |
|---|---|
| 克隆 / 分裂(Densification) | 每densification_interval = 100步 |
| 剪枝(Pruning) | 每次Densification时同时执行 |
| 不透明度重置(Opacity Reset) | 每opacity_reset_interval = 3000步 |
| 停止Densification | 从第densify_until_iter = 15000步之后停止 |
这个节奏意味着:前15000步是高斯体数量快速增长的阶段,之后只有剪枝(高斯体数量逐渐减少并稳定)。
3.2 各操作的判断阈值
| 参数名 | 默认值 | 含义 |
|---|---|---|
densify_grad_threshold | 0.0002 | 触发克隆/分裂的位置梯度阈值 |
percent_dense | 0.01 | 区分克隆和分裂的尺度阈值(相对于场景尺寸) |
min_opacity | 0.005 | 透明度剪枝阈值 |
max_screen_size | 20(像素) | 图像空间尺寸超过该值的高斯体被剪枝 |
梯度累积方式:位置梯度不是单步梯度,而是最近densification_interval步的梯度均值(绝对值)。累积后求平均,能更稳定地判断哪些区域真正需要增加密度,避免被单步的噪声梯度误触发。
4. 密度控制对渲染质量的影响
通过训练日志中高斯体数量的变化曲线,可以看出密度控制的效果:
高斯体数量(对数尺度) 1M | ∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙∙(趋于稳定) | ∙∙∙∙ 500K| ∙∙∙∙ | ∙∙∙∙ 200K| ∙∙∙∙ | ∙(初始点云) 50K|___________________________________________▶ 训练步数 0 2k 4k 6k 8k 10k 12k 15k 30k ← 快速增长阶段 →|← 密度稳定阶段(仍有微量剪枝)→高斯体数量的快速增长阶段正是场景细节逐渐丰富的阶段——从远看轮廓正确但模糊,到近看也能看清纹理和边缘细节。
密度控制参数调得太激进(densify_grad_threshold过小):高斯体数量爆炸,显存耗尽,训练崩溃。
密度控制参数调得太保守(densify_grad_threshold过大):高斯体不够,细节丢失,PSNR偏低。
opacity_reset_interval的作用:如果这个值太大(重置频率太低),“僵尸高斯体”(位置不好但透明度已经学到较高值的高斯体)会一直存在。适当频率的重置是避免高斯体数量虚高的保障。
5. 超参数调优指南
不同场景有不同的最优配置,以下是一些经验规律:
室内近景场景(如NeRF-Blender合成数据集)
# 场景规模小,点云密,可以适当提高梯度阈值python train.py-sdata/nerf_synthetic/lego\--densify_grad_threshold0.0002\# 默认值--densification_interval100# 默认值室外无约束场景(如Mip-NeRF360数据集)
# 背景无限远,高斯体数量多,建议保守一些python train.py-sdata/360_v2/garden\--densify_grad_threshold0.0003\# 适当提高阈值,减少高斯体数量--densify_until_iter20000# 可适当延长密度增长阶段高斯体数量过多(显存不足)的应对方案:
- 提高
densify_grad_threshold(减少密度增长触发频率) - 降低
densify_until_iter(更早停止密度增长) - 降低
max_screen_size(更积极地剪枝大高斯体) - 降低训练分辨率(减少图像空间计算量,同时间接影响高斯体尺度阈值)
渲染结果有大量"浮云"(场景边缘的噪声点):
降低max_screen_size或在训练后单独运行一次剪枝脚本。
前瞻:自适应密度控制的一个根本问题是它依赖梯度信号来判断哪里需要更多高斯体,而梯度信号本身就有噪声。Gaussian Opacity Fields(2024)提出用不透明度场来驱动密度控制,比纯梯度信号更稳定。另一个方向是 Compact3D(2024),通过在损失函数里加入高斯体数量的惩罚项,让模型在训练过程中自动学习稀疏性,而不依赖手动设定的阈值。
6. 参考资料
- Kerbl, B. et al. (2023). 3D Gaussian Splatting.SIGGRAPH 2023. https://arxiv.org/abs/2308.04079 — 原论文第5节Optimization
- Kheradmand, A. et al. (2024). 3D Gaussian Splatting as Markov Chain Monte Carlo. https://arxiv.org/abs/2404.09591 — 用MCMC替代启发式密度控制
- Fan, Z. et al. (2023). LightGaussian: Unbounded 3D Gaussian Compression with 15x Reduction and 200+ FPS. https://arxiv.org/abs/2311.17245 — 高斯体压缩与剪枝的后续工作
- Yu, Z. et al. (2024). Gaussian Opacity Fields: Efficient Adaptive Surface Reconstruction in Unbounded Scenes. https://arxiv.org/abs/2404.10772
下一篇:07 损失函数与优化策略
