当前位置: 首页 > news >正文

高斯泼溅技术-从入门到精通

自适应密度控制(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_threshold0.0002触发克隆/分裂的位置梯度阈值
percent_dense0.01区分克隆和分裂的尺度阈值(相对于场景尺寸)
min_opacity0.005透明度剪枝阈值
max_screen_size20(像素)图像空间尺寸超过该值的高斯体被剪枝

梯度累积方式:位置梯度不是单步梯度,而是最近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# 可适当延长密度增长阶段

高斯体数量过多(显存不足)的应对方案

  1. 提高densify_grad_threshold(减少密度增长触发频率)
  2. 降低densify_until_iter(更早停止密度增长)
  3. 降低max_screen_size(更积极地剪枝大高斯体)
  4. 降低训练分辨率(减少图像空间计算量,同时间接影响高斯体尺度阈值)

渲染结果有大量"浮云"(场景边缘的噪声点):
降低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 损失函数与优化策略

http://www.cnnetsun.cn/news/3609468.html

相关文章:

  • DeepSeek专家模式突破对话上限技巧,无缝衔接新对话!
  • 非结构化数据满天飞,90%的敏感数据藏在文档堆里,怎么让AI真正分得清?
  • 大模型分布式训练与显存优化核心技术解析
  • 因算力紧缺,月之暗面Kimi宣布暂停C端新用户订阅;ASML回应向全球员工发2万欧元股权激励;Qwen3.8-Max预览版上线 | 极客头条
  • 2026年英文论文翻译工具横评:5款主流方案实测对比与效率选型指南
  • UVM验证平台的死亡陷阱:从入门到放弃的那些坑
  • FreeRDP曝高危堆缓冲区溢出漏洞:wfreerdp客户端遭弃用,远程代码执行风险急剧上升
  • 【Springboot毕设全套源码+文档】基于JavaWeb的图书馆管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 下拉刷新库:通用下拉刷新与上拉加载组件(243)
  • 弹窗库:Toast、Loading、ActionSheet的统一封装(244)
  • C 语言 struct 内存对齐与面向对象:从 padding 到函数指针接口
  • 从“刷卡拥堵”到“秒级通行”:一张RFID电子校徽如何让校园管理有迹可循?
  • 2023三大开源AI工具实战:Dify、n8n与OpenClaw
  • 东莞商旅服务平台头部机构多维度能力梳理及选型参考
  • LLM Agent技术演进:从定制化到通用化
  • 解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
  • LLM到Agent的技术演进与核心组件解析
  • Windows11的SMB共享文件夹
  • 英文降AI率实战:Turnitin更新后,文本AI率优化策略(附3款工具测评)
  • 上海宝山高境开公司的老板注意!低价代账正在拖垮你的企业
  • 从 50 字段订单表到可演进订单领域:一次基于真实代码的 DDD 重构分析
  • VS Code远程开发——现代机器人开发的主流IDE方案
  • Python agate-stats 包详解:功能、安装、语法与实战案例
  • Python agate-lookup 包详解:功能、安装、语法与实战案例
  • 2026 主流热门 AI 配音软件合集深度实测测评报告
  • 全球80000余座大型国际机场、地区性通航机场、水上飞机起降点分布矢量数据
  • 深入解析TMS320C5x DSP架构:哈佛结构、外设协同与低功耗设计实战
  • 终于不用熬夜写论文了[特殊字符]|PaperXie一套搞定本科毕业论文全流程
  • 选单片机硬件设计公司,怎么避坑不踩雷?
  • ESXi嵌套虚拟化Windows卡顿完整解决方案:GPU直通优化与嵌套底层开销说明