打开

【泡泡点云时空】DROID-SLAM:适用于单目,双目和RGB-D 相机的基于深度学习的视觉 SLAM系统

泡泡机器人SLAM
泡泡机器人SLAM
2022-07-11 06:44:45

泡泡点云时空,带你精读点云领域顶级会议文章

标题:DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras

作者:Zachary Teed, Jia Deng, Princeton University

来源:NIPS 2021

编译:王宇杰

审核:阮建源 王志勇

这是点云时空推送的第278篇推文,欢迎个人转发朋友圈;其他机构或自媒体如需转载,后台留言申请授权,同时欢迎留言交流,大家的支持和鼓励是我们前进的动力。

摘要

我们介绍了 DROID-SLAM,一种新的基于深度学习的 SLAM 系统。DROID-SLAM 包括通过稠密集束调整层对相机位姿和像素深度的反复迭代更新。DROID-SLAM比以前的工作取得了很大的改进,具有高精度和鲁棒性,受灾难性失败的影响大大减少。尽管只对单目视频上进行了训练,但本系统可以利用双目或 RGB-D 视频在测试时提高性能。我们开源代码的 URL 是

https://github.com/princeton-vl/DROID-SLAM。

主要贡献

1、 高精度:我们在跨多个数据集和模式的先前工作上取得了很大的改进。在 TartanAir SLAM 比赛中,针对单目和双目的结果上,我们比此前最佳结果在误差上分别减少了 62%和60%。我们在ETH-3D RGB-D SLAM 排行榜上排名第一,在考虑误差和灾难性失败的 AUC 指标下,比第二名高出 35%。在 EuRoC上,使用单目输入,相比于其他零失败的方法,我们在精度上减少了 82% 的误差,相比于 ORB-SLAM3 上减少了 43%,因为在 11 个序列中仅能成功完成其中的 10 个。使用双目输入,我们比 ORB-SLAM3 减少了 71% 的误差。在 TUM-RGBD上,我们在零失败的方法中将误差减少了 83%。

2、高鲁棒性:与以前的系统相比,我们的灾难性失败要少得多。在 ETH-3D 上,我们成功跟踪了 32 个 RGB-D 数据集中的 30 个,而下一个最好的方法仅成功跟踪了32个的19个。在 TartanAir、EuRoC 和 TUM-RGBD 上,我们的失败率为零。

3、强泛化性:我们的系统仅使用单目输入进行训练,可以直接使用双目或RGB-D 输入来提高准确性,无需任何重新训练。我们在 4 个数据集和 3 个模态中的所有结果都是通过一个模型实现的,该模型仅使用单目输入,且只在合成 TartanAir 数据集上进行了一次训练。

DROID-SLAM 的强大性能和泛化能力得益于其“可微分循环优化启发设计”(DROID),这是一种结合了经典方法和深度网络优势的端到端可微架构。具体来说,它由循环迭代更新组成,建立在 应用于光流的RAFT 的基础上,但引入了两个关键创新:

首先,与迭代更新光流的 RAFT 不同,我们迭代更新相机位姿和深度。虽然 RAFT 在两帧上运行,但我们的更新适用于任意数量的帧,从而能够对所有相机位姿和深度图进行联合全局优化,这对于最大限度地减少长轨迹和闭环的漂移至关重要。

其次,DROID-SLAM 中相机位姿和深度图的每次更新都是由一个可微分的稠密集束调整 (DBA) 层产生的,该层计算相机位姿和每像素稠密深度的高斯-牛顿更新,以最大限度地兼容当前对光流的估计。此 DBA 层利用几何约束,提高准确性和鲁棒性,并使单目系统无需重新训练即可处理双目或 RGB-D 输入。

DROID-SLAM 的设计很新颖。以前方法中与之最接近的深度架构是 DeepV2D 和 BA-Net,它们都专注于深度估计并报告了有限的 SLAM 结果。DeepV2D 在更新深度和更新相机位姿之间交替,而不是集束调整。BA-Net 有一个集束调整层,但它们的层有很大不同:它不是“稠密”的,因为它优化了用于线性组合深度值的少量系数构成的基底,而我们直接优化每个像素的深度,而不受深度值基底的限制。此外,BA-Net 优化光度重投影误差(在特征空间中),而我们利用最先进的光流估计来优化几何误差。

我们对四个不同的数据集和三种不同的传感器模式进行了广泛的评估,在所有情况下都展示了最先进的性能。我们还包括消融研究,这些研究揭示了重要的设计决策和超参数。

算法结构

