ORBSLAM2匹配方法流程
在基於特征點的視覺SLAM系統中,特征匹配是數據關聯最重要的方法。特征匹配為后端優化提供初值信息,也為前端提供較好的里程計信息,可見,若特征匹配出現問題,則整個視覺SLAM系統必然會崩掉。因此,本系列將特征匹配獨立成一講進行分析。
ORBSLAM2中的匹配流程如下所述:
1. 計算當前幀描述子對應的BOW向量;
2. 設置匹配閾值;
3. 進行BOW特征向量匹配確定最優匹配;
4. 統計匹配描述子角度偏差並篩選,確定最終匹配。
接下來,我們一起再細細分析一下,每一步它具體是怎么做的。
詞袋模型
在進入正題之前,需要給大家普及一下,什么叫BOW。BOW就是Bag of Word,是詞袋模型中的詞匯組合而成的向量。
到這里,大家肯定又會有疑惑,什么叫詞袋模型?
從字面上非常直觀的意思就是:裝着很多詞匯的袋子。那么,這個袋子里面的詞袋究竟是什么?怎么來的呢?
我們知道,一幀圖像中,可以提取到很多的特征點,每一個特征點都是一個圖像局部塊的描述,那么相似場景下的特征點,其描述應該是比較接近的。如果我們將這些常見場景的相似特征進行聚類,下一次再遇到相似的特征,能不能直接用我們聚類的結果來表示這個特征呢?顯然是可以的。也就是說,我們把所有相似的特征描述都進行統一化,最終得到一個唯一的描述。而詞袋模型就是將所有常見場景的特征描述子按照樹狀圖進行分層聚類,最終得到的一系列聚類中心——統一化的特征描述。
為了讓大家更加直觀的理解我所說的東西,我為大家提供了一個分層聚類的樹結構圖:
如圖所示,上述樹結構是一個聚類中心K為3,深度D為2的詞匯樹,共計產生KD也就是9個詞匯。
比如我有10幀圖像,每幀圖像提取了500個特征點,那么總共有5000個特征點。首先將其聚成3類,作為粗略的篩選。在這三個聚類中心的基礎上,每個大類下的特征點再進一步聚成三類。所以我們將5000個特征點分成了9大類,即9個詞匯,對於屬於詞匯W5的描述子,其最終表示是[ 0 0 0 0 1 0 0 0 0 ],對於每一個詞匯,都存儲着其對應的權重。對於任意一張輸入圖像,所有特征點通過詞袋模型轉換以后變成 [ 50 50 100 0 0 50 50 100 100 ],即輸入圖像中的所有特征點直接轉換成了一個9維的向量,在圖像檢索時非常高效。
但是,上述的詞袋模型對於我們的問題來說,實在是太小了。因此,ORBSLAM中回環檢測里采用的詞袋模型,是從一些常用場景的大量圖像中提取了特征點后進行上述基於樹結構的聚類。當然,其樹結構肯定是更大更深的,比如,聚類中心K為10,深度D為5的詞匯樹,共計產生十萬個詞匯。這個龐大的詞匯樹可以讓不那么相似的特征分開,使得BOW向量更加具有區分度。
轉換成BOW向量
對於輸入圖像的所有特征點,我們通過詞袋模型轉換成對應詞匯,在樹結構龐大的情況下,我們不能在一個向量中包含所有詞匯,一方面是考慮內存,另一方面考慮檢索效率。因此,我們只保存非0的詞匯,即 I = { (W1, 0.01), (W5,0.02), ..., (W300,0.05) },花括號里(A,B),A表示詞匯ID,B表示權重。需要注意的是,這里的權重是我隨機寫的,只是為了方便大家理解,實際的權重必須是根據統計結果算出來的。
以上述的樹結構為例,對於任意一個特征點,我們從root節點出發,與第一層聚類中心進行粗匹配,選擇匹配分數最高的一個聚類中心。接着,繼續與其子類進行特征匹配,找到最優的匹配,直到葉子為止,這個葉子就是我們之前所說的詞匯。假設最終找到的詞匯是W3,則這個描述子對應的BOW就是(W3,0.02),通過將所有特征點進行相同的操作,我們可以得到一系列詞匯ID和權重,將其串起來就得到了我們要的BOW向量了。
特征匹配
通過上述的方法,我們將待匹配圖像的特征點轉換成BOW向量,在匹配時我們查找兩幀BOW向量中相同ID的詞匯,特征匹配只在有相同ID的詞匯中進行。顯然,這個過程限定了匹配范圍,可以提高匹配的速度。當然,匹配的精度跟詞匯樹的大小和深度有關系。
假設在圖像1中,ID為3的詞匯中包含6個特征點,同理,圖像2中包含3個特征點。則對圖像1中的每個特征點都與圖像2中的每個特征點計算匹配分數,通過最近鄰比例法,結合閾值條件篩選出最優的匹配對。值得注意的是,在圖像2中已經匹配過的特征點,圖像1其余特征點就不再與之匹配了。
形象一點說:圖像1中有6名男士,圖像2中有3名女士,自由牽手組合。當圖像1中的一名男士與圖像2中的所有女士進行交流后(特征匹配),有其中一位好感度比較高(匹配分數高於匹配閾值),那么就牽手成功了。這時,圖像1中剩余5名男士自然無法匹配已經被選擇的那名女士。相反,如果所有女士都對其好感度較低(匹配分數低於匹配閾值),則說明牽手失敗。(即匹配失敗)
確定最優匹配
ORBSLAM2中將360°分成30個bin,每個bin的范圍是12°。對於圖像1和圖像2任意兩個對應匹配特征,我們計算其二者主方向的夾角。根據夾角的大小確定在哪個角度范圍里,並將特征索引存入對應bin中。
我們統計每個bin中保存的索引數量,取數量最多的前三個bin作為最終的匹配對結果。其他的匹配對全部予以刪除。至此,我們的最優匹配就全部確定了。
不過,值得注意的是,我們實際上匹配的點只是一部分,另一部分沒有匹配到的,在后面會通過共試圖關鍵幀以及局部地圖重投影進行進一步匹配,我們會在后續的內容中講解。
總結:
本文主要介紹了ORBSLA2中的匹配方案,以及詞袋模型的生成方法。本文在文末提供了一些參考文獻,歡迎大家查閱。
(為了讓大家能更直觀的了解ORBSLAM2的圖像匹配,本文后續會提供圖像匹配的源碼。。。)
下一講,我將為大家介紹ORBSLAM2的運動估計模塊。
參考文獻:
[1] A Fast and incremental method for loop-closure detection using bags of visual words
[2] 視覺SLAM十四講
PS:
如果您覺得我的博客對您有所幫助,歡迎關注我的博客。此外,歡迎轉載我的文章,但請注明出處鏈接。
對本文有任何問題可以在留言區進行評論,也可以在泡泡機器人論壇:http://paopaorobot.org/bbs/index.php?c=cate&fid=1中的SLAM技術交流模塊發帖提問。
我的github鏈接是:https://github.com/yepeichu123/orbslam2_learn。