第11讲 回环检测

1、理解回环检测的必要性

2、掌握基于词袋的外观式回环检测

3、通过DBoW3的实验,学习词袋模型的实际用途

目录

1、概述

1.1 回环检测的意义

1.2 回环检测的方法

1.3 准确率和召回率

2、词袋模型

3、字典

3.1 字典的结构

4、相似度计算

4.1 理论部分

5、实验分析与评述

5.1 增加字典规模

5.2 相似性评分的处理

5.3 关键帧的处理

5.4 检测之后的验证

 5.5 与机器学习的关系

实践部分:代码编译踩坑


1、概述

1.1 回环检测的意义

  • 回环检测模块能够给出除了相邻帧的一些是个更加久远的约束。相机经过了同一个地方,采集了相似的数据。
  • 回环检测的关键,就是如何有效地检测出相机经过同一个地方这件事。
  • 回环检测的意义:
    • 关系到我们估计的轨迹和地图在长时间下的正确性。
    • 提供了与所有历史数据的关联,还可以利用回环检测进行重定位。

1.2 回环检测的方法

  • 回环检测方法
    • 基于里程计的几何关系
      • 假设了相机回到之前位置,才能检测回环。有倒果为因的嫌疑,无法在累积误差较大时工作。
    • 基于外观的几何关系(主流)
      • 与前端、后端的估计都无关,仅根据两幅图像的相似性确定回环检测关系。
      • 摆脱了累积误差,使回环检测模块相对独立。(当前前端可以为它提供特征点)
    • 工程角度
      • 配备GPS,提供全局位置信息
  • 如何计算图像间的相似性
    • 直接让两幅图像相减,再取某种范式不行?
      • 像素灰度不稳定,严重受环境光照和相机曝光影响。
      • 相机视角发生少量变换,即使光度不变,像素在图像中的位移,会造成很大差异。
      • 因此,直接相减取范式不能很好的反映图像间的相似关系。
    • 怎样的函数能够更好地反映相似关系?
      • 引出感知偏差(Perceptual Aliasing)和感知变异(Perceptual Variability)

1.3 准确率和召回率

  • 准确率描述的是算法提取的所有回环检测中确实是真实回环的概率
  •  Precision=TP/(TP+FP)
  • 召回率是指,在所有真正回环中被正确检测出来的概率
  • Recall=TP/(TP+FN)
  • Precision-Recall曲线。R横轴,P纵轴,我们关系整条曲线偏向右上方的程度、100%准确率下的召回率或者50%召回率时的准确率,作为评价指标
  • SLAM中对准确率要求更高,对召回率相对宽容。
  • 在选择回环检测算法时,我们倾向于把参数设置更严格,或在检测之后再加上回环检测的步骤。

2、词袋模型

  • 词袋(Bag-of-Words),目的是用“图像上有哪几种特征”来描述一幅图像。
    • 确定“人”“车”“狗”等特征概念——对应于BoW中的单词(Word),许多单词放在一起,促成了字典(Dictionary)。
    • 确定一幅图像中出现了哪些在字典中定义的概念——单词出现的情况(直方图)来描述整幅图像。这就把一幅图像转成了一个向量的描述。
    • 比较上一步中描述的相似程度。
  • 字典是固定的,类似于单词的一个集合。
  • 向量可以描述整幅图像。向量描述的是“是否出现”,而不管“在哪儿出现” 。因此在相机发生少量运动时,只要物体还在视野中出现,就仍然保证描述向量无变化。
  • 两个向量相似性:s(a,b)=1-\frac{1}{W}||a-b||_1

3、字典

3.1 字典的结构

  • 字典有很多单词组成,每个单词代表一个概念,与一个单独的特征点不同,它是某一类特征的组合。字典生成问题类似于一个聚类问题。
  • 假设对大量图像提取了特征点,例如有N个,现在想找一个有k个单词的字典,每个单词可以看做局部相邻特征点的集合,应该怎样做?
  • 经典K-means聚类算法可解决。
    • 随机选k个中心点:c1,...,ck
    • 对每个样本,计算它们与每个中心的距离,取最近的作为每个样本的归类
    • 重新计算每个类的中心点
    • 如果每个中心点都变化很小,则算法收敛,退出;否则返回第2步。
  • K-means有一些问题,例如需要指定聚类数量、随机选取中心点使得每次聚类结果都不同、效率问题。层次聚类法、K-means++可弥补不足。
  • 如何根据图像中某个特征点查找字典中相应的单词?
    • 跟每个单词对比,O(n)
    • 对字典排序,二分查找:log(n)
    • 细节复杂但效率较高:Fabmap中的Chou-Liu tree。
    • 简单实用的:k叉树,类似于层次聚类。有N个特征点,希望构建一个深度为d、每次分叉为k的树。对数级别查找效率。
      • 根结点,用K-means把所有样本聚成k类,得到第一层
      • 对第一层的每个节点,把属于该节点的样本再聚成k类,得到下一层
      • 依次类推,最后得到叶子层。叶子层即Words。
    •  k叉树,在查询某个给定特征对应的单词时,只需将它与每个中间结点的聚类中心比较(一共d次),即可找到最后单词。

