当前位置: 首页 > article >正文

经典文献阅读之--DROID-SLAM(完美的深度学习slam框架)

0. 简介

深度学习和SLAM现在结合越来越紧密了,但是实际上很多时候深度学习只会作为一个block放在slam系统中。而很多深度学习slam算法,在slam这边的性能都不是太好,尤其是回环和全局优化这块。因为有一些深度学习的工作就不太适合做回环检测。回环检测对于slam算法来说非常重要,因为relative pose的精度及其稳定性,很容易带来累积误差。而回环是目前唯一一个可以用来修正累积误差的。
回环检测需要去评估两个图片的相似性,传统的方法是基于特征点,然后训练词袋包。这样每张图片就有了唯一的特征,利用距离+图片特征做匹配,检测回环,然后再基于图片配准的方法做算pose。基本上回环和前端定位用的是一套方案,这样不需要增加额外的算力,就能实现回环检测,但是很多基于深度学习的方法,要么没有回环,要么增加额外的特征做回环(这样就需要额外的算力和存储)。而《DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras》一文就是在这个方面做出了改进,这篇文章的通讯是ImageNet的一作。可以看出文章的含金量,相关的代码已经在Github上开源了。

1. 主要贡献

在这项工作中,我们介绍了DROID-SLAM,这是一个基于深度学习的全新SLAM系统。它具有最先进的性能,在具有很大差距的挑战性基准测试中胜过现有的SLAM系统,无论是传统的还是基于学习的。具体来说,它具有以下优势:
高精度:我们在多个数据集和模态上相较于先前工作都取得了显著的改进。在TartanAir SLAM竞赛[55]中,我们在单目轨迹上将误差减少了62%,在立体轨迹上减少了60%,超过了先前最佳结果。在ETH-3D RGB-D SLAM排行榜[42]上,我们在考虑了误差和灾难性失败率的AUC指标下,比第二名高出35%。在EuRoC[2]上,使用单目输入,我们在零失败的方法中将误差降低了82%,相较于ORB-SLAM3,它只在11个序列中成功了10个,我们将误差降低了43%。在使用立体输入时,我们将误差降低了71%。在TUM-RGBD[44]上,我们在零失败的方法中将误差降低了83%。
高鲁棒性:我们的系统遭受的灾难性失败要远远少于先前的系统。在ETH-3D上,我们成功跟踪了32个RGB-D数据集中的30个,而下一个成功跟踪的只有19/32。在TartanAir、EuRoC和TUM-RGBD上,我们完全没有失败。
强泛化能力:我们的系统仅使用单目输入进行训练,却能直接使用立体或RGB-D输入来获得更高的精度,而无需重新训练。我们在4个数据集和3个模态上的所有结果都是由单一模型实现的,它只受过一次训练,且完全是在合成的TartanAir数据集上使用单目输入进行训练的。

2. 主要方法

我们以视频作为输入,有两个目标:估计相机的轨迹并构建环境的三维地图。我们首先描述单目设置;在第6节中,我们描述如何将系统推广到立体和RGB-D视频。
表示:我们的网络在有序图像集合 { I t } t = 0 N \{I_t\}^N_{t=0} {It}t=0N上运行。对于每个图像 t t t,我们维护两个状态变量:相机姿态 G t ∈ S E ( 3 ) G_t ∈ SE(3) GtSE(3)和逆深度 d t ∈ R + H × W d_t ∈ \mathbb{R}^{H×W}_+ dtR+H×W。姿态集合 { G t } t = 0 N \{G_t\}^N_{t=0} {Gt}t=0N和逆深度集合 { d t } t = 0 N \{d_t\}^N_{t=0} {dt}t=0N未知的状态变量,在推理过程中随着新帧的处理而迭代更新。在本文的其余部分,当我们提到深度时,请注意我们使用逆深度参数化。
我们采用帧图 ( V , E ) (\mathcal{V},\mathcal{E}) (VE)来表示帧之间的共视关系。边 ( i , j ) ∈ E (i,j)∈ \mathcal{E} (ij)E表示图像 I i I_i Ii I j I_j Ij具有重叠的视场和共享点帧图在训练和推理过程中动态构建。在每次姿态或深度更新后,我们可以重新计算可见性以更新帧图。如果相机返回到先前映射的区域,我们在图中添加长程连接以执行闭环。

3. 特征提取与相关性

系统从每个新添加的图像中提取特征。这一阶段的关键组成部分借鉴了 RAFT[49] 的方法。[RAFT是输入两帧RGB迭代的优化光流,DROID-SLAM是输入arbitrary数量的RGB,迭代的优化深度和位姿。(Joint global refinement of all camera poses and depth maps对于消除累计飘移和回环检测至关重要)]

