词袋模型(BoW)在视觉SLAM中的应用

SLAM技术简介

SLAM技术是指即时定位与地图构建,意思是说,当我们把机器人放在一个未知的环境中时,机器人能通过附近的环境对自身进行定位,并绘制出附近环境的地图,当然这个地图不是说我们常常看的那种地图,而是一些能够被机器人用来定位的数据点,我们也把它们叫做点云 右边这个图是视觉SLAM的一个主流框架,其中在前端视觉里程计这部分,就是利用前后两帧图片去推断出相机的运动,进而估计出机器人的运动轨迹;后端优化就是对这些运动轨迹甚至是点云的位置进行优化,使对他们的估计更加合理,误差更小;构图就是将观测到的环境信息用某种数据结构保存下来的过程;今天要介绍的重点是这个回环检测。

词袋模型(BoW)在视觉SLAM中的应用

回环检测

词袋模型(BoW)在视觉SLAM中的应用

像上面提到的,视觉里程计是通过前后两帧的图像估计出相机的运动。那么问题在于,这种估计是存在一定误差的,如果一直按照前后两帧前后两帧的方式去递推估计的话,难免会产生误差的积累,最后导致我们估计的机器人运动轨迹与实际的运动轨迹相差过大(如图),我们称之为漂移现象 。

回环检测就是为了解决这个问题而被提出来的,它的思想在于,如果机器人能认出他曾经到达过的位置,那么我们就能直接跟那个地方的图像作比较,直接估计出现在的机器人位姿状态,就可以把前面累积的误差修正过来。 

那么问题就变成,我们怎么让机器人知道自己回到了某个去过的位置呢,或者说,我们怎么去判断两张图片是不是相似的呢?

词袋模型(Bag of Words)

词袋模型(BoW)在视觉SLAM中的应用

SLAM中的解决方案是引入了词袋模型。词袋模型最初是被用在信息检索领域的,它最初是被用于在计算机上表示一些文本。它的原理是这样的,当我们拿到一些文本时,首先统计这些文本中有哪些单词,这些单词的集合被称为词典。然后,对每个文本中的各个单词进行统计,这样统计出来结果就会是一个对应的向量,这个向量就是这个文本的单词向量。如果我们通过某种准则比如汉明距离或L1范数等,对各个文本的单词向量进行比较的话我们就可以知道不同文本之间的相似度。

如果我们把图片看作是这里的文本,那么在每张图片中,一些比较相似的特征点集合就可以被看作是单词。那么我们就可以利用词袋模型去衡量图片之间的相似度了。 现在问题在于,我们怎么去构建一个视觉特征的词典呢?

词袋模型:如何构造词典?

词袋模型(BoW)在视觉SLAM中的应用

这里介绍一种图像的特征,这种特征被称为ORB特征,它由FASET角点和BRIEF描述子组成。FAST角点是指一些与周边像素相差较大的点,而BRIEF描述子就是描述这些角点的一个二进制编码,这里是一个256位的编码。

如果,我们对一张图片中的BRIEF描述子用某种依据进行分类的话,我们就可以得到若干个BRIEF描述子的种类,这些种类就是词典中的单词。

词袋模型(BoW)在视觉SLAM中的应用

构造一个视觉特征词典分成这如下几步: 第一,我先计算训练集中所有图片的BRIEF描述子, 第二,对这些BRIEF描述子进行汇总,然后以汉明距离作为分类依据,作分层K-Means聚类,如图所示,就是迭代地对K-Means聚类的结果再进行聚类,直至将这些BRIEF描述子分成足够多的类数。这样一来,我就把所有的描述子分成若干个类,这些类就是词典中的单词。 我会把上面聚类的结果用K叉树保存。 最后,为每一个单词计算一个IDF权重,这个IDF权重的意义是,在数据集中出现得越少的单词,其可辨认度就越高。

词袋模型(BoW)在视觉SLAM中的应用

当词典被构建好之后,我们就可以计算两张图片之间的相似度了。 相似度是这么来算的: 首先,计算一张图片的BRIEF描述子,然后对每个描述子,根据刚才构造的词典,找到它所述的单词。 这里由于我用K叉树保存了词典,所以我只需与每层的聚类质心比较,就能很快找出单词种类。 然后,这里算一下一个tf权重,这个权重是说,如果某个单词在一张图片中出现的次数越多,就证明这个单词越能代表这张图片。 最后,将tf和idf这两个权重相乘就得到某个单词的总权重了,对所有单词计算这个总权重,就能得到前面提到的单词向量。 相似度就是用两张图片的单词向量的L1范数或者余弦相似度去衡量的。 在回环检测中,如果新来的图像的单词向量与数据集中某张图片的相似度最高并且超过了一定阈值,那么就认为,机器人回到了之前到达过的位置。

实现&测试

词袋模型(BoW)在视觉SLAM中的应用

这里需要提一下的是,在SLAM问题中只会在图片序列中挑选出若干帧的关键帧,所以这里的训练集只是这些关键帧,数量不会很多,这里我挑选出了整个数据集中差异较大的八张图片作为数据集

词袋模型(BoW)在视觉SLAM中的应用