KCF再理解記錄

2021-09-06 20:29:48 字數 3589 閱讀 1219

**        yaqilyu  知乎文章    niubility的相關濾波框架詳解

接下來將封閉解變換到傅利葉域,結合迴圈矩陣的特性將樣本集進行化簡,得到最終的封閉解:

其實迴圈移位的樣本集是隱性的,並沒有真正產生過,只是在推導過程中用到了,所以我們也不需要真正的記憶體空間去儲存這些樣本。

在舉個簡單例子,100*100的檢測塊,目標中心位於邊緣附近(20,20)位置,在檢測過程中會持續迴圈移位並與濾波模板比較,只有當目標移位到中心時響應最大,這個最大值會寫入響應圖(20,20)位置。

此外,作者發現如果給嶺回歸加入kernel-trick,也可以推導出封閉解,推薦是高斯核。至此,csk演算法就成型了。總結一下,如果是100*100的影象塊,經過傅利葉變換和幾個簡單的元素級點乘計算,事實上已經完成了10000個樣本的訓練和10000個樣本的檢測,複雜度由o(mn*mn)降低到了o(mn*log(mn)),m和n是影象的高乘寬,也就是說csk的複雜度與影象塊的畫素點總數有關,padding大小會影響複雜度。迴圈移位生成的近似樣本集結合fft以近乎恐怖的方式降低了計算量,但是,這種近似以引入邊界效應為代價,再但是,即使存在邊界效應kcf/dcf依然碾壓了struck。接下來,再看幾個視覺化結果,依次是某些幀的檢測響應,模板權值和跟蹤結果:

首先看第二列的分類器引數,和前面的分析一致,視覺化的模板權值就是跟蹤目標的內容(模子,建模成功)。相關響應在理想情況下呈現單峰,與訓練時的期望高斯圖比較類似,有遮擋或在變形嚴重(模板對不上號)時會呈現多峰。

同一時期,martin danelljan大牛(林雪平大學,這個名字還會出現很多很多次)用多通道顏色特徵color names(cn)去擴充套件csk得到了不錯的效果,演算法也簡稱cncoloring visual tracking。將rgb的3通道影象投影到11個顏色通道,分別對應英語中常用的語言顏色分類,分別是black, blue, brown, grey, green, orange, pink, purple, red, white, yellow (對比漢語中常用的語言顏色分類:赤橙黃綠青藍紫+黑白灰,英語和漢語對顏色的認知還是略有差異的),並歸一化得到10通道顏色特徵。作者還測試了多種顏色特徵在相關濾波中的效果,發現cn最好,其次是lab。下面是hog特徵和8個cn特徵通道視覺化的影象,隨便畫的隨便看看:

