1. 程式人生 > >(一)ORB描述子提取

(一)ORB描述子提取

ORBSLAM2中使用ORB描述子的方法


 

  經典的視覺SLAM系統大體分為兩種:其一是基於特徵點法的,其二是基於直接法的。那麼本文主要就講特徵點法的SLAM。

  基於特徵點法的視覺SLAM系統典型的有PTAM,ORBSLAM等。本文主要圍繞ORBSLAM2的方案來闡述特徵點法SLAM,因為ORBSLAM2可以說是特徵點法SLAM的巔峰之作。ORBSLAM2採用三個主要執行緒:跟蹤,區域性建圖和閉環以及一個額外執行緒:全域性BA,該執行緒只有在閉環時才會觸發。值得注意的是,ORBSLAM2中每個模組中都採用ORB描述子,而不像之前的其他系統那樣跟蹤和迴環檢測使用不同的特徵點,這種做法一方面是節省提取時間,另一方面可以使得整個系統更加簡潔。

  在跟蹤階段,ORBSLAM2對輸入影象提取ORB描述子,與參考幀影象的ORB描述子進行特徵匹配,具體的特徵匹配方法下一講中我們再詳細討論。如圖1藍色線所示,Rf表示參考幀(在ORBSLAM2中即是最後一個插入的關鍵幀Kf),Cf表示當前幀。p1表示參考幀Rf中的畫素點,而p2表示當前幀Cf中與參考幀Rf匹配的ORB特徵點位置。ORBSLAM2中在地圖中查詢p1的三維座標P,如圖1綠色線所示,查詢完畢後利用外參T=[R,t]將P投影到當前幀Cf中,如圖1紅色線所示。如圖1中黃色線所示,p2為P在當前幀Cf中的真實位置,而p2'為實際投影位置,二者之間存在誤差,通過優化外參T=[R,t]來使得所有特徵點之間的衝投影誤差最小,實現相機的位置跟蹤:

    

如公式(1)所示,即為當前幀和當前幀所有匹配特徵點對的重投影誤差,除了單純的計算重投影誤差外,注意到公式(1)中,採用了核函式,來防止外點對非線性優化的過度影響(非線性優化中最怕的就是外點,因為他會導致其他內點都去遷就他,結果優化效果與真實值的差距自然較大)。此外,公式(1)還利用了資訊矩陣來對不同的特徵點新增權值資訊,最簡單的資訊就是取資訊矩陣為單位陣,即對所有特徵點都一視同仁。可以看見,這都是有一些優化的小技巧在的,縱觀全文,你會發現ORBSLAM2中處處都是優化的細節,簡直到了喪心病狂的地步 - -|。

  在區域性優化和全域性優化的時候,採用的也都是公式(1)的方法,只不過在閉環時為了節省計算時間,採用了pose-graph,即忽略所有點的資訊,只對位姿進行優化。具體的內容後續部落格我會盡量給大家講清楚。

  ORB描述子用於迴環檢測之前,會先利用Bag of word將ORB描述子進行轉換,變成視覺詞彙。在迴環檢測時,只需要比較詞彙之間的相似性,即可判斷機器人是否回到之前經過的地方。當然,這裡還有一些其他的驗證,後續也會給大家慢慢講。

  至此,ORBSLAM2中ORB描述子的使用算是給大家講清楚了,接下來,就開始研究一下ORB描述子到底是怎麼生成的以及為什麼它會如此強大?

                      圖 1

 


 

