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,這樣一個樹結構有葉子結點3Lw個。可以根據場景大小,需要達到的效果修改k和d的數值。這樣query image進來檢索時,可以通過對數時間的復雜度(d次 = logk N)找到其對應的聚類中心,而不是使用O(n)的時間復雜度的暴力檢索。
然后,為了提高檢索時的效率、成功率以及准確率,還采用了下述算法
- 倒排索引(Inverse Index)
- 正排索引(Direct Index)
- TF-IDF(Term Frequency - Inverse Document Frequency)

2. 在線步驟 - 近似最近鄰檢索(ANN Retrieval)
由於ORB和BRIEF描述子均為二進制,因此距離度量采用漢明距離(二進制異或計算)。query image的描述子通過在字典的樹上檢索(找到最近鄰的葉子節點)視覺單詞,組成一個詞袋向量(BoW vector),然后進行詞袋向量之間的相似度計算,得到可能匹配的ranking images。最后還需要利用幾何驗證等方法選出正確(只是概率最大。。。)的那張圖片。
