ArXiv link:https://arxiv.org/abs/2308.04079
输入是SfM的稀疏点云,不带法线(normal),我们将几何图形建模为一组不需要法线的3D高斯。我们的高斯由世界空间中定义的完整3D协方差矩阵 Σ \Sigma Σ 定义,以点为中心(mean μ \mu μ):
在blending混合过程中,这个高斯会被乘上 α \alpha α。
在渲染的时候我们需要将3D高斯投影到2D,这个过程使用此公式: Σ ′ = J W Σ W T J T {\Sigma }' = JW \Sigma \space W^T J^T Σ′=JWΣ WTJT,其中W是视角转换(viewing transformation)矩阵, Σ ′ \Sigma' Σ′是协方差矩阵, J J J是雅可比矩阵(Jacobian)即射影变换(projective transformation)的仿射近似(affine approximation),由于协方差矩阵需要保证半正定性(positive semi-definite),所以没有办法直接优化,因此,我们使用了3D高斯的协方差矩阵 Σ \Sigma Σ 类似于描述椭球的配置,给定一个缩放矩阵 S 和旋转矩阵 R,我们可以找到相应的 Σ \Sigma Σ: Σ = R S S T R T \Sigma = RSS^TR^T Σ=RSSTRT,为了允许对这两个因素进行独立优化,我们分别存储他们:用于缩放3D向量 s s s和表示旋转的四元素 q q q,为了避免训练过程中自动微分造成的显著开销,我们在实现中明确的推导出所有参数的梯度。
本文的核心创新是优化步骤,它创建了一个密集的3D高斯点集,精准的表示场景以进行free-view synthesis。除了对3D位置 p p p、透明度 α \alpha α、协方差 Σ \Sigma Σ,我们还优化了每个高斯点颜色 c c c的SH系数,以正确捕捉场景的视点相关外观。
优化是基于连续的迭代,先渲染,之后将生成的图像与捕捉数据集中的训练视图进行loss计算。不可避免的,由于3D到2D投影的模糊性,几何形状可能会被错误的放置。因此我们的优化需要能够创建geometry,如果geometry被错误地定位,也会remove或move geometry。3D高斯协方差参数的质量对于表示的紧凑性至关重要,因为可以用少量的large各向异性高斯捕获大的均匀的区域。优化器使用了SGD,透明度 α \alpha α使用的了sigmoid作为激活函数来将value限制在[0, 1)范围内,协方差的scale使用了exp激活函数来限制value范围。
我们将初始协方差矩阵估计为各向同性高斯,其轴等于到最近三个点的距离的平均值。我们使用类似于plenoxels的标准指数衰减调整(standard exponential decay scheduling)技术,但只适用于位置。损失函数包含了D-SSIM项: L = ( 1 − λ ) L 1 + λ L D-SSIM \mathcal{L} = (1 - \lambda )\mathcal{L}_1 + \lambda \mathcal{L}_{\text{D-SSIM}} L=(1−λ)L1+λLD-SSIM,我们在所有的测试中都使用 λ = 0.2 \lambda = 0.2 λ=0.2。
我们从SfM的初始系数点集开始,然后应用我们的方法自适应的控制高斯的数量及其在单位体积1上的密度,允许我们从初始稀疏的高斯集到密集的集合,更好的表示场景,并具有正确的参数。在优化预热之后,我们每100次迭代就会触发稠密化,同时去除任何本质上透明的高斯点,即当该高斯点的 α \alpha α透明度低于某个阈值 ϵ α \epsilon_\alpha ϵα时。
我们对高斯的自适应控制需要填充空区域,它侧重于缺少几何特征的区域(“重建不足”),但在高斯覆盖场景中大面积的区域(通常对应于“重建过度”)。我们观察到两者都具有较大的视图空间位置梯度,直观的说,这可能是因为它们对应于尚未很好地重建的区域,并且优化试图移动高斯点来纠正这一点。
由于这两种情况都是稠密化比较好的候选区域,因此我们对平均幅度视图空间位置梯度高于阈值 τ p o s \tau_{pos} τpos的高斯进行稠密化,在实验中我们将这个阈值设置为0.0002。
高斯自适应详细步骤(如上图):
存在的问题:
在上述第一种情况下,我们通过增加高斯数来增加系统总体积,在第二种情况下,我们保持总体积但是增加高斯点数。但是我们的优化可能会被卡在靠近输入相机的漂浮物上(相机缺陷/烟雾),在实践中,这可能会导致高斯密度的不合理增加,一个有效的解决方法是:每迭代 N = 3000 N=3000 N=3000次,就将 α \alpha α值设置为接近零,之后优化策略会对有效的高斯点提升 α \alpha α,同时无效的高斯点会被之前讲到的透明度阈值 ϵ α \epsilon_{\alpha} ϵα剔除。高斯可能会缩小或增长,并且与其他高斯有很大的重叠,但我们定期删除世界空间中非常大的高斯和视图空间中占用较大的高斯。这种策略总体上可以很好地控制高斯的总数。
用于高斯的快速可微栅格化器(Differentiable rasterizer):
我们的目标是具有快速的整体渲染和快速排序,以允许alpha-blend——包括anisotropic splats——并避免先前工作中对可以存在的梯度的斜率数量的硬约束。为了实现这些目标,我们设计了一种基于tile的高斯溅射光栅化器,首先一次性对整个图像进行预排序,避免了对每个像素进行排序的成本,这阻碍了以前的alpha-blending解决方案。我们的快速光栅化器允许对任意数量的混合高斯进行有效的反向传播,这些混合高斯具有较低的额外内存消耗,每个像素只需要恒定的开销。我们的光栅化管线是完全可微的,并且给定到2D的投影可以栅格化类似于以前的2D溅射方式的各向异性(anisotropic)溅射。
我们的方法首先将屏幕分割成16x16个贴图,然后继续根据视锥和每个贴图对3D高斯进行剔除。具体来说,我们只保留与视锥相交的99%置信区间的高斯。此外,我们使用保护带来简单地拒绝极端位置的高斯(即,那些均值接近近平面且远离视锥体的高斯分布,因为计算它们的投影2D协方差将是不稳定的。然后我们根据高斯重叠tiles的数量初始化每个高斯并为每个instance分配一个结合了视图空间深度和tile ID的key。然后我们使用单个快速GPU Radix排序基于这些key对高斯进行排序。注意,没有额外的逐点排序,并且基于这个初始排序执行blending,因此,我们的alpha- blending可以在某些config中近似。然而,随着splats接近单个像素的大小,这些近似值变得可以忽略不计。我们发现这种选择大大提高了训练和渲染性能,而不会在收敛场景中产生可见的artifacts。
在对高斯进行排序之后,我们通过识别splat到给定tile的第一个和最后一个深度排序条目来为每个tile生成一个列表。对于光栅化,我们为每个tile启动一个线程块。每个块首先协作将高斯的数据包加载到共享内存中,然后对于给定的像素,通过从前到后遍历列表累积颜色和 α \alpha α透明度,从而最大化数据加载/共享和处理的并行增益。当我们在像素中达到目标饱和度 α \alpha α时,相应的线程停止。定期,查询tile中的线程,当所有像素饱和时,整个tile的处理终止(即 α = 1 \alpha = 1 α=1时)。
在光栅化过程中, α \alpha α的饱和是唯一的停止条件,与之前的工作相比,我们不限制接受梯度更新和混合primitives的数量,我们强制执行此方法以允许我们的算法可以处理具有任意、不同深度复杂性的场景并准确的学习它们,而无需求助于特定于场景的超参调整。因此,在反向传播期间,我们必须恢复前向传递中每个像素的混合点的完整序列。一种解决方案是在全局内存中存储任意长的混合点列表。为了避免隐含的动态内存管理开销,我们改为选择再次遍历每个tile列表,我们可以重用排序的高斯数组和tile的范围从前向传播。为了便于梯度计算,我们现在将从后到前遍历它们。
遍历从tile中的任何像素的最后一个点开始,并将点加载到共享内存中再次发生协作。此外,如果每个像素的深度小于或等于前向传递期间对颜色有贡献的最后一个点的深度,则每个像素只会开始(昂贵的)重叠测试和处理。梯度计算需要原始混合过程中每一步的积累不透明值。我们可以通过在前向传递结束时仅存储总累积不透明度来恢复这些中间不透明度,而不是通过遍历一系列显性的反向传递中逐渐缩小不透明度。具体来说,每个点在前向过程中存储最终的累积不透明度 α \alpha α。我们将其除以我们的前后遍历中的每个点的 α \alpha α,以获得梯度计算所需要的系数。
人工合成有界场景:除了真实场景之外,我们还在人工合成的blender数据集上评估我们的方法。即使随机初始化,我们也可以获得最先进的结果:我们从包含场景边界的体积内100k均匀随机高斯开始训练,我们的方法快速自动将它们修剪到大约6-10k有意义的高斯,30k次迭代后训练模型的最终大小每个场景达到大约200-500k高斯,我们使用白色背景来报告和比较我们获得的PSNR分数。
紧凑形式:对比之前的显式场景表示,我们优化中使用的各向异性高斯(anisotropic gaussian)能够在参数数量较少的同时建模复杂形状。对比之前的SOTA point-based方法,我们使用接近1/4之于原始点云的数量,获得相似的visual质量,平均模型大小3.8MB,对比它们的9MB。实验显示我们只使用了两度球谐函数。
从SfM点进行初始化:我们评估了从SfM点云初始化3D高斯的重要性。对于这种消融,我们统一采用一个大小等于输入相机边界框三倍的立方体。我们观察到我们的方法表现相对较好,即使没有SfM点,也避免了完全失败。相反,它主要在背景(background)中退化(图7)。此外,在训练视图中没有很好的覆盖的区域,随机初始化方法似乎有更多的漂浮物,无法通过优化去除。另一方面,合成NeRF数据集没有这种行为,因为它没有背景并且受到输入相机的良好约束。
稠密化:我们还评估了两种稠密化的方法,具体的说,就是我们描述的克隆和拆分的策略,我们分别禁用两种方法,并使用其余方法进行优化比边,结果表明,分割大高斯对于允许很好地重建背景很重要,如图8,而克隆小高斯而不是拆分它们可以实现更好更快的收敛,尤其是当薄结构出现在场景中时。
具有梯度到溅射到无限深度复杂性:我们评估了如果跳过N个最前面的点之后的梯度计算将在不牺牲质量的情况下为我们提供加速,在测试中,我们设定N=10,这比在Pulsar中的默认值高两倍,但是由于梯度计算中的严重近似,他导致优化不稳定,对于卡车(Truck)场景,PSNR质量下降11dB,Garden场景的视觉效果:
各向异性协方差:我们的方法中的一个重要算法选择是优化3D高斯的完整协方差矩阵。为了证明这种选择的效果,我们进行了消融,我们通过优化单个标量值来消除各向异性,该值控制所有三个轴上3D高斯的半径。该优化结果如下图,我们观察到各向异性显著提高了三位高斯与曲面对齐能力的质量,这个反过来又允许更高的渲染质量,同时保持相同数量的点。
球面谐波(SH):最后球面谐波的使用提高了我们的总体PSNR分数,因为他们补偿了视觉相关的效应。(见table3)