我们将视频作为输入,有两个目标:估计相机的轨迹并构建环境的 3D 地图。我们首先描述单目的设置;在后面我们会描述如何将系统推广到双目和 RGB-D 视频。

表征我们的网络接收图像的有序集合。对于每个图像 t,我们维护两个状态变量:相机位姿和逆深度。位姿和逆深度的集合是未知状态变量,它们在推理过程中随着新加入帧的处理而迭代更新。在本文中当我们提到深度时,请注意我们使用的是逆深度的参数化方式。

我们采用了基于帧的图结构(V,E)来表示帧间的共视性。边 (i, j ) ∈ E 意味着图像 i 和 j 具有包含共视3D路标点的重叠视野。以上图结构是在训练和推理期间动态构建的。在每次位姿或深度更新后,我们可以重新计算更新图结构的共视性。如果相机返回到之前建图过的区域,我们在图中添加长距离连接以执行闭环优化。

特征提取与关联

从添加到系统的每个新图像中提取特征。这个阶段的关键组件是从 RAFT 中借用的。

特征提取每个输入图像都由特征提取网络处理。该网络由 6 个残差块和 3 个下采样层组成,以输入图像分辨率的 1/8 生成稠密特征图。像 RAFT一样,我们使用两个独立的网络:一个特征网络和一个上下文网络。特征网络用于构建关联的集合,而上下文特征在更新算子的每次应用过程中被注入网络。

关联金字塔对于图结构中的每条边,我们通过在所有特征向量对之间进行点积来计算 4D 关联量;然后,我们在 RAFT之后对相关量的最后两个维度进行平均池化,形成一个 4 级的关联金字塔。

关联查找我们定义了一个查找算子Lr,它使用半径为 r 的网格来索引关联量。查找算子将 H × W 坐标网格作为输入,并使用双线性插值从关联量中检索值。该算子应用于金字塔中的每个关联量,并通过连接每一级的结果来计算最终的特征向量。

更新算子

我们的 SLAM 系统的核心组件是一个学习更新算子,如下图所示。更新算子是一个 3×3 卷积 GRU,隐藏状态为 h。每次应用算子都会更新隐藏状态,并额外生成位姿更新 Δξ(k) 和深度更新 Δd(k)。位姿和深度更新分别通过在SE3 流形上改变和向量加法应用于当前位姿和深度估计。

更新算子的图示:算子作用于图结构中的边,预测光流的修正量并通过 DBA 层映射到深度和位姿的更新。

更新算子的迭代应用产生一系列位姿和深度,期望收敛到一个固定点 G∗, d∗,从而反映真实的重建。

对应关系在每次迭代开始时,我们使用当前对位姿和深度的估计来估计对应关系。给定一个像素坐标网格,pi ∈ RH ×W ×2在帧 i 中,我们计算基于图像帧的图结构中的每条边 (i, j) ∈ E 的稠密对应关系场 pij。

这里 Πc 是将一组 3D 点映射到图像上的相机模型,Πc^−1 是将逆深度图 d 和 坐标网格 pi 映射到 3D 点云的逆投影函数(我们在附录中提供了公式和雅可比矩阵)。pij 表示使用估计的位姿和深度映射到帧 j 的像素 pi 的坐标。

输入我们使用对应关系场来索引关联量。对于每条边 (i, j) ∈ E,我们使用 pij 从关联量 Cij 中执行查找以检索相关特征。此外,我们使用对应关系场来导出由相机运动引起的光流作为差异 pij - pj 。此外,将先前 BA 解决方案的残差与光流场连接,允许网络使用来自先前迭代的反馈。

关联特征提供了关于 pij 邻域中视觉相似性的信息,允许网络学习对齐视觉相似的图像区域。然而,对应关系有时是模棱两可的。该流程提供了一个补充信息源,允许网络利用运动场中的平滑性来获得鲁棒性。

更新关联特征和光流特征在注入 GRU 之前分别通过两个卷积层进行映射。此外,我们通过逐元素加和将上下文网络提取的上下文特征注入 GRU。

ConvGRU 是一个具有较小感受野的局部操作。我们通过对图像空间维度上的隐藏状态进行平均来提取全局上下文,并将此特征向量用作 GRU 的附加输入。全局上下文在 SLAM 中很重要,因为例如由大型移动物体引起的不正确对应关系会降低系统的准确性。由网络来识别和拒绝错误的匹配是很重要的。

