GCN-SLAM:基于神经网络提取的特征点和描述子的SLAM
简介
最近看了GCN-SLAM的论文,算是第一次接触到基于神经网络提取特征的视觉SLAM,所以赶紧记下自己对文章的一些理解。博客中只是记录下系统大致的工作方式和自己理解的网络训练的过程。
GCN-SLAM大致原理
GCN-SLAM中所使用的GCNv2网络是在作者之前提出的GCN(想要更深入地理解该系统,可以去查看对应的论文)的基础上,精简后的结果。GCNv2的结构如下图:
该网络通过卷积的方法,由原始灰度图获得低像素、多通道的概率图(Probability map)和特征图(Feature maps)。再通过上采样(Pixel shuffle)改变概率图的像素大小 (变得和原始灰度图像素大小一样,且单通道),并根据变化后的概率图中各点的概率值确定图中的特征点位置。最后以特征点位置为基础,通过 Feature maps 中的对应值和一个二值化网络层提取出每个特征点对应的二值化描述子。
由上述操作可知,GCNv2最终能够同时获得特征点和描述子。这和ORB-SLAM2中特征提取环节是一样的,因此GCNv2能够很好地移植到ORB-SLAM2中。整个GCN-SLAM系统的工作过程如下:
1、从相机中获得图像,并将其对应的灰度图送入到GCNv2网络中;
2、将GCNv2产生的特征点和描述子保存到系统中,用于系统的定位和跟踪;
3、与ORB-SLAM2不同的是,GCN-SLAM不采用恒速模型,仅使用特征点匹配的方式完成帧间跟踪定位;
4、后续的闭环啥的操作都采和ORB-SLAM2相似,但是由于更换了提取特征的方法,所以要重新构建合适的词袋数据。
GCNv2提取特征和描述子的训练
一些符号
1、
o
o
o:表示由GCNv2产生的概率图(Probability map)转换成与原始灰度图像像素大小相同的概率图;
2、
f
f
f:表示网络输出的 Feature maps;
3、
F
c
u
r
、
F
t
a
r
F_{cur}、F_{tar}
Fcur、Ftar:分别表示当前帧和目标帧。需要在这两帧间找出匹配特征点,并完成帧间位姿估计。
特征提取训练
转换后的概率图
o
o
o 中各点只在0、1取值,其中1表示该点是特征点,0则表示不是。作者设计了如下损失函数来训练网络提取特征点的性能:
其中
x
c
u
r
x^{cur}
xcur 表示特征点在当前帧
F
c
u
r
F_{cur}
Fcur 中的位置,
x
+
t
a
r
x^{tar}_{+}
x+tar 是
x
c
u
r
x^{cur}
xcur 在目标帧
F
t
a
r
F_{tar}
Ftar 中真实匹配点的位置。
o
c
u
r
o^{cur}
ocur、
o
t
a
r
o^{tar}
otar 分别是
F
c
u
r
F_{cur}
Fcur 、
F
t
a
r
F_{tar}
Ftar 对应的由GCNv2网络输出的概率图在
x
c
u
r
x^{cur}
xcur 、
x
+
t
a
r
x^{tar}_{+}
x+tar 像素位置上的点的值,
L
c
e
(
)
L_{ce}()
Lce() 是计算加权交叉熵(这部分不太懂(T _ T))
综上所述,要想使用 (4) 中损失函数训练网络,需要给网络提供真实的特征点位置和特点点匹配关系。作者的做法是:
先用 16X16 的小框对原图进行分割,以一个框为操作单位。先从框中提取
S
h
i
−
T
o
m
a
s
i
Shi-Tomasi
Shi−Tomasi 角点 (即
x
c
u
r
x^{cur}
xcur ),然后根据数据集提供的图像间的真实位姿,获得这些角点的真实匹配特征点 (即
x
+
t
a
r
x^{tar}_{+}
x+tar )。以此为样本数据,根据所给的损失函数来完成对网络的特征提取环节的训练。
(个人理解:网络的训练就是希望最终输出的概率图 o 中值为1的点的位置能够尽可能地和所提供的真实特征点的位置相符)
描述子的提取
先大致说下如何获得特征点的描述子。网络首先根据
o
o
o 图获得的特征点位置,然后再根据以下计算原则,计算特征点对应的 256 位二值化描述子 (描述子由256位数字组成,每位上的值为0或1):
如之前的
F
i
g
2
Fig2
Fig2 所示,Feature maps 的通道数量为256,刚好就能够获得256位二值描述子。
(反向求导那里并没有很懂(T _ T),但是我找到了这篇不错的文章)
上述计算过程在网络中是以一个 Binary activation layer (二值化层)实现的。添加这样一个二值化层的原因在于,作者发现这样比直接让网络输出 -1~+1 之间的数值效果更好(可能网络更好训练)。
如何训练计算描述子环节的网络
在计算描述子环节的网络训练中,作者使用了 Triplet Loss 损失函数,如下:
式中
m
m
m 是一个距离修正项,
d
(
.
)
d(.)
d(.) 表示计算两个描述子间的汉明距离。
x
c
u
r
x^{cur}
xcur、
x
+
t
a
r
x^{tar}_{+}
x+tar 是已知的两个正确匹配特征点的位置。(2) 式中
x
−
t
a
r
x^{tar}_{-}
x−tar 是关键, 它的获得方式如下:
该算法的输入输出分别是:
输入:当前特征点
x
c
u
r
x^{cur}
xcur 的描述子,
k
k
k 个匹配度 (与
x
c
u
r
x^{cur}
xcur描述子距离最近) 最高的特征点
x
k
x_{k}
xk 的位置以及它们的描述子,
x
c
u
r
x^{cur}
xcur 的真实匹配特征点
x
+
t
a
r
x^{tar}_{+}
x+tar ,阈值
c
c
c;
输出:找出与
x
+
t
a
r
x^{tar}_{+}
x+tar 在像素坐标上距离较大(大于
c
c
c)的特征点,记为
x
−
t
a
r
x^{tar}_{-}
x−tar ,并返回
x
−
t
a
r
x^{tar}_{-}
x−tar 的描述子。如果没找到符合条件的特征点则啥都不返回。
结合这个算法,我对 (2) 式损失函数和网络的训练过程的理解如下:
首先给网络提供这些已知数据:当前特征点
x
c
u
r
x^{cur}
xcur ,与
x
c
u
r
x^{cur}
xcur 真实匹配的特征点
x
+
t
a
r
x^{tar}_{+}
x+tar ,以及通过算法1 找出的距离
x
+
t
a
r
x^{tar}_{+}
x+tar 相对较远的
x
−
t
a
r
x^{tar}_{-}
x−tar (
x
−
t
a
r
x^{tar}_{-}
x−tar 是在与
x
c
u
r
x^{cur}
xcur 描述子最相近的一部分特征点中,由于与
x
+
t
a
r
x^{tar}_{+}
x+tar 距离超过阈值
c
c
c 时选出的)。
因为
x
−
t
a
r
x^{tar}_{-}
x−tar与
x
+
t
a
r
x^{tar}_{+}
x+tar 在像素坐标系上相距较远,所以
x
−
t
a
r
x^{tar}_{-}
x−tar 一定不能被选为
x
c
u
r
x^{cur}
xcur 的匹配点。又因为GCN-SLAM中特征匹配是根据描述子间距离实现的,所以为了避免误匹配,需要
x
c
u
r
x^{cur}
xcur 与
x
−
t
a
r
x^{tar}_{-}
x−tar 的描述子距离大一点,这样
x
−
t
a
r
x^{tar}_{-}
x−tar 就不会被选为匹配结果。取而代之的是,匹配算法会选择与
x
+
t
a
r
x^{tar}_{+}
x+tar 距离更近的特征点作为
x
c
u
r
x^{cur}
xcur 的匹配点。
这种做法的期望是:网络在计算特征点的描述子时,能够只让以
x
+
t
a
r
x^{tar}_{+}
x+tar 为中心,
c
c
c 为半径,这样一个小范围内的特征点与
x
c
u
r
x^{cur}
xcur 的描述子距离较近,而让此范围外的特征点与
x
c
u
r
x^{cur}
xcur 的描述子距离较远,从而在一定程度上保证匹配结果的偏差不会太大(即不让匹配特征点距离真实点太远,以免影响位姿估计精度)。
上述思想在公式中的体现就是,
L
f
e
a
t
L_{feat}
Lfeat 等于
m
a
x
max
max 函数中的值。如果
m
a
x
max
max 中第二项,
x
c
u
r
x^{cur}
xcur 与
x
−
t
a
r
x^{tar}_{-}
x−tar 描述子距离较远,则
m
a
x
max
max 会把 0 作为输出,此时网络训练误差最小;否则
m
a
x
max
max 会输出一个正的误差,网络需要继续训练。
个人理解在误差项中加上修正项
m
m
m 的原因是:
x
−
t
a
r
x^{tar}_{-}
x−tar 的描述子也是通过网络计算出来的,而网络以及图像都会存在一定误差和噪声。所以为了更加严格,让网络能更好区别开特征点间的描述子,这里加入了
m
m
m 来保证最终训练结果(即
x
c
u
r
x^{cur}
xcur 与
x
−
t
a
r
x^{tar}_{-}
x−tar 的描述子距离要足够大)。
个人理解设定阈值
c
c
c 的原因是:
x
c
u
r
x^{cur}
xcur 是由其他算法提取出来的
S
h
i
−
T
o
m
a
s
i
Shi-Tomasi
Shi−Tomasi 角点,
x
+
t
a
r
x^{tar}_{+}
x+tar 则是根据位姿真值获得的。由于不能保证其他算法百分百准确,且图片存在一定噪声,所以
x
+
t
a
r
x^{tar}_{+}
x+tar 不能百分百保证就是
x
c
u
r
x^{cur}
xcur 最好的匹配点(如何找最佳匹配点也是计算机视觉中的一大难题)。但有理由认为最好的匹配点应该就位于以
x
+
t
a
r
x^{tar}_{+}
x+tar 为中心的某个范围内,因此这里设定了阈值
c
c
c。所以对网络计算描述子的要求就是:在指定范围内特征点的描述子距离较近,且该范围内、外的特征点的描述子距离较远。以此帮助帮助匹配算法将匹配点锁定在适当的范围围内。
结尾
GCN-SLAM由于精简化了网络结构,计算量相比于作者先前发布的GCN网络有了很大降低,因此该系统能够运行在某些嵌入式设备上,且仍能够获得较好的精度。但是,该网络在训练时使用的样本数据,即真实特征点位置和真实特征匹配关系,是通过角点提取算法和位姿真值数据获得的。感觉这类样本特征点的稳定性不够高,可能会影响网络的稳定性。此外,真实的匹配关系是根据数据集所给的真实位姿获得的,所以训练样本中主要包含的还是位姿信息,即网络主要是以位姿信息为训练的依据。或许可以尝试加入其他高级信息,如语义啥的。但这也是为什么文中说 GCNv2 就是为了位姿估计而生的原因吧。