iDF-SLAM:基于神经隐式建图和深度特征跟踪的端到端RGB-D SLAM系统(论文阅读记录)

一、前置知识补充     

        什么是显示表达,什么是神经隐式表达3D点云、Mesh、voxel等都是经典的显示表达,它们都是直接反应场景的3维几何特征。神经隐式表达就是将场景的几何特征训练进MLP这样的模型中,如果拿到这个模型,不给输入的话,你是完全看不出这是个什么东西,但是,当你对这样的MLP模型输入一串数据,得到一串输出,将这些输出组织起来就可以看得出来这个模型所包含的场景是什么。

        在阅读这篇论文或者阅读我这篇文章之前请务必先了解NeRF的基本结构,推荐观看B站UP主的视频:【较真系列】讲人话-NeRF全解(原理+代码+公式)_哔哩哔哩_bilibili

        关于什么是TSDF,请参考:TSDF算法学习-CSDN博客

二、核心内容提炼

1.作者认为以前的SLAM系统有这些问题:

        ①在建图过程中需要占用巨大的显存(VRAM),并且在动态修改地图时会产生额外计算消耗。目前来说这是没办法避免的,建出来的地图的大小会随着输入的帧越多而越来越大,而采用固定参数数量的MLP网络来隐式表达场景又会导致建出来的地图细节不够好。

        ②在估计位姿时,两种方法(iMAP 和 NICE-SLAM)都对每一帧进行逆NeRF优化,这是非常耗时的。

2.为了一定程度上解决或者缓解上述问题,作者打算采用这样的架构:

        采用基于特征的深度神经跟踪器作为前端,采用 NeRF 式神经隐式建图器作为后端。神经隐式建图器是动态训练的,虽然神经跟踪器是在 ScanNet 数据集上预训练的,但它也会随着神经隐式映射器的训练进行微调。跟踪器和映射器的训练都是自我监督的,无需引入ground truth姿势。

3.系统总览

        如下图所示,iDF-SLAM由三个主要的部分组成,分别是深度神经追踪器(neural tracker)、神经隐式建图器(neural implicit mapper)以及体渲染模块(volume renderer):

        该系统需要输入一串有序RGB-D帧。每次有新帧进入系统,就会选择新帧作为“当前帧”(current RGB-D frame)用F_{c} = \begin{Bmatrix} I_{c} & D_{c} \end{Bmatrix}表示,并找到一个与之对应的“参考关键帧”(reference RGB-D keyframe)用F_{r} = \begin{Bmatrix} I_{r} & D_{r} \end{Bmatrix}表示(在这里I表示RGB数据,D表示深度图数据)。将这两帧的RGB-D数据分别送入Pose Estimation中来计算两帧之间的变换矩阵T_{c}。只有当两帧之间的运动足够远或者,“当前帧”跟踪丢失时,当前帧才会被作为新的“关键帧”添加进后端的神经隐式建图器(neural implicit mapper)。但是,在更新神经隐式网络的参数之前,需要先进行一次位姿优化。“当前帧”没有被选为“关键帧”的话,就固定神经隐式网络(本文用的是MLP),转而优化深度神经追踪器(在这里用的是URR model,可以参考UnsupervisedR&R: Unsupervised Point Cloud Registration via Differentiable Rendering)。