GRU 产生一个更新的隐藏状态 h(k+1)。我们不是直接预测深度或位姿的更新,而是预测稠密光流场空间中的更新。我们通过两个额外的卷积层映射隐藏状态以产生两个输出:(1)一个修正的光流场 r ∈ RH×W×2;(2)对应的置信度图 w ∈ RH×W×2。修正项 r 用于修正稠密对应关系场中的错误。我们将校正后的对应关系表示为 p∗ij = rij + pij。

然后,我们将隐藏状态汇集到共享相同视角 i 的所有特征上,并预测像素级阻尼因子 λ。我们使用 softplus 运算符来确保阻尼项为正。此外,我们使用池化特征来预测一个 8x8 掩码,该掩码可用于对逆深度估计进行上采样。

稠密集束调整层 (DBA)稠密集束调整层 (DBA) 将一组光流修正量映射到一组位姿和像素深度上以执行更新。我们在整个图结构上定义代价函数:

其中|| ||Σ 表示马氏距离,它根据置信权重 wij 对误差项进行加权。以上等式表明我们想要一个更新后的位姿 G' 和深度 d',使得重投影的点与更新算子预测的修改后的对应关系 p∗ij 匹配上。

我们使用局部参数化来线性化以上等式,并使用高斯牛顿算法来求解更新 (Δξ, Δd)。由于方程式中的每个项仅包含单个深度变量,Hessian 矩阵具有块对角结构。通过分离位姿和深度变量,可以使用舒尔补来有效地求解系统,并将像素阻尼因子 λ 添加到深度块中:

其中 C 是对角矩阵,因此可以轻松地求逆 C^−1 = 1/C。DBA 层作为计算图的一部分实现,并且在训练期间通过该层来执行反向传播。

训练

我们的 SLAM 系统是在 PyTorch 中实现的,我们使用 LieTorch 扩展在所有群元素的切线空间中执行反向传播。

去除尺度自由度在单目设置中,网络无法恢复绝对尺度。一种解决方案是定义一个对相似性变换不变的损失。然而,在训练过程中仍然存在尺度自由度,这对线性系统的调节和梯度的稳定性会有影响。我们通过将前两个位姿固定为每个训练序列的真实位姿来解决这个问题。固定第一个位姿会消除 6 自由度的测量自由度;固定第二个位姿可以解决尺度自由度的问题。

构建训练视频每个训练示例由一个 7 帧视频序列组成。为了保证稳定的训练和良好的下游性能,我们希望对不太容易也不太难的视频进行采样。

训练集由一组视频组成。对于长度为 Ni 的每个视频 i,我们预先计算一个 Ni × Ni 距离矩阵,存储每对帧之间的平均光流幅度。然而,并不是所有帧都是共视的。重叠率小于 50% 的帧对被分配无限远的距离。在训练过程中,我们通过在距离矩阵中采样路径来动态生成视频,使得相邻视频帧之间的平均光流量在 8px 到 96px 之间。

监督我们使用位姿损失和光流损失的组合来监督我们的网络。光流损失应用于成对的相邻帧。我们计算由预测的深度和位姿引起的光流以及由真值深度和位姿引起的光流。损失被认为是两个光流场之间的平均 l2 距离。

给定一组真实位姿Ni和预测位姿Ni,位姿损失被认为是真实位姿和预测位姿之间的距离,Lpose= ∑|| LogSE3(Ti^-1·Gi)||2。我们使用 γ = 0.9 将损失应用于每次迭代的输出,权重呈指数增长。

SLAM系统

在推理过程中,我们将网络组合成一个完整的 SLAM 系统。SLAM 系统以视频流为输入,实时进行重建和定位。我们的系统包含两个异步运行的线程。前端线程接收新帧、提取特征、选择关键帧并执行局部集束调整。后端线程同时对关键帧的整个历史执行全局集束调整。我们在此处提供系统概述,并在附录中提供更多信息。

初始化使用 DROID-SLAM 进行初始化很简单。我们只是收集帧,直到我们有一组 12 个帧。当我们积累帧时,如果光流大于 16px(通过应用一次更新迭代估计),我们只保留前一帧。一旦累积了 12 帧,我们通过在相隔 3 个时间步长的关键帧之间创建一条边来初始化图,然后运行 10 次更新操作迭代。

前端前端直接对传入的视频流进行操作。它维护一组关键帧和一个存储共视关键帧之间边的图结构。关键帧位姿和深度在不断被优化。首先从传入的帧中提取特征,然后将新帧添加到图结构中,添加边及其 3 个最近邻关键帧(通过平均光流测量),并使用线性运动模型来初始化位姿。然后,我们应用更新运算符的几次迭代来更新关键帧位姿和深度。我们修复了前两个位姿以消除量规自由度,但将所有深度视为自由变量。

