KCF算法原理筆記

        KCF算法全稱是Kernelized Correlation Filters,是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista提出來的跟蹤算法,這個算法不論是在跟蹤效果還是跟蹤速度上都有十分亮眼的表現。該算法主要使用循環矩陣對樣本進行採集,使用快速傅里葉變換對算法進行加速計算。

第一部分 線性迴歸

Linear regression

       首先介紹一下脊迴歸,線性迴歸函數是f(z)=wTz,給定樣本xi和對應的標籤yi,目標是優化最大平方和誤差來求出參數w,即

       其中λ是正則化參數,來防止過擬合現象的發生,就像深度學習中的那樣。這個函數的通用求解公式是

       其中,矩陣X的每一行對應着一個向量xi,向量y的每一個值對應着yi,I是一個單位矩陣。

       ,每個樣本是一個n*1維的向量

       ,X一共有m個樣本

      

      

      

Cyclic shifts

       爲了簡單說明這種操作,先考慮一個通道,一維信號的情況。考慮一個n*1的向量x來表示一個感興趣區域,把它當作一個基本樣本,我們的目標是用基本樣本(一個正樣本)和通過移位操作來得到的幾個虛假樣本(作爲負樣本)來訓練分類器。我們可以用循環移位算子來模擬這個向量的一維平移操作,用P矩陣來操作,P是n*n的矩陣:

                                                                       

       通過用P矩陣和向量x相乘的方式,我們就可以得到另一個向量,那麼再用P*Px我們就可以再得到一個不同的向量,我們就可以說,通過在x向量前面乘上P的1到n-1次冪,我們能得到n-1個不同的虛假向量,得到新的負樣本,如下圖所示:

       對於二維圖片,經過這種平移操作,可以得到很多張新的圖片,如下圖所示:

 

Circulant matrices

       經過上面的操作,我們只需要給出一個樣本,我們就能生成n個不同的樣本,那麼對於求解脊迴歸問題,我們給出一個基礎向量x=[x1,x2,x3,…,xn]T,然後我們就能得到X了:

       帶入到上面脊迴歸的求解公式,我們就可以計算出w了,是不是很巧妙吶。可是如果進行這種矩陣運算求解還是很複雜,所以怎麼辦吶?一個非常令人震驚的有用的發現出現了,所有的循環矩陣都能夠在傅氏空間中使用離散傅里葉矩陣進行對角化,X相似於對角陣

       其中對應於生成X的向量(就是X的第一行矩陣)x傅里葉變化後的值,=F(x)=,F是離散傅里葉矩陣,是常量

 

Putting it all together

       現在我們發現可以用上面的方式在求X了,上面脊迴歸在傅里葉域的求解方法是這樣的

       然後我們就可以X=帶入上面的公式裏了

注意這裏的分號是點除運算,就是對應元素相除。因爲

 

所以

                                                                                      

       非常簡潔高效的公式,不由得說一句,數學真美!!!

第二部分 非線性迴歸

Kernel trick – brief overview

       對於非線性迴歸問題來說,我們希望找到一個非線性映射函數,使映射後的函數在線性空間下是可分的,那麼對於非線性迴歸問題我們就可以描述爲找到一個迴歸函數,給定樣本xi和對應的標籤yi,目標是優化最大平方和誤差來求出參數w。

       設w由訓練樣本的非線性變換ψ(xi)的線性組合構成:

       記κ(xi,xj)=ψ(xi)ψ(xj),稱爲核函數。所以

       ,k(z)中的第i個元素爲訓練樣本xi和測試樣本z的核函數值。

Fast kernel regression

f(z)是關於z的非線性函數,但卻是關於κ(z)的線性函數,可以使用線性函數的優化方法求解α。

       K是所有訓練樣本的核相關矩陣。如果核函數選擇得當,使得x內部元素順序更換不影響核函數取值,則可以保證K也是循環矩陣。以下核都滿足這樣的條件:

這裏k是核相關矩陣的第一行,表示原始生成向量x0和移位了i的向量xi的核函數。

       兩者都是同一個向量和自身位移結果進行運算。因爲所有涉及到的核函數都只和位移的絕對值有關,所以ki=kN−i,即k是對稱向量。因爲對稱向量的傅里葉變換是實數,有:

