视觉SLAM十四讲——第十一讲回环检测

一、Bag-of-Words词袋

1.概念区分

1.1.单词(word/vocabulary)

单词是特征的聚类,一定注意是特征的聚类生成的结果,而不是具体的特征。这个特征在cv中可以是提取的特征的描述子(注意特征点只有描述子才能描述它的特征,而特征点本身只是包含它的坐标信息)。也可以是比较形象的表示的某些物体级别的特征,比如鼻子、眼睛、嘴巴等,只是这个时候特征的提取不是像特征点提取描述子那么简单,要复杂一点,因为提取的是高级特征(语义特征)。

以ORB特征点的聚类举例来说,就是找很多图片作为数据集,每张图片都会提取很多特征点,对应着实际描述这个特征点的特征的描述子。那么生成单词的时候,先指定要生成的单词的数量,然后就是根据K-means聚类算法对这些特征点的描述子进行聚类,注意聚类的结果是聚类得到的中心点到这个类别中所有描述子的距离最小,所以说这个聚类的结果很可能不是存在于这些描述子当中的,而是数学计算新生成得到的一个描述子,这个描述子可以最大程度上代表这个类的特征,最后的这个描述子也就是聚类得到的单词。

1.2.词典(dictionary)

词典就是把上面所有的单词按照一定的数据结构组成的集合。但是为了后面对一张输入的图像查找其中的单词的方便,词典需要有一定的数据结构,以加速词典中单词的查找,最常见的结构就是k-d树的字典结构。

所谓的k-d树,就是说单词并不是杂乱排列的,而是存在于k-d树中的叶子节点中(最下面的那一层节点)。其实这个k-d树是在聚类生成单词的时候就生成了,因为这个k-d树是从上到下生成的(也就是从根节点到叶子节点生成的)。在聚类的时候,先把所有的特征聚成k类得到第一层聚类,然后对每一类中的所有特征再次聚类聚成k类得到第二次聚类,依次类推,直到得到d层的聚类,最后一层的叶子节点就可以得到 k d k^d kd这么多的单词。同样在查找单词的时候也可以利用这个k-d树,先从某一层聚类开始查找,也就是从单词的某个大类中开始查找最相似的那个节点,然后再一直往下找,这样就可以加快单词的查找速度。

视觉SLAM十四讲——第十一讲回环检测_第1张图片

1.3.词袋向量(BoW vecotr)/ 词袋(BoW)

(注意有的时候说计算某张图片的词袋BoW,就是计算某张图片的词袋向量,因为词袋向量是词袋最重要的部分)

首先明确单词向量是一个向量,它的维度是 k d k^d kd,然后每一个位置的数字是在当前图片中这个位置的单词出现了多少次。所以显而易见,由于单词数量非常大,而一张图片中含有的单词数量肯定是有限的,所以这个向量中有很多地方都是0,也就是说这是一个稀疏向量。而且由于单词是特征聚类的结果,所以图片中相似的特征会查询到同一个单词,也就是说当前图片中同一个单词可能会出现多次,但是这个具体出现的次数是包括在了TD-IDF权重中的。

在十四讲的书中,把单词向量定义成了带有权重的。也就是每个位置的数据要么是0,说明当前图片中没有出现过这个单词;要么这个位置的数据不是0,那么这个数据就是当前图片对应这个单词的TD-IDF权重,如下所示。下图中的 ( ω i , η i ) (\omega_i, \eta_i) (ωi,ηi)可以看成是内积。
视觉SLAM十四讲——第十一讲回环检测_第2张图片

1.4.相似度得分(score)

计算词袋向量(或者简称词袋)的作用就是为了计算两张图片对应的词袋向量的得分,从而评价两张图片的相似度。

关于相似度的得分,有多种定义形式,本质上就是衡量两个向量之间的距离。比如可以定义两个向量之间的夹角余弦值:视觉SLAM十四讲——第十一讲回环检测_第3张图片
也可以定义像十四讲中说的 L 1 L1 L1范数:
视觉SLAM十四讲——第十一讲回环检测_第4张图片

1.5.TF-IDF权重

TF-IDF(Term Frequency - Inverse Document Frequency,频率-逆文档频率),就是前面衡量每一个单词的权重系数。这个包括两部分,最后的结果是 T F − I D F = T F × I D F TF-IDF = TF × IDF TFIDF=TF×IDF.

  1. TF:TF是在线计算的,对不同的输入图片来说其每个单词的TF都不一样。
    T F = m i M TF=\frac{m_i}{M} TF=Mmi
    其中 m i m_i mi是这个单词在当前这张图中出现的次数, M M M是这张图中包含的所有单词的数量。这个其实就是包含了这个单词出现的次数,把这个次数包含到最后的词袋向量中。
  2. IDF:IDF是是在使用数据集生成词典之后就计算出来了,也就是离线计算好的,对于不同的输入图片来说,它们的IDF都相等。它主要是反映了这个单词在所有的单词中是否有区分度。比如文档中单词的描述,单词and/or/is显然没有区分度,而单词robot就很有区分度。某个单词i的IDF的定义如下:
    I D F i = l o g N n i IDF_i = log\frac{N}{n_i} IDFi=logniN
    公式中, N N N是训练词典的数据集中的图片总数, n i n_i ni是数据集中出现过这个单词的图片的张数,取对数是为了数据稳定性,因为N一般很大(比如 1 0 4 10^4 104),而 n i n_i ni一般很小,如果直接用比值的话对这个单词的IDF加权就太大了。而取了log后,如果 n i = 1 0 4 n_i=10^4 ni=104那么对这个单词的加权就是 l o g 1 = 0 log1=0 log1=0,因为这个单词在所有的图片中都出现过,对于匹配图像没有任何帮助了;如果 n i = 1 n_i=1 ni=1那么对这个单词的加权就是 l o g 1 0 4 = 4 log10^4=4 log104=4,这个单词的唯一性很好,对它的加权是4,而不是 1 0 4 10^4 104那么离谱。

1.6.倒排表(Inverted file)

倒排表主要是为了进行图像匹配和搜素。因为虽然上面计算出来了输入图片的词袋向量,但是直

问题:在大规模的图像搜索中,是把在训练词典的大规模图片数据集中搜索和输入的图片匹配的图片。但是在SLAM中呢?用的字典是离线训练好的,但是重定位的时候是为了找之前存储的关键帧中和当前帧相似的图片。

你可能感兴趣的:(SLAM,聚类,机器学习,python)