1. 程式人生 > >迴環檢測中的詞袋模型(bag of words)

迴環檢測中的詞袋模型(bag of words)

將會從以下四個方面進行展開

關於詞袋模型的基本理解
演算法簡介
開原始碼庫DBoW2庫的簡單介紹
關於DBoW的一些總結
關於詞袋模型的基本理解
BoW基本簡介
Bag of words模型最初被用在文字分類中,將文件表示成特徵向量。它的基本思想是假定對於一個文字,忽略其詞序和語法、句法,僅僅將其看做是一些詞彙的集合,而文字中的每個詞彙都是獨立的。
如果文件中豬、馬、牛、羊、山谷、土地、拖拉機這樣的詞彙多些,而銀行、大廈、汽車、公園這樣的詞彙少些,我們就傾向於判斷它是一篇描繪鄉村的文件,而不是描述城鎮的。

舉例說明
文件一:Bob likes to play basketball, Jim likes too. 
文件二:Bob also likes to play football games.
基於這兩個文字文件,構造一個詞典:Dictionary = {1:”Bob”, 2. “like”, 3. “to”, 4. “play”, 5. “basketball”, 6. “also”, 7. “football”,8. “games”, 9. “Jim”, 10. “too”}。

基於上述的詞典可以構造出一個兩個直方圖向量 
1:[1, 2, 1, 1, 1, 0, 0, 0, 1, 1] 
2:[1, 1, 1, 1 ,0, 1, 1, 1, 0, 0] 
這兩個向量共包含10個元素, 其中第i個元素表示字典中第i個單詞在句子中出現的次數. 因此BoW模型可認為是一種統計直方圖 (histogram).

應用詞袋模型的影象處理
這是一個萬能的詞袋模型示意圖 

其實整個過程是這樣實現的 


演算法簡介
應用在視覺SLAM中的迴環檢測
在SLAM過程中,迴環檢測顯得尤為重要,當失去迴環檢測時,整個SLAM過程就會退化成一個視覺里程計。 
 


在迴環的過程中,如何確定什麼時候迴環,需要比較當前影象資訊與先前影象的相似性。 
 
但並不是每次迴環都會這麼友好,還會受到各種影響,有天氣、陰影等帶來的,所以往往就會識別錯誤,錯誤情況分為兩種,在應該回環的時候沒有識別出來;在不應該回環的時候認為是迴環了。

介紹詞袋模型
1、特徵提取與描述 
2、詞袋組成與結構 
3、迴環檢測流程 
4、實驗評估

參考論文: 
Galvez-Lopez D, Tardos J D. Real-time loop detection with bags of binary words[C]// IEEE/RSJ International Conference on Intelligent Robots & Systems. 2011:51-58. 
Galvez-López D, Tardos J D. Bags of Binary Words for Fast Place Recognition in Image Sequences[J]. IEEE Transactions on Robotics, 2012, 28(5):1188-1197.

特徵提取與描述
這裡主要按照參考論文進行關於詞袋的講解,所以主要以FAST+Brief為主,讀者可以根據需要選擇ORB、surf等。 
FAST特徵點: 
 

FAST特徵點的提取比較簡單,遍歷影象各個畫素點,以當前畫素點為中心,3為半徑選擇16個周圍畫素,依次進行比較,灰度差異值大於給定閾值的就標記一下,若大於12,則當前點為特徵點。
論文的特色在於使用了Brief描述子(二進位制),可以滿足記憶體、運算速度等實際需要 

最後的描述子是一個256bit的向量,在比較特徵點相似性的時候可以使用漢明距離,所以有點比較明顯。當然沒有具備旋轉以及尺度的不變性。在ORB_SLAM2中則使用多尺度的ORB描述子,有興趣可以去看一下。

言歸正傳,接下來要進入正題了!!

詞袋組成與結構
1、詞典生成流程

在目前流行的SLAM過程中,但凡用了迴環檢測的,基本上都使用了BoW,包括號稱魯棒與效果兼備的ORB_SLAM;使用詞袋模型分為兩個步驟,產生一個詞典,然後利用這個詞典,前者是離線生成的,注意是離線生成的(就像小時候看書的時候還沒認識那麼多字,但是想看書,怎麼辦,去書店買一本詞典吧,一遍讀,一遍看;可能這個比方不是很恰當);在後面的步驟中,需要產生一個數據庫,用了記錄一下查詞典時所用到的單詞,方便回來看的時候能快速找到,不用辛辛苦苦的再去找一遍。
在實際使用的過程中,第一步我們得訓練產生一本詞典,就像前面提到的那樣,單詞就是一些特徵聚類的結果。擺在我們面前的可能是幾十萬甚至幾百萬張訓練的圖片,我們需要依次提取特徵,這真是個浩大的工程,然後在特徵空間中就會有n多個特徵資訊,接下來我們要用這些特徵聚類產生單詞了,聚類成多少?這是個問題,這取決於我們選擇的樹形結構(後面會提到),整個過程就像下面圖一樣


