回环检测模块能够给出除了相邻帧之外的一些时隔更加久远的约束,这是因为我们观察到相机经过了同一个地方,采集到了相似的数据。而回环检测关键是如何有效监测出相机经过同一个地方这件事。可直观的想象成回环边把带有累计误差的边拉到了正确的位置。
1 回环检测如何实现?
希望有个哪处可能出现回环的预计,才不那么盲目地去检测。两种思路:
基于里程计的几何关系。当我们发现当前相机运动到了之前的某个位置附近时,检测他们有没有回环关系。但由于积累误差的存在,往往没法正确发现运动到了之前某个位置附近的事实。
基于外观。仅根据两幅图像的相似性确定回环检测关系。摆脱了积累误差,使回环检测模块成为slam系统中相对独立的模块。在此算法中,核心问题是如何计算图像间的相似性。
2 召回率和准确率
算法\事实 | 是回环 | 不是回环 |
是回环 | 真阳性(True Positive) | 假阳性(False Positive) |
不是回环 | 假阴性(False Negative) | 真阴性(True Negative) |
准确率描述的是,算法提取的所有回环中确实是真实回环的概率;召回率则是说在所有真实回环中被正确检测出来的概率。在slam中对准确率要求更高,对召回率相对宽容。
3 词袋模型
词袋,Bag-of-Words(BoW),目的是用“图像上有哪几种特征”来描述一幅图像。首先通过某种方式得到一本字典。例如“人”“车”“狗”都是记录在字典中的单词,记为w1,w2,w3。然后对于图像A,根据它们含有的单词,记为
A=1*w1+1*w2+0*w3
字典是固定的,只要用[1,1,0]这个向量就可以表达A的意义。该向量描述的是“图像是否含有某类特征”的信息。比单纯的灰度值更加稳定。描述向量说的是“是否出现”,而不管它们“在哪出现”,所以与物体的空间位置和排列顺序无关,因此相机发生少量运动时,只要物体仍在视野范围内,就可以保证描述向量不发生变化。
同理用[2,0,1]描述图像B。如果只考虑“是否出现”,而不考虑数量,也可以是[1,0,1],这时向量就是二值的。
4字典
当有N个数据,想要归成k个类,用K-means聚类主要包括以下步骤:
1)随机选取k个中心点:c1,....,ck。
2)对每个样本,计算它与每个中心点之间的距离,取最小的作为它的归类。
3)重新计算每个类的中心点。
4)如果每个中心点变化很小,则算法收敛,退出;否则返回第2步。
k叉树来表达字典,类似于层次聚类,是k-means的直接扩展。假如有N个特征点,希望构建一个深度为d,每次分叉为k的树,做法如下:
1)在根节点,用k-means把所有样本聚成k类,这样得到第一层。
2)对每一层的每个节点,把属于该节点的样本再聚成k类,得到下一层。
3)以此类推,最后得到叶子层。叶子层即为所谓的words。
最终仍在叶子层构建了单词,而树结构中的中间节点仅供快速查找时使用。一个k分支,深度为d的树,可容纳k的d次方个单词。在查找某个给定特征对应的单词时,只需将它与每个中间节点的聚类中心作比较,即可找到最后的单词。
5相似度计算
不同单词在区分性上的重要性并不相同,通过给定不同的权值对单词的区分性或重要性加以评估。在文本检索中,常用到TF-IDF(Term Frequency-Inverse Document Frequency)。TF部分的思想是,某单词在一幅图像中经常出现,它的区分度就高;IDF的思想是,某单词在词典中出现的频率越低,则分类图像时区分度越高。
统计某个叶子节点wi中的特征数量相对于所有特征数量的比例作为IDF部分。假设所有特征数量为n,wi数量为ni,该单词的IDF为
IDFi=log(n/ni)
TF部分指某个特征在单幅图像中出现的频率。假设图像A中单词wi出现了ni次,而一共出现的单词次数为n,则
TFi=ni/n
wi的权重等于TF与IDF之积。
ci=TFi×IDFi
对于某幅图像A,它的特征点可对应到许多个单词,组成它的Bag-of-Words:
向量vA是一个稀疏的向量,它的非零部分指示了图像A中含有哪些单词,而这部分的值为TF-IDF的值。
给定vA和vB,计算它们的差异存在若干种解决方式,L1范数形式: