DBoW2 詞袋模型筆記

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. 離線步驟 - 構建字典(聚類問題,也稱爲無監督分類):

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

相關文章
相關標籤/搜索