跟踪新帧后,我们选择一个关键帧来去除冗余。我们通过计算平均光流幅度来计算帧对之间的距离并删除冗余帧。如果没有帧适合移除,我们会移除最旧的关键帧。

后端后端对关键帧的整个历史执行全局集束调整。在每次迭代期间,我们使用所有关键帧对之间的光流来重建图结构,表示为 N × N 距离矩阵。我们首先在时间相邻的关键帧之间添加边。然后,我们从距离矩阵中按光流量增加的顺序对新边进行采样。对于每个选定的边,我们将相邻边抑制在 2 的距离内,其中距离定义为索引对之间的切比雪夫距离 ||(i, j) - (k, l)||∞= max(|i - k| , |j - l|)。

然后我们将更新运算符应用于整个图结构,通常由数千个帧和边组成。存储全套关联量将很快超过视频内存。相反,我们使用 RAFT 中提出的内存高效实现。

在训练期间,我们在 PyTorch 中实现稠密集束调整以利用自动微分引擎。在推理时,我们使用自定义的 CUDA 内核,利用问题的块稀疏结构,然后对推导出的相机块执行稀疏 Cholesky 分解。

我们只对关键帧图像执行完整的集束调整。为了恢复非关键帧的位姿,我们通过迭代估计每个关键帧与其相邻非关键帧之间的光流来执行仅包含运动的集束调整。在测试期间,我们评估完整的相机轨迹,而不仅仅是关键帧。

双目和 RGB-D我们的系统可以轻松修改为双目和 RGB-D 视频。在 RGB-D 的情况下,我们仍然将深度视为一个变量,因为传感器深度可能有噪声并且缺少观测值,并且只需在代价函数中添加一个项,它会惩罚深度的预测值和测量值之间的平方距离。对于双目,我们使用与上述完全相同的系统,只是将帧加倍,并在 DBA 层中固定左右帧之间的相对位姿。图结构中的跨相机边允许我们利用双目信息。

主要结果

我们在一组不同的数据集和传感器模态上进行实验。我们将深度学习和已建立的经典 SLAM 算法进行比较,并特别强调跨数据集泛化能力。我们主要使用绝对轨迹误差 (ATE) 来评估相机轨迹的准确性。虽然一些数据集具有真值点云,但没有标准协议来比较 SLAM 系统直接给出的 3D 重建结果,因为 SLAM 系统可以选择重建哪些 3D 点。评估密集 3D 重建结果通常在多视角立体几何领域,在本工作考虑范围之外。

我们的网络完全使用来自合成 TartanAir 数据集的单目视频进行训练。我们训练我们的网络进行 250k 步,批量大小为 4,分辨率 384 × 512,7 帧剪辑,并展开 15 次更新迭代。在 4 个 RTX-3090 GPU 上训练需要 1 周时间。

TartanAir(单目和双目)TartanAir 数据集是评估 SLAM 算法的具有挑战性的综合基准,并被用作 ECCV 2020 SLAM 竞赛的一部分。我们使用官方测试序列,并在 Tab 中的所有“困难”序列中提供 ATE。

下表展示了我们方法的鲁棒性(没有灾难性故障)和准确性(非常低的漂移)。我们在 TartanAir 上重新训练 DeepV2D 作为基线。在大多数序列上,我们的性能优于现有方法一个数量级,平均误差比 TartanVO 低 8 倍,比 DeepV2D 低 20 倍。

我们还使用 TartanAir 数据集与 ECCV 2020 SLAM 竞赛的最好提交进行比较。前两个提交使用基于 COLMAP 构建的系统,运行速度比实时慢 40 倍。另一方面,我们的方法运行速度提高了 16 倍,并且在单目基准上的误差降低了62%,在双目基准上降低了 60%。

EuRoC (单目和双目)在剩下的实验中,我们对我们的网络泛化到新相机和环境的能力感兴趣。EuRoC 数据集包含从微型飞行器 (MAV) 上的传感器捕获的视频,是评估 SLAM 系统的广泛使用的基准。我们使用 EuRoC 数据集来评估单目和双目性能,并在下表中报告结果。

在单目设置中,我们实现了 2.2 厘米的平均 ATE,在零失败的方法中减少了 82% 的误差,并且在仅比较 ORB-SLAM3 成功的序列时比 ORB-SLAM3 减少了 43%。

