什麼是迴環檢測?前端
在講解迴環檢測前,咱們先來了解下回環的概念。在視覺SLAM問題中,位姿的估計每每是一個遞推的過程,即由上一幀位姿解算當前幀位姿,所以其中的偏差便這樣一幀一幀的傳遞下去,也就是咱們所說的累計偏差。數據庫
咱們的位姿約束都是與上一幀創建的,第五幀的位姿偏差中便已經積累了前面四個約束中的偏差。但若是咱們發現第五幀位姿不必定要由第四幀推出來,還能夠由第二幀推算出來,顯然這樣計算偏差會小不少,由於只存在兩個約束的偏差了。像這樣與以前的某一幀創建位姿約束關係就叫作迴環。迴環經過減小約束數,起到了減少累計偏差的做用。後端
那麼咱們怎麼知道能夠由第二幀推算第五幀位姿呢?也許第一幀、第三幀也能夠呢。確實,咱們之因此用前一幀遞推下一幀位姿,由於這兩幀足夠近,確定能夠創建兩幀的約束,可是距離較遠的兩幀就不必定能夠創建這樣的約束關係了。找出能夠創建這種位姿約束的歷史幀,就是迴環檢測。優化
迴環檢測的意義spa
有了前端的視覺里程計及後端優化的SLAM系統,彷佛已經比較好用了。但其在提升實時性的同時精度卻下降了,一旦精度下降,又會面臨長時間累計偏差的問題,特別是像ORB-SLAM那樣只作局部地圖優化的方案。咱們該如何平衡這個矛盾呢?圖片
咱們不妨先思考下,在一個陌生的環境中,咱們人類是如何進行環境地圖的創建?在局部區域,人不斷的移動從而在腦海中建造增量式地圖,時間長了大部分人也分不清東南西北了,與起始點的關係又如何。假如人正巧回到了以前路過的位置,在對環境足夠敏感的狀況下,他就能發現這個事實,從而修正本身以前對方位的判斷。咱們說,此時檢測到了一個迴環,顯然,人能夠經過面前看到的景象與腦海中殘缺的印象來對比從而檢測到迴環的,對於SLAM來講也能夠經過對比當前幀與過去關鍵幀的類似度,如類似度超過某一閥值時就能夠被認爲是檢測到迴環。it
如今,問題的關鍵就在於如何判斷兩幀圖片的類似度。最直觀的作法是特徵匹配,比較匹配的數量是否足夠多。但因爲特徵匹配很是耗時,迴環檢測須要與過去全部關鍵幀匹配,這個運算量是絕對沒法承受的。所以,有人提出了詞袋模型,用來加速特徵匹配。class
什麼是詞袋模型?
詞袋模型就是把特徵當作是一個個單詞,經過比較兩張圖片中單詞的一致性,來判斷兩張圖片是否屬於同一場景。
爲了可以把特徵歸類爲單詞,咱們須要訓練一個字典。所謂的字典就是包含了全部可能的單詞的集合,爲了提升通用性,須要使用海量的數據訓練。
字典的訓練實際上是一個聚類的過程。假設全部圖片中共提取了10,000,000個特徵,可使用K-means方法把它們聚成100,000個單詞。可是,若是隻是用這100,000個單詞來匹配的話效率仍是過低,由於每一個特徵須要比較100,000次才能找到本身對應的單詞。爲了提升效率,字典在訓練的過程當中構建了一個k個分支,深度爲d的樹,以下圖所示。直觀上看,上層結點提供了粗分類,下層結點提供了細分類,直到葉子結點。利用這個樹,就能夠將時間複雜度下降到對數級別,大大加速了特徵匹配。效率
使用DBoW3庫訓練及使用詞典方法
DBoW3庫爲咱們提供了很是方便的訓練詞典和使用詞典的方法。
訓練詞典時,只須要把全部訓練用的圖片的描述符傳給DBoW3::Vocabulary的create方法就能夠了。訓練好的詞袋模型保存在vocabulary.yml.gz文件中。接下來,使用訓練好的詞袋模型對圖片計算類似性評分。DBoW3爲咱們提供了兩種計算類似性的方式,第一種是直接對兩張圖片比較;第二種是把圖片集構形成一個數據庫,再與另外一張圖片比較。
005QQQghzy7oCR8cSOZ31&690能夠看出,圖片越類似,評分越接近1。咱們能夠根據這個評分來判斷兩張圖片是不是同一場景。可是直接給定一個絕對的閾值並不合適。一般,若是當前幀與以前某幀的類似度超過當前幀與上一個關鍵幀類似度的3倍,就認爲可能存在迴環。不過,這種作法要求關鍵幀之間的類似性不能過高,不然沒法檢測出迴環。