4.神经隐式建图器

        与 iMAP 类似,iDF-SLAM的神经隐式映射器的核心是单个 MLP,它是 iDF-SLAM 中唯一的地图表示(也就是说这个MLP本身就是建出来的地图)。MLP的架构如下图所示。

        这个MLP 具有 8 个特征大小为 256 的隐藏层和 2 个输出头,与 iMAP 中使用的 MLP 不同,作者将其中一个输出头替换为预测TSDF值的输出头。MLP 的输入是给定点的 3-D 位置 pi和对该点的观测方向d(这是NeRF这篇论文提出的,因为对同一点从不同的观测方向可以看到不同的颜色)。图中的Position Embeding是对pi和d进行位置编码的编码器(之所以要进行位置编码,是因为三维的坐标表示太模糊了,以二维为例[1,1]与[1,2]这两个坐标在二维时,只在y上差了1,但是一旦映射到三维空间,就可以表示为[1,1,0]和[1,2,10],这样就可以将两点的差别拉大,不让MLP误以为两坐标很近所以它们应该很相似,这就使NeRF重建的细节更好)。

        除了上述和iMAP类似的部分外,作者还对其进行了一系列改善,以适应整个系统:

        ①多层感知器(MLP)优化

        为了高效优化 MLP,iDF-SLAM首先从给定关键帧中采样一批个数为B的像素集(也就是不对所有像素都优化而只是采样部分像素优化),并且为了使网络更专注于更新地图中没见过的部分或忘记的部分,iDF-SLAM采用 iMAP 中的主动采样策略,将每一关键帧划分为 8 × 8 网格,并从损失更高的区域中采样更多的像素。给每个采样得到的像素定义一条射线r,r的起点是相机的光心并穿过该像素。再在每条射线r上采样Sp个三维点,形成 MLP 的输入。(这一段描述的基本上和 iMAP还是一样的,如果看不懂,还是需要先看懂iMAP)

        iDF-SLAM是这样定义损失,并监督MLP参数更新的:

        其中,是光度损失,是几何损失,它们的定义如下:

        光度损失没什么好说的,就是从体渲染得到的颜色和采样的像素的颜色是否一样来判断损失。这里需要特别说明一下几何损失,p是B的众多射线上的一条,当我们拿到一个射线p时,就将p上采样得到的点分为两组,靠近物体表面的点为一组,位于相机和物体表面之间的点为一组。其中S_{p}^{tr}是靠近表面的的点的集合,S_{p}^{fs}是位于相机和表面之间的点的集合。所以tr就等于深度图上对应p这条射线的像素位置上的深度值减去采样距离di,\widehat{T_{s}}应该是等于0?(感觉原文写得不是很清楚,所以只能猜)

        ②位姿优化

        新关键帧的位姿以与 iNeRF类似的方式进行优化。位姿优化使用与 MLP 优化完全相同的损失函数。只是位姿优化MLP参数θmlp是固定的,仅更新姿态参数 \delta T_{c}

        除此之外,还有一点要注意,前面不是提到过一种采样像素的方法吗。即“将每一关键帧划分为 8 × 8 网格,并从损失更高的区域中采样更多的像素”,但在位姿优化中我们需要调整为“将每一关键帧划分为 8 × 8 网格,并从损失更低的区域中采样更多的像素”。因为损失更低的区域采样得到的数据去优化位姿能够使位姿更准确

        ③共视图和关键帧剔除

        如果每次只根据新输入的帧去调整MLP的参数,就会发生灾难性遗忘。这很好理解,因为不将以前的帧与新帧一起优化的话,老的帧对MLP的约束就没了,那么很可能新帧就将表达老帧的MLP参数给修改了。所以作者使用了和iMAP一样的“老帧重播策略”,但是与iMAP不同的是,对于给定的一个具有优化后的姿势T_{n}的新关键帧 KF_{n } 和一组先前存储的关键帧 \mathbb{F} = \begin{Bmatrix} KF_{i} \end{Bmatrix} 以及相关姿势\mathbb{T} = \begin{Bmatrix} T_{i} \end{Bmatrix} 。我们首先计算从新关键帧到每个其他关键帧的相对变换矩阵T_{n}^{i},然后使用相机内参矩阵K和深度测量,就可以将新关键帧的每一像素投影到先前关键帧上:

        通过检查投影像素u_{i}是否落在关键帧的有效边界内,我们可以通过将有效投影像素数除以关键帧中的像素总数来计算共视性得分。如果关键帧 KF_{i}的共可见性得分大于预定义的阈值 \sigma _{cull},我们删除新的关键帧,因为它和已经存在的关键帧的共视关系很好,增加这个关键帧不会提升MLP的表达能力。否则,就将共可见性得分与另一个较低阈值\sigma _{covis}对比 。如果分数大于这个新阈值,则将新关键帧KF_{n }连接到可见图中的关键帧KF_{i}(也就是说作者维护了一个图结构,顶点是帧,两顶点有边就说明这两帧有共视关系)。在选择那些老帧进行“老帧重播”时,就选择那些相互不共视的帧。

 5.神经追踪器(NEURAL TRACKER)

        神经追踪器采用改进的无监督 R&R (URR) 模型作为神经跟踪器。作者说之所以使用R&R (URR) 模型而不是其他,主要是因为它可以无监督训练、微调,从而避免在整个流程中引入监督。

        给定输入 RGB-D 帧和参考 RGB-D 关键帧,该模型首先使用全卷积特征提取器从两个帧的 RGB 数据中提取特征图。然后,利用深度数据,我们可以通过反投影获得一对点云。由于提取器中既不使用跨步也不使用池化,因此输出特征图具有与输入图像相同的高度和宽度。因此,点云中的每个点都与一个唯一的特征向量相关联。通过在特征空间中进行最近邻(kNN)搜索,可以在两个点云之间找到一组对应关系。最后,使用加权 Procrustes 算法计算从当前帧到参考关键帧的相对变换。

        特征提取器的架构如下图所示,其中第 1 层和第 2 层共享相同的架构,并且是ResNet18网络中的第一个卷积块。

        在默认的 URR 模型中,kNN 搜索会通过特征空间搜索到最相似的K个特征点。但是作者注意到,使用默认 URR 模型找到的对应关系往往彼此接近,导致后续姿态估计所选择的特征点仅来自输入图像的一小部分区域如下图上半部分:

        为了解决这个问题,作者借鉴了ORB-SLAM的思想,强制从输入图像的不同区域选择特征点,从而确保匹配对均匀分布。具体来说,作者将输入图像划分为 4 × 4 网格,并设置每个网格可以找到的最大对应数量。通过这样做,得到的对应集在输入图像中均匀分布,从而使前端视觉里程计实现更稳健的姿态估计。如上图的下半部分。

        作者为了使基于NEURAL TRACKER的前端视觉里程计能够更适应特定的场合,提出可以将

NEURAL TRACKER的其他层固定,去微调outconv层。其损失函数是这样定义的:

        其中光度损失的公式与之前定义的光度损失相同。其中 C = {c, r, w} 是对应集,其中 c、r 是对当前帧像素坐标和参考关键帧像素坐标的索引,w 是该对应关系的置信度。pc,pr和分别表示当前帧和参考关键帧中对应点的坐标(也就是说C表示了,当前帧的像素坐标和参考帧像素坐标的对应集)。关于我只能猜,文中写得也不是很清楚,要是谁对我的猜想有兴趣的话,就直接评论区问吧,这里直接偷懒了。

三、总结

        可以通过下图来准确理解,红色的视锥是“参考关键帧”的,蓝色的视锥是“当前帧”的,将两帧的RGB-D送入neural tracker得到T_{c2w}。有了T_{c2w}就可以在蓝色视锥的一条射线上采样得到三维点的d和pi(d是观测方向,pi是三维点的坐标)。将d和pi输入neural implicit mapper后就可以得到每一个采样得到的三维点的s和(r,g,b),在这里,s是TSDF值。s和(r,g,b)送入volume renderer后就可以得到这条射线对应的像素的色彩值(也就是RGB值)。

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值