【高斯泼溅】3DGS城市模型从“硬盘杀手”到“轻盈舞者”?看我们如何实现14倍压缩

如何把一座城市渲染出来?

三年前,NeRF给出的答案是“隐式网络+无尽采样”,渲染的算力黑洞让人望而却步;如今,3D Gaussian Splatting(3DGS)用“显式高斯椭球”消除了渲染阶段对网络的依赖,却悄悄把问题翻了个面——模型体量大成了新瓶颈。

3DGS模型与椭球分布

当场景从“桌面摆件”扩展到“十字街头”再到“万亩城区”,数据像吹气球一样膨胀:数千万椭球、上百GB模型文件,训练时卡爆GPU,加载时撑爆显卡,传输时堵爆带宽,保存时挤占硬盘

“怎样在保真的同时变得更轻”,本文将主要分析3DGS模型潜在的冗余椭球问题及探讨相应的解决方法。

冗余椭球与训练缓慢

当我们训练一个3DGS模型时,总会有一个疑问:这个场景到底需要多少椭球,才能既保证渲染质量又保证训练速度?

01椭球数量的增长

3DGS原始实现并没有设置一个固定的数量上限,而是靠着人为设置的阈值在指定训练次数后停止增长椭球。在典型的小区域环绕场景中椭球可以增长到500~600万左右。这个数量一般远超想要表达的主要兴趣区域所需。

图中在仅使用234万椭球的情况下即可达到570万的渲染指标。

原生算法和简化效果对比

02训练速度的降低

随着椭球数量的增长,随之而来的是显卡显存的占用和计算压力的提升,带来的直接影响便是训练时长的显著增加。3DGS原始实现训练常用的小场景数据集时间平均在20~40分钟之间,而且我们可以显著的观察到训练速度是随着点数增长而相应降低的。

如何用更少的椭球数量实现同等的渲染质量是一个必须研究的方向。识别冗余椭球并删除,是一个显而易见的可行方案。

主流删除方案:直接法与剪枝法

直接法剪枝法目的都是删除冗余点,但他们之间最主要的区别是:删除依据是可学习的还是人工设计的。

01直接法

直接法一般不参与训练中的梯度计算,仅在训练中/后直接计算每个椭球的重要性分数,逐步/一次删除至设定的点数。

这方面的代表有LightGaussianTamingGSMini-splatting等论文。重要性分数的计算共有步骤有:

  1. 输入训练视角的所有图片和位姿
  2. 遍历图片,每张图片计算与其有关椭球的重要性分数(不透明度、命中像素次数等)
  3. 累加所有视角,计算出最终每个椭球的重要性分数
  4. 根据需要,删除低分数椭球

LightGaussian重要性计算

02剪枝法

剪枝法认为直接限制椭球数量上限难以满足渲染质量的要求,因此一般是在训练过程中识别并逐渐删除对渲染质量贡献较小的冗余高斯。

剪枝法的核心思想是为每个椭球增加一个可训练的参数,用于表示其对渲染的贡献程度,从而可以依据该参数直接进行删除。该方法的相关工作有CompactGS、MaskGS、GaussianSpa等。

MaskGS流程图,M为可学习参数

与直接法重要性得分计算类似,剪枝法需要构建一个可以微分的重要性得分。在上述工作中,主要与椭球的不透明度、形状、透射率等参数相关联,依托椭球本身的属性来构建重要性。

比如CompactGS方法思路较为直接,直接构建mask掩膜,为每个椭球分配一个二值变量(0或1),其中1表示渲染,0表示删除。虽然二值操作本身不可导,不能被优化,但是可以通过构造可导的间接变量,使得梯度可以传导至掩码。

CompactGS掩码公式

从下表可以看出:

  • 原始3DGS中确实存在较多冗余椭球
  • 两类方法均可以在较大的压缩比下实现接近甚至超出的质量
  • 删除椭球后训练时间有不同程度降低(GaussianSPA训练轮数更多)

建模质量与数量对比

两种方法的适用情况也不尽相同,直接法的重要性分数一般可以在训练后算出剪枝法一般需要伴随一定量的训练步骤。如果是已经训练完的原始模型,最好使用直接法删除椭球,以降低可能的额外训练时间。

Mapmost 高斯泼溅建模平台

结合学术界压缩方法,我们在Mapmost高斯泼溅建模平台综合并改进了一套模型轻量化算法,可以在保证细节的情况下,最高达到14倍的压缩比。

图中14倍压缩率情况下,模型体积从170MB降低至16MB,文字细节和屋顶轮廓仍然保持较高还原度。这样不仅减小了存储占用,同时也有利于建模和渲染性能的提升。

Mapmost高斯泼溅建模平台正式开放体验!让专业级城市三维建模,从此没有门槛。上传航拍图,即可获得一个高精度、轻量化、即拿即用的3DGS模型。

登录Mapmost 3DGS Builder体验版(studio.mapmost.com/3dgs),立即开始建模!

申请试用,请至Mapmost官网联系客服

Morton排序可以提升3D高斯数据压缩效率,具体方法如下: ### 利用空间局部性 莫顿重新排序能使渲染速度更快,因为按距离排序后,附近的点更有可能位于原始数据数组中附近。在3D高斯数据里,具有空间局部性的数据在莫顿排序后会聚集在一起。这样相似特征的数据相邻排列,使得数据在存储时冗余度降低,更有利于压缩算法识别和处理这些相似数据,进而提升压缩效率[^1]。 ### 编码实现 可以通过特定的代码实现莫顿编码对3D数据进行排序。如给定的代码中,`MortonPart1By2`函数将输入的`x`的21个低位插入两个0位,为后续的3D Morton编码做准备。`MortonEncode3`函数则把三个21位整数编码为3D Morton顺序。通过这样的编码,3D高斯数据能以一种有序的、符合空间局部性的方式排列,便于后续的压缩操作。以下是相关代码: ```csharp // Based on https://fgiesen.wordpress.com/2009/12/13/decoding-morton-codes/ // Insert two 0 bits after each of the 21 low bits of x static ulong MortonPart1By2(ulong x) { x &= 0x1fffff; x = (x ^ (x << 32)) & 0x1f00000000ffffUL; x = (x ^ (x << 16)) & 0x1f0000ff0000ffUL; x = (x ^ (x << 8)) & 0x100f00f00f00f00fUL; x = (x ^ (x << 4)) & 0x10c30c30c30c30c3UL; x = (x ^ (x << 2)) & 0x1249249249249249UL; return x; } // Encode three 21-bit integers into 3D Morton order public static ulong MortonEncode3(uint3 v) { return (MortonPart1By2(v.z) << 2) | (MortonPart1By2(v.y) << 1) | MortonPart1By2(v.x); } ``` 通过调用上述函数对3D高斯数据进行莫顿编码排序,能让数据在空间上有序排列,提升压缩效率[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值