4、相似度计算

4.1 理论部分

  • TF-IDF(Term Frequency-Inverse Document Frequency),译频率-逆文档频率,是文本检索中常用的一种加权方式,也由于BoW模型中。
    • TF思想:某单词在一幅图像中经常出现,它的区分度就高
    • IDF思想:某单词在字典中出现频率越低,分类图像时区分度越高
  • 建立字典时计算IDF:统计某个叶子结点w_i中的特征数量n_i相对于所有特征数量n的比例,作为IDF部分。 该单词(叶子结点)的IDF:{IDF}_i=log\frac{n}{n_i}
  • TF是指某个特征在单幅图像中出现的频率。假设图像A中单词w_i出现了n_i次,而一共出现的单词次数为n,TF:TF_i=\frac{n_i}{n}
  • w_i的权重为:\eta _i=TF_i\times IDF_i
  • 对于图像A,它的特征点可对应到许多单词,组成它的BoW:A=\{(w_i,\eta _1),...(w_N,\eta _N)\}=v_A
  • v_A会存在大量0,是一个稀疏向量,非零部分指示了图像A中含有哪些单词,而这些部分的值为TF_IDF值。
  • 如何计算v_A,v_B的差异。其中一种:s(v_A-v_B)=2\sum_{i=1}^{N}|v_{Ai}|+|v_{Bi}|-|v_{Ai}-v_{Bi}|

5、实验分析与评述

5.1 增加字典规模

  • 增加字典规模,无关图像的相似性明显变小,而相似的图像,虽然分值略微下降,但相对其他评分更显著。

5.2 相似性评分的处理

  • 只利用两幅图像的相似相评分分值的绝对大小不一定有很好的效果,有些环境的外观本来就很相似,另一些环境可能各个地方都有很大不同。
  • 因此,取一个先验相似度s(v_t,v_{t-\Delta t}),表示某时刻关键帧图像与上一时刻的关键帧的相似性。其他分值都参照这个值进行归一化:s(v_t,v_{t_j})'=s(v_t,v_{t_j})/s(v_t,v_{t-\Delta t})
  • 如果当前帧与之前某关键帧的相似度超过当前帧与上一关键帧相似度的3被,认为可能存在回环。避免引入绝对的相似度阈值,算法可以适应更多环境。

5.3 关键帧的处理

  • 实践上,用于回环检测的帧最好稀疏一些,彼此之间不太相同,又涵盖整个环境。
  • 会把“相近”的回环聚成一类,使算法不要反复地检测同一类的回环。

5.4 检测之后的验证

  • 一种是建立回环的缓存机制,认为单次检测到的回环并不足以构成良好的约束,而在一段时间中一直检测到的回环,才是正确的回环。可以看成是时间上的一致性检测。
  • 另一种是空间上的检测,即对回环检测到的两帧进行特征匹配,估计相机运动。然后把运动放到之前的位姿图中,检查与之前的估计是否有很大出入。

 5.5 与机器学习的关系

  • 词袋模型本身是一个非监督的机器学习过程——构建词典相当于对特征描述子进行聚类,而树只是对所聚的类的一个快速查找的数据结构。
  • 相信,未来深度学习方法很有希望大白这些传统机器学习方法。例如BoW模型的改进形式VLAD就有基于CNN的实现。

实践部分:代码编译踩坑

视觉SLAM十四讲 报错 No rule to make target ‘/usr/local/lib/libDBoW3.a‘, needed by ‘gen_vocab‘._no rule to make target lib.a needed by-CSDN博客

实际运行代码,相似度计算部分的结果与书中不同,未知原因。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值