圖像搜索三-局部特征SIFT
基於全局特征的傳統特征對圖像的精細識別能力都不強,即強調魯棒性大於區分性,這對我們實際應用,尤其是追求同款的應用非常不利;一般有兩種方式來避開全局性特征的不利,一是從局部出發,即點特征,二是采用多個局部來確定整體,即點集。
SIFT介紹
SIFT的出現是圖像特征描述子研究領域一項里程碑式的工作,該算法的實質是在不同的尺度空間上查找關鍵點(特征點),並計算出關鍵點的方向。SIFT所查找到的關鍵點是一些十分突出,不會因光照,仿射變換和噪音等因素而變化的點,如角點、邊緣點、暗區的亮點及亮區的暗點等,這種點數量豐富,而且具有強大的不變性(如平移、縮放、旋轉和光照等),非常適合在拍照情況下進行匹配。
當然,SIFT特征的抽取過程也很復雜,充分體現了由人工定義規則的精美和細致(與非人工/智能相對而言),我們可以簡單的划分為如圖所示的幾個步驟:
尺度空間理論目的是模擬圖像數據的多尺度特征,尺度空間使用高斯金字塔表示。尺度規范化的LoG算子具有真正的尺度不變性,使用LoG能夠很好地找到圖像中的興趣點,但是需要大量的計算量,所以Lowe使用DoG圖像的極大極小值近似尋找特征點。
極值點的尋找
在實際計算時,使用高斯金字塔每組中相鄰上下兩層圖像相減,得到高斯差分圖像,進行極值檢測。關鍵點是由DoG空間的局部極值點組成的,關鍵點的初步探查是通過同一組內各DoG相鄰兩層圖像之間比較完成的。為了尋找DoG函數的極值點,每一個像素點要和它所有的相鄰點比較,看其是否比它的圖像域和尺度域的相鄰點大或者小。中間的檢測點和它同尺度的8個相鄰點和上下相鄰尺度對應的9×2個點共26個點比較,以確保在尺度空間和二維圖像空間都檢測到極值點,達到良好的尺度不變性;下圖表示了金字塔的建立過程以及差分檢測的示意:
以上方法檢測到的極值點是離散空間的極值點,需要通過擬合三維二次函數來精確確定關鍵點的位置和尺度,同時去除低對比度的關鍵點和不穩定的邊緣響應點(因為DoG算子會產生較強的邊緣響應,這一步本質上要去掉DoG局部曲率非常不對稱的像素),以增強匹配穩定性、提高抗噪聲能力。
接下來,要在檢測到的關鍵點基礎上得到特征描述子,如下圖所示:
極值點的方向性
為了使描述符具有旋轉不變性,需要利用圖像的局部特征為給每一個關鍵點分配一個基准方向。使用圖像梯度的方法求取局部結構的穩定方向。在完成關鍵點的梯度計算后,使用直方圖統計鄰域內像素的梯度和方向。梯度直方圖將0~360度的方向范圍分為36個柱(bins),其中每柱10度。直方圖的峰值方向代表了關鍵點的主方向,(為簡化,圖中只畫了八個方向的直方圖)
通過以上步驟,對於每一個關鍵點,可以得到三個信息:位置、尺度以及方向。接下來就是為每個關鍵點建立一個描述符,用一組向量將這個關鍵點描述出來,使其不隨各種變化而改變,比如光照變化、視角變化等等。這個描述子不但包括關鍵點,也包含關鍵點周圍對其有貢獻的像素點,並且描述符應該有較高的獨特性,以便於提高特征點正確匹配的概率。
SIFT描述子是關鍵點鄰域高斯圖像梯度統計結果的一種表示。通過對關鍵點周圍圖像區域分塊,計算塊內梯度直方圖,生成具有獨特性的向量,這個向量是該區域圖像信息的一種抽象,具有唯一性。
特征向量形成后,為了去除光照變化的影響,需要對它們進行歸一化處理,對於圖像灰度值整體漂移,圖像各點的梯度是鄰域像素相減得到,所以也能去除。得到的描述子向量為歸一化后的特征向量。同時非線性光照,相機飽和度變化對造成某些方向的梯度值過大,而對方向的影響微弱。因此設置門限值(向量歸一化后,一般取0.2)截斷較大的梯度值。然后,再進行一次歸一化處理,提高特征的鑒別性。
通過以上各步驟后,最終對每個feature形成一個448=128維的描述子,每一維都可以表示4*4個格子中一個的scale/orientation,這個特征就是我們需要使用的神通廣大的SIFT特征。
看到上述簡化后的步驟,估計不熟悉的諸位,也會頭暈腦大;其實這些步驟也是使用統計直方圖+最大值等最通用的原理得到,也會遵循Code+pooling的路線。
索引及查詢過程
索引及查詢過程:基於局部特征的圖像搜索系統的整體流程如下圖所示,其中左邊為離線流程,右邊為在線過程.
Pooling:這個過程主要是把不定數量的特征向量投影到固定維數的向量空間去,同時保留向量相似度能代表原始圖像的相似度,最常用的算法有BOW(Bag of Word),VLAD,SCP以及我們使用的LLC(Locality-constrained Linear Coding)。其過程如下圖,其中左邊是基於SC的過程,右上是LLC與兩者的區別,與VQ相比,引入軟件量化,即一對多而不是一對一的量化,減少誤差,與SC相比主要體現在引入了locality的約束,即不僅僅是sparse要滿足,非零的系數還應該賦值給相近的dictionary terms;
同時,如果碼本空間足夠大,那么得到的pooling向量就會比較稀疏,而稀疏特征又有很多好處,如
- 已經提到過的重建性能好;
- sparse有助於獲取salient patterns of descripors;
- image statistics方面的研究表明image patches都是sparse signals;
- biological visual systems的研究表明信號的稀疏特征有助於學習;
- 稀疏的特征更加線性可分等,所以大家可以看到,以后的高維特征數不勝數,DL等得到的特征也經常是稀疏的。
在Pooling上,LLC選用的是最大值而不是均值,同時作了L2歸一,其過程可見右下圖(大家是不是很眼熟,這個過程圖怎么與CNN這么像啊?事實上正是,各特征提取手段千變萬換,其實最基本的過程都有相似性的)。
在線精確搜索重排:在通過相似檢索(主要為了保證召回)后得到TopK的結果以后,為了更精確的得到結果,需要進行精確匹配並去噪重排,其大致過程有4個步驟:
1.距離匹配
我們需要以輸入Query圖的特征點去匹配相似搜索的結果(比如Top1K),這個過程運算量其實也非常大(比方說Query圖有200個點,目標圖有1000 * 200個點,每個點維度為128【未優化】,使用歐氏距離來匹配,運算量可以估計出來);我們在三方面進行了優化,一是如先所說特征本身的優化(包括維度、點數、數值范圍等),二是距離計算采用指令優化,三是可以使用量化算法來降低匹配數據量,如下圖
在上圖的左邊,根據全量化碼本,我們在離線處理中為每個圖都建立一個微型量化索引;在在線的時候,首先為Query中的每一個特征點與碼本進行一次比較,得到排序的碼本中心,然后根據這個序列,對每張候選圖中的點從近到遠進行比較,當比較點數量達到總點數量的一定比例(如10%)時,停止比較,得到最近的點即為有效點。通過這種方法可以將距離運算量降低一個數量級,同時召回在0.93以上。
要注意的是,距離最近的點對必須是相互的才有效,即你離我最近,同時我離你也最近;
2.匹配對選取
並不是所有的匹配對都是真正有效的對,雖然你離我是最近,但這個最近也非常遠,則需要拋棄掉;比較實際的方法是,將最近的和最遠的距離值取出來作為基准空間,然后選取離最近一定范圍內的比例作為候選點集;
3. 去噪
以上方法得到匹配集,大部分都是噪聲匹配,因為該匹配沒有考慮空間位置,因此會存在誤匹配。
去噪的算法也有好幾種,其中比較經典的是RANSAC算法,但是該算法使用全局迭代的邏輯,效率很難達到要求,一對圖需要秒級的消耗,在實際中難以應用,因此為了提高匹配的精度,我們通過另一種快速的方式,即空間校驗的方法來去除誤匹配。該空間匹配算法利用SIFT特征的位置,角度和尺度信息來濾除不兼容的匹配點。對待查詢圖像和目標圖像的每一對匹配點,將圖像坐標歸一化到各自特征對應的角度和尺度,然后對空間進行划分來濾除不匹配的點。下圖表示以點2的特征為基准的坐標歸一化,其中紅色箭頭表示特征的角度,紅色圓表示特征的尺度。如下圖,由於點5的相對坐標位置在兩幅圖中發生了變化,其會被濾除。
待查詢圖像 目標圖像
4.相似分計算
最后剩下的匹配點對,才可以參與相似分的計算,這個分采用倒數開方相加的方法得到。
SIFT一經提出,就迅速成為局部特征描述的主流,在部分拷貝圖像檢索、剛體檢索中發揮了巨大的作用,並在此基礎上擴展了各種其它描述子,如SURF、Color-SIFT、Affine-SIFT、Dense-SIFT、PCA-SIFT、Kaze等,各有優缺點,大家可以搜索之。
但局部特征也有不少缺點:
- 速度相對比較慢,對空間要求大,在線和離線壓力大;
- 對非常模糊、光滑的物體抽取不出特征,或特征量過少;
- 變形過大(如褶子非常多的衣服),背景噪聲過多,抽取的特征本身也是噪聲點的概率大;
- 局部特征本身是從底向上的特征,反應的是圖像局部的信息,對上層抽象、圖像全局能力描述不夠(如我們想搜一種“短袖、圓領的T恤”這種概念無法做到)
知識儲備
角點
尺度規范化的LoG算子
Lowe使用DoG圖像
高斯差分圖像
擬合三維二次函數
圖像灰度
歸一化處理
非線性光照
相機飽和度
coding+pooling線路
BOW(Bag of Word),VLAD,SCP以及我們使用的LLC(Locality-constrained Linear Coding)
sparse
匹配與選取
RANSAC
相似分計算
SURF、Color-SIFT、Affine-SIFT、Dense-SIFT、PCA-SIFT、Kaze