特征提取
特征的種類在圖像領域主要分為點,線,面。線特征和面特征對圖像信息利用得更多,因而其分辨性更高。但遺憾的是,由於線特征和面特征提取的條件比較苛刻,因此在實際應用中並不廣泛。(盡管在SLAM中也有點線結合的實例,在圖像紋理較弱的情況下,線特征可以發揮更大的用處。但是卻是在增加計算量的同時,提高的性能較為有限。)隨着深度學習在圖像方面的不斷提升,基於全圖學習得到的特征向量性能不斷提高,甚至超越了手工設計的特征點。這也是前面所說的,由於對圖像信息利用得更加全面,才使得特征向量的識別性能越來越好。
在視覺SLAM中,特征主要還是用點特征。
>> 點特征主要分為兩大類:
- 基於手工設計的特征點:這類特征點主要是憑借人們對幾何學以及數學上的一些認識,對圖像中的某一塊特殊區域進行建模得到描述函數。典型的比如SIFT,利用差分高斯金字塔計算圖像中比較特殊的點,再通過該點的領域信息對其進行描述,得到最終的描述函數。
- 基於深度學習得到的特征向量:這類特征點主要是對深度學習網絡進行設計,使其通過多個卷積和池化操作來取得圖像中比較有用的信息。說起來是比較抽象的,個人理解,深度學習雖然看起來是個大箱子,但是實際上,各個卷基層都是一個函數 $f_{i}(x)$,最終的輸出就是多個復合函數的函數值 $G = f_{N}(f_{N-1}(...f_{1}(x)...))$。前期的網絡設計主要是模仿手工描述子的計算步驟,各個卷基層的操作與手工描述子並無二致。后期的主要是為了利用更多的圖像信息,彌補了手工描述子的不足。(這類網絡的設計通常是將手工設計的特征點圖塊作為訓練集,輸入到網絡中進行訓練)。
>>
不同點特征的區別:
特征點實際上包含兩種類型:
- 一種是只有關鍵點(interested point),典型的如FAST這類角點;
- 還有一類就是基於角點的位置,利用其鄰域信息對其進行描述,得到描述子,SLAM中常用的主要是這類描述子,比如SIFT, SURF, ORB等。
>>
特征提取的缺陷:
直接對圖像提取特征點,通常會出現特征點扎堆的現象。顯然,對於圖像紋理多的地方,特征點自然會提取得多。這導致的結果便是,圖像某一塊位置提取到的特征點特別多,而其他區域提取到的點特別少,甚至是沒有。這在實際應用當中會導致估算相對姿態變換出現較大的偏差,影響定位精度。這是我們極力要避免的。
>>
特征提取的小技巧:
通過對圖像進行分塊,對不同圖像子塊提取特征點,可以解決特征點分布不均勻的問題。
以ORB-SLAM中提取ORB特征點為例:
- 圖像 $I$ 划分成 $4$ 個區域 ${s_1, s_2, s_3, s_4}$,對每個區域提取特征點;
- 將子圖 ${s_1, s_2, s_3, s_4}$ 各自划分成 $4$ 個區域,現在我們總共有 $16$ 個子圖,將步驟 $1$ 中提取的特征點按區域進行分配;
- 對於存在不止一個特征點的子圖,進一步進行划分,直到限制的最小子圖時停止。若此時特征點數量仍然較多,則根據響應值,取最大的特征點;
- 若步驟 $1$ 中,各個子圖中提取的特征點數量較少,則需要通過調整閾值條件,來提高特征點的數量。
- 步驟 $1-3$ 可以通過不斷遞歸來完成。
PS: 筆者自己實現了一個簡單的特征提取函數,但是並沒有利用遞歸對圖像進行更加精細的划分。只是簡單的划分成幾個區域,對各自區域進行提取。歡迎參考。