一、说明
高斯泼溅是一种用于表示 3D 场景和渲染新颖视图的方法,在"实时辐射场渲染的 3D 高斯泼溅"中引入。它可以被认为是 NeRF² 类模型的替代品 ,就像当年的 NeRF 一样,高斯分布导致了许多新的研究工作,这些工作选择将其用作各种用例的 3D 世界的底层表示。那么它有什么特别之处以及为什么它比 NeRF 更好呢?或者甚至是这样?让我们来看看吧!
二、概说
首先也是最重要的,这项工作的主要特点是渲染速度快,这一点从标题中就可以理解。这是由于下面将介绍的表示本身,以及使用自定义 CUDA 内核定制的渲染算法的实现。
图 1:之前的高质量表示和高斯泼溅(标记为"我们的")在渲染速度 (fps)、训练时间(分钟)和视觉质量(峰值信号到噪声比,越高越好)[来源:摘自[1]]
此外,高斯泼溅根本不涉及任何中性网络 。甚至没有一个小的 MLP,没有任何"神经",场景本质上只是空间中的一组点。这本身就已经很引人注目了。看到这种方法在我们痴迷于人工智能的世界中越来越受欢迎,研究公司追逐由越来越多的数十亿个参数组成的模型,真是令人耳目一新。它的想法源于"Surface splatting"(2001),因此它树立了一个很酷的例子,经典的计算机视觉方法仍然可以激发相关的解决方案。其简单而明确的表示使得高斯泼溅特别易于解释,这是在某些应用中选择它而不是 NeRF 的一个很好的理由。
三、代表 3D 世界
如前所述,在高斯喷射中,3D 世界由一组 3D 点表示,实际上有数百万个,大约为 0.5-50 万个。每个点都是一个 3D 高斯分布,具有自己独特的参数,这些参数适合每个场景,以便该场景的渲染与已知的数据集图像紧密匹配。优化和渲染过程将在稍后讨论,因此让我们暂时关注必要的参数。
**图 2:**高斯中心(平均值)[来源:取自 Dynamic 3D Gaussians⁴]
每个 3D 高斯均通过以下参数化:
- 平均μ可解释为位置 x、y、z;
- 协方差Σ;
- 不透明度σ(𝛼),应用 sigmoid 函数将参数映射到 [0, 1] 区间;
- 颜色参数,(R、G、B)的 3 个值或球谐函数 (SH) 系数。
这里有两组参数需要进一步讨论,协方差矩阵和 SH。有一个单独的部分专门讨论后者。至于协方差,设计上选择各向异性,即不是各向同性。实际上,这意味着3D 点可以是沿空间中任意方向旋转和拉伸的椭球体 。它可能需要 9 个参数,但是,它们不能直接优化,因为协方差矩阵只有当它是正半定矩阵时才具有物理意义。使用梯度下降进行优化使得很难直接对矩阵施加这样的约束,这就是为什么它被分解如下:
这种因式分解称为协方差矩阵的特征分解,可以理解为椭球体的配置,其中:
- S是一个对角缩放矩阵,有3个参数用于缩放;
- R 是用 4 个四元数解析表达的 3x3 旋转矩阵。
使用高斯函数的美妙之处在于每个点的双重影响。一方面,根据其协方差,每个点有效地代表空间中接近其均值的有限区域。 另一方面,它在理论上具有无限的范围,这意味着每个高斯都是在整个 3D 空间上定义的,并且可以对任何点进行评估。这很棒,因为在优化过程中它允许梯度从长距离流动。⁴
3D 高斯i 对 3D 中任意 3D 点p的影响定义如下:
图 3: 3D 高斯 i 对 3D 中点 p 的影响 [来源:作者提供的图片]
该方程看起来几乎像多元正态分布的概率密度函数,只是忽略了具有协方差行列式的归一化项,而是通过不透明度进行加权。
四、图像形成模型和渲染
4.1 图像形成模型
给定一组 3D 点,最有趣的部分可能是了解如何将其用于渲染。您之前可能熟悉 NeRF 中使用的逐点𝛼混合。事实证明,NeRF 和高斯喷射共享相同的图像形成模型。为了了解这一点,让我们绕一点弯路,重新审视 NeRF² 及其许多后续作品 (1) 中给出的体积渲染公式。我们还将使用简单的转换(2)重写它:
您可以参考 NeRF 论文了解 σ 和 δ 的定义,但从概念上讲,这可以理解如下:图像像素p 中的颜色是通过沿穿过该像素的光线对样本进行积分来近似的。最终颜色是沿该光线采样的 3D 点颜色的加权和,并按透射率进行加权。考虑到这一点,我们最后看一下高斯泼溅的成像模型:
事实上,公式(2)和(3)几乎是相同的。唯一的区别是两者之间𝛼 的计算方式不同。 然而,这种微小的差异在实践中却非常重要,并导致渲染速度截然不同。事实上,它是高斯泼溅实时性能的基础。
为了理解为什么会出现这种情况,我们需要理解f^{2D} 的 含义以及它提出的计算要求。这个函数只是我们在上一节中看到的f(p) 到 2D 的投影,即到正在渲染的相机的图像平面上。3D 点及其投影都是多元高斯分布,因此可以使用与 3D 高斯分布对 3D 中其他点的影响相同的公式来计算投影 2D 高斯分布对像素的影响(参见图 3)。唯一的区别是平均值 μ 和协方差 Σ 必须投影到二维,这是使用 EWA splatting⁵ 的推导完成的。
通过使用内部相机矩阵K 和外部相机矩阵W= [ R | ] 将齐次坐标(带有额外 1 坐标)中的向量μ 投影到图像平面中,可以轻松获得 2D 中的平均值 ]:
也可以写成一行,如下所示:
这里"z"下标代表 z 归一化。二维协方差使用 (4), J 的雅可比行列式定义:
整个过程仍然是可微分的,这对于优化当然至关重要。
4.2 渲染
公式(3)告诉我们如何获得单个像素的颜色。要渲染整个图像,仍然需要遍历所有 HxW 光线,就像 NeRF 中一样,但是,该过程要轻量得多,因为:
- 对于给定的相机,每个 3D 点的f(p) 可以在迭代像素之前**提前投影到 2D 中。**这样,当高斯混合几个附近的像素时,我们不需要一遍又一遍地重新投影它。
- 没有MLP 可以对单个图像进行 H·W·P 次推断,2D 高斯直接混合到图像上。
- 沿着射线评估哪个 3D 点没有歧义 ,无需选择射线采样策略。与每个像素的光线重叠的一组 3D 点(参见(3)中的N)是离散的,并且在优化后是固定的。
- 使用可微 CUDA 内核的自定义实现,在 GPU 上每帧完成一次预处理排序阶段。
概念上的差异如图 4所示:
图 4: NeRF 和 GS 之间的概念差异,左:沿射线查询连续MLP,右:混合与给定射线相关的一组离散高斯函数 [来源:作者提供的图片]
上面提到的排序算法就是论文的贡献之一。其目的是为使用公式 (3) 进行色彩渲染做准备:按深度(与图像平面的接近程度)对 3D 点进行排序,并按图块对它们进行分组。第一个需要计算透射率,而后者允许将每个像素的加权和限制为仅相关 3D 点(或更具体地说,是它们的 2D 投影)的 α 混合。分组是使用简单的 16x16 像素图块来实现的,并且这样实现,如果高斯函数重叠多个单一视锥体,则它可以落在几个图块中。通过排序,每个像素的渲染可以简化为来自像素所属图块的预排序点的 α 混合。
图 5: 视锥体,每个视锥体对应一个 16x16 图像图块。颜色没有特殊含义。排序算法的结果是每个图块内按深度排序的 3D 点的子集。[来源:基于此处的图]
五、优化
我可能会想到一个天真的问题:如何从太空中的一堆斑点中获得看起来像样的图像?好吧,确实,如果高斯没有正确优化,您将在渲染中得到各种尖锐的伪影。在图 6 中,您可以观察到此类伪影的示例,它们看起来非常像椭球体。获得良好渲染的关键是三个组成部分:良好的初始化、可微优化和自适应致密化。
**图 6:**未优化场景的渲染示例 [来源:作者提供的图片]
初始化是指训练开始时设置的3D点的参数。对于点位置(均值),作者建议使用 SfM(Structure from Motion)生成的点云,请参见图 7。逻辑是,对于任何 3D 重建,无论是 GS、NeRF 还是更经典的东西,您必须知道相机矩阵,因此您可能无论如何都会运行 SfM 来获取这些矩阵。**既然 SfM 会产生稀疏点云作为副产品,为什么不使用它进行初始化呢?**这就是本文的建议。当由于某种原因点云不可用时,可以使用随机初始化来代替,但存在最终重建质量潜在损失的风险。
图 7: SfM 生成的稀疏 3D 点云,意味着初始化 [来源:取自此处]
协方差被初始化为各向同性,换句话说,3D 点以 spheres 开始。半径是根据到相邻点的平均距离设置的,这样 3D 世界就可以很好地覆盖并且没有"洞"。
初始化后,使用简单的随机梯度下降来正确拟合所有内容。该场景针对损失函数进行了优化,该损失函数是地面实况视图和当前渲染之间的L1 和 D-SSIM(结构相异指数测量)的组合。
然而,事实并非如此,另一个关键部分仍然存在,那就是自适应致密化。它在训练期间每隔一段时间启动一次,例如每 100 SGD 步启动一次,其目的是解决重建不足和过度重建问题。需要强调的是,SGD 本身只能调整现有的点 。但在完全缺乏点或点太多的区域中,很难找到好的参数。这就是自适应致密化的用武之地,它会分割具有大梯度的点 (图 8)并删除收敛到非常低的 α 值的点(如果一个点如此透明,为什么要保留它?)。
**图 8:**自适应致密化。一个拟合豆子形状的玩具示例,我们想用几个点来渲染它。[来源:摘自[1]]
六、SH 与视图相关的颜色
球谐函数(简称 SH)在计算机图形学中发挥着重要作用,最初被提出作为学习 Plenoxels 中离散 3D 体素的视图相关颜色的方法⁶。视图依赖性是一个很好的属性,可以提高渲染质量,因为它允许模型表示非朗伯效应,例如金属表面的镜面反射。然而,这当然不是必须的,因为可以进行简化,选择用 3 个 RGB 值来表示颜色,并且仍然使用高斯泼溅,就像[4]中所做的那样。这就是为什么我们在布置整个方法之后单独审查这个表示细节。
SH 是在球体表面定义的特殊函数。换句话说,您可以对球体上的任何点计算这样的函数并获得一个值。所有这些函数都是通过为 ℓ 和 − ℓ ≤ m ≤ ℓ 选择正整数从这个单一公式导出的,每个SH 一对*(ℓ, m) :*
虽然一开始有点吓人,但对于较小的l 值,这个公式可以显着简化。事实上,对于ℓ = 1,Y = ~0.282 ,只是整个球体上的常数。相反,较高的ℓ 值会产生更复杂的表面。该理论告诉我们,球谐函数形成了正交基,因此球面上定义的每个函数都可以通过 SH 表示。
这就是为什么表达与视图相关的颜色的想法是这样的:让我们将自己限制在一定的自由度ℓ_max 范围内,并说每种颜色(红色、绿色和蓝色)是第一个ℓ_max SH 函数的线性组合。对于每个 3D 高斯,我们希望学习正确的系数,以便当我们从某个方向查看这个 3D 点时,它会传达一种最接近地面真实颜色的颜色。获取与视图相关的颜色的整个过程如图 9 所示。
图 9:获取具有 ℓ_max = 2 和 9 个学习系数的点的与视图相关的颜色(红色分量)的过程。sigmoid 函数将值映射到 [0, 1] 区间。通常,会使用剪裁来代替[来源:作者提供的图片]
七、局限性
尽管整体效果出色且渲染速度令人印象深刻,但表示的简单性是有代价的。最重要的考虑因素是在优化过程中引入的各种正则化启发法 ,以防止模型出现"损坏"高斯分布:太大、太长、冗余等点。这部分至关重要,提到的问题可以在任务中进一步放大超越新颖的视图渲染。
选择放弃连续表示而选择离散表示意味着MLP 的归纳偏差消失了。在 NeRF 中,MLP 执行隐式插值并消除给定视图之间可能存在的不一致,而 3D 高斯更为敏感,从而导致了上述问题。
此外,高斯泼溅也存在 NeRF 中存在的一些众所周知的伪影,它们都继承自共享图像形成模型:较少看到或不可见的区域质量较低,靠近图像平面的漂浮物等。
检查点的文件大小是另一个需要考虑的属性,尽管新颖的视图渲染还远未部署到边缘设备。考虑到 3D 点的大致数量和流行 NeRF 的 MLP 架构,两者都占用相同数量级的磁盘空间,而 GS 平均只重几倍。
八、哪里可以玩它
没有任何博客文章能够公正地描述一种方法以及仅运行它并亲自查看结果。这里是你可以玩的地方:
- gaussian-splatting --- 使用自定义 CUDA 内核的官方实现;
- nerfstudio ---是的,nerf studio中的高斯泼溅。这是一个最初专用于类似 NeRF 模型的框架,但自 23 年 12 月以来,它也支持 GS;
- Threestudio-3dgs --- Threestudio 的扩展,另一个跨模型框架。如果您有兴趣根据提示生成 3D 模型而不是学习一组现有图像,则应该使用此模型;
- UnityGaussianSplatting --- 如果您喜欢 Unity,您可以将经过训练的模型移植到此插件中以进行可视化;
- gsplat --- 一个从 nerfstudio 分支出来的 CUDA 加速高斯光栅化库。它可作为独立的基于火炬的项目用作泼溅的可微分模块。
参考
- Kerbl, B.、Kopanas, G.、Leimkühler, T. 和 Drettakis, G. (2023)。用于实时辐射场渲染的 3D 高斯喷射。SIGGRAPH 2023。
- Mildenhall, B.、Srinivasan, PP、Tancik, M.、Barron, JT、Ramamoorthi, R. 和 Ng, R. (2020)。NeRF:将场景表示为神经辐射场以进行视图合成。欧洲CV 2020。
- Zwicker, M.、Pfister, H.、van Baar, J. 和 Gross, M. (2001)。表面喷溅。2001年SIGGRAPH
- Luiten, J.、Kopanas, G.、Leibe, B. 和 Ramanan, D. (2023)。动态 3D 高斯:通过持久动态视图合成进行跟踪。3D 视觉国际会议。
- Zwicker, M.、Pfister, H.、van Baar, J. 和 Gross, M. (2001)。EWA 体积溅射。IEEE 可视化 2001。
- Yu, A.、Fridovich-Keil, S.、Tancik, M.、Chen, Q.、Recht, B. 和 Kanazawa, A. (2023)。Plenoxels:没有神经网络的辐射场。CVPR 2022。
- 凯特·尤尔科娃