0. 简介

神经隐式表示近年来在SLAM中,特别是在稠密视觉SLAM中,成为一种流行的表示方法。然而,此前在这一方向上的工作要么依赖于RGB-D传感器,要么需要单独的单目SLAM方法进行相机跟踪,并且不能产生高精度、高密度3D场景重建。在本文中,我们提出了NICER-SLAM,这是一个稠密的RGB SLAM系统,同时优化相机位姿和分层神经隐式地图表示,这也允许高质量的新视图合成。

为了促进地图的优化过程,我们集成了额外的监督信号,包括易于获取的单目几何线索和光流,并引入了一个简单的变形损失来进一步强制几何一致性。此外,为了在复杂的室内场景中进一步提高性能,我们还提出了从符号距离函数(SDF)到体积渲染方程中的密度的局部自适应转换。在合成和实际数据集上,我们展示了在密集映射、跟踪和新视角合成方面的强大性能,甚至与最近的RGB-D SLAM系统竞争。这部分代码目前还没开源,可以期待一波。

1. 文章贡献

本文贡献如下:

1、我们提出了NICER-SLAM,这是第一个稠密的RGB SLAM之一,它可以对跟踪和建图进行端到端优化,还可以实现高质量的新视图合成。

2、我们为SDF,不同的几何和运动正则化,以及局部自适应的SDF体积密度转换引入了层次神经隐式编码。

3、我们在合成数据集和真实数据集上展示了强大的建图、跟踪和新颖的视图合成性能,甚至可以与最近的RGBD SLAM方法竞争。

2. 系统概述

我们在图2中提供了NICER-SLAM流程的概述。给定RGB视频作为输入,我们通过端到端优化同时估计准确的三维场景几何形状和颜色,以及相机跟踪。图二显示了NICER-SLAM的系统概述。我们的方法仅采用RGB流作为输入,并输出相机姿态以及用于几何和颜色的学习分层场景表示。为了实现端到端的联合映射和跟踪,我们渲染预测的颜色、深度、法线,并根据输入RGB和单目线索进行优化。此外,我们进一步通过RGB变形损失和光流损失强化几何一致性。我们使用分层神经隐式表示来表示场景的几何形状和外观(第3节)。通过类似NeRF的可微体积渲染,我们可以呈现每个像素的颜色、深度和法向量值(第4节),这将用于相机姿态、场景几何形状和颜色的端到端联合优化(第5节)。最后,我们讨论了系统中的一些设计选择(第6节)

3. 分层神经隐式表示(和Nice slam类似)

我们首先介绍我们可优化的分层场景表示方法,它将多级网格特征与MLP解码器相结合,用于SDF和颜色预测。
粗层几何表示:粗层几何表示的目标是有效地建模粗略的场景几何(捕获几何细节的对象)和场景布局(例如墙壁,地板),即使只有部分观察数据也能做到。 为此,我们使用分辨率为32×32×32的密集体素网格表示归一化场景,并在每个体素中保留32个特征。 对于空间中的任何点x∈\mathbb{R}^3,我们使用一个小的MLP f ^{coarse},带有一个64维隐藏层,以获得其基本SDF值scoarse∈\mathbb{R}和几何特征z^{coarse}∈\mathbb{R}^{32},如下式所示:

其中γ对应于一个固定的位置编码 [29, 54],将坐标映射到更高的维度。根据[71, 69, 68]的方法,我们将位置编码的级别设置为6。Φ^{coarse}(x)表示特征网格Φ^{coarse}在点x处进行三线性插值。

Fine-level几何表征:虽然粗略的几何形状可以通过我们的粗略级别形状表示获得,但捕捉场景中的高频几何细节很重要。 为了实现这一目标,我们使用多分辨率特征网格和MLP解码器[5, 31, 76, 53]来将高频几何细节建模为残差SDF值。 具体而言,我们使用多分辨率稠密特征网格{Φ^{fine}_l }^L_1 ,分辨率为R_l。 这些分辨率在几何空间中采样[31],以合并不同频率的特征:

其中,**R_{min}R_{max}分别对应最低和最高分辨率**。这里我们设置R_{min}=32R_{max}=128,总共有L=8个级别。每个级别的特征维度为4。
现在,为了对一个点x建模残差SDF值,我们提取并串联每个级别的三线性插值特征,并将它们输入到一个3个隐藏层大小为64的MLP f^{fine} 中:

其中z^{fine} ∈ \mathbb{R}^{32}x在细级别上的几何特征。通过粗层基础SDF值s^{coarse}和细层残差SDF∆sx的最终预测SDF值\hat{s}简单地是两者之和:

