LightGaussian: Unbounded 3D Gaussian Compression with 15x Reduction and 200+ FPS
本文根据本人对 LightGaussian 论文的理解,结合论文中的实验结果和作者的分析,对该方法的核心创新、实验验证以及潜在的局限性进行了详细的解读与总结。同时也用于记录和分享该方法的核心思想和技术细节,方便后续的学习和参考。
论文发表在NeurIPS 2024上,作者来自德州大学奥斯汀分校和厦门大学。
- 效果展示:https://lightgaussian.github.io/
- 论文链接:https://arxiv.org/pdf/2311.17245
- 代码链接:https://github.com/VITA-Group/LightGaussian
前言
3D Gaussian Splatting虽然实现了高质量实时渲染,但存在一个严重问题:一个无边界场景的高斯点数量巨大,通常都是百万级别,存储和计算成本极高。LightGaussian 是一种后处理的压缩方法,它的目标就是要在尽可能不损失画面质量的情况下,把3DGS生成的场景变“轻”,也就是大幅减少场景的参数量,从而实现更高效的存储和更快的渲染速度。
LightGaussian 的流程
原文中的流程图展示了 LightGaussian 的整体流程,主要分为以下几个步骤:
-
输入数据:首先,LightGaussian 接收一个由原版3DGS生成的高斯点云作为输入。这些高斯点云包含了场景的几何和颜色信息,是后续处理的基础。
-
剪枝与恢复:接下来,LightGaussian 通过一种创新的剪枝方法,将输入数据中对画面质量贡献较小的高斯点剪掉。这一步是 LightGaussian 的核心创新之一,通过引入一种新的全局显著性算法,实现了对场景的中高斯点的精准剪枝。并且在剪枝后,还使用剪枝剩下的高斯点的渲染结果和真实图像对比,并微调它们(剩余高斯点)的参数,以进一步减少剪枝对画面质量的影响。
-
蒸馏SH:在剪枝之后,LightGaussian 还引入了一个蒸馏SH(Spherical Harmonics)的方法,用于对剪枝后的高斯点进行进一步的优化和压缩。这一步通过知识蒸馏和伪视图增强,进一步减少了数据量,同时保持了较好的视觉质量。
-
高斯VQ:最后,LightGaussian 还使用了一种高斯VQ(Vector Quantization)的方法,对剪枝后的高斯点进行量化和编码,以实现更高效的存储和传输。
一句话概括就是:找出“没用的Gaussian”,用更低成本表达“有用的Gaussian”。
具体压缩方法
高斯剪枝与恢复
以前的压缩方法主要依赖于高斯点的不透明度来进行剪枝。从上面的图中可以看出,不透明度小于0.2的高斯点几乎占了全部高斯点的一半,也就是说大部分高斯点的不透明度都不高。所以如果直接根据不透明度进行剪枝,可能会导致画面质量的显著下降。
而 LightGaussian 的剪枝方法则引入了一种新的全局显著性算法:
这个算法综合考虑了高斯点的光线命中次数、不透明度以及高斯体积多个因素,来判断哪些高斯点应该被剪掉。
其中,高斯体积由高斯点的真实体积归一化得到,这样才不会导致体积非常小的用于表现细节的高斯点被剪掉。具体计算公式如下:
这种方法能够更精准地识别出那些对画面质量贡献较小的高斯点,从而实现更有效的剪枝。
最后,LightGaussian 还通过比较剪枝后的渲染结果和真实图像之间的差异来对剩余高斯点的参数进行微调。通过优化剩余高斯点的参数,使得最终的渲染结果尽可能接近真实图像,从而最大程度地减少剪枝对画面质量的影响。
下图是剪枝前后高斯点的数量和画面的结构相似度的对比,中间这一列是光栅化残差,也就是画面中被剪掉的高斯点。可以看出剪枝后的高斯点数量大幅减少,并且画面仍然能够保持较好的视觉效果:
作者还做了相关的消融实验来验证这种剪枝方法的有效性。第一行是剪枝前的结果,第二行是只根据命中次数进行剪枝的结果,第三行是进一步考虑了不透明度进行剪枝的结果,第四行是再进一步考虑了高斯体积(也就是文中的方法)进行剪枝的结果。可以看出,LightGaussian 的方法在保持较好视觉质量的同时,实现了更高效的剪枝:
球谐(SH)系数蒸馏
原始的3DGS方法中,每个高斯点有位置、缩放、旋转、不透明度等参数。除此之外,每个高斯点还包含了一个3阶的球谐(SH)函数,用于表示该高斯点的光照信息。这个3阶的球谐函数需要48个参数来表示,参数占据了大量的存储空间。
因此作者就想通过对球谐函数进行降阶来进一步减少参数量。具体来说,作者是通过知识蒸馏和伪视图增强的方法来实现的。
首先,作者将原始的3阶球谐函数作为教师模型,然后用砍掉一阶的球谐函数作为学生模型,让这个学生模型来学习教师模型的输出。通过这种方式,学生模型能够在保持较好视觉质量的同时,使用更少的参数来表示球谐函数。
并且为了让学生模型学习连续视角下的光影变化,避免过拟合到特定视角,作者还引入了伪视图增强的方法。具体来说,就是在真实相机视角附近随机生成一些虚拟相机视角(也就是从不同的视角渲染场景),然后让学生模型在这些伪视图上进行训练。通过这种方式,学生模型能够更好地学习到球谐函数在不同视角下的变化,从而进一步提升了压缩后的视觉质量。
这一步实现了用低阶球谐函数来模拟高阶的效果,从而在保证视觉效果的同时,进一步减少了参数量。
高斯矢量量化(VQ)
在剪枝和蒸馏之后,LightGaussian 还引入了一种高斯矢量量化(VQ)的方法来进一步压缩数据。
举个例子,比如有1000个相似的白色色块,原始的3DGS方法每个色块都需要存完整的RGB值,这样就需要3000个参数。而矢量量化就是把这些相似的色块归为一类,只存储一个代表性的RGB值并将其记录到一个公用的码本中,然后每个色块就只需要存储其对应的索引,这样总共就只需要1003个参数。
按照前面的例子,直觉上肯定会想对所有高斯点的所有参数都进行矢量量化,这样才能最大化的减少参数量。但是作者发现如果对高斯点的位置、缩放、旋转这些参数也做量化的话,误差会特别大。因为这些参数稍微有一点点变化,最终渲染出来的效果就会差很多。而高斯点的SH系数则相对稳定,对误差比较不敏感,相似点的SH系数也更接近,因此最适合进行矢量量化。
但是也不是所有高斯点的SH系数都适合进行矢量量化。作者根据前面提到的全局显著性分数来筛选,只对全局显著性得分最低的那些高斯点的SH系数进行矢量量化。而对于那些全局显著性得分高的高斯点的SH系数,则不进行矢量量化,而是直接存储完整的参数。
也就是说,最终只对部分高斯点的SH系数进行矢量量化,这样既能够最大程度地减少参数量,又能够保持较好的视觉质量。
最后再对码本进行一定次数的微调,减少量化带来的画面质量损失。而未被量化的参数则直接用16位的浮点数存储(原始3DGS中是32位)。
作者也对不同的量化策略进行了消融实验。第一行是没有进行矢量量化的结果,第二行是只把32位浮点数换成16位浮点数存储的结果,
第三行是对所有高斯点的所有系数都进行矢量量化的结果,第四行是只对全局显著性较低的高斯点的全部系数进行矢量量化的结果。可以看出画面质量相比不考虑全局显著性有明显提升。
第五行是对所有高斯点的SH系数进行矢量量化的结果,可以看出画面质量明显下降。第六行是只对全局显著性较低的高斯点的SH系数进行矢量量化的结果,画面质量相比前面有明显提升:
实验结果
对比实验
作者在多个数据集上对 LightGaussian 进行了实验验证,并与之前的压缩方法进行了对比。结果表明,LightGaussian 在实现了更高效压缩和更快渲染速度的同时,也保证了较好的视觉质量。
消融实验
最后作者还进行了消融实验来验证每个步骤的有效性。通过逐步去掉剪枝、蒸馏SH和高斯VQ等组件,观察画面质量的变化,进一步证明了这些组件在 LightGaussian 中的重要作用。
第一行是原始的3DGS方法,第二行是剪枝后的结果,第三行是剪枝加上恢复的结果。
第四行是再加上直接讲解球谐函数的结果,第五行是加上降阶后微调的结果,第六行是加上知识蒸馏和伪视图增强的结果。
第七行是再加上高斯矢量量化的结果,第八行是加上量化后对码本进行微调的结果。可以看出每一步的改进都在帧率和场景大小或者画面质量上有明显提升:












