1. 概述

本篇文章和大家一起讨论SuperPoint系列文章的第三篇,也就是真正提出SuperPoint的一篇文章。

论文地址:arxiv.org/pdf/1712.0762

开源代码地址:github.com/MagicLeapRes

SuperPoint是作者经过前面两篇文章的工作,经过总结和改进得来的,方向上都是通过深度学习网络提取特征,但是思想上发生了很大转变,就是不再端到端学习位姿了,而只学习特征点和描述子。作者在这篇文章中开源了他的代码,说明他自己对这篇文章的工作还是比较自信的,能够经得起检验的。

目前深度学习在SLAM的应用中,有明显对立的两派,一派主张学习特征和描述子,另一派主张直接端到端学习位姿。关于这一点,我是赞同前者的,我个人认为有明确数学模型的地方还是应该以模型为主,利用特征点的投影计算位姿,这是有很明确的几何关系的,何必再用深度学习这种不可解释性的方法取而代之呢。我认为深度学习在这方面最好的应用方式就是提取特征,这是它的强项,也是传统方法的弱项,因为传统方法提取的特征在稳定性和长时间重定位方面都不尽如人意。通过分析SuperPoint的作者这连续三篇文章中思想的转变,也能够体会到这一点,算是一个间接的证明。

好了,言归正传,我们先介绍下SuperPoint的整体思路。

本文一共设计了两个网络,一个是BaseDetector,用于检测角点(注意,此处提取的并不是最终输出的特征点,可以理解为候选的特征点),另一个是SuperPoint网络,输出特征点和描述子。

网络的训练共分为三个步骤:

1)第一步是采用虚拟的三维物体作为数据集,训练网络去提取角点

2)使用真实场景图片,用第一步训练出来的网络提取角点,这一步称作兴趣点自标注(Interest Point Self-Labeling)

3)对第二步使用的图片进行几何变换得到新的图片,这样就有了已知位姿关系的图片对,把这两张图片输入网络,提取特征点和描述子。

下面对算法流程进行详细介绍

2. 算法流程

2.1 网络结构

上面提到网络分为BaseDetector网络和SuperPoint网络。BaseDetector网络就是上一篇文章中提到的 MagicPoint网络,用于在虚拟物体产生的图片中提取角点。

SuperPoint网络是作者在本篇文章中提出的,所以给了较为详细的介绍,网络的结构如下图

网络共分为四部分,下面分别介绍

1)编码网络

从上面的SuperPoint网络的图片我们可以看出,这本质上就是两个网络,只不过在前半部分有一些相同的结构,所以把这些相同的结构提取出来共用,合并之后就看起来像是一个网络了。这个共用的网络就是编码网络,作者选用的是一个类似于VGG的网络结构,它的作用是是对图片降维,提取特征,以减小后续网络的计算量。这部分的结构就不详细介绍了,感兴趣的可以看论文。

2)特征点检测网络

此处的网络实际就是一个解码器,上面有编码,此处自然就需要解码。作用就是对图片的每个像素都计算一个概率,这个概率表示的就是其为特征点的可能性大小。对于一般的解码操作运算量过大的问题,作者也提出了采用子像素卷积(sub-pixel convolution)的方法降低计算量,对这个东西感兴趣的,此处提供些资料供参考

3)描述子检测网络

同样的,此处也是一个解码器。先学习半稠密的描述子(不使用稠密的方式是为了减少计算量和内存),然后进行双三次插值算法(bicubic interpolation)得到完整描述子,最后再使用L2标准化(L2-normalizes)得到单位长度的描述。

4)损失函数

网络分为两个分支,损失函数自然也就分为两个分支。不过为了统一进行训练,作者把两个分支的损失函数加和作为最终的损失函数来用。最终的损失函数为

其中 [公式] 是特征点的损失函数, [公式] 是描述子的损失函数,那个系数 [公式] 只是为了平衡他俩的权重,这个公式每一项代表啥意思,大家看论文把,不贴了,太长了……

2.2 网络训练

概述中已经提到,网络训练共分为是哪个步骤

1)第一步是采用虚拟的三维物体作为数据集,训练网络去提取角点

这里使用的就是网络Base Detector,也就是上面提到的MagicPoint,虚拟结构的角点是已知的,所以可以直接作为标注的数据集去训练网络提取角点的能力。

2)使用真实场景图片,用第一步训练出来的网络提取角点,这一步称作兴趣点自标注(Interest Point Self-Labeling)

作者使用的数据集是MS-COCO,为了使网络的泛化能力更强,在这一步,作者不仅使用原始了原始图片,而且对每张图片进行随机的旋转和缩放形成新的图片,新的图片也被用来进行识别。这一步其实就类似于目标检测的训练里常用的数据增强。

3)对第二步使用的图片进行几何变换得到新的图片,这样就有了已知位姿关系的图片对,把这两张图片输入网络,提取特征点和描述子。这一步就是以姿态误差构建损失函数,损失函数的具体内容在网络结构那一节已经讲述了。在此多说一点,就是为了使提取的特征点能够更适合于进行位姿解算(也就是稳定性和精度更好),往往在设计网络时都会用位姿的误差去构建损失函数,这就是想要得到啥,就以啥为直接目标进行训练的意思。之前解读的GCN网络就是采用了这种方法。

3. 实验结果

作者提供了两张表格说明实验结果,这种表格总之就是讲自己的指标比别人好,没啥可讲的

为了更直观显示对比结果,作者提供了几组图片,图片中显示的是几对图片中检测到的特征点对及其连线,总之就是说它提的特征点又多又准、分散性又好。

4. 总结

本文是SuperPoint系列文章的最后一篇,作者提出的深度学习网络可以提取特征点和描述子,而且,由于以位姿计算损失函数,所以提出的特征点和描述子在位姿解算方面更有优势。为了提高泛化能力,作者在训练时,还对图片进行了随机的缩放和旋转,以进行数据增强。