经典文献阅读之--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)
Gt∈SE(3)和逆深度
d
t
∈
R
+
H
×
W
d_t ∈ \mathbb{R}^{H×W}_+
dt∈R+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})
(V,E)来表示帧之间的共视关系。边
(
i
,
j
)
∈
E
(i,j)∈ \mathcal{E}
(i,j)∈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×2→RH×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}
pi∈RH×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∘Πc−1(pi,di)),pij∈RH×W×2Gij=Gj∘Gi−1.(3)
对于图像帧中的每个边缘 ( i , j ) ∈ E (i, j) ∈ \mathcal{E} (i,j)∈E,这里的 Π c Πc Πc是摄像机模型,将一组3D点映射到图像上,而 Π c − 1 Π^{-1}_c Πc−1是逆投影函数,将逆深度图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 pij−pj的差异。此外,上一次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)}
rij∈R(H×W×2) (对应上图中的蓝色的线)。和(2)相关的置信度图
w
i
j
∈
R
+
(
H
×
W
×
2
)
w_{ij} ∈ \mathbb{R}^{(H×W×2)}_+
wij∈R+(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 的掩膜,可用于上采样逆深度估计。