黑色的就是最原始的,提取到的特徵,為了簡單,把這些特徵放在二維空間了,實際上應該256維的,所以上面這張中,這些特徵點和他們在實際圖片中的位置資訊沒有任何關係。 
黑色—>紅色—>綠色—>藍色,這就是聚類的步驟,黑色的特徵聚類成紅色節點,紅色節點聚類成綠色節點,然後綠色節點再聚類成根節點(藍色) 
 
Vocabulary branch factor:kw 
Vocabulary depth levels :Lw
整個步驟流程如下圖 
 
:產生詞典樹形結構的步驟: 
所有特徵描述子分佈在特徵空間-> 
根據設定好的樹形結構引數,進行kmean++聚類,產生葉子結點-> 
對產生的節點依次進行kmean++聚類,直至產生根節點。

結點個數(等比數列):

2、inverse index word 
 
1、逆序索引單詞涵蓋了所有出現的單詞 
2、每一個單詞指向包含它的一系列影象 
3、採用投票機制選取候選者,加速搜尋

加快搜索示意圖 

3、direct index image 
主要用途: 
在迴環檢測的最後階段——幾何結構驗證階段,可以加速匹配候選影象與當前影象之間的特徵點對

結構如下圖所示,左圖是2011會議論文所採用的儲存結構,以word為單位,右圖是2012在TRO期刊上使用的儲存結構,以node為單元。 


迴環檢測流程
1、基礎知識介紹 
2、資料庫查詢 
3、組匹配 
4、時間一致性校驗 
5、結構一致性校驗
1、基礎知識介紹 
這時候要要利用了訓練之後的詞典了。BoW模型主要就是利用了訓練詞典產生了高度差異型模型,因此每一張圖片通過詞典檢索,都會得到一個獨一無二的直方圖向量,向量的維度就是詞典個數(一般都是100萬)。在具體寫程式的時候不會產生這麼大一個維度的連結串列,可以有一個等效的模型。

從影象—>BoW向量流程: 
1、輸入一張影象I,進行特徵檢測與特徵描述,特徵點數量最多不超過約定值(300)。 
2、將每個特徵通過樹形結構的字典,得到BoW向量v,該向量的維度為特徵數量(程式中),論文中認為維度為葉節點(words)數量。

其中向量v的資料單元結構為map—>(index , value)即(word index,weight)

Word index解釋如下: 
將每個特徵從樹形字典的根節點葉節點(words),依次與當前所在節點的子節點進行比較,選取漢明距離最小的節點作為中繼節點,以此類推,直到所在節點為葉節點
Weight解釋如下: 


每個單詞的權重有一個歸一化過程,權重的組成由tf和idf兩部分構成,對於前者,分子為當前圖片中出現單詞i的個數,分母為總共包含的單詞個數,這是線上得到的;後者是詞典的屬性,已經離線生成,不會發生改變,分子為生成詞典時所包含的訓練圖片數量,分母為出現單詞i的圖片個數,這個比重分量主要為了凸顯差異型,認為在訓練時經常出現的單詞差異性較小,權重賦予的小一些,舉例:如果一個單詞在每一張圖片都能出現,那麼詞典所給予的權重分量應該是0,因為太常見了,所以會忽略它。
在得到了兩張圖片的BoW向量之後,需要比較兩者的相似性: 
給出公式: 


在實際程式中公式如下: 

注:L1-score指的是一範數得分,後面的絕對值也指的是求取一範數,最後得到的是一個標量

實際中不可能存一個100萬維的BoW向量,向量是稀疏的,只存下出現某個單詞的索引及權重 
論文和實際公式等效: 


一些需要用的基礎知識和結構已經介紹完了,接下就是迴環檢測了
迴環檢測:資料庫查詢
查詢的資料庫就是上述線上更新和維護的inverse index word 
利用inverse index words 資料庫簡化檢索過程;不採用暴力匹配,只匹配包含相同單詞的個別影象資訊, 加快檢索過程。
得到歸一化得分函式如下: 


1、防止因分母過小,而引起的得分過大,需要對分母增加條件(有特徵點數要求或者得分要求) 
2、需要對最後得分設立閾值,過濾得分較少的候選影象,保留符合要求的候選影象進入組匹配進行校驗
迴環檢測流程——組匹配 
當影象 It,It′It,It′,表示了一個真正的迴環,則ItIt 同樣也和It±Δt,It±2ΔtIt±Δt,It±2Δt 有著較高的相似性,定義相似得分和函式如下: 
 