接下來是cn的效能,作者選了41個彩色序列(25%灰度序列的otb表現不出彩色特徵方法的優勢)進行比較,簡單來說也是全面領先struck,10通道cn特徵的fps是78.9,壓縮後兩通道cn2特徵的fps是105,但這裡需要強調一點,**中的幀率fps是和作者電腦的配置密切相關的,martin danelljan大神的電腦配置比較差演算法普遍幀率低很多,這裡我們以吳毅老師的電腦為參考,固定struck為20fps,其他演算法都換算到這個標準去比較,結果如下:csk(362fps), kcf(172fps), dcf(292fps), cn(152fps), cn2(202fps)。(後面其他演算法類似,如dsst是53.6fps

hog是梯度特徵,而cn是顏色特徵,兩者可以互補,所以hog+cn在近兩年的跟蹤演算法中成為了hand-craft特徵標配。最後,再回到kcf/dcf的實驗結果,討論兩個問題:

第一,hog,作者用了hog的快速演算法fhog,來自piotr's computer vision matlab toolbox,c**而且做了sse優化。如對fhog有疑問,請參考**object detection with discriminatively trained part based models第12頁。 第二,hog特徵常用cell size是4,這就意味著,100*100的影象,hog特徵圖的維度只有25*25=625畫素點,而raw pixels是灰度圖歸一化,維度依然是100*100 = 10000畫素點,我們簡單算一下:27通道hog特徵的複雜度是27*625*log(625) = 47180,而單通道灰度特徵的複雜度是10000*log(10000) = 40000,

結果也是相差不多,符合**(不知道這種演算法對不對,如果有誤請指出,謝謝)。

看**你會發現,作者在擴充套件後目標區域面積較大時,會先對提取到的影象塊做因子2的下取樣,到50*50 = 2500畫素點,這樣複雜度就變成了2500*log(2500) = 8495,下降了非常多。那你可能會想,如果下取樣再多一點,複雜度就更低了,但這是以犧牲跟蹤精度為代價的,再舉個例子,如果影象塊面積為200*200,先下取樣到100*100,再提取hog特徵,解析度降到了25*25,這就意味著響應圖的解析度也是25*25,也就實說,響應圖每位移1個畫素,原始影象中跟蹤框要移動8個畫素,這樣就降低了跟蹤精度。在精度要求不高時,你完全可以稍微犧牲下精度提高幀率(但真的不能再下取樣了~)。

大部分人都會認為kcf效果超過dcf,而且各屬性的準確度都在dcf之上,然而,如果換個角度來看,以dcf為基準,再來看加了kernel-trick的kcf,mean precision僅提高了0.4%,而fps下降了41%,這麼看是不是挺驚訝的呢?除了影象塊畫素總數,kcf的複雜度還主要和kernel-trick相關。所以,下文中的cf方法如果沒有kernel-trick,就簡稱基於dcf,如果加了kernel-trick,就簡稱基於kcf(請注意區分其他方法有沒有加核)。當然這裡的cn也有kernel-trick,但請注意,這是martin danelljan大神第一次使用kernel-trick,也是最後一次。。。

可能會有這樣的疑問,kernel-trick這麼強大的東西,怎麼才提高這麼點?這裡就不得不提到winsty的另一篇大作:

一句話總結,別看那些五花八門的機器學習方法,那都是虛的,目標跟蹤演算法中特徵才是最重要的。(若有曲解,以**為準)所以對於那些僅簡單修改機器學習方法而不關注如何減小邊界效應的相關濾波,也許可能大概會有效果,但在這裡我一律不做評價討論(如果您有不同看法,非常歡迎討論),我更加關心那些速度比較快或者對邊界效應處理的比較有效的方法。

以上就是前三個首先推薦的高速演算法,csk, kcf/dcf和cn,區別主要在於有沒有kernel trick和用什麼特徵(灰度畫素,fhog,color names)!當然任性組合也是沒有問題的。

大佬寫的很好,留著。

再理解敏捷

2009年1月24日 2008年春,專案做的對敏捷有了點興趣,花了兩個晚上瀏覽了 敏捷迭代開發 管理者指南 理念式的書,看起來比較輕鬆,摘錄一些自己的體會。有些需求在開始的時候是提不出來的,或者說沒法細化的,強行的過渡需求分析是浪費時間的行為,到後來多半還是要改。瀑布 其實royce大大提出的瀑布模...

遞迴再理解

其實關於遞迴,我也是比較模糊的,至今能理解和能用的遞迴演算法,基本是靠記憶和經驗,要是讓我自己設計乙個遞迴,估計又得難半天,很早都想總結一下,喜歡瀏覽技術網 站,總是能找到好東西,現在將遞迴演算法總結如下,也不是多麼深刻,多麼高大上,可以說還是拙見吧 定義遞迴演算法 基本思想 那麼什麼是遞迴演算法呢...

關於KCF的幾個問題個人理解

本文目的把自己閱讀過程中遇到的問題和最後的理解記錄下,方便以後回顧,關於主要公式不再進行推倒公式.1.特徵的表達,很多人對迴圈矩陣中x的第一行小x不是很清楚,個人的理解是其可能是目標區域正樣本的特徵,或者是目標上下左右移動後負樣本的特徵,樣本的特徵在 中可能是二維或者三維,實際你可以理解為一維。2....