颜色表示:除了3D几何信息之外,我们还预测颜色值,以便我们的映射和相机跟踪也可以通过颜色损失进行优化。此外,作为另一个应用,我们还可以即时从新视角渲染图像。受[31]的启发,我们使用另一个多分辨率特征网格{Φ^{color}_l}^L_1和一个由大小为64的2层MLP参数化的解码器f^{color}来编码颜色。特征网格的层数现在为L = 16,每个层的特征维数为2。最小和最大分辨率现在分别为R_{min} = 16R_{max} = 2048。我们预测每个点的颜色值为:

其中,\hat{n} 对应于从方程(4)中的\hat{s}计算出的点x处的法线,γ(v)是观察方向,其具有4级的位置编码,遵循[68,71]。

4. 体积渲染(比较重要的论点)

跟随最近基于隐式方法的3D重建 [38,68,71,59] 和密集视觉SLAM [51,76] 的工作,我们使用可微分的体积渲染从第3.1节中优化的场景表示。具体而言,为了渲染一个像素,我们从相机中心o沿着其规范化视线方向v,将射线r投射到像素上。然后沿着该射线采样N个点,表示为x_i = o + t_iv,它们的预测SDF和颜色值分别为\hat{s}_i\hat{c}_i。为了进行体积渲染,我们遵循[68],将SDF \hat{s}_i 转换为密度值σ_i

其中,β ∈ R 是控制从 SDF 到体密度的转换的参数。如同 [29],当前光线r 的颜色 \hat{C} 被计算为:

其中,T_iα_i 分别对应沿着光线 r 的采样点 i 的透射率和 alpha 值,\delta_i 是相邻采样点之间的距离。类似地,我们也可以计算与当前光线 r 相交的表面的深度 \hat{D} 和法线 \hat{N},如下所示:

本文提出了一种本地自适应转换的方法。公式(6)中的β参数模拟了物体表面附近的平滑程度。随着网络对物体表面更加确定,β的值逐渐减小。因此,这种优化方案能够实现更快、更锐利的重建。在VolSDF [68]中,他们将β建模为单个全局参数。这种建模方式本质上假定在不同场景区域中优化的程度相同,对于小型场景是足够的。然而,在复杂的室内场景中,全局优化的β值是次优的(请参见4.2节的消融研究)。因此,我们提出了一种本地自适应的方法,将β值本地化,以使公式(6)中的SDF-density 转换也是本地自适应的。具体来说,我们在整个场景中维护一个体素计数器,并在映射过程中计算每个体素内的点样本数。我们经验性地选择了体素大小为643(请参见4.2节的消融研究)。接下来,我们启发式地设计了一种从局部点样本计数T_pβ值的转换:

我们通过在全局输入设置下绘制β随体素计数递减的曲线并对曲线进行拟合得到了该变换。我们经验性地发现指数曲线最适合。

5. 端到端的联合建图和跟踪(这部分也比较总要)

仅从 RGB 时序输入,很难同时优化 3D 场景几何和颜色以及相机姿态,由于高度的歧义,特别是对于具有许多无纹理和稀疏覆盖区域的大型复杂场景。因此,为了在我们的神经场景表示下实现端到端联合映射和跟踪,我们建议使用以下损失函数,包括几何和先验约束、单视角和多视角约束,以及全局和局部约束。

RGB渲染损失:式(7)将3D神经场景表示与2D观察结果相连,因此我们可以使用简单的RGB重建损失来优化场景表示:

其中,R 表示每次迭代中随机采样的像素/光线,C 是输入像素颜色值。

RGB变形损失:为了进一步从仅有的颜色输入中强制执行几何一致性,我们还添加了一个简单的每像素变形损失。对于第m帧中的像素,表示为r_m,我们首先使用公式(8)渲染其深度值并将其投影到3D空间中,然后使用第n帧的内部和外部参数将其投影到另一个帧中。附近的关键帧n中的投影像素r_{m→n}表示为r_{m→n}$$。然后定义变形损失为:


其中K_m表示当前帧m的关键帧列表,不包括帧m本身。我们将在帧n的图像边界外投影的像素屏蔽掉。需要注意的是,与[11]不同的是,我们观察到,对于随机采样的像素来说,简单地执行像素变形比使用路径变形更有效,并且没有性能下降。