其中VTiVTi 表示候選影象所在集合從VtniVtni 到 VtmiVtmi
1、防止連續影象在資料庫查詢時存在的競爭關係,但是不會考慮同一地點,不同時間的關鍵幀。 
2、防止誤匹配

迴環檢測流程——時間一致性校驗 
在經過組匹配之後,得到了最佳組匹配VT′VT′,此時需要檢驗該組匹配的時間一致性。 
一般來說,對於組匹配<vt,VT′><vt,VT′> ,與當前幀的前kk 幀影象得到的組匹配<vt,VT1><vt,VT1> , … ,<vt,VT2><vt,VT2> 有著較大的重疊區域。

在經過時間一致性校驗之後,只保留一組匹配<vt,vt′><vt,vt′> ,判斷標準在所在組得分最高,成為唯一的候選物件,進入結構一致性校驗

迴環檢測流程——結構一致性校驗

詞袋是一個無序的模型,好比我打了小明,小明打了我這兩句話,意思正好相反,但是詞袋的模型卻是同一個,這就很要命,會帶來誤匹配。所以需要增加約束,該約束就是幾何結構上的約束,即各個特徵點在空間中的位置是唯一不變的,以基礎矩陣建立約束。 
1、在使用詞袋進行迴環檢測的過程中,並未考慮特徵之間的結構約束; 
2、在檢測的最後一個流程中,在得到對應特徵點的基礎上,通過使用RANSAC和基礎矩陣解算,計算滿足要求的特徵點對數目(12)。
過程關鍵點: 
1、使用direct image index,加速校驗前特徵點對的獲取 
2、同時為了獲取足夠數量的特徵點,不能直接選取words作為匹配 
索引;同時凸顯特徵之間的區分度,也不能採用採用較高層數 
的節點(詞袋樹形結構)。 
所需要的結構就是已經介紹過的 


至此,整個迴環檢測的流程已經結束了
論文還給出了實驗評估,評估的標準就是精度—召回曲線,如下: 
 
評價標準 
精度:正確迴環檢測佔總檢測迴環數目的比率 
召回:正確迴環檢測佔測試樣本總迴環的比率 

實驗評估
這裡簡單涉及一下,論文中所涉及的引數和實驗結果 
引數設定: 
 
資料集(前三個作為訓練,後兩個作為測試) 

與FAB-MAP 的實驗結果比較(貌似Magaga6L的訓練集數目不對等) 
 
有興趣可以去看一下08年的FAB-MAP,程式也是開源的。 
Cummins M, Newman P. FAB-MAP: Probabilistic Localization and Mapping in the Space of Appearance[J]. International Journal of Robotics Research, 2008, 27(6):647-665.
開原始碼庫DBoW的簡單介紹
整個開源的DBoW2程式如下圖分佈:

整個結構非常緊湊,寫的也很好,給使用者的選擇比較多,可以使用各種特徵描述方式,遺憾的是,論文作者並未把所涉及到的演算法全部開源,只是框架開源,所以無法重現結果。
demo

程式中有一個簡單的demo,可以幫助瞭解整個框架,包括建立詞典到測試詞典
demo程式和結果: 

demo資料集 

因為是由四張圖片產生的詞典(差異度不夠),用來測試圖片,所以效果並不十分凸顯,可以使用ORB_SLAM2開源的詞庫進行測試。

關於DBoW的總結
1、理解詞袋模型: 
在理解論文的基礎上,需要結合開原始碼,對演算法有一個更為深入的瞭解;需要加強對資料結構的使用和操作,詞袋模型大量使用了list、map、vector及自定義的資料結構。

2、需要客觀看待: 
在迴環準確性和時間開銷,需要一個取捨,雖然在文中FAST+Brief取得了一個不錯的結果;但是這樣的特徵檢測和描述方式,沒有對尺度和旋轉的不變性,在平面移動機器人+前置(側置)攝像頭中尚能取得較好的效果。

3、使用開源程式: 
ORB_SLAM2,也同樣使用了開源庫DBoW2。

整體而言,離線產生的詞典對於迴環檢測時有幫助的,因為有一個差異度足夠高的模型,這一點是線上所無法比擬的,但是總有一種作弊的感覺,也有很多關於online visual vocabulary的論文,但是並不十分流行。
--------------------- 
作者:辜鴻銘 
來源:CSDN 
原文:https://blog.csdn.net/qq_24893115/article/details/52629248 
版權宣告:本文為博主原創文章,轉載請附上博文連結!