1.回環檢測
首先,在視覺SLAM問題中,位姿的估計是一個遞推的過程,也就是由上一幀位姿解算當前幀位姿,所以我們的位姿約束都是與上一幀建立的,但是每一次估計位姿都有誤差,隨着位姿遞推的進行,誤差也在不斷的累計位姿,也就形成了我們所說的累計誤差,這樣將會導致長期估計的結果不可靠,或者說,我們無法構建全局一致的軌跡和地圖。

如圖(《視覺SLAM十四講》)當我們只進行VO時,我們最終得到的運動軌跡無法避免的出現了漂移現象,得到了一條錯誤的軌跡,這顯然是我們無法接受的。而回環檢測就是針對這一問題而出現的。
回環檢測的關鍵,就是如何有效地檢測出相機經過同一個地方這件事。這將使得我們長時間估計位姿時誤差得以減小。如果我們能 夠成功地檢測這件事,就可以為后端的 Pose Graph 提供更多的有效數據,使之得到更好的估計,特別是得到一個全局一致(Global Consistent)的估計。並且回環檢測提供了當前數據與所有歷史數據的關聯,在跟蹤算法丟失后,我們還可以利用重定位。
回環檢測的方法(如何檢測回環是否發生)
(1)最簡單的方法:對任意兩個關鍵幀進行特征匹配
(2)基於里程計的方法
(3)基於外觀的方法
這里我們重點介紹基於外觀的方法,因為相較其他兩種方法,基於外觀的方法優點更加突出,更被人普遍接受,是目前回環檢測中的主流方法。
基於外觀的方法,它和前端、后端的估計都無關,僅根據倆副圖像的相似性確定回環檢測關系,這種做法擺脫了積累誤差,使回環檢測模塊成為SLAM一個相對獨立的模塊。
首先,在這里,需要明確的一點是我們不能采用讓兩個圖像直接相減,然后取某種范數。因為像素灰度是一種不穩定的測量值,它嚴重受環境光照和相機曝光的影響。假設相機未動,我們打開了一支電燈,那么圖像會整體變亮一些。這樣,即使對於同樣的數據,我們都會得到一個很大的差異值。 另一方面,當相機視角發生少量變化時,即使每個物體的光度不變,它們的像素也會在圖像中發生位移,造成一個很大的差異值。
在基於外觀回環檢測算法中,核心問題是如何計算圖像間的相似性。比如對於圖像A和圖像B,我們要計算它們之間的相似性分:s(A,B)。這個評分會在某個區間內取值,當它大於一定量后我們認為出現了一個回環。
在這里引出感知偏差(Perceptual Aliasing) 和感知變異(Perceptual Variability)兩個概念。
准確率和召回率
回環檢測的結果分類

其中假陽性又稱為感知偏差,假陰性稱為感知變異。真陽性(True Positive)簡稱TP,假陽性稱為(False Positive)簡稱FP。顯然,我們都希望所有的結果中FP和FN盡可能要低。對於某特定算法,我們可以統計它在某個數據集上的TP、FP、FP、FN的出現次數,並統計倆個統計量:准確率Presicion=TP/(TP+FP)和召回率Recall=TP/(TP+FN)。
從上述公式可以得到,准確率描述的是,算法提取的所有回環中確實是真實回環的概率。而召回率是說在所有真實回環中被正確檢測出來的概率。
我們發現一個現象就是Precision和Recall通常是矛盾的:
P高則R低
R高則P低
由於在這里我們針對的是SLAM,而在SLAM中我們對准確率要求更高,而對召回率則可以進行適度的犧牲。
2.詞袋模型
詞袋( Bag-of-Words(BoW)),目的是用“圖像上有哪幾種特征”來描述一個 圖像。例如,如果某個照片,我們說里面有一個人、一輛車;而另一張則有兩個人、一只狗。根據這樣的描述,可以度量這兩個圖像的相似性。
字典
字典中的每個元素可以看作相鄰特征點的集合,我們就將這一問題轉化成了一個聚類問題,采用K-means均值來做:
1. 隨機選取 k 個中心點:c1,...,ck;
2. 對每一個樣本,計算與每個中心點之間的距離,取最小的作為它的歸類;
3. 重新計算每個類的中心點;
4. 如果每個中心點都變化很小,則算法收斂,退出;否則返回 1。
詞袋對特征的聚類:
·特征聚類形成Word
·許多Word組成了Dictionary
·圖像的相似性=Word的相似性
·只看Word的有無,無視Word的順序
K-means存在小問題,就是:需要指定聚類數量,隨機選取中心點等。
為了解決這個問題,我們使用一種K叉樹來表達字典。假定我們構建一個深度為d、每次分叉為k的樹,那么做法如下:
1. 在根節點,用 k-means 把所有樣本聚成 k 類(實際中為保證聚類均勻性會使用 k-means++)。這樣得到了第一層。
2. 對第一層的每個節點,把屬於該節點的樣本再聚成 k 類,得到下一層。
3. 依此類推,最后得到葉子層。葉子層即為所謂的 Words。
這樣一個 k 分支,深度為 d 的樹,可以容納 kd 個單詞。另一方面,在查找某個給定 特征對應的單詞時,只需將它與每個中間結點的聚類中心比較(一共 d 次),即可找到最 后的單詞,保證了對數級別的查找效率。
3. 相似度計算
原則上通過之前的步驟,我們得到了很多Word,我們似乎已經可以比較Word了,也就是可以計算圖像相似度。但是我們會發現我們對於所有的Word都是“一視同仁”的。但是我們知道,一些Word是常見的,另一些則很罕見。我們希望對單詞的區分性或重要性加以評估,給它們不同的權值以起到更好的效果。
針對上述問題,這里引入TF-IDF(Term Frequency-Inverse Document Frequency):
思路:單詞在字典中出現頻率越高,則區分度越低/在圖像中頻率越高-則分類圖像時區分度越高
IDF部分可在字典訓練過程中計算
TF部分則需要對圖像的特征進行計算
IDFi = log n ni
另一方面,TF 部分則是指某個特征在單個圖像中出現的頻率。假設圖像 A 中,單詞 wi 出現了 ni 次,而一共出現的單詞次數為 n,那么 TF 為:
TFi = ni n
於是 wi 的權重等於 TF 乘 IDF 之積:
ηi = TFi ×IDFi.
考慮權重以后,對於某個圖像 A,它的特征點可對應到許多個單詞,組成它的 Bag-ofWords:
A = {(w1,η1),(w2,η2),...,(wN,ηN)} ∆ = vA.
由於相似的特征可能落到同一個類中,因此實際的 vA 中會存在大量的零。無論如何, 通過詞袋,我們用單個向量 vA 描述了一個圖像 A。這個向量 vA 是一個稀疏的向量,它 的非零部分指示出圖像 A 中含有哪些單詞,而這些部分的值為 TF-IDF 的值。
接下來的問題是:給定 vA 和 vB,如何計算它們的差異呢?這個問題和范數定義的方 式一樣,存在若干種解決方式,比如 [102] 中提到的 L1 范數形式:
s(vA −vB) = 2
N ∑ i=1
|vAi|+|vBi|−|vAi −vBi|
若想要進行實踐,可以參考《視覺SLAM十四講》回環檢測部分,這里就不加以敘述了。
