实时辐射场渲染利器——三维高斯泼溅算法

2024年 3月 7日 127.4k 0

译者 | 朱先忠

审校 | 重楼

高斯泼溅(Gaussian Splatting)是“实时辐射场渲染的3D高斯泼溅”论文(引文1)中介绍的一种表示3D场景和渲染新颖视图的方法。它被认为是NeRF(引文2)类模型的替代品,就像当年的NeRF模型本身一样,高斯泼溅引发了一系列新的研究工作,这些工作选择将其用作各种场景中3D世界的底层表示。

那么,高斯泼溅算法究竟有什么特别之处,为什么它比NeRF更好呢?或者说,可以下这样的结论吗?本文中,我们将全面地回答这几个问题。

引言

首先,从本文标题中可以看出,高斯泼溅算法的主要成名点是高渲染速度。这归功于下文将介绍的此算法实现本身以及由于使用自定义CUDA内核定制的渲染算法的实现。

图1:在渲染速度(fps)、训练时间(min)和视觉质量(峰值信噪比,越高越好)方面,之前的高质量表示和高斯泼溅(标记为“Ours”)的并排比较(源于引文1)

此外,高斯泼溅根本不涉及任何中性网络。甚至没有使用哪怕是一个小的MLP,也没有引入任何神经网络,场景本质上只是空间中的一组点。这本身就已经引起了人们的注意。看到这样一种方法在我们痴迷于人工智能的世界里越来越受欢迎,也发现有些研究公司竞相研发由越来越多乃至数十亿个参数组成的模型,真是令人耳目一新。

高斯泼溅的想法源于“表面飞溅”(引文3),因此它树立了一个很酷的例子——经典的计算机视觉方法仍然可以启发相关的解决方案。它简单而明确的表示使高斯泼溅特别容易解释,这是在某些应用中选择它而不是NeRF算法的一个很好的理由。

表示三维世界

如前所述,在高斯泼溅算法中,3D世界由一组3D点表示。事实上,存在数百万个3D点,大约在50万到500万之间。每个点都是具有其自己独特参数的3D高斯,这些参数针对每个场景进行拟合,使得该场景的渲染与已知的数据集图像紧密匹配。优化和渲染过程将在稍后讨论;让我们暂时先来介绍几个必要的高斯参数。

