对于单目SLAM系统使用监督和无监督深度神经网络的回环检测

Loop closure detection using supervised and unsupervised deep neural networks for monocular SLAM systems

关键字:回环检测、视觉SLAM、词袋、超级字典



一、摘要和总结

检测出正确的回环在视觉SLAM中是至关重要的,它能够帮助重定位、提高地图的精度、帮助配准算法获得更精准和一致的结果。但是回环检测的结果会被多种因素所影响:

  • 光照条件
  • 季节变化
  • 不同视角
  • 移动物体

这篇文章提出了一个新颖的方法,它基于和传统词袋(BoW)字典不同的超级字典,使用来自深度学习的更高级且更抽象的特征,并且不需要产生词汇。这使其具有记忆效率,相反,它存储了精确的特征,与传统的词袋(BoW)方法相比,词袋(BoW)方法中的每一帧存储的记忆量与词汇中的单词数量相同,而本文的方法的数量较少,存储的内存量也非常少。两个深度神经网络被一起用来提升回环检测的速度,并且忽视在回环检测中动态物体的影响。

题目中提到的监督无监督的方法分别体现在:

  • 监督学习技术用来帮助避免移动物体从而降低错误联系的风险(使用VGG构建分类器部分内容)
  • 无监督学习技术用来检测回环的可能性来使它更快的处理帧(自编码器部分内容)

关于自编码器以及超级字典的使用都是提升系统速度并且避免不必要的先前帧的扫描(检索)。


存在的问题

对于之前提到的对回环检测能够产生影响的几个因素,可以通过深度学习方法在一定程度上去避免,但是有一些问题我们仍然不能回避:

  1. 现在的使用词袋的方法每次都要查询完整的词袋字典,效率低
  2. 后续的改进可能造成没有匹配到正确的环的风险

方法的优势

  1. 提升了回环检测的速度,这个体现在检索的时候可以不用每次都检索完全的词袋字典
  2. 可以减少没有匹配到正确的环的风险

二、具体的方法

1、移动物体检测和特征提取层

首先原始的图像帧会被分成一个个的小块(patch),然后这些小块会被一个接着一个的输入到移动物体识别层,不同小块中所包含的信息有的有用有的则没有用,比如某个小块中存在移动的物体(如行人汽车,即使他们没有在移动,但是他们也是可以移动的物体,这个是作者想要强调的概念),那么这个小块则是对后续的回环检测没有用的块,就会被忽略,我们通过移动物体检测层将输入的小块进行分类,提取出没有移动物体的小块的深度特征用于后续的处理。所提出的方法使用并行线程(标记为虚线矩形)来加快循环闭合检测,块是通过移动一个从左上到右下的滑动窗口来获取的。

使用深度学习特征和超级字典的回环检测框架

  • 深度卷积神经网络分类器
    这个分类器是基于VGG16架构,使用5个卷积层,4个最大池化层和2个全连接层,如下图所示
    分类器结构
    数据集包含两个类,一个包含移动物体,一个是没有任何移动物体的室外环境块,输入到分类器的是一个块(patch),目的是去检测出移动物体并且忽视包含移动物体的块。包含移动物体的块如下图中上面一行的图像所示。
    数据集分类

  • 深度特征
    这个特征是从深度卷积神经网络分类器的倒数第二个全连接层中提取到的,不包含移动物体的深度特征会被保留,相反则会被忽视。

2、特征存储

对于每个图像帧的所有块(patch)并不是都进行存储,这里只会存储没有移动物体的块(patch)的特征,一个块会产生128*1维的特征,若一共有j个块满足没有移动物体的要求,那么最后这一帧图像会形成128*j维的特征。

