SLAM学习心得——回环检测

1.回环检测

首先,在视觉SLAM问题中,位姿的估计是一个递推的过程,也就是由上一帧位姿解算当前帧位姿,所以我们的位姿约束都是与上一帧建立的,但是每一次估计位姿都有误差,随着位姿递推的进行,误差也在不断的累计位姿,也就形成了我们所说的累计误差,这样将会导致长期估计的结果不可靠,或者说,我们无法构建全局一致的轨迹和地图。

如图(《视觉SLAM十四讲》)当我们只进行VO时,我们最终得到的运动轨迹无法避免的出现了漂移现象,得到了一条错误的轨迹,这显然是我们无法接受的。而回环检测就是针对这一问题而出现的。

回环检测的关键,就是如何有效地检测出相机经过同一个地方这件事。这将使得我们长时间估计位姿时误差得以减小。如果我们能 够成功地检测这件事,就可以为后端的 Pose Graph 提供更多的有效数据,使之得到更好的估计,特别是得到一个全局一致(Global Consistent)的估计。并且回环检测提供了当前数据与所有历史数据的关联,在跟踪算法丢失后,我们还可以利用重定位

回环检测的方法(如何检测回环是否发生)

(1)最简单的方法:对任意两个关键帧进行特征匹配

(2)基于里程计的方法

(3)基于外观的方法

这里我们重点介绍基于外观的方法,因为相较其他两种方法,基于外观的方法优点更加突出,更被人普遍接受,是目前回环检测中的主流方法。

基于外观的方法,它和前端、后端的估计都无关,仅根据俩副图像的相似性确定回环检测关系,这种做法摆脱了积累误差,使回环检测模块成为SLAM一个相对独立的模块。

首先,在这里,需要明确的一点是我们不能采用让两个图像直接相减,然后取某种范数。因为像素灰度是一种不稳定的测量值,它严重受环境光照和相机曝光的影响。假设相机未动,我们打开了一支电灯,那么图像会整体变亮一些。这样,即使对于同样的数据,我们都会得到一个很大的差异值。 另一方面,当相机视角发生少量变化时,即使每个物体的光度不变,它们的像素也会在图像中发生位移,造成一个很大的差异值。

在基于外观回环检测算法中,核心问题是如何计算图像间的相似性。比如对于图像A和图像B,我们要计算它们之间的相似性分:s(A,B)。这个评分会在某个区间内取值,当它大于一定量后我们认为出现了一个回环。

在这里引出感知偏差(Perceptual Aliasing) 和感知变异(Perceptual Variability)两个概念。

准确率和召回率

                                                   回环检测的结果分类

这里写图片描述

其中假阳性又称为感知偏差,假阴性称为感知变异。真阳性(True Positive)简称TP,假阳性称为(False Positive)简称FP。显然,我们都希望所有的结果中FP和FN尽可能要低。对于某特定算法,我们可以统计它在某个数据集上的TP、FP、FP、FN的出现次数,并统计俩个统计量:准确率Presicion=TP/(TP+FP)和召回率Recall=TP/(TP+FN)。
从上述公式可以得到,准确率描述的是,算法提取的所有回环中确实是真实回环的概率。而召回率是说在所有真实回环中被正确检测出来的概率

我们发现一个现象就是Precision和Recall通常是矛盾的:

P高则R低

R高则P低

由于在这里我们针对的是SLAM,而在SLAM中我们对准确率要求更高,而对召回率则可以进行适度的牺牲。

2.词袋模型

词袋( Bag-of-Words(BoW)),目的是用“图像上有哪几种特征”来描述一个 图像。例如,如果某个照片,我们说里面有一个人、一辆车;而另一张则有两个人、一只狗。根据这样的描述,可以度量这两个图像的相似性。

字典

字典中的每个元素可以看作相邻特征点的集合,我们就将这一问题转化成了一个聚类问题,采用K-means均值来做:

1. 随机选取 k 个中心点:c1,...,ck;

2. 对每一个样本,计算与每个中心点之间的距离,取最小的作为它的归类;

3. 重新计算每个类的中心点;

4. 如果每个中心点都变化很小,则算法收敛,退出;否则返回 1。

词袋对特征的聚类:

·特征聚类形成Word

·许多Word组成了Dictionary

·图像的相似性=Word的相似性

·只看Word的有无,无视Word的顺序

K-means存在小问题,就是:需要指定聚类数量,随机选取中心点等。

为了解决这个问题,我们使用一种K叉树来表达字典。假定我们构建一个深度为d、每次分叉为k的树,那么做法如下:

1. 在根节点,用 k-means 把所有样本聚成 k 类(实际中为保证聚类均匀性会使用 k-means++)。这样得到了第一层。

2. 对第一层的每个节点,把属于该节点的样本再聚成 k 类,得到下一层。

3. 依此类推,最后得到叶子层。叶子层即为所谓的 Words。


这样一个 k 分支,深度为 d 的树,可以容纳 kd 个单词。另一方面,在查找某个给定 特征对应的单词时,只需将它与每个中间结点的聚类中心比较(一共 d 次),即可找到最 后的单词,保证了对数级别的查找效率。

3. 相似度计算

原则上通过之前的步骤,我们得到了很多Word,我们似乎已经可以比较Word了,也就是可以计算图像相似度。但是我们会发现我们对于所有的Word都是“一视同仁”的。但是我们知道,一些Word是常见的,另一些则很罕见。我们希望对单词的区分性或重要性加以评估,给它们不同的权值以起到更好的效果。

针对上述问题,这里引入TF-IDF(Term Frequency-Inverse Document Frequency):

思路:单词在字典中出现频率越高,则区分度越低/在图像中频率越高-则分类图像时区分度越高

IDF部分可在字典训练过程中计算

TF部分则需要对图像的特征进行计算

IDFi = log n ni

另一方面,TF 部分则是指某个特征在单个图像中出现的频率。假设图像 A 中,单词 wi 出现了 ni 次,而一共出现的单词次数为 n,那么 TF 为:

TFi = ni n

于是 wi 的权重等于 TF 乘 IDF 之积:

ηi = TFi ×IDFi.

考虑权重以后,对于某个图像 A,它的特征点可对应到许多个单词,组成它的 Bag-ofWords:

A = {(w1,η1),(w2,η2),...,(wN,ηN)} ∆ = vA. 

由于相似的特征可能落到同一个类中,因此实际的 vA 中会存在大量的零。无论如何, 通过词袋,我们用单个向量 vA 描述了一个图像 A。这个向量 vA 是一个稀疏的向量,它 的非零部分指示出图像 A 中含有哪些单词,而这些部分的值为 TF-IDF 的值。

接下来的问题是:给定 vA 和 vB,如何计算它们的差异呢?这个问题和范数定义的方 式一样,存在若干种解决方式,比如 [102] 中提到的 L1 范数形式:

s(vA −vB) = 2
N ∑ i=1
|vAi|+|vBi|−|vAi −vBi|

若想要进行实践,可以参考《视觉SLAM十四讲》回环检测部分,这里就不加以叙述了。

猜你喜欢

转载自www.cnblogs.com/zp1285/p/11110854.html