什么是回环检测?前端
在讲解回环检测前,咱们先来了解下回环的概念。在视觉SLAM问题中,位姿的估计每每是一个递推的过程,即由上一帧位姿解算当前帧位姿,所以其中的偏差便这样一帧一帧的传递下去,也就是咱们所说的累计偏差。数据库
咱们的位姿约束都是与上一帧创建的,第五帧的位姿偏差中便已经积累了前面四个约束中的偏差。但若是咱们发现第五帧位姿不必定要由第四帧推出来,还能够由第二帧推算出来,显然这样计算偏差会小不少,由于只存在两个约束的偏差了。像这样与以前的某一帧创建位姿约束关系就叫作回环。回环经过减小约束数,起到了减少累计偏差的做用。后端
那么咱们怎么知道能够由第二帧推算第五帧位姿呢?也许第一帧、第三帧也能够呢。确实,咱们之因此用前一帧递推下一帧位姿,由于这两帧足够近,确定能够创建两帧的约束,可是距离较远的两帧就不必定能够创建这样的约束关系了。找出能够创建这种位姿约束的历史帧,就是回环检测。优化
回环检测的意义spa
有了前端的视觉里程计及后端优化的SLAM系统,彷佛已经比较好用了。但其在提升实时性的同时精度却下降了,一旦精度下降,又会面临长时间累计偏差的问题,特别是像ORB-SLAM那样只作局部地图优化的方案。咱们该如何平衡这个矛盾呢?图片
咱们不妨先思考下,在一个陌生的环境中,咱们人类是如何进行环境地图的创建?在局部区域,人不断的移动从而在脑海中建造增量式地图,时间长了大部分人也分不清东南西北了,与起始点的关系又如何。假如人正巧回到了以前路过的位置,在对环境足够敏感的状况下,他就能发现这个事实,从而修正本身以前对方位的判断。咱们说,此时检测到了一个回环,显然,人能够经过面前看到的景象与脑海中残缺的印象来对比从而检测到回环的,对于SLAM来讲也能够经过对比当前帧与过去关键帧的类似度,如类似度超过某一阀值时就能够被认为是检测到回环。it
如今,问题的关键就在于如何判断两帧图片的类似度。最直观的作法是特征匹配,比较匹配的数量是否足够多。但因为特征匹配很是耗时,回环检测须要与过去全部关键帧匹配,这个运算量是绝对没法承受的。所以,有人提出了词袋模型,用来加速特征匹配。class
什么是词袋模型?
词袋模型就是把特征当作是一个个单词,经过比较两张图片中单词的一致性,来判断两张图片是否属于同一场景。
为了可以把特征归类为单词,咱们须要训练一个字典。所谓的字典就是包含了全部可能的单词的集合,为了提升通用性,须要使用海量的数据训练。
字典的训练实际上是一个聚类的过程。假设全部图片中共提取了10,000,000个特征,可使用K-means方法把它们聚成100,000个单词。可是,若是只是用这100,000个单词来匹配的话效率仍是过低,由于每一个特征须要比较100,000次才能找到本身对应的单词。为了提升效率,字典在训练的过程当中构建了一个k个分支,深度为d的树,以下图所示。直观上看,上层结点提供了粗分类,下层结点提供了细分类,直到叶子结点。利用这个树,就能够将时间复杂度下降到对数级别,大大加速了特征匹配。效率
使用DBoW3库训练及使用词典方法
DBoW3库为咱们提供了很是方便的训练词典和使用词典的方法。
训练词典时,只须要把全部训练用的图片的描述符传给DBoW3::Vocabulary的create方法就能够了。训练好的词袋模型保存在vocabulary.yml.gz文件中。接下来,使用训练好的词袋模型对图片计算类似性评分。DBoW3为咱们提供了两种计算类似性的方式,第一种是直接对两张图片比较;第二种是把图片集构形成一个数据库,再与另外一张图片比较。
005QQQghzy7oCR8cSOZ31&690能够看出,图片越类似,评分越接近1。咱们能够根据这个评分来判断两张图片是不是同一场景。可是直接给定一个绝对的阈值并不合适。一般,若是当前帧与以前某帧的类似度超过当前帧与上一个关键帧类似度的3倍,就认为可能存在回环。不过,这种作法要求关键帧之间的类似性不能过高,不然没法检测出回环。