3、超级字典

  • 超级字典和词袋之间的组成关系
    理想的过程是对于每一个新的图像帧都去检查词袋字典,但是这会导致这个过程变得很缓慢,特别是轨迹变得很长以后,一些其他的方法要么是检查在词袋中的随机帧,要么就是每10帧检查一次来提升回环检测的速度,但是对于长轨迹缓慢的问题还是没有得到解决,同时因为没有考虑到所有帧,就会存在错过正确回环的风险。
    而这篇文章提出的超级字典的方法便能够克服上述的问题,其实我认为所谓的超级字典的概念就是和哈希表的原理差不多,相当于在原始的词袋字典的基础上建立了一级索引,只不过这一级索引只保留原始的词袋字典中的几帧,当新的图像帧与这一级(超级字典)中的图像帧的相似度没有达到阈值要求,就不会检查词袋字典,这样便会提升回环检测的速度;如果新的图像帧在这一级中存在满足阈值要求的对应帧,那么找到这个帧的前后两帧,这样就会对应到完整的词袋字典中的一段序列,然后在此基础上进行二次检查来找到回环的最佳匹配,这样可以有效的缩短检查词袋字典的序列长度,从而提升了回环检测的速度,示意图如下所示。
    字典之间的关系图
    对于超级字典和词袋字典的工作流程如下图所示
    判断流程图
  • 超级字典的组成
    对于超级字典中的关键帧选择,通常第一帧总是会加入到字典中,这样第二帧就会作为之后帧的参考帧,每一个即将到来的帧都会与参考帧进行匹配,当参考帧和当前帧的相似度低于一个阈值,这一帧就会考虑作为关键帧并加入到超级字典中,然后它的下一帧就会被作为新的参考帧,来应对即将到来的帧,以此类推,如下图所示。

超级字典的关键帧选择

4、新颖的检测层

这一部分采用一个无监督的自编码器来构建检测层,这个自编码器由三个隐藏的Sigmoid层,一个输出Sigmoid层组成,如下图所示
自编码器的结构图
自编码器接收维度是128*j的特征输入,并且基于MSE(mean square error)计算重建损失,通过多种实验的测试,最后采用Adadelta优化器的效果是最好的,可以使用较少的epoch,函数收敛也更快。
在这里使用自编码器的目的是:检测出这个场景是否已经被观测过,如果这个场景已经被观测过,那么重建的损失就会小于一个阈值,相反则会高于这个阈值。当自编码器尝试去重建序列中的剩余图像的时候,它只会在第一帧被训练,因为一个序列当中临近的帧有很多的相似性,如下图所示
相邻帧图片
53帧之后才会有很大的不同,然而,场景被观测过不代表就是检测到了回环,很多场景都会有相似性,所以相似度函数会在之后被用于在超级字典和词袋字典中检查之前观测到的场景来获得最佳的匹配。

5、相似度检测器

相似度的计算其实是很简单的:前期的工作会把一个图分成多个块(patch),然后每个块都会通过分类器的全连接层(dense layer)得到一个128*1维的向量,j个没有移动物体的块(patch),最后组成了一个128*j的向量。通过下面的伪代码我们也可以看出来其实就是循环累加两个图之间的多个128*1维向量之间的余弦相似度,然后进行归一化。
相似度计算的伪代码

6、相关阈值

文章中有两个阈值函数(系数):一个关于自编码器一个关于相似度计算
自编码器:这个阈值是一个可训练的阈值,在训练过程中是一直更新的
相似度计算:这个阈值函数是一个固定的值为0.6,如果调高这个阈值设定,就会导致超字典中的关键帧数量上升,处理时间也会上升,而调低这个阈值设定,则会影响整体的性能


三、几个疑问

  1. 个人认为把移动物体完全的忽视掉也许并不是一个很好的选择,因为可能在很长的一段时间内,在某一个位置的汽车是始终静止的,这样我们在受到一些其他因素影响时,这部分忽视的数据可能就会对匹配产生利好的影响。
  2. 虽然深度学习方法在一定程度上可以减轻以前的低级特征对性能的影响,但是回环部分的假阳性、假阴性等的问题好像在文中并没有怎么提到。

小结

以上是关于这篇论文方法部分的基本介绍,可能有遗漏的部分或者是没有理解对的地方,欢迎大家及时指正。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值