我们比较了几种深度学习方法。我们将在 TartanAir 数据集上训练的 DeepV2D 和在 NYUv2 和 ScanNet上训练的公开版本进行比较。DeepFactors 在 ScanNet 上进行了训练。我们发现,与经典的 SLAM 系统相比,最近的深度学习方法在 EuRoC 数据集上表现不佳。这是由于泛化能力差和数据集偏差导致大量漂移,但我们的方法不存在这些问题。D3VO 能够通过将神经网络前端与 DSO 作为后端相结合,使用 11 个序列中的 6 个进行评估并对其余序列进行无监督训练,从而实现良好的鲁棒性和准确性,其中包含用于评估的相同场景。

TUM-RGBD RGBD 数据集由手持相机拍摄的室内场景组成。由于存在滚动快门伪影、运动模糊和重度旋转,对于单目方法而言,这是一个出了名的困难数据集。我们在下表中对整个 freiburg1 数据集进行了基准测试。

ORB-SLAM 等经典 SLAM 算法往往在大多数序列上失败。虽然深度学习方法更稳健,但它们在大多数评估序列上的准确度较低。我们的方法既稳健又准确。它成功跟踪了所有 9 个序列,同时实现了比 DeepFactors的 ATE低 83%,比 DeepV2D的 ATE低 90%。

ETH3D-SLAM (RGB-D)最后,我们在 ETH3D-SLAM 基准上评估 RGB-D 性能。在此设置中,网络还提供了来自 RGB-D 相机的测量值。我们采用在 TartanAir 上训练的网络,并在优化目标中添加一个附加项,以惩罚预测和观测的逆深度之间的距离。在没有任何微调的情况下,我们的方法在训练集和测试集上均排名第一。对于某些数据集,其环境是“昏暗”的,这意味着没有可用的图像数据,因此在这些数据集上,我们不提交任何预测。在测试集上,我们成功跟踪了 30/32 RGB-D的序列,比次优的 19/32 有所提高。

RGB-D ETH3D-SLAM 基准的泛化结果。(左)我们的方法仅在合成 TartanAir 数据集上进行训练,在训练和测试拆分中均排名第一。(右)横轴为 ATE ,纵轴为成功轨迹的数目。我们的方法成功地跟踪了 30/32 的序列(图像数据可用的数据集)。

DROID-SLAM 可以泛化到新的数据集。我们依次展示了 Tanks and Temples、ScanNet、Sintel 和 ETH-3D 的结果;全部使用单目视频。

时序和内存我们的系统可以使用 2 个 3090 GPU 实时运行。跟踪和局部 BA 在第一个 GPU 上运行,而全局 BA 和回环在第二个 GPU 上运行。在 EuRoC 上,我们通过下采样到 320 × 512 分辨率并每隔一帧跳过一次来实现平均 20fps的性能。在 TUM-RGBD 上,我们通过下采样到 240 × 320 并每隔一帧跳过一次来实现平均 30fps的性能。在 TartanAir 上,由于相机运动速度更快,我们无法实时运行,平均频率为 8fps。然而,这仍然比依赖 COLMAP 的 TartanAir SLAM 挑战的前 2 名的系统运行速度提高了 16 倍。

SLAM 前端可以在具有 8GB 内存的 GPU 上运行。后端由于需要存储完整图像集的特征图,因此需要更多的内存。TUM-RGBD 上的所有结果都可以在单个 1080Ti 显卡上生成。EuRoC、TartanAir 和 ETH-3D(视频最高可达 5000 帧)的结果需要具有 24GB 内存的 GPU。虽然内存和资源需求目前是我们系统的最大限制,但我们相信通过剔除冗余计算和更有效的表示可以大大减少这些限制。

Abstract

We introduce DROID-SLAM, a new deep learning based SLAM system. DROID- SLAM consists of recurrent iterative updates of camera pose and pixelwise depth through a Dense Bundle Adjustment layer. DROID-SLAM is accurate, achieving large improvements over prior work, and robust, suffering from substantially fewer catastrophic failures. Despite training on monocular video, it can leverage stereo or RGB-D video to achieve improved performance at test time. The URL to our open source code is https://github.com/princeton-vl/DROID-SLAM.

如果你对本文感兴趣,想要下载完整文章进行阅读,可以关注【泡泡机器人SLAM】公众号。

欢迎来到泡泡论坛,这里有大牛为你解答关于SLAM的任何疑惑。

有想问的问题,或者想刷帖回答问题,泡泡论坛欢迎你!

泡泡论坛:http://paopaorobot.org/bbs/

泡泡机器人SLAM的原创内容均由泡泡机器人的成员花费大量心血制作而成,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!

泡泡机器人SLAM的原创内容均由泡泡机器人的成员花费大量心血制作而成,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!