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。数据库
理解词袋模型最重要的是要明白什么叫特征向量?什么叫一个视觉单词?又是什么叫词袋向量?spa
特征向量 - 单个视觉特征描述子code
视觉单词 - 词典中的聚类中心,带有权重的单个视觉特征描述子blog
词袋向量 - 一张图片用词袋中每一个单词是否出现(+ 出现的次数 + TF-DF)组合而成的向量(体现多个视觉特征描述子)索引
没看懂?请看下面图片
一. 主要步骤:ip
构建字典(Vocabulary):将图像数据库转换为索引图(k叉树)get
template<class TDescriptor, class F>
class TemplatedDatabase
{
...
};
近似最近邻(ANN)搜索:将一张图片中特征的描述子经过在k叉树种搜索转换为视觉单词(visual word),多个视觉单词组成词袋向量(BoW Vector)it
template<class TDescriptor, class F> class TemplatedVocabulary { ... };
二. 具体算法:
1. 离线步骤 - 构建字典(聚类问题,也称为无监督分类):
将训练图像数据库中全部N个描述子分散在一个k分支,d深度的k叉树的叶子节点上,以下图,分支数为3,深度为Lw,这样一个树结构有叶子结点3Lw个。能够根据场景大小,须要达到的效果修改k和d的数值。这样query image进来检索时,能够经过对数时间的复杂度(d次 = logk N)找到其对应的聚类中心,而不是使用O(n)的时间复杂度的暴力检索。
而后,为了提升检索时的效率、成功率以及准确率,还采用了下述算法
2. 在线步骤 - 近似最近邻检索(ANN Retrieval)
因为ORB和BRIEF描述子均为二进制,所以距离度量采用汉明距离(二进制异或计算)。query image的描述子经过在字典的树上检索(找到最近邻的叶子节点)视觉单词,组成一个词袋向量(BoW vector),而后进行词袋向量之间的类似度计算,获得可能匹配的ranking images。最后还须要利用几何验证等方法选出正确(只是几率最大。。。)的那张图片。