光流损失:RGB渲染和变形损失都是基于点的项,易受局部最小值的影响。因此,我们添加了一种基于光流估计的损失,它遵循区域平滑性先验,并有助于解决歧义。假设帧m中的采样像素为r_m,相应的投影像素在帧n中为r_n,则可以添加光流损失如下:

其中 GM(r_{m→n})表示从GMFlow [66]中估计的光流。

单目深度损失:给定RGB输入,可以通过现成的单目深度估计器[12]获得几何线索(如深度或法线)。受[71]启发,我们还将此信息包含在优化中,以指导神经隐式表面重建。
更具体地说,为了在我们的渲染预期深度\hat{D}和单目深度\bar{D}之间强制执行深度一致性,我们使用以下损失[43, 71]:

其中,wq是用于对齐\hat{D}\bar{D}的比例因子和偏移量,因为\bar{D}仅在未知比例下已知。我们使用最小二乘准则[43]对每个图像解决wq,这有一个闭式解。

单目法线损失:除了单目深度外,另一个互补的几何线索是表面法线。与提供当前视角全局表面信息的单目深度不同,表面法线是局部的并捕捉更多几何细节。与[71]类似,我们使用角度和L1损失对体积渲染的法线\hat{N}和来自[12]的单目法线\bar{N}进行一致性约束:

Eikonal Loss(规范化输出SDF(Signed Distance Function)值的损失函数): 此外,我们还添加了 Eikonal loss [15] 来规范化输出的 SDF 值 \hat{s}

其中X 是一组均匀采样的近表面点。

优化方案:最后,我们提供有关如何优化场景几何和外观以及相机姿态的层次表示形式的详细信息。

建图:为了优化第3.1节中提到的场景表示,我们总共从当前帧和选择的关键帧中均匀采样M个像素/光线。接下来,我们执行类似于[76]的3阶段优化,但使用以下损失:

在第一阶段中,我们将方程(1)中的粗略级别基础SDF值s^{coarse}视为最终的SDF值\hat{s},并使用公式(16)来优化粗略特征网格Φ^{coarse},粗略MLP f^{coarse}的参数和颜色MLP f^{color}的参数。接下来,在总迭代次数的25%之后,我们开始使用公式(4)作为最终的SDF值,因此还联合优化了细粒度特征网格{Φ^{fine}_l}和细粒度MLP f^{fine}。最后,在总迭代次数的75%之后,我们使用公式(16)进行局部捆集调整(BA),其中还包括优化颜色特征网格{Φ^{color}_l}以及选择的映射帧K的外部参数。

相机跟踪:我们同时运行相机跟踪,优化当前帧的相机姿态(旋转和平移),同时保持分层场景表示不变。简单地说,我们从当前帧中采样 M_t 个像素,并使用方程(10)中的纯RGB渲染损失进行100次迭代。

6. 系统设计

地图制作中的帧选择:在地图制作过程中,我们需要选择多个帧来采样光线和像素。我们引入了一个简单的帧选择机制。首先,我们维护一个全局关键帧列表,每10帧直接添加一个。对于地图制作,我们选择总共K=16个帧,其中5个是从关键帧列表中随机选择的,10个是从最近的20个关键帧中随机选择的,还有当前帧。

实现细节:地图制作每5帧进行一次,而跟踪每帧进行一次。请注意,使用纯RGB输入时,漂移是一个已知的困难问题。为了缓解这个问题,在地图制作的局部BA阶段中,我们对远离当前帧的16个选定帧的相机姿势进行了冻结,只与场景表示的另一半一起联合优化其他一半的相机姿势。对于方程(9)中的自适应局部变换,我们将c_0 = 1.208 · 10^{-2}、c_1 = 6.26471 · 10^{-6}和c_2 = 2.3 · 10^{-3}设置为常数。对于地图制作和跟踪,我们分别采样M = 8096M_t = 1024个像素,并进行100次迭代的优化。对于每次地图制作迭代,我们随机从所有选定的帧中采样像素,而不是每次迭代从一个帧中采样。使用我们目前未经优化的PyTorch实现,每个地图制作和跟踪迭代平均需要在单个A100 GPU上使用496ms和147ms。粗略的几何图形初始化为球体,遵循[71, 68, 69]。为了在第一次地图制作期间优化场景表示,我们在方程(13)中将比例因子和偏移值分配为w = 20q = 0,以使缩放的单眼深度值大致合理(例如1-5米)。最终的网格是使用Marching Cubes [27]从场景表示中提取的,分辨率为5123。

7. 参考链接

https://zhuanlan.zhihu.com/p/608410464?utm_id=0