本文为3DGS paper的部分翻译。
基于点的𝛼混合和 NeRF 风格的体积渲染本质上共享相同的图像形成模型。 具体来说,颜色 𝐶 由沿射线的体积渲染给出:
其中密度 𝜎、透射率 𝑇 和颜色 c 的样本是沿着射线以间隔 𝛿 𝑖 采集的。 这可以重写为
典型的基于神经点的方法通过混合与像素重叠的 N 个有序点来计算像素的颜色 𝐶:
其中 c 𝑖 是每个点的颜色,𝛼 𝑖 是通过评估一个2D 高斯,用协方差 Σ 乘以学习的每点不透明度。
从等式2,3 可以清楚地看到成像模型是相同的。 然而,渲染算法却有很大不同。 NeRF 是隐式表示空/占用空间的连续表示; 需要昂贵的随机抽样才能找到等式2中的样本。 随之而来的噪声和计算开销。 相比之下,点是一种非结构化、离散的表示形式,它足够灵活,可以像 NeRF 一样创建、破坏和位移几何图形。 这是通过优化不透明度和位置来实现的,同时避免了完整体积表示的缺点。
最近的一种方法使用点通过径向基函数方法来表示辐射场。 他们在优化过程中采用点修剪和致密化技术,但使用体积光线行进并且无法实现实时显示速率。
在人体表演捕捉领域,3D 高斯已被用来表示捕捉到的人体。最近,它们已与体积光线行进一起用于视觉任务。 神经体积基元已在类似的背景下被提出。 虽然这些方法启发了我们选择 3D 高斯作为我们的场景表示,但它们专注于重建和渲染单个孤立对象(人体或面部)的特定情况,从而产生深度复杂度较小的场景。 相比之下,我们对各向异性协方差的优化、交错优化/密度控制以及用于渲染的高效深度排序使我们能够处理完整、复杂的场景,包括室内和室外的背景,并且具有较大的深度复杂性。
输入是一组静态场景的图像,以及由 SfM校准的相应摄像机,这会产生稀疏点云作为副作用。 从这些点出发,我们创建了一组 3D 高斯(第 4 节),由位置(均值)、协方差矩阵和不透明度 𝛼 定义,这允许非常灵活的优化机制。 这会产生 3D 场景的相当紧凑的表示,部分原因是高度各向异性的体积片可用于紧凑地表示精细结构。 辐射场的方向外观分量(颜色)通过球谐函数 (SH) 表示。 我们的算法继续通过 3D 高斯参数的一系列优化步骤来创建辐射场表示(第 5 节),即位置、协方差、𝛼 和 SH 系数与高斯密度自适应控制的操作交织在一起。 我们方法效率的关键是我们基于图块的光栅化器(第 6 节),它允许各向异性图块的𝛼混合,通过快速排序尊重可见性顺序。 快速光栅化器还包括通过跟踪累积的 𝛼 值进行快速向后传递,并且对可以接收梯度的高斯数量没有限制。 我们的方法的概述如图 2 所示。
流程如图:
可微3d gaussian splatting
我们的目标是优化场景表示,从一组没有法线的稀疏 (SfM) 点开始,实现高质量的新颖视图合成。 为此,我们需要一个基元,它继承可微分体积表示的属性,同时是非结构化和显式的,以允许非常快速的渲染。 我们选择 3D 高斯,它是可微分的,可以轻松投影到 2D splats,从而允许快速𝛼混合进行渲染。
我们的表示与以前使用 2D 点的方法有相似之处 [Kopanas 等人。 2021 年; 一帆等人。 2019]并假设每个点都是一个具有法线的小平面圆。 鉴于 SfM 点极其稀疏,很难估计法线。 同样,从这样的估计中优化非常嘈杂的法线将非常具有挑战性。 相反,我们将几何体建模为一组不需要法线的 3D 高斯函数。 我们的高斯函数由世界空间中定义的完整 3D 协方差矩阵 Σ 定义 [Zwicker 等人,2017]。 2001a] 以点(平均值)𝜇 为中心:
在我们的混合过程中,该高斯乘以 𝛼。
然而,我们需要将 3D 高斯投影到 2D 进行渲染。 茨威克等人。 [2001a] 演示如何对图像空间进行投影。 给定观察变换 𝑊,相机坐标中的协方差矩阵 Σ ′ 如下:
其中 𝐽 是射影变换的仿射近似的雅可比行列式。 茨威克等人。 [2001a] 还表明,如果我们跳过 Σ ′ 的第三行和第三列,我们将获得一个具有相同结构和属性的 2×2 方差矩阵,就好像我们从具有法线的平面点开始一样,如之前的工作 [Kopanas et 等人。 2021]。
一种明显的方法是直接优化协方差矩阵 Σ 以获得表示辐射场的 3D 高斯分布。 然而,协方差矩阵仅在半正定时才具有物理意义。 为了优化所有参数,我们使用梯度下降,它不能轻易地被约束来产生这样的有效矩阵,并且更新步骤和梯度可以很容易地创建无效的协方差矩阵。
因此,我们选择了一种更直观、但同样具有表达能力的表示方式来进行优化。 3D 高斯的协方差矩阵 Σ 类似于描述椭球体的配置。 给定缩放矩阵𝑆和旋转矩阵𝑅,我们可以找到相应的Σ:
为了允许对这两个因素进行独立优化,我们将它们分开存储:用于缩放的 3D 向量 𝑠 和表示旋转的四元数 𝑞。 这些可以简单地转换为各自的矩阵并组合,确保标准化 𝑞 以获得有效的单位四元数。
为了避免训练过程中自动微分带来的巨大开销,我们显式地导出所有参数的梯度。 精确导数计算的详细信息在附录 A 中。各向异性协方差的这种表示(适合优化)允许我们优化 3D 高斯以适应捕获场景中不同形状的几何形状,从而产生相当紧凑的表示。 图 3 说明了这种情况。
通过 3D 高斯自适应密度控制进行优化
我们方法的核心是优化步骤,它创建一组密集的 3D 高斯函数,准确地表示自由视图合成的场景。 除了位置 𝑝、𝛼 和协方差 Σ 之外,我们还优化表示每个高斯颜色 𝑐 的 SH 系数,以正确捕获场景的依赖于视图的外观。 这些参数的优化与控制高斯密度的步骤交织在一起,以更好地表示场景。
优化
优化基于渲染的连续迭代并将生成的图像与数据集中的训练视图进行比较。 由于 3D 到 2D 投影的模糊性,几何图形不可避免地可能会被错误放置。 因此,我们的优化需要能够创建几何体,并且如果几何体定位不正确,还需要破坏或移动几何体。 3D 高斯协方差参数的质量对于表示的紧凑性至关重要,因为可以用少量大的各向异性高斯函数捕获大的均匀区域。
我们使用随机梯度下降技术进行优化,充分利用标准 GPU 加速框架,以及为某些操作添加自定义 CUDA 内核的能力。 特别是,我们的快速光栅化(参见第 6 节)对于优化的效率至关重要,因为它是优化的主要计算瓶颈。
我们对 𝛼 使用 sigmoid 激活函数将其限制在 [0 − 1) 范围内并获得平滑梯度,出于类似的原因,我们对协方差尺度使用指数激活函数。
我们将初始协方差矩阵估计为各向同性高斯矩阵,其轴等于到最近三个点的距离的平均值。 我们使用类似于 Plenoxels 的标准指数衰减调度技术,但仅适用于位置。 损失函数是 L 1 与 D-SSIM 项的结合:
高斯自适应控制
我们从 SfM 的初始稀疏点集开始,然后应用我们的方法自适应地控制单位体积 1 上高斯的数量及其密度,从而使我们能够从初始的稀疏高斯集变为更好地表示 场景,并具有正确的参数。 优化预热后(参见第 7.1 节),我们每 100 次迭代进行一次致密化,并删除任何本质上透明的高斯分布,即 𝛼 小于阈值 𝜖 𝛼 。 我们对高斯的自适应控制需要填充空白区域。 它专注于缺少几何特征的区域(“重建不足”),但也关注高斯覆盖场景中大面积的区域(通常对应于“过度重建”)。 我们观察到两者都有很大的视图空间位置梯度。 直观上,这可能是因为它们对应于尚未很好重建的区域,并且优化尝试移动高斯来纠正这一点。
由于这两种情况都是致密化的良好候选者,因此我们用高于阈值 𝜏 的视空间位置梯度的平均幅度来致密高斯,我们在测试中将其设置为 0.0002。
接下来我们将详细介绍该过程,如图 4 所示。
图 4.我们的自适应高斯致密化方案。 顶行(重建中):当小规模几何体(黑色轮廓)未被充分覆盖时,我们克隆相应的高斯。 底行(过度重建):如果小规模几何体由一个大的板表示,我们将其分成两部分。
对于重建区域中的小高斯,我们需要覆盖必须创建的新几何形状。 为此,最好通过简单地创建相同大小的副本并将其沿位置梯度的方向移动来克隆高斯。
另一方面,具有高方差的区域中的大高斯需要被分割成更小的高斯。 我们用两个新的高斯函数替换这些高斯函数,并将它们的尺度除以我们通过实验确定的系数 𝜙 = 1.6。 我们还通过使用原始 3D 高斯作为 PDF 进行采样来初始化它们的位置。
在第一种情况下,我们检测并处理增加系统总体积和高斯数量的需要,而在第二种情况下,我们保留总体积但增加高斯数量。 与其他体积表示类似,我们的优化可能会因靠近输入摄像机的浮动体而陷入困境; 在我们的例子中,这可能会导致高斯密度的不合理增加。 调节高斯数量增加的有效方法是每 𝑁 = 3000 次迭代将 𝛼 值设置为接近于零。 然后,优化会在需要时增加高斯的 𝛼,同时允许我们的剔除方法删除 𝛼 小于 𝜖 𝛼 的高斯,如上所述。 高斯可能会缩小或增长,并且与其他高斯有相当大的重叠,但我们会定期删除在世界空间中非常大的高斯以及在视空间中具有较大足迹的高斯。 该策略可以总体上很好地控制高斯总数。 我们模型中的高斯始终在欧几里得空间中保持原语; 与其他方法不同,我们不需要针对远距离或大高斯的空间压缩、扭曲或投影策略。
优化和致密化算法如下:
以colmap(sfm) 的稀疏点为起始, 调节高斯数量增加的有效方法是每 𝑁 = 3000 次迭代将 𝛼 值设置为接近于零。
然后,优化会在需要时增加高斯的 𝛼,同时允许我们的剔除方法删除 𝛼 小于 𝜖 𝛼 的高斯,如上所述。
高斯可能会缩小或增长,并且与其他高斯有相当大的重叠,但我们会定期删除在世界空间中非常大的高斯以及在视空间中具有较大足迹的高斯。
该策略可以总体上很好地控制高斯总数。 当小规模几何体未被充分覆盖时,我们克隆相应的高斯。
如果小规模几何体由一个大的板表示,我们将其分成两部分。
高斯快速可微光栅化器
我们的目标是实现快速整体渲染和快速排序,以允许近似 𝛼 混合(包括各向异性图片),并避免对先前工作中存在的可以接收梯度的图片数量进行硬性限制 [Lassner 和 Zollhofer 2021]。
为了实现这些目标,我们受最新软件光栅化方法 [Lassner 和 Zollhofer 2021] 的启发,为高斯图设计了一个基于图块的光栅化器,一次对整个图像的图元进行预排序,避免了对每个像素进行排序的开销,而这会阻碍之前的 𝛼-混合解决方案。 我们的快速光栅化器允许在任意数量的混合高斯上进行有效的反向传播,并且附加内存消耗低,每个像素只需要恒定的开销。 我们的光栅化管道是完全可微分的,并且考虑到 2D 投影(第 4 节)可以对各向异性 splats 进行光栅化,类似于以前的 2D splatting 方法。
我们的方法首先将屏幕分割成 16×16 块,然后根据视锥体和每个块剔除 3D 高斯。 具体来说,我们只保留与视锥体相交的置信区间为 99% 的高斯分布。 此外,我们使用保护带来简单地拒绝极端位置处的高斯分布(即那些均值接近近平面且远离视锥体的位置),因为计算它们的投影 2D 协方差将不稳定。 然后,我们根据每个高斯重叠的图块数量来实例化它们,并为每个实例分配一个结合了视图空间深度和图块 ID 的键。 然后,我们使用单个快速 GPU 基数排序根据这些键对高斯进行排序 [Merrill 和 Grimshaw 2010]。 请注意,没有额外的每像素点排序,并且混合是基于此初始排序执行的。 因此,我们的 𝛼 混合在某些配置中可以是近似的。 然而,当图块接近单个像素的大小时,这些近似值变得可以忽略不计。 我们发现这种选择极大地增强了训练和渲染性能,而不会在融合场景中产生可见的伪影。
对高斯进行排序后,我们通过识别第一个和最后一个映射到给定图块的深度排序条目来为每个图块生成一个列表。 对于光栅化,我们为每个图块启动一个线程块。 每个块首先协作地将高斯数据包加载到共享内存中,然后对于给定的像素,通过从前到后遍历列表来累积颜色和𝛼值,从而最大化数据加载/共享和处理的并行性增益。 当我们达到像素中的目标饱和度 𝛼 时,相应的线程就会停止。 每隔一段时间,就会查询图块中的线程,并且当所有像素都饱和时(即 𝛼 变为 1),整个图块的处理就会终止。 附录 C 中给出了排序的详细信息和总体光栅化方法的高级概述。
在光栅化过程中,𝛼的饱和度是唯一的停止标准。 与之前的工作相比,我们不限制接收梯度更新的混合基元的数量。 我们强制执行此属性,以允许我们的方法处理具有任意、不同深度复杂性的场景并准确地学习它们,而不必求助于特定于场景的超参数调整。 因此,在后向传递过程中,我们必须恢复前向传递中每个像素的混合点的完整序列。 一种解决方案是将每个像素的任意长混合点列表存储在全局内存中[Kopanas et al. 2021]。 为了避免隐含的动态内存管理开销,我们选择再次遍历 Pertile 列表; 我们可以重用前向传递中的高斯排序数组和平铺范围。 为了便于梯度计算,我们现在从后到前遍历它们。
遍历从影响图块中任何像素的最后一个点开始,并且将点加载到共享内存中再次协作发生。 此外,如果每个像素的深度低于或等于前向传递过程中对其颜色有贡献的最后一个点的深度,则每个像素只会开始(昂贵的)点重叠测试和处理。 第 4 节中描述的梯度计算需要原始混合过程中每个步骤的累积不透明度值。 我们可以通过在前向传递结束时仅存储累积的总不透明度来恢复这些中间不透明度,而不是在后向传递中遍历逐渐缩小的不透明度的显式列表。 具体来说,每个点存储的是前向过程中最终累积的不透明度𝛼; 我们在从后到前的遍历中将其除以每个点的𝛼,以获得梯度计算所需的系数。
优化细节。 为了稳定性,我们以较低的分辨率“预热”计算。 具体来说,我们使用 4 倍小的图像分辨率开始优化,并在 250 次和 500 次迭代后上采样两次。
SH 系数优化对角度信息的缺乏很敏感。 对于典型的“类似 NeRF”的捕捉,通过在其周围的整个半球拍摄的照片来观察中心物体,优化效果很好。 然而,如果捕获丢失了角度区域(例如,当捕获场景的角落或执行“由内而外”[Hedman et al. 2016]捕获时)SH 的零阶分量可以通过优化产生完全不正确的值( 即,基础颜色或漫反射颜色)。 为了克服这个问题,我们首先仅优化零阶分量,然后每 1000 次迭代后引入一个 SH 频带,直到表示所有 4 个 SH 频带。