3.1 特征提取

每个输入图像都经过特征提取网络的处理。该网络由6个残差块和3个下采样层组成,生成密集的特征图,分辨率为输入图像的1/8。与 RAFT[49] 一样,我们使用两个独立的网络:一个特征网络和一个上下文网络。特征网络用于构建相关性体积集合,而上下文特征在每次更新操作符应用时被注入到网络中

3.2 相关性金字塔

对于帧图中的每条边 ( i , j ) ∈ E (i, j) ∈ \mathcal{E} (i,j)E,我们通过计算 g θ ( I i ) g_θ(I_i) gθ(Ii) g θ ( I j ) g_θ(I_j) gθ(Ij) 中特征向量的所有配对的点积来生成一个4D相关性体积
C u 1 v 1 u 2 v 2 i j = ⟨ g θ ( I i ) u 1 v 1 , g θ ( I j ) u 2 v 2 ⟩ (1) C_{u_1 v_1 u_2 v_2}^{ij} = \left\langle g_\theta (I_i)_{u_1 v_1}, g_\theta (I_j)_{u_2 v_2} \right\rangle \tag{1} Cu1v1u2v2ij=gθ(Ii)u1v1,gθ(Ij)u2v2(1)

然后,我们执行对相关性体积最后两个维度的平均池化,按照RAFT[49]的方法形成一个4级相关性金字塔。

3.3 相关性查找

我们定义了一个查找运算符,它使用半径 r r r网格对相关性体积进行索引 L r : R H × W × H × W × R H × W × 2 → R H × W × ( r + 1 ) 2 L_r : \mathbb{R}^{H×W×H×W} × \mathbb{R}^{H×W×2}→ \mathbb{R}^{H×W×(r+1)^2} Lr:RH×W×H×W×RH×W×2RH×W×(r+1)2

查找运算符接受一个 H × W H×W H×W坐标网格作为输入,并使用双线性插值从相关性体积中检索值。该运算符应用于金字塔中的每个相关性体积,并通过连接每个级别的结果来计算最终特征向量。

4. 更新算子

我们SLAM系统的核心组件是一个经过学习的更新算子,如图2所示。该更新算子是一个带有隐藏状态h的3×3卷积GRU。每次应用该算子都会更新隐藏状态,并额外产生一个姿势更新 ∆ ξ ( k ) ∆ξ^{(k)} ξ(k)和深度更新 ∆ d ( k ) ∆d^{(k)} d(k)。姿势和深度更新通过在SE3流形上的重新投影和向量加法分别应用于当前深度和姿势估计。
G ( k + 1 ) = Exp ⁡ ( Δ ξ ( k ) ) ∘ G ( k ) , d ( k + 1 ) = Δ d ( k ) + d ( k ) . ( 2 ) \mathbf{G}^{(k+1)} = \operatorname{Exp}(\Delta \bm{\xi}^{(k)}) \circ \mathbf{G}^{(k)}, \mathbf{d}^{(k+1)} = \Delta \mathbf{d}^{(k)} + \mathbf{d}^{(k)}. \qquad \qquad (2) G(k+1)=Exp(Δξ(k))G(k),d(k+1)=Δd(k)+d(k).(2)

迭代更新操作产生一系列姿态和深度值,期望能够收敛到一个稳定的点 { G ( k ) } → G ∗ \{G^{(k)}\} → G^∗ {G(k)}G, { d ( k ) } → d ∗ \{d^{(k)}\} → d^∗ {d(k)}d,反映出真实的重建情况。在每次迭代开始时,我们使用当前姿态和深度值的估计来估算对应关系。给定一个像素坐标网格, p i ∈ R H × W × 2 p_i ∈ \mathbb{R}^{H×W×2} piRH×W×2,在第 i i i帧中,我们计算密集的对应关系场 p i j p_{ij} pij
在这里插入图片描述

图2: 更新操作符说明。该操作符作用于画面图中的边缘,预测流程修订并通过(DBA)层映射到深度和姿态更新。

p i j = Π c ( G i j ∘ Π c − 1 ( p i , d i ) ) , p i j ∈ R H × W × 2 G i j = G j ∘ G i − 1 . ( 3 ) \mathbf{p}_{ij} = \Pi_c(\mathbf{G}_{ij} \circ \Pi_c^{-1}(\mathbf{p}_i, \mathbf{d}_i)), \quad \mathbf{p}_{ij} \in \mathbb{R}^{H \times W \times 2} \quad \mathbf{G}_{ij} = \mathbf{G}_j \circ \mathbf{G}_i^{-1}. \quad (3) pij=Πc(GijΠc1(pi,di)),pijRH×W×2Gij=GjGi1.(3)

