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。最後還須要利用幾何驗證等方法選出正確(只是機率最大。。。)的那張圖片。