Fast detection

       對於第一幀圖像來說,在第一幀標註好的框的周圍劃分一個上下文目標區域,得到訓練樣本和標籤來訓練檢測器,其中訓練集是由上下文目標區域和由其移位得到的若干樣本組成,對應的標籤是根據距離越近正樣本可能性越大的準則賦值的,然後可以得到α。

假設我們要預測第二幀圖中目標的位置,我們就在上一幀框的附近劃分一個感興趣區域,對於這個感興趣區域z,我們對這個感興趣區域進行移位操作,即,其中

                                                                                           

                                                       ,X是循環矩陣,每一行表示的是訓練集x向量

                                                                                         

然後選擇f(zj)值最大的作爲新目標區域,由zj可以知道目標移動的位置。

定義是測試樣本和訓練樣本在覈空間上的核矩陣

       ,ψ(Z)中的每一行代表zj向量,1*n X n*n X n*n=1*n.

      ,因爲是循環矩陣,所以,類似前面的推導,                                                                                                     

第三部分 核相關矩陣快速計算

Dot-product and polynomial kernels

經過上面的推導,我們發現現在我們要計算的部分只有了。

對於內積和多項式核:

對於多項式核:

Radial Basis Function and Gaussian kernels

       對於徑向基核:

       對於高斯核:

第四部分 多通道問題

       首先讓我們來看一下二維特徵怎麼應用到上面的各種公式中去。

       設圖片,假設存在一個函數,使,然後計算核相關矩陣K。

       移位生成的樣本數量一共是m*n個,所以

       其中,是二維傅里葉變換矩陣,是生成塊矩陣K的生成矩陣,是對進行傅里葉變換。

                                                                                    

       論文中在提取目標區域的特徵時可以是灰度特徵,但是使用Hog特徵能夠取得更好的效果,那麼Hog特徵該如何加入前面提到的模型呢?

       Hog特徵是將圖像劃分成較小的局部塊,稱爲cell,在cell裏提取梯度信息,繪製梯度方向直方圖,然後爲了減小光照影響,將幾個cell的方向直方圖串在一起進行block歸一化,最終將所有的cell直方圖串聯起來就是圖像的特徵啦。

那麼,按照傳統的方式一張圖像就提取出一個向量,但是這個向量怎麼用啊?我們又不能通過該向量的移位來獲得採樣樣本,因爲,你想啊,把直方圖的一個bin循環移位有什麼意義啊?

所以論文中Hog特徵的提取是將sample區域劃分成若干的區域,然後在每個區域提取特徵,代碼中是在每個區域提取了32維特徵,即3XnOrients+5,其中nOrients=9就是梯度方向劃分的bin個數,每個方向提取了3個特徵,2個是對方向bin敏感的,1個是不敏感的,另外4個特徵是關於表觀紋理的特徵還有一個是零,表示階段特徵。提取了31個特徵(最後一個0不考慮)之後,不是串聯起來,而是將每個cell的特徵並起來,那麼一幅圖像得到的特徵就是一個立體塊,假設劃分cell的結果是mXn,那麼fhog提取結果就是mXnX31,我們就相當於得到了31張圖片。那麼就可以通過cell的位移來獲得樣本,這樣對應的就是每一通道對應位置的移位,所有樣本的第i通道都是有生成圖像的第i通道移位獲得的,所以獨立的在每一個通道上計算,就可以利用循環矩陣的性質了。

對於線性核來說,求k的公式如下所示,其中xc和xc‘代表每個通道的圖片:

同理對於高斯核來說,公式如下:

以此類推。。。

第五部分 整體代碼和實驗結果

 

從實驗結果可以看出,用hog特徵對跟蹤效果有個非常大的提升。

第五部分 總結

KCF算法引入了hog特徵和核方法,在跟蹤的精度核速度上都取得了非常好的效果,但是KCF也有一些問題,比如它對尺度變化,高度運動和遮擋問題會很敏感。

 

 

 

 

 

 

 

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