本文经自动驾驶之心公众号授权转载,转载请联系出处。
近年来,新视角合成取得了重大进展,3D Gaussian splatting提供了出色的视觉质量、快速训练和实时渲染。然而,训练和渲染所需的资源不可避免地限制了可以以良好视觉质量表示的场景大小。本文引入了一种3D高斯层次结构,该结构在保留大场景视觉质量的同时,为有效渲染远处内容提供了高效的细节级别(LOD)解决方案,实现了有效的级别选择和级别之间的平滑过渡。方法采用了一种分而治之的方法,使我们能够在大场景中独立地训练多个block。将这些块整合成一个层次结构,该层次结构可以优化以进一步改善合并到中间节点的高斯函数的视觉质量。非常大的捕获通常具有稀疏的场景覆盖,给原始的3D高斯平铺训练方法带来了许多挑战;我们调整和规范了训练以解决这些问题。我们提出了一个完整的解决方案,该方案能够实时渲染非常大的场景,并可以通过LOD方法适应可用资源。我们展示了使用简单且负担得起的设备捕获的场景的结果,这些场景包含多达数万张图像,涵盖了长达数公里、持续时间长达一小时的轨迹。
针对3D高斯Splatting的分层细节级别
在处理大型场景时,细节级别(LOD)解决方案至关重要,它们允许有效地渲染大量内容;因此,我们的目标是创建一个层次结构,以表示通过原始3DGS优化生成的图元。遵循图形中的传统LOD方法,我们需要:
1)找到候选的3DGS图元并定义如何将它们合并到中间节点中;
2)提供一种有效的方式来确定层次结构中的切割点,以在质量和速度之间取得良好的平衡;
3)在层次级别之间提供平滑的过渡策略。
1)层次生成
为每个block创建一个基于树的层次结构,包括内部节点和叶子节点。每个节点都与一个3D高斯分布相关联,这个3D高斯分布要么是来自原始优化的叶子节点,要么是合并的内部节点。对中间节点的要求是:1) 保持与叶子节点相同的快速光栅化程序;2) 尽可能准确地表示其子节点的外观。因此需要定义中间节点,这些节点是3D高斯分布,具有3DGS图元的所有属性,即均值?(位置)、协方差Σ、SH系数和不透明度。
2)层次切割选择和级别切换
给定一个3DGS模型的层次树结构和视图?,选择一种通过树的切割方式,以在保持视觉质量的同时最大化渲染性能。首先定义给定层次节点?的粒度? (?),这是给定视图下在屏幕上的投影大小(如图3(a)所示)。具体来说,使用包含在节点中的叶高斯的边界框,然后取边界框的最大维度,并据此计算投影大小。通过识别投影边界框小于给定目标粒度??(例如,1像素)的节点来找到切割点。基于层次节点的生成及其边界,父节点的AABB(轴对齐边界框)永远不会小于其任何子节点。这使得我们能够在线性时间内找到适当的切割点,或者在大规模并行设置中,每个节点在常数时间内找到:如果节点?的边界满足粒度条件,但其父节点的边界不满足,则对于给定设置,选择节点?并将其包含在切割中(如图3(b)中的绿色曲线所示)。
优化和压缩层次结构
层次结构是通过聚合几何图元来构建的;最终需要更明确地考虑外观。由于层次结构的每个中间节点本身都是一个3D高斯图元,因此可以进一步优化以提高视觉质量。为此,需要通过中间节点传播梯度,引入一个具有可优化中间节点的层次结构。接下来将解释如何实现这一点,以及一个额外的步骤来压缩层次结构。
传统上,图形中的LOD(细节级别)方法用于在从远处查看场景时表示其简化版本;这在图6中有所说明。我们的目标粒度通过考虑投影到屏幕上的面积来实现这一效果,该面积用先前定义的节点?的粒度? (?) 来表示。
1)优化分层
这里自上而下的层次结构构建产生了一个效果良好的数据结构(见表2)。然而,一旦构建完成,中间节点可以像叶子3DGS图元一样进行渲染,因此也可以以同样的方式进行优化。可以优化层次结构的中间节点,以提高它们可以表示的视觉质量。这就引出了如何在不同尺度之间执行这种优化的问题。一种解决方案是通过随机选择一个输入视图和一个下采样因子来优化层次结构;较低的分辨率直接意味着不同的目标粒度,以及相应的层次结构切割。然而,这种方法存在缺点,在图5和图7中进行了说明:当降低分辨率时,无法表示高频细节。
在优化过程中,我们始终在全分辨率下进行渲染,并简单地选择随机的目标粒度。这种方法具有优化许多不同切割节点的期望效果,同时保留了视觉细节。当资源有限时,这可以特别有用,因为可以采用更激进的LOD策略,同时保持更好的视觉质量。
2)压缩层次结构
层次结构在内存方面增加了一些开销。更重要的是,对于层次结构本身的优化,我们希望避免父节点大小仅比子节点稍大的父子设置。否则,这样的节点在训练过程中可能很少被选择,也得不到适当的优化。为了避免这种情况,我们稀疏化了生成的树结构。
首先将所有叶子节点(即3DGS优化的输出)标记为相关节点,即它们不应该从树中被移除。接下来,在所有训练视图上找到树中最小目标粒度???? = 3像素(由于低通滤波,原始3DGS图元的最小范围)的切割的并集。在这个并集中找到最底部的节点,这再次产生了一个切割。这些节点被认为是所选粒度下的最高细节的相关节点。它们与已标记节点之间的所有节点都将从树中移除。然后将目标粒度提高2倍,并重复此过程,直到达到????,即图像分辨率的一半。
大场景训练
现在可以构建高效的3D高斯层次结构;这对于处理非常大的场景是不可或缺的,因为从远处可见的场景部分可以在层次结构的较粗级别上进行渲染。为了训练大场景,本文方法建立在实时渲染大数据的常见计算机图形学方法之上。特别是,引入了一种分而治之的方法,通过将大场景分割成块(图8)来进行处理。
将块大小定义为50×50米,适用于步行捕获的场景,以及100×100米,适用于使用车辆捕获的场景。虽然这些块的大小有限,但它们仍然比原始3DGS方法处理的块大。此外,这种场景的捕获方式必然比大多数辐射场解决方案所期望的要稀疏得多。因此,我们调整3D高斯的优化以适应这些差异。
目标是允许对各个块进行并行处理,以便在给定足够计算资源的情况下,在合理的挂钟时间内处理大场景。一旦各个块被处理完毕,我们需要一个整合步骤来处理各个块之间可能存在的不一致性。
具体实现和预处理
在C++和Python/PyTorch的原始3DGS实现基础上实现了本文的方法,并修改了SIBR渲染器以实现快速渲染。在论文发表时,将提供所有源代码和数据,包括数据集预处理的所有脚本(请参见项目页面)。使用PyTorch中的自动微分进行层次结构优化。此外,在层次结构优化过程中,通过在层次结构中对应于叶子节点的所有高斯分布上使用停止梯度操作符来避免优化叶子节点,从而有效地冻结它们的属性。
论文捕获了三个户外场景:SmallCity、BigCity和Campus。在表1中列出了每个场景的统计数据,以及Wayve提供的另一个场景的统计数据。
捕获:在捕获过程中,使用了一个自行车头盔,上面安装了6个相机(Campus数据集使用5个)。使用了GoPro HERO6 Black相机(见图9),设置为线性视野(Linear FoV)和1444×1080分辨率的延时模式,每0.5秒拍摄一次。骑着自行车以大约6-7公里/小时的速度拍摄了SmallCity和BigCity场景,而Campus场景则是戴着头盔步行时拍摄的。
姿态估计:姿态估计是处理的相机数量所带来的一个主要挑战。数据集包含5800到40000张照片。使用COLMAP,结合自定义参数设置、层次映射器和每个块的附加捆绑调整,以实现合理的处理时间。在附录B中提供了详细信息。
数据集处理:以类似的方式对曝光进行校正,就像其他人所做的那样,通过优化每幅图像的曝光校正。最后,通过基于CNN的分割算法来检测汽车、自行车等移动物体,并确定它们是否有对应的SfM点,从而移除这些移动物体。还移除了所有人和车牌。所有步骤的详细信息都在附录中进行了介绍。