淺談SLAM的迴環檢測技術

什麼是迴環檢測?

在講解迴環檢測前,我們先來了解下回環的概念。在視覺SLAM問題中,位姿的估計往往是一個遞推的過程,即由上一幀位姿解算當前幀位姿,因此其中的誤差便這樣一幀一幀的傳遞下去,也就是我們所說的累計誤差。

我們的位姿約束都是與上一幀建立的,第五幀的位姿誤差中便已經積累了前面四個約束中的誤差。但如果我們發現第五幀位姿不一定要由第四幀推出來,還可以由第二幀推算出來,顯然這樣計算誤差會小很多,因爲只存在兩個約束的誤差了。像這樣與之前的某一幀建立位姿約束關係就叫做迴環。迴環通過減少約束數,起到了減小累計誤差的作用。

那麼我們怎麼知道可以由第二幀推算第五幀位姿呢?也許第一幀、第三幀也可以呢。確實,我們之所以用前一幀遞推下一幀位姿,因爲這兩幀足夠近,肯定可以建立兩幀的約束,但是距離較遠的兩幀就不一定可以建立這樣的約束關係了。找出可以建立這種位姿約束的歷史幀,就是迴環檢測。

迴環檢測的意義

有了前端的視覺里程計及後端優化的SLAM系統,似乎已經比較好用了。但其在提高實時性的同時精度卻降低了,一旦精度降低,又會面臨長時間累計誤差的問題,特別是像ORB-SLAM那樣只做局部地圖優化的方案。我們該如何平衡這個矛盾呢?

我們不妨先思考下,在一個陌生的環境中,我們人類是如何進行環境地圖的建立?在局部區域,人不斷的移動從而在腦海中建造增量式地圖,時間長了大部分人也分不清東南西北了,與起始點的關係又如何。假如人正巧回到了之前路過的位置,在對環境足夠敏感的情況下,他就能發現這個事實,從而修正自己之前對方位的判斷。我們說,此時檢測到了一個迴環,顯然,人可以通過面前看到的景象與腦海中殘缺的印象來對比從而檢測到迴環的,對於SLAM來說也可以通過對比當前幀與過去關鍵幀的相似度,如相似度超過某一閥值時就可以被認爲是檢測到迴環。

現在,問題的關鍵就在於如何判斷兩幀圖片的相似度。最直觀的做法是特徵匹配,比較匹配的數量是否足夠多。但由於特徵匹配非常耗時,迴環檢測需要與過去所有關鍵幀匹配,這個運算量是絕對無法承受的。因此,有人提出了詞袋模型,用來加速特徵匹配。

005QQQghzy7oCR3k9Gqda&690

什麼是詞袋模型?

詞袋模型就是把特徵看成是一個個單詞,通過比較兩張圖片中單詞的一致性,來判斷兩張圖片是否屬於同一場景。

爲了能夠把特徵歸類爲單詞,我們需要訓練一個字典。所謂的字典就是包含了所有可能的單詞的集合,爲了提高通用性,需要使用海量的數據訓練。

字典的訓練其實是一個聚類的過程。假設所有圖片中共提取了10,000,000個特徵,可以使用K-means方法把它們聚成100,000個單詞。但是,如果只是用這100,000個單詞來匹配的話效率還是太低,因爲每個特徵需要比較100,000次才能找到自己對應的單詞。爲了提高效率,字典在訓練的過程中構建了一個k個分支,深度爲d的樹,如下圖所示。直觀上看,上層結點提供了粗分類,下層結點提供了細分類,直到葉子結點。利用這個樹,就可以將時間複雜度降低到對數級別,大大加速了特徵匹配。

使用DBoW3庫訓練及使用詞典

DBoW3庫爲我們提供了非常方便的訓練詞典和使用詞典的方法。

訓練詞典時,只需要把所有訓練用的圖片的描述符傳給DBoW3::Vocabulary的create方法就可以了。訓練好的詞袋模型保存在vocabulary.yml.gz文件中。

005QQQghzy7oCR5pXUS1a&690接下來,使用訓練好的詞袋模型對圖片計算相似性評分。DBoW3爲我們提供了兩種計算相似性的方式,第一種是直接對兩張圖片比較;第二種是把圖片集構造成一個數據庫,再與另一張圖片比較。
005QQQghzy7oCR6ZhbP79&690

005QQQghzy7oCR8cSOZ31&690005QQQghzy7oCR8cSOZ31&690

可以看出,圖片越相似,評分越接近1。我們可以根據這個評分來判斷兩張圖片是否是同一場景。但是直接給定一個絕對的閾值並不合適。通常,如果當前幀與之前某幀的相似度超過當前幀與上一個關鍵幀相似度的3倍,就認爲可能存在迴環。不過,這種做法要求關鍵幀之間的相似性不能太高,否則無法檢測出迴環。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章