图2:高斯中心(平均值(源自引文4中“动态三维高斯”)图2:高斯中心(平均值(源自引文4中“动态三维高斯”)

每个3D高斯算法通过以下方式进行参数化:

  • 平均μ可解释为位置x、y、z;
  • 协方差∑;
  • 不透明度σ(��),是一个sigmoid函数,用于把参数映射到[0,1]区间;
  • 颜色参数,可能是(R、G、B)3值形式,也可能是球面谐波(SH)系数方式指定。

这里需要进一步讨论两组参数:协方差矩阵和SH。接下来还有一个单独的小节专门讨论后者。对于协方差,设计之初指定它是各向异性的;也就是说,不是各向同性的。这意味着3D点可以是沿空间中任何方向旋转和拉伸的椭球体。此参数可能需要9个子参数;然而,不能直接优化它们,因为协方差矩阵只有当它是正半定矩阵时才有物理意义。使用梯度下降进行优化使得很难直接在矩阵上提出这样的约束,这就是为什么把它分解为如下形式:

这种因子分解被称为协方差矩阵的特征分解,可以被理解为椭球体的配置,其中:

  • S是具有3个缩放参数的对角缩放矩阵;
  • R是用4个四元数解析表示的3x3旋转矩阵。

使用高斯的美妙之处在于每一点的双重影响。一方面,根据其协方差,每个点有效地表示了空间中接近其均值的有限区域。另一方面,它在理论上具有无穷大的范围,这意味着每个高斯都是在整个三维空间上定义的,并且可以对任何点进行评估。这很好,因为在优化过程中,它允许梯度沿长距离流动(引文4)。3D高斯i对3D中任意3D点p的影响定义如下:

图3:三维高斯i对三维点p的影响(作者本人提供的图片)图3:三维高斯i对三维点p的影响(作者本人提供的图片)

这个方程看起来几乎像多元正态分布的概率密度函数,只是忽略了具有协方差行列式的归一化项,而是用不透明度来加权的。

图像形成模型和渲染

图像形成模型

给定一组3D点,可能最有趣的部分是看它如何用于渲染。以前你可能熟悉一个NeRF中使用的����ɑ-混合。结果表明,NeRF系列算法和高斯泼溅共享相同的图像形成模型。要了解这一点,不妨让我们绕道而行——重新访问NeRF(引文2)及其许多后续作品中给出的体积渲染公式(1)。我们还将使用简单的转换来重写它(2):

σ和δ的定义可以参考NeRF论文,但从概念上讲,这可以理解为:图像像素p中的颜色是通过沿穿过该像素的光线对样本进行积分来近似的。最终颜色是沿该光线采样的3D点的颜色的加权和,按透射率向下加权。考虑到这一点,让我们最后来看高斯泼溅的图像形成模型:

事实上,公式(2)和(3)几乎相同。唯一的区别是如何��在两者之间计算。然而,这种微小的差异在实践中变得极其显著,并导致截然不同的渲染速度。事实上,它是高斯泼溅实时性能的基础。

为了理解为什么会出现这种情况,我们需要理解f^{2D}的含义以及它提出的计算要求。这个函数只是我们在上一节中看到的f(p)到2D的投影,即投影到正在渲染的相机的图像平面上。3D点及其投影都是多变量高斯,因此投影的2D高斯对像素的影响可以使用与3D高斯对3D中其他点的影响相同的公式来计算(见图3)。唯一的区别是平均μ和协方差∑必须投影到2D中,这是使用EWA泼溅的导数来完成的(引文5)。

2D中的平均值可以通过使用内在相机矩阵K和外在相机矩阵W=[R|t]将齐次坐标(具有额外的1个坐标)中的向量μ投影到图像平面中而简单地获得:

这也可以写在一行中,如下所示:

这里的“z”下标代表z归一化。2D中的协方差是使用(4)的雅可比定义的,J的定义如下:

整个过程仍然是可微分的,这对优化至关重要。

渲染

公式(3)告诉我们如何在单个像素中获得颜色。要渲染整个图像,仍然需要遍历所有HxW射线,就像在NeRF中一样。然而,该过程要简单得多,因为:

  • 对于给定的相机,在对像素进行迭代之前,每个3D点的f(p)可以预先投影到2D中。这样,当高斯混合到附近的几个像素时,我们不需要一遍又一遍地重新投影它。
  • 对于单个图像,没有MLP可以被推断为H·W·P倍,2D高斯直接混合到图像上。
  • 沿着射线评估哪个3D点没有歧义,无需选择射线采样策略。与每个像素的光线重叠的一组3D点(参见(3)中的N)在优化后是离散的和固定的。
  • 预处理排序阶段在GPU上每帧完成一次,使用可微分CUDA内核的自定义实现。概念上的差异如图4所示:

图4:NeRF和GS之间的概念差异,左:沿射线查询连续的MLP,右:混合与给定射线相关的离散高斯集(作者本人提供图片)

上面提到的排序算法是本文的贡献之一。其目的是准备使用公式(3)进行颜色渲染:按深度(接近图像平面)对3D点进行排序,并按图块对其进行分组。第一种方法需要计算透射率,而后者允许将每个像素的加权和限制为仅相关3D点的α-混合(或者更具体地说,它们的2D投影)。该分组是使用简单的16x16像素图块来实现的,并且如果高斯与多于单个视锥重叠,则它可以落在几个图块中。得益于排序,每个像素的渲染可以简化为像素所属图块的预编序点的α-混合。

图5:视图截头体,每个截头体对应一个16x16图像片段。颜色没有特别的意义。排序算法的结果是按深度排序的每个图块内的3D点的子集

优化

一个天真的问题可能会浮现在脑海中:怎么可能从太空中的一群斑点中获得一张看起来不错的照片呢?如果没有对高斯算法进行适当优化的话,你会在渲染中遭遇到各种各样的头疼任务。在图6中,您可以观察到这样一个任务的例子,它们看起来非常像椭球体。获得良好渲染的关键是三个部分:良好的初始化、可微分优化和自适应致密化。

图6:未优化场景的渲染示例(作者本人图片)图6:未优化场景的渲染示例(作者本人图片)

初始化是指在训练开始时设置的3D点的参数。对于点位置(平均值),作者建议使用SfM(运动结构)产生的点云(见图7)。逻辑依据是,对于任何3D重建,无论是GS、NeRF还是更经典的东西,你都必须知道相机矩阵,所以你可能无论如何都会运行SfM来获得这些矩阵。既然SfM会产生一个稀疏点云作为副产品,为什么不使用它进行初始化呢?这就是论文的建议。当点云由于某些原因不可用时,可以使用随机初始化,以避免最终重建质量的潜在损失。

图7:SfM产生的稀疏3D点云,即初始化工作(来源:https://speciale.ar/publication/privacypreservingsfm/)

协方差被初始化为各向同性;换句话说,3D点以球体开始。半径是根据到相邻点的平均距离设置的,这样3D世界就可以很好地覆盖,并且没有“洞”。

初始化之后,使用一个简单的随机梯度下降来正确地拟合所有内容。场景针对损失函数进行优化,该损失函数是地面实况视图和当前渲染之间的L1和D-SSIM(结构不相似性指数度量)的组合。

然而,事实并非如此,另一个关键部分仍然存在,那就是自适应致密化。它在训练期间偶尔出现一次,比如说,在每100个SGD步骤(目的是解决重建不足和过度的问题)中发生一次。需要强调的是,SGD本身只能调整现有的点。但在完全缺乏积分或积分过多的领域,它将很难找到好的参数。这就是自适应致密化的作用所在,用大梯度分割点(图8),并去除收敛到非常低的α值的点(如果一个点那么透明,为什么要保留它?)。

图8:自适应致密化:一个玩具的示例,用于拟合我们想要用几个点渲染的豆形状(图源自引文1)

基于SH函数的视图依赖颜色

球面谐波,简称SH,在计算机图形学中发挥着重要作用,并首次被提出作为学习Plenoxel辐射场中离散三维像素的视图相关颜色的一种方法(引文6)。视图依赖性是一个很好的特性,可以提高渲染质量,因为它允许模型表示非朗伯效应,例如金属表面的镜面反射。然而,这当然不是必需的,因为可以进行简化,选择用3个RGB值表示颜色,并且仍然像引文4中那样使用高斯泼溅。这就是为什么我们在制定整个方法后单独审查这个表示细节的原因。

SH是在球面上定义的特殊函数。换句话说,您可以为球体上的任何点计算这样的函数,并获得一个值。所有这些函数都是通过为ℓ(−ℓ ≤ m≤ℓ),每个SH使用一个(ℓ, m)成对:

虽然一开始有点吓人,但对于ℓ的小值,这个公式大大简化了。事实上,对于ℓ = 1,Y=~0.822,只是整个球体上的一个常数。相反,ℓ的值越高生成更复杂的曲面。该理论告诉我们,球面谐波形成了一个正交基,因此定义在球面上的每个函数都可以通过SH表示。

这就解释了为什么依赖于视图的颜色的想法可以这样表达:让我们把自己限制在一定程度的自由度ℓ_max,并设定每种颜色(红色、绿色和蓝色)都是第一个ℓ_max SH函数的线性组合。对于每一个3D高斯,我们都想学习正确的系数,这样当我们从某个方向看这个3D点时,它会传达出最接近地面实况的颜色。获取视图相关颜色的整个过程如图9所示:

图9:获取点的视图相关颜色(红色分量)的过程(学习系数ℓ_max=2和9。此处,sigmoid函数将值映射到[0,1]区间。通常情况下,使用剪辑代替(作者本人图片)

高斯泼溅算法的局限性

高斯泼溅算法尽管总体效果很好,渲染速度也令人印象深刻,但其表示的简单性也是有代价的。最重要的考虑因素是在优化过程中引入的各种正则化启发式方法,以保护模型免于发生“破坏性”高斯:太大、太长、冗余等等。这一部分至关重要,上述问题可以在新视图渲染之外的任务中进一步放大。

选择放弃连续表示而选择离散表示意味着MLP的归纳偏差消失了。在NeRF中,MLP执行隐式插值,并平滑给定视图之间可能的不一致性,而3D高斯对此更具敏感性,导致了上述问题。

此外,高斯泼溅也并非没有NeRF中存在的一些众所周知的问题,它们都继承自共享的图像形成模型:在看不太清或看不见的区域中质量较低,靠近图像平面处存在漂浮物等。

检查点的文件大小是另一个需要考虑的属性,尽管新型视图渲染远未部署到边缘设备上。考虑到3D点的大致数量和流行的NeRF的MLP架构,两者占用的磁盘空间数量级相同,高斯泼溅只多出几倍。

总结

没有一篇博客文章能公正地评价一种方法,只需运行相应实例并亲自观察一下结果便知。以下是您可以进一步研究本文相关内容可参考的资料:

  • 高斯泼溅——使用自定义CUDA内核的官方实现;
  • nerfstudio框架——它提供了高斯泼溅算法支持。这是一个最初专门用于NeRF类似模型的框架,但自2023年12月以来,它也支持高斯泼溅;
  • threestudio-3dgs——另一个跨模型框架threestudio的扩展。如果你对基于提示词生成3D模型感兴趣,而不是学习现有的图像集,那么你应该使用一下这个扩展;
  • UnityGussianSplatting——如果你喜欢Unity,你可以将一个经过训练的模型移植到这个插件中进行可视化;
  • gsplat——一个CUDA加速高斯光栅化的库,从nerfstudio分支出来。它可以用于独立的基于Torch框架的项目,作为泼溅的可微分模块。

鸣谢

这篇博客文章是基于Tali Dekel博士在实验室的一次小组会议。特别感谢Michal Geyer参与论文的讨论,还感谢引文4的作者对高斯泼溅的系统总结。

参考文献

  • Kerbl, B., Kopanas, G., Leimkühler, T., & Drettakis, G. (2023)。3D Gaussian Splatting for Real-Time Radiance Field Rendering(https://arxiv.org/abs/2308.04079),SIGGRAPH 2023。
  • Mildenhall, B., Srinivasan, P. P., Tancik, M., Barron, J. T., Ramamoorthi, R., & Ng, R. (2020)。NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis(https://arxiv.org/abs/2003.08934)。ECCV 2020。
  • Zwicker, M., Pfister, H., van Baar, J., & Gross, M. (2001)。Surface Splatting(https://www.cs.umd.edu/~zwicker/publications/SurfaceSplatting-SIG01.pdf。 SIGGRAPH 2001。
  • Luiten, J., Kopanas, G., Leibe, B., & Ramanan, D. (2023)。Dynamic 3D Gaussians: Tracking by Persistent Dynamic View Synthesis(https://arxiv.org/abs/2308.09713)。International Conference on 3D Vision。
  • Zwicker, M., Pfister, H., van Baar, J., & Gross, M. (2001)。EWA Volume Splatting(https://www.cs.umd.edu/~zwicker/publications/EWAVolumeSplatting-VIS01.pdf)。IEEE Visualization 2001。
  • Yu, A., Fridovich-Keil, S., Tancik, M., Chen, Q., Recht, B., & Kanazawa, A. (2023)。Plenoxels: Radiance Fields without Neural Networks(https://arxiv.org/abs/2112.05131)。CVPR 2022。
  • 译者介绍

    朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。

    原文标题:A Comprehensive Overview of Gaussian Splatting,作者:Kate Yurkova

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论