一個相關濾波跟蹤的簡單教程(附實現demo)
因為最近在做目標跟蹤相關的領域,系統的了解了一下相關濾波,自己做了一個實現KCF的小demo,分享給大家,代碼在我的repository:
xfmao/Visual_Tracking_api
直接clone我的項目,運行 tutorials 文件夾下的 Kernelized Correlation Filters.ipynb 文件
用python notebook是為了更好的把可視化結果呈現給大家,這個教程是KCF的最簡單實現,我沒有使用任何手工(HOG,Haar)或者Deep的特徵,而是直接用了像素值。中間沒有任何boundbox的大小旋轉變化,而只是預測一個位置(x,y值)。所以,我只是把最純粹最原始的KCF展示給大家。
原版的代碼是用matlab寫的,而我用更加輕便的python來實現
—————————————————————————————————————————
需要的庫:
都是常用的幾個庫:matplotlib,numpy,scikit-image
編譯環境:
python 2.7
引子
在開始實驗之前,我們用一維的數據來介紹一下相關濾波的用途。
假設有這麼一串數,我們要跟蹤的目標是5這個數
過了一段時間,數字5往右運動了,於是變成了這樣
如何讓機器知道5的位置?
通常的想法,取一個模板,遍歷整個數據,這個模板的參數設為w1,w2...,w9,像下面這樣(虛線部分補0,是線性卷積,虛線部分補後面的數,是循環卷積)
再定義一個標籤數組,目標的位置設為1,其他位置設為0
針對循環卷積來講,那麼最終要求解的就是這個:
用機器學習的方法訓練w1,w2...,w9即可,這是一個ridge regression。這個模板對矩陣中第一種模式是最敏感,響應最大的。
此時,這個模板遍歷下一幀數據,很容易就可以判斷,在以下情況會取到最大值:
由此,新的位置就可以得到了。
但是這種方法有一個問題,遍歷是一件很費時間的事,時間複雜度很高,導致演算法無法實時。
有沒有簡化循環卷積的方法?有,快速傅里葉變換。fft可以在傅里葉域把卷積轉換為點積。
演算法的思想可以說就這麼些了,而KCF,就是把fft簡化循環卷積的操作代入到了ridge regression求解當中順便加了個kernel trick,這個分類其實就是一個kernel ridge regression
接下來讓我們把一維推廣到二維的場景,體驗真正的KCF
1.數據可視化
目標跟蹤的任務都是在一些benchmark上做的,諸如VOT,OTB之類。然而這些數據集對於我們的demo太龐大了,所以這裡我只截取了兩張圖,構成一個小序列。那麼總體過程就是在第一張圖上訓練得到模板,然後應用到第二張圖上用模板去檢測。
我用以下代碼來可視化兩張圖片以及對應的groundtruth
輸出:
2.預處理
可以看到這麼大一張圖除了目標所在區域是有用的,其他區域對我們跟蹤沒什麼幫助,如果在演算法中用整張圖去計算,那肯定浪費了很多計算資源,所以我們總是取以目標為中心,儘可能包含目標的一塊區域作為patch,這個patch,作為演算法的輸入:
定義為 x :training image patch,大小:m×n×c(c是通道數)
處理完的圖就是下面這樣子
有了訓練樣本,總得有標籤吧,對於上面這個圖,肯定圖片中心位置,響應是最大的,周圍次之,我們可以用Gaussian-shaped矩陣來表示
定義為 y:regression target ,大小: m*n
中間最亮,概率是最大的,然後亮點相當於二維高斯分布,這裡有一個參數sigma,是控制這個點的大小的。
然後再取出測試圖上的patch,這個test patch,是最後做模板卷積要用的
定義為 z :test image patch,大小 m*n*c
再加一個餘弦窗(為什麼?相關濾波里餘弦窗作用 - LRYUS_HJL的博客 - CSDN博客)
加了餘弦窗以後圖像變成了這樣:
3.開始訓練
首先把圖像轉換到傅里葉域
然後開始計算核矩陣K
這裡面有一大堆的理論推導:
首先是fft簡化後的ridge regression公式:
不用核技巧的的話其實到這就結束了,但是KCF將核技巧融入進去,最後加了Kernel的ridge regression公式:
其中
這個形式也就是高維空間自己和自己做循環卷積
使用rbf核,最後化簡完的高斯核函數:
上面這個公式其他都好理解,就最後一項需要解釋一下,因為高斯核中距離平方打開之後,是有一個-2xx"這一項的,也即-2xX,這個就是循環卷積操作,所以可以直接轉換到傅里葉域來求解。這裡也有一個sigma,這個sigma控制的是高斯核的帶寬,注意區分。
4.用模板來檢測
最後就是在傅里葉域模板和測試圖像相乘的操作,獲得響應圖
輸出:
新的預測位置:
推薦閱讀:
※李宏毅機器學習2016 第二十二講 循環神經網路RNN
※通往無限層神經網路 (1):對於殘差網路(Residual Network)的一種理解方法,與深層網路的訓練
※XGBoost入門系列第一講
TAG:计算机视觉 | 机器学习 | 深度学习DeepLearning |