ORB描述子提取的方法

  如上所說的,視覺SLAM系統中目前主流的是基於直接法或者基於特徵點法。但是目前魯棒性最好的描述子是SIFT描述子,但是提取過程太耗費時間,非常不適用於SLAM這種需要實時執行的系統,而基於SIFT描述子改進的SURF描述子儘管提高了一個數量級的提取效率,但仍然無法滿足SLAM系統的要求。而更快速的FAST關鍵點對光照非常敏感,BRIEF描述子可以很好地利用畫素塊的資訊構成一個具有特異性的描述子,但其對於旋轉不具備不變形。由於現存的大部分描述子要麼因為魯棒性不足,要麼因為提取時間過長等缺陷,因此迫切需要一種在魯棒性和提取時間這種的方案出現,而ORB描述子就是答案。

  ORB發掘了現有的提取效率最快的關鍵點FAST以及描述子BRIEF,並在其原有基礎上進行改進,形成具備尺度不變形和旋轉不變形的ORB描述子。

Fast關鍵點提取

  對輸入影象中每個畫素提取FAST關鍵點,即在當前提取畫素點p的區域性塊中,比較塊中的畫素(1-16)與中心畫素p的灰度差,如圖2所示。

    

                        圖 2

在ORB描述子的文章ORB: an efficient alternative to SIFT or SURF中,使用FAST9來提取FAST關鍵點,即在圖2中的16鄰域中,只要有9個畫素點同時都比中心畫素p小或者大,即認為其是關鍵點,但實際提取過程中這個畫素差是可以新增閾值的。如公式(2)所示。

    

其中t即為閾值,必須滿足畫素差大於某一個值才能定義其為關鍵點。

  為了避免關鍵點扎堆的情況出現,比如桌子邊緣這類地方,會出現整個邊緣佈滿FAST關鍵點。儘管關鍵點某些時候越多越好,但是將較差的部分濾掉,保留較好那部分關鍵點,顯然是更好的選擇,因為這會使得在使用過程中,增加系統的魯棒性。

  FAST中用極大值抑制來篩選出較好的關鍵點,統計關鍵點p1的鄰域中的畫素差總和分數s1,對比相鄰關鍵點之間的差異,即s1和s2,在鄰域內只保留分數最大的關鍵點。

  顯然FAST關鍵點不具有尺度不變形,因此採用了空間金字塔為FAST構建尺度不變性,在每一個尺度下的影象中提取FAST關鍵點。具體在原始碼解析的時候會為大家詳細解讀。

  由於BRIEF描述子不具備旋轉不變性,為了克服這個缺陷,ORB描述子通過計算FAST關鍵點區域性塊的矩來生成旋轉方向(即利用塊中所有畫素y方向上的差值之和與x方向上的差值之和的比值,可以理解成tan(theta) = delta y / delta x):

    

 

BRIEF描述子生成

  BRIEF描述子主要是通過比較中心畫素點p任意鄰域內的256對畫素之間的差值來生成二進位制描述子的。如公式(6)所示,任意一對畫素點p(x)和p(y),若p(x)<p(y),則描述子對應的位置為1,否則置為0。

    

  值得注意的是,很多人看到論文的時候會覺得BRIEF描述子並沒有用到上面FAST生成的灰度質心角度啊。但是參考SIFT描述子,ORB描述子也採用了同樣的方法,在計算描述子的時候,ORB描述子通過旋轉匹配對的位置,再進行計算,因此就使得ORB描述子具備了旋轉不變性。

  通過機器學習的方式隨機選擇多種組合的畫素對,作者通過選擇最好的一組256對畫素點的組合作為ORB描述子的pattern。

  


 

總結

  本文首先介紹了

    ORB描述子在ORBSLAM2中的應用,包括跟蹤階段和迴環檢測時ORB如何使用的;

    ORB描述子的提取方法,包括FAST關鍵點的提取和BRIEF描述子的生成。  

  下一講將會將ORBSLAM2中的ORB描述子提取原始碼分離出來,單獨實現並進行講解。

 

PS:

  如果您覺得我的部落格對您有所幫助,歡迎關注我的部落格。此外,歡迎轉載我的文章,但請註明出處連結。

  對本文有任何問題可以在留言區進行評論,也可以在泡泡機器人論壇:http://paopaorobot.org/bbs/index.php?c=cate&fid=1中的SLAM技術交流模組發帖提問。