1. 概述

上一篇文章我们一起学习了GCN网络,它的作用是提取特征点和描述子,用于匹配得到位姿。本次我们一起学习它的改进版GCNv2,改进版在速度上大幅度提升,精度上和原网络性能相当。并且改进版所提取的特征点具有和ORB一样的格式,因此作者把它在ORB-SLAM中替换掉了ORB特征,也就是GCN-SLAM。

论文链接:arxiv.org/abs/1902.1104

代码链接:github.com/jiexiong2016

这里发现了一个有趣的事情,就在我写这篇文章的前一天(2019.06.05),作者在github上建了一个Repository(链接:github.com/jiexiong2016),但是只有一个readme,里面只有一句话,看来这哥们也给自己挖了一个大坑啊,接下来我们就一起期待这个坑填完是个什么效果。

2. 主要思路

鉴于GCN网络的运算量比较大,不适合用在实时SLAM系统中,因此作者对网络进行了改进。首先,把原来用于提取特征的卷积网络ResNet-50换成了SuperPoint网络,并对网络做了裁剪,然后把原来的循环神经网络给去掉了,这两步就可以大幅度提升效率。同时,为了保持精度不明显下降,把GCN网络中的优点保留了下来,其中最重要的一项就是使用了已知ground-truth的度量学习。

3. 算法流程

特征提取流程图(与ORB对比)

本篇文章的算法目的是特征提取,因此算法的设计流程也就是网络模型的设计流程。大体也是分为特征提取和基于ground-truth的度量学习两步。

3.1 特征提取

GCNv2的特征提取部分是从SuperPoint的方法借鉴过来的,做了一些小的改动,原文对这部分内容的介绍只有一小段话。

Inspired by SuperPoint, which uses a simple structure to perform detection using a single frame, we deploy a network with even fewer parameters and working on a lower scale than SuperPoint. Intuitively, the network performs an individual prediction for each grid cell of size 16×16 pixels in the original image. In GCNv2 all the pooling layers are replaced by convolutions with kernel size 4×4, stride 2 and padding 1.

意思就是,删除了一些不必要的参数,并且采用了更低的尺度。池化层被卷基层代替,卷积核大小为4X4,步长为2,填充为1。

SuperPoint的详细内容不是本文的重点,所以此处列出一些参考资料,有兴趣的可以去看:

论文:arxiv.org/pdf/1712.0762

解读:blog.csdn.net/prephet/a

与之前GCN不同的是,此处为了和ORB-SLAM对接,特征的描述要以二进制形式进行,因此需要在网络中把输出做一次转换。思路也很简单,就是在最终的输出层的前面加上一个公式,强行转成二进制。

我们知道,神经网络中,前向传播都要有对应的反向传播,用以在训练时使用。当我们添加了上面的式子后,就要给出它的反向传播公式

其中 [公式] 是度量学习中的损失函数。

3.2 度量学习

度量学习在此处的作用和具体细节,上一篇文章中已经有所介绍,而且3.1中所使用的损失函数中[公式] 就是从此处得到的,具体公式如下:

不过,跟之前GCN不同的是,之前的距离是两个特征点在图片中所处的坐标值的欧式具体,而此处是特征点二进制描述之间的汉明距离。与之前一样,为了求得 [公式] ,需要找到正样本和负样本,正样本通过ground-truth计算得到,公式为:

其实就是刚体的旋转和平移变换。负样本的选取和GCN略有不同,GCN是选取所有特征点中除了正样本以外,离正样本最近的点,而此处是按照下面的流程选取的负样本

仔细看会发现,变化在于多个一个Relaxed Criteria用于帮助选择,只有负样本和正样本之间的距离大于这个值时才会被选中,至于为什么这么做,原文给出了解释。

The relaxed criteria is used to increase the tolerance to potentially noisy data.

意思是这样可以减小噪声的影响。至于为啥这样做就能起到这个作用,很抱歉,我也没想明白。

4. 实验结果

在文章中,作者首先把GCN、ORB、SIFT、SURF的结果做了对比,这是直接使用的GCN的论文中的结果,一个数字都没有变,结论就是GCN精度最高,稳定性最好。同时,在表格中增加了本次文章中重点讨论的GCNv2的结果,由于GCNv2是从SuperPoint改进而来,所以也提供了SuperPoint的结果。结果证明直接使用SuperPoint效果不好,但是使用GCNv2效果就改善了很多,和之前的GCN效果相当,还略有改善。最后,作者在GCNv2的基础上,对网络进行简化,得到了GCNv2-tiny,效率更高,但结果稍差,对网络进行扩展,得到了GCNv2-large,结论是效率变差,但是精度和稳定性变好。

5. 结论

作者在GCN的基础上对特征点提取网络进行了改进,把特征提取部分完全替换成了改进后的SuperPoint,但保留了度量学习的部分,因为从理论上这一部分是整个算法的核心,也是性能上能够超越其他算法的关键。最终实验表明,基于GCNv2的GCN-SLAM比其他传统提取特征点的方式和其他基于深度学习提取特征点的方式精度都要好,而且稳定性更高。

==============================================================

本篇文章有对应的开源代码,本专栏对于有开源代码的工作都会单独写一篇代码的解读和代码实测的效果分析,但是并不一定会在文章解读之后就立即进行,要看个人时间,所以下一篇可能会介绍一篇别的文章,开源代码的测试需要等一段时间。