文章目录
0.引言
在视觉建图中,位姿的估计往往是一个递推的过程,即由上一帧位姿解算当前帧位姿,因此其中的误差便这样一帧一帧的传递下去,也就是我们所说的累计误差,所以这时候需要用回环检测来消除累计误差。
在基于纯特征地图的视觉定位中,需要利用重定位来获取机器人的所在位置,以便于初始化机器人的位姿。
以上所述两个概念其实本质是一种技术:匹配技术。匹配分为:地图与地图的匹配,特征点与特征点的匹配,特征点与地图的匹配和图像与图像的匹配。
1.基于dbow的匹配
1.1词袋模型(bow)
单词:差距较小的描述子的集合
字典:所有的单词
因此每一帧(特征点)都可以用单词来描述,也就是这一帧中有哪些单词,这里只关心了有没有,而不必关心具体在哪里。只有两帧中单词种类相近才可能构成回环。
因此,现在利用词袋模型我们将回环检测大致分为了以下三个步骤:
- 构建字典(所有单词的集合)
- 确定一帧中具有哪些单词,用向量表示 (1表示具有该单词,0表示没有)
- 比较两帧描述向量的差异,完成匹配
所以基于dbow的匹配本质上属于特征点与特征点的匹配。
字典结构
字典由单词组成,而单词来自于描述子。并不是说一个描述子就是一个单词,而是一个单词表示了一组多个描述子,同组内的描述子差异较小。例如,描述子由256位组成,则描述子的种类便有 种,这个数相当大了,我们确定单词,构建字典的过程就类似于将这 种描述子进行分类(聚类)的过程,我们可以指定具体分成多少类。那就很像我们现实中的字典了,有厚有薄,也就是看我们分类的多少了。
那现在字典的构建也就是一个描述子聚类的过程。聚类算法也有很多了,这里采用了K-means算法,其过程也很简单:
如图(来自视觉slam14讲):
现在通过聚类我们获得了字典,但这里又有一个问题:怎么去查找每张图片特征点对应的单词。回想我们平时查字典的过程,不可能直接打开一个一个去找吧,我们会利用目录,首字母等方法方便我们查找。这里也一样,一个个去查找速度太慢了,因此我们将字典构建成一个K叉树的结构来加速查找。如下图所示:
最后就是通过单词去对两幅图片匹配,计算他们的相似度。
现在我们有了字典,但还有一点需要注意。我们利用单词表示图像,目的是发现回环,也就是两帧图像具有较高的相似性。那其实不同的单词对这一目的的贡献性是不同的。例如,我这篇文章中有很多“我们”这个词,但这个词并不能告诉我们太多信息。而有些单词例如“回环”、“K-means”就比较具有代表性,能大概告诉我们这句话讲了什么。因此不同的单词应该具有不同的权重。
用两个量来描述这种权重:
- IDF(Inverse Document Frequency):描述单词在字典中出现的频率(构建字典时),越低越具有代表性
- TF(Term Frequency):单词在单帧图像中出现的频率,越高越具有代表性
因此将一帧图像转化为单词表示时,我们要计算其单词的权重:
因此一帧图像 A 由单词 w 和对应的权重
η
{\eta}
η 表示
匹配之后的相似度:
1.2orbslam2中回环检测应用
2.maplab中的全局匹配
2.1maplab 的全局匹配和基于dbow的匹配比较
DBOW的基本原理是判断最相似的两张图。但如果作为基于地图的定位来做的化,当场景大部分区域放生变化的时候,其实很难找到相似的图片了。Maplab中直接使用描述符匹配,不管一个场景变换再大,只有有不小部分是可识别的就能work
。
两张图片的对比只用了单张图片的信息。有的时候一张图片的信息不够匹配上,但多张图片组合在一起才能产生足够信息。而Maplab的方式能够自然的使用多张图片联合一起的信息。
ORB的重定位中只使用DBOW检测出来的frame看到的3d点来做匹配。但DBOW选出的图片经常是偏离最近kf的。所以能匹配上的就更少了。主要也只用了单张图片的信息。
基于DBOW的地图还需要存BowVector,FeatureVector等额外信息
总结来看就是Maplab的全局定位要大大优于DBOW。毕竟DBOW只是用来做单次slam的回环和重定位,场景不会发生太大变化。
2.2maplab的匹配原理
‘’Get Out of My Lab: Large-scale, Real-Time Visual-Inertial Localization”
是maplab在全局匹配主要引用的一篇文章。此文章提出全局匹配精度高速度快,能高效地和地图做全局匹配。其特点主要包括以下几部分:
- Descriptor Projection
二进制(binary)描述符比起浮点(float)描述符在计算描述符距离和描述符压缩上面有优势。但是在KD tree的搜索方式中,因为维度太高,却反而是劣势。所以binary描述符一般都使用暴力匹配。文章提出可以把高维的binary描述符投影到低维的浮点描述符。比如512维的binary描述符(freak)可以投影到10维的float描述符空间。
- Product Quantization
10维的float描述符对KD tree搜索仍然维度太高。所以作者把10维的向量分为两个5维的向量,这样形式上把10维向量变成了2维向量。新出现的5维的向量,通过k-means聚类成256个类。这样表示一个描述符只需要知道这两个5维向量对应的聚类后的类id。也就是描述符继续压缩成2byte。压缩后的描述符对匹配上也有帮助。因为数据库里面的描述符是存的聚类的id。当我们要计算一个普通描述符和量化后的描述符的距离的时候。只需要计算普通描述符分成的两个5维向量到目标量化后的描述符的类id的距离。我们一共只有256×2个聚类中心,所以当要知道一个普通描述符和数据库中所有的量化描述符的距离的时候。可以提前把普通描述符到这256×2个聚类中心的距离算出来。后面计算距离的时候,就之需要加法运算了。
- Inverted Multi-index
Maplab系列:Inverted File
高维的描述符对于kd-tree方法维度太高。如果使用但存的Inverted Index方法(先聚类出多个中心,找最近点的时候,先找到离query的描述符最近的那个中心,然后在把属于这个中心的所有描述符和quary描述符做暴力匹配)。这种方法因为聚类中心会很多,所以一开始找最近的聚类中心也会非常费时。所以作者通过类似于Product Quantization的思路,先把描述符分给成等长度的部分。文章中把10维向量分为两个5维的。然后通过kd-tree来找最近的聚类中心(2维空间中找),知道后再做暴力匹配。
- Covisibility Filter
Maplab系列:共视关系筛选全局匹配
压缩后的描述符的表达分辨率肯定不如原始的高。所以之际使用描述符距离找到的匹配肯定有很多无匹配。这里作者提出,一张图片和所有描述符匹配的结果。大量错误的匹配会分散在不同的帧上面,也就是几乎在所有帧上面都会找到匹配上的描述符。但正确的匹配会在被匹配上特别多的那些帧上。
2.3 全局匹配演示视频
global