CodeSLAM - Learning a Compact, Optimisable Representation for Dense Visual SLAM
该文是帝国理工学院戴森机器人实验室在2018年在CVPR上发表的论文,并且是一篇Best Paper。
主要贡献
- 通过对灰度图的自动编码器进行调节,推导出地图的紧凑表示。
- 实现了一个实时的单目SLAM系统,可以实现相机运动和地图的同时优化。
本文主要是在自动编码器上下功夫,并结合图像几何信息实现了单目相机的密集SLAM。对于一张rgb图像,利用一个U-net去提取特征及估计深度的不确定性,并利用另外一个变分自动编码器以编码和解码一个初始的深度值,然后联合两帧图像的相关信息来优化相机位姿及进一步估计深度。
算法流程
1、网络架构
上半部分使用U-Net,左边是一个下采样的过程,将灰度图拆分为高维度的特征表示,得到的是一个抽象的特征,接着是一个带有跳层的上采样部分,负责将抽象的特征进行细化,还原到原来的尺寸,跳层的作用是联系输入图像的信息,有助于还原抽象的特征。本文的U-Net估计了4个不同尺寸的关于深度的不确定性,并提取了图像强度特征。
然后使用这些图像强度特征对深度进行编码和解码。下半部分是一个变分自动编码器结构(VAE),下采样通过改变卷积步长来实现,而上采样则使用双线性插值,自动编码器的瓶颈部分包括两个全连接层。然后计算平均值和方差,采用KL散度来优化这个VAE,最终输出四个等级的预测平均值μ和深度的不确定度b。
本文利用了一个类高斯的分布Laplace分布来计算网络训练的loss,为什么要用这个Laplace分布呢?因为他的尾部比高斯分布更重,可以看下图。
p
(
d
~
∣
μ
,
b
)
)
=
1
2
b
exp
(
−
∣
d
~
−
μ
∣
b
)
p(\tilde{d} | \mu, b))=\frac{1}{2 b} \exp \left(-\frac{|\tilde{d}-\mu|}{b}\right)
p(d~∣μ,b))=2b1exp(−b∣d~−μ∣)
对Laplace分布求一个对数,并取负,这里将常数忽略了。
− log ( p ( d ~ ∣ μ , b ) ) = ∣ d ~ − μ ∣ b + log ( b ) -\log (p(\tilde{d} | \mu, b))=\frac{|\tilde{d}-\mu|}{b}+\log (b) −log(p(d~∣μ,b))=b∣d~−μ∣+log(b)
论文将数据集的深度值转换为范围[0,1]。为此,采用了混合深度参数化,称之为接近度,如下式,给定一个平均深度值a,它将[0,a]中的深度映射到[0.5,1.0](类似于常规深度),并将[a,∞]的深度映射到[0,0.5](类似于逆深度)。
p = a d + a p=\frac{a}{d+a} p=d+aa
2、仿射变换
对于每一张图像
I
A
I_{A}
IA存在一个对应的代码
c
A
\boldsymbol{c}_{A}
cA,视角A和视角B间的变换关系为
w
(
u
,
c
A
,
T
A
B
)
=
π
(
R
A
B
π
−
1
(
u
,
D
A
[
u
]
)
+
B
t
A
B
)
w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right)=\pi\left(\boldsymbol{R}_{A}^{B} \pi^{-1}\left(\boldsymbol{u}, D_{A}[\boldsymbol{u}]\right)+_{B} \boldsymbol{t}_{A}^{B}\right)
w(u,cA,TAB)=π(RABπ−1(u,DA[u])+BtAB),可以参照下图进行理解,其中
π
\pi
π是投影,
π
−
1
\pi^{-1}
π−1是反投影,
R
A
B
\boldsymbol{R}_{A}^{B}
RAB可以理解为视角A转换为视角B的方向旋转矩阵,
B
t
A
B
_{B} \boldsymbol{t}_{A}^{B}
BtAB可以理解为视角A到视角B的位置平移矩阵。
对于的雅克比矩阵为
∂
I
B
[
v
]
∂
B
t
A
B
=
∂
I
B
[
v
]
∂
v
∂
π
(
x
)
∂
x
∂
I
B
[
v
]
∂
R
A
B
=
∂
I
B
[
v
]
∂
v
∂
π
(
x
)
∂
x
(
−
R
A
B
π
−
1
(
u
,
d
)
)
×
∂
I
B
[
v
]
∂
c
a
=
∂
I
B
[
v
]
∂
v
∂
π
(
x
)
∂
x
R
A
B
∂
π
−
1
(
u
,
d
)
∂
d
∂
D
A
[
u
]
∂
c
A
\begin{array}{l}{\frac{\partial I_{B}[\boldsymbol{v}]}{\partial_{B} \boldsymbol{t}_{A}^{B}}=\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{v}} \frac{\partial \pi(\boldsymbol{x})}{\partial \boldsymbol{x}}} \\ {\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{R}_{A}^{B}}=\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{v}} \frac{\partial \pi(\boldsymbol{x})}{\partial \boldsymbol{x}}\left(-\boldsymbol{R}_{A}^{B} \pi^{-1}(\boldsymbol{u}, d)\right)^{\times}} \\ {\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{c}_{a}}=\frac{\partial I_{B}[\boldsymbol{v}]}{\partial \boldsymbol{v}} \frac{\partial \pi(\boldsymbol{x})}{\partial \boldsymbol{x}} \boldsymbol{R}_{A}^{B} \frac{\partial \pi^{-1}(\boldsymbol{u}, d)}{\partial d} \frac{\partial D_{A}[\boldsymbol{u}]}{\partial \boldsymbol{c}_{A}}}\end{array}
∂BtAB∂IB[v]=∂v∂IB[v]∂x∂π(x)∂RAB∂IB[v]=∂v∂IB[v]∂x∂π(x)(−RABπ−1(u,d))×∂ca∂IB[v]=∂v∂IB[v]∂x∂π(x)RAB∂d∂π−1(u,d)∂cA∂DA[u]
其中
×
\times
×对应下列等式
v
=
w
(
u
,
c
A
,
T
A
B
)
x
=
R
A
B
π
−
1
(
u
,
D
A
[
u
]
)
+
B
t
A
B
d
=
D
(
I
A
,
c
A
)
[
u
]
\begin{aligned} \boldsymbol{v} &=w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right) \\ \boldsymbol{x} &=\boldsymbol{R}_{A}^{B} \pi^{-1}\left(\boldsymbol{u}, D_{A}[\boldsymbol{u}]\right)+_{B} \boldsymbol{t}_{A}^{B} \\ d &=D\left(I_{A}, \boldsymbol{c}_{A}\right)[\boldsymbol{u}] \end{aligned}
vxd=w(u,cA,TAB)=RABπ−1(u,DA[u])+BtAB=D(IA,cA)[u]
3、逐帧优化
每帧图像都有
I
i
I_{i}
Ii都有对应的编码
c
i
\boldsymbol{c}_{i}
ci和深度
D
i
D_{i}
Di,结合估计出的位姿
T
i
\boldsymbol{T}_{i}
Ti可以推导出光度误差和几何误差,如下面两个公式所示,通过高斯牛顿法来对其进行联合优化。
E
pho
=
L
p
(
I
A
[
u
]
−
I
B
[
w
(
u
,
c
A
,
T
A
B
)
]
)
E
geo
=
L
g
(
D
A
[
u
]
−
D
B
[
w
(
u
,
c
A
,
T
A
B
)
]
)
\begin{array}{l}{E_{\text {pho }}=L_{p}\left(I_{A}[\boldsymbol{u}]-I_{B}\left[w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right)\right]\right)} \\ {E_{\text {geo }}=L_{g}\left(D_{A}[\boldsymbol{u}]-D_{B}\left[w\left(\boldsymbol{u}, \boldsymbol{c}_{A}, \boldsymbol{T}_{A}^{B}\right)\right]\right)}\end{array}
Epho =Lp(IA[u]−IB[w(u,cA,TAB)])Egeo =Lg(DA[u]−DB[w(u,cA,TAB)])
- 图像A经过U-net,得到深度的不确定性和图像强度特征;,并初始化得到代码 c A \boldsymbol{c}_{A} cA ,得到一个非常模糊的深度图 D A \boldsymbol D_{A} DA,注意,图像A的不确定性、深度、代码 c A \boldsymbol{c}_{A} cA将结合下一帧B进行优化;
- 图像B进行同样操作,得到深度的不确定性和图像强度特征,并初始化代码 c B \boldsymbol{c}_{B} cB,得到一个非常模糊的深度图 D B \boldsymbol D_{B} DB,注意图B的不确定性、深度、代码 c B \boldsymbol{c}_{B} cB将结合下一帧C进行优化;
- 有了两张图片A,B的深度等信息, 先给定位置,利用图A的像素 u \boldsymbol{u} u在图B上找到对应的像素 v \boldsymbol{v} v,计算光度误差和几何误差。
- 根据光度误差和几何误差对代码 c A \boldsymbol{c}_{A} cA进行优化。
4、结果
结果图我就不放了,说实话,他这个结果图我是真的看不下去,就零代码重建和编码后的有明显的区别,编码后的与优化后的,恕本人眼拙,实在看不出来,你好歹给个数值吧,这我也能知道优化后有变化啊。
5、论文地址
本人对这篇文章只是浅薄的理解,想要更深层次的理解,请去看原文
CodeSLAM原文地址
有条件的人可以去Youtube上面看一下原视频,有助于理解该文
CodeSLAM视频