DBoW算法用于解决Place Recognition问题,ORB-SLAM,VINS-Mono等SLAM系统中的闭环检测模块均采用了该算法。来源于西班牙的Juan D. Tardos课题组。
主要是基于词袋模型(BoW)https://en.wikipedia.org/wiki/Bag-of-words_model_in_computer_vision。在10000张train image图像数据库中找到query image的匹配图像耗时<39ms,并有较高的召回率和较低的false positive。
理解词袋模型最重要的是要明白什么叫特征向量?什么叫一个视觉单词?又是什么叫词袋向量?
特征向量 - 单个视觉特征描述子
视觉单词 - 词典中的聚类中心,带有权重的单个视觉特征描述子
词袋向量 - 一张图片用词袋中每个单词是否出现(+ 出现的次数 + TF-DF)组合而成的向量(体现多个视觉特征描述子)
没看懂?请看下面
一. 主要步骤:
构建字典(Vocabulary):将图像数据库转换为索引图(k叉树)
template<class TDescriptor, class F>
class TemplatedDatabase
{
...
};
近似最近邻(ANN)搜索:将一张图片中特征的描述子通过在k叉树种搜索转换为视觉单词(visual word),多个视觉单词组成词袋向量(BoW Vector)
template<class TDescriptor, class F>
class TemplatedVocabulary
{
...
};
二. 具体算法:
1. 离线步骤 - 构建字典(聚类问题,也称为无监督分类):
- 主要采用K-means算法,将用于训练的图像数据库中的视觉特征(DBoW3中支持ORB和BRIEF两种二进制描述子)归入k个簇(cluster)中,每一个簇通过其质心(centroid)来描述,聚类的质量通常可以用同一个簇的误差平方和(Sum of Squared Error,SSE)来表示,SSE越小表示同一个簇的数据点越接近于其质心,聚类效果也越好。这里的“接近”是使用距离度量方法来实现的,不同的距离度量方法也会对聚类效果造成影响(后面会提到)。K-means优点是容易实现,缺点是在大规模数据集上收敛较慢,并且可能收敛到局部最小,造成该簇没有代表性。对于描述子这种高维空间的大规模聚类,粗暴使用K-means会有问题。因此会使用其变种Hierarchical K-means或者K-means++。
将训练图像数据库中所有N个描述子分散在一个k分支,d深度的k叉树的叶子节点上,如下图,分支数为3,深度为Lw,这样一个树结构有叶子结点3个。可以根据场景大小,需要达到的效果修改k和d的数值。这样query image进来检索时,可以通过对数时间的复杂度(d次 = logN)找到其对应的聚类中心,而不是使用O(n)的时间复杂度的暴力检索。
然后,为了提高检索时的效率、成功率以及准确率,还采用了下述算法
- 倒排索引(Inverse Index)
- 正排索引(Direct Index)
- TF-IDF(Term Frequency - Inverse Document Frequency)
2. 在线步骤 - 近似最近邻检索(ANN Retrieval)
由于ORB和BRIEF描述子均为二进制,因此距离度量采用汉明距离(二进制异或计算)。query image的描述子通过在字典的树上检索(找到最近邻的叶子节点)视觉单词,组成一个词袋向量(BoW vector),然后进行词袋向量之间的相似度计算,得到可能匹配的ranking images。最后还需要利用几何验证等方法选出正确(只是概率最大。。。)的那张图片。