对于图像帧中的每个边缘 ( i , j ) ∈ E (i, j) ∈ \mathcal{E} (i,j)E,这里的 Π c Πc Πc摄像机模型,将一组3D点映射到图像上,而 Π c − 1 Π^{-1}_c Πc1是逆投影函数,将逆深度图d和坐标网格 p i p_i pi 映射到3D点云(附录中提供公式和雅可比矩阵)。 p i j p_{ij} pij表示使用估计的姿势和深度将像素 p i p_i pi映射到帧 j j j中的坐标。

4.1 输入

我们使用对应场来索引相关卷积体来获取相关特征。另外,我们使用对应场来推导由摄像机运动引起的光流,即 p i j − p j p_{ij} - p_j pijpj的差异。此外,上一次BA解决方案的残差与流场连接,使网络能够使用前一次迭代的反馈。相关特征提供关于 p i j p_{ij} pij周围的视觉相似性的信息,使得网络能够学习对齐视觉相似的图像区域。然而,对应关系有时是模糊的。流场提供了一种补充信息源,使网络能够利用运动场的平滑性来获得鲁棒性。

4.2 更新

相关特征和光流特征分别通过两个卷积层进行映射,然后注入到GRU中。此外,我们通过逐元素相加将上下文特征(由上下文网络提取)注入到GRU中。
ConvGRU是一个具有小感受野的局部操作。我们通过对图像的空间维度进行隐藏状态平均,提取全局上下文,并将这个特征向量作为额外的输入注入到GRU中。在SLAM中,全局上下文非常重要,因为大的移动物体导致的错误对应可能会降低系统的准确性。对网络来说,识别并拒绝错误的对应是非常重要的。
GRU会生成一个更新的隐藏状态 h ( k + 1 ) h^{(k+1)} h(k+1)。我们不是直接预测深度或姿态的更新,而是预测密集光流场空间中的更新。我们将隐藏状态通过另外两个卷积层映射,产生两个输出:(1)修订的光流场 r i j ∈ R ( H × W × 2 ) r_{ij} ∈ \mathbb{R}^{(H×W×2)} rijR(H×W×2) (对应上图中的蓝色的线)。和(2)相关的置信度图 w i j ∈ R + ( H × W × 2 ) w_{ij} ∈ \mathbb{R}^{(H×W×2)}_+ wijR+(H×W×2)(对应上图中的红色的线)。修订的 r i j r_{ij} rij 是网络预测的修正术语,用于纠正密集对应字段中的错误。我们用 p i j ∗ = r i j + p i j p^∗_{ij} = r_{ij} + p_{ij} pij=rij+pij 表示已修正的对应。
然后,我们在共享相同源视图 i i i 的所有特征上对隐藏状态进行汇集,并预测像素级的阻尼因子 λ λ λ。我们使用 softplus 运算符来确保阻尼项为正数。此外,我们利用汇集的特征来预测一个 8x8 的掩膜,可用于上采样逆深度估计。
在这里插入图片描述

4.3 Dense Bundle Adjustment Layer (DBA)

…详情请参照古月居


http://www.kler.cn/a/394610.html

相关文章:

  • 嵌入式硬件实战提升篇(一)-泰山派RK3566制作多功能小手机
  • MySQL:数据库的约束
  • Git在版本控制中的应用
  • 【excel】easy excel如何导出动态列
  • 鸿蒙next版开发:ArkTS组件点击事件详解
  • 标准C++ 字符串
  • 使用Java爬虫获取商品订单详情:从API到数据存储
  • STM32完全学习——系统时钟设置
  • 从华为到创业公司
  • 蓝桥杯竞赛单片机组备赛【经验帖】
  • 【计算机网络】五层对比,物理设备对比
  • 阿里巴巴首推Chinese SimpleQA,全方位检验大型语言模型在中文事实性问答上的表现
  • Mac中安装OhMyZsh
  • 构建安全的数据库环境:群晖NAS安装MySQL和phpMyAdmin详细步骤
  • Qt 之 qwt和QCustomplot对比
  • javascript-Web APLs (五)
  • ANDROIDWORLD: A Dynamic Benchmarking Environment for Autonomous Agents论文学习
  • Vue的基础使用
  • 【linux】进程等待与进程替换
  • LeetCode343.整数拆分
  • 客户端发送http请求进行流量控制
  • 如何绕过Captcha并使用OCR技术抓取数据
  • 如何轻松导出所有 WordPress URL 为纯文本格式
  • 红黑树
  • 【日常记录-Git】如何为post-checkout脚本传递参数
  • 【SQL】sql常用命令