目标跟踪算法学习笔记之一:KCF
2016-09-15 22:27
381 查看
版权声明:本文为博主原创文章,转载请注明出处。
1.相关滤波器CF(correlation filter)值得学习,值得深入探讨,可以被实际工程所用。
2.我想做个总结,主要想把相关滤波器有关的算法理一下。
好,废话不多说,下面开始,部分内容参考几位博主的文章和作者主页,如下:
http://blog.csdn.net/shenxiaolu1984/article/details/50905283
KCF高速跟踪详解:
http://blog.csdn.net/mhz9123/article/details/51670802
论文作者主页:
http://www.robots.ox.ac.uk/~joao/#
minw∑(f(xi)−yi))2+λ∥w∥2(1)
其中λ是防过拟合的正则化参数。论文描述上述问题的解
w=(XHX+λI)−1XHy(2)
其中XH=(X∗)T,*表示复共轭,T表示转置,X的每一行是xi,上述解的推导有兴趣的可以去了解下。由于该式子不易求解,运算复杂是O(n^2),故作者采用了一个巧妙方法——循环矩阵。
这就是本算法的最重要的地方,我们也可以类比MOSSE算法中的相关滤波器的作用,两者是相通的。
循环矩阵X的构造是每一行由基样本(base sample)x的循环偏移向量组成,如下:
如果用图像形象化描述就是
中间的基样本图像分别左移和右移得到其余的样本,而且循环矩阵所具备的性质正是帮助对式2求解的关键:
1.循环矩阵C(x)可以被DFT矩阵F对角化:
X=Fdiag(x^)FH(3)
其中x^是x的傅里叶变换,F是离散傅里叶矩阵。
DFT矩阵:
F=1K−−√⎡⎣⎢⎢⎢⎢11111ww2w31w2w4w61w3w6w9⎤⎦⎥⎥⎥⎥,w=e−2πi/K(4)
DFT矩阵的性质:
-对称矩阵
-满足FFH=FHF=I
我们可以用matlab试验上述性质:
因此循环矩阵的作用是:将矩阵求逆变换为特征值求逆,从而提高运算速度。
XH=(X∗)T=(F∗diag(x^∗)FH∗)T=(FHdiag(x^∗)F)T=Fdiag(x^∗)FH(5)
这里的圆圈符号,相当于矩阵点乘运算。之后对公式2进行展开:
w=(XX+λI)−1XHy=(Fdiag(x^∗⨀x^)FH+Fdiag(λ)FH)−1XHy=(Fdiag(x^∗⨀x^+λ)FH)−1XHy=(Fdiag(x^∗x^∗⨀x^+λ)FH)y(6)
利用反对角化性质:Fdiag(y)FH=C(F−1(y))得到:
w=C(F−1(x^∗x^∗⨀x^+λ))y(7)
再利用循环矩阵卷积性质:F(C(x)y)=F∗(x)⨀F(y)得到:
F(w)=F(C(x)y)=(x^∗x^∗⨀x^+λ)∗⨀F(y)=x^⨀y^x^∗⨀x^+λ(8)
论文中的分子部分是错误的,但是代码中还是正确的。
这里就是本文的核心,而据此我们可以通过上式逆傅里叶变换得到线性回归系数w。
上述问题的回归系数w用x和对偶空间α的线性组合表示如下:
w=∑iαiψ(xi)
回归问题就转为:
f(z)=wTz=∑i=1nαiψ(xi)ψ(zi)=∑i=1nαiκ(z,xi)(9)
其中κ(z,xi)=ψ(z)ψ(xi)就是核函数,常用的有高斯核、多项式核和线性核,本文中默认用的是高斯核。故将求回归系数w转化为求α。
根据文献8,我们可以得到非线性问题的解:
α=(K+λI)−1y
这里根据文中的定理1结合之前w的推导,可以得到
α^=y^k^xx+λ(10)
其中kxx是核矩阵K=C(kxx)的第一行。
这样对于输入z,同样构造矩阵Kz=C(kxz),kxz就是x和z的核相关,据此我们可以对所有的pathch进行回归检测:
f^(z)=k^xz⨀α^(11)
将响应值f^(z)逆变换回空域,找到最大值对应的patch既是结果。至于如何进行核相关,参见文中第6小节所述。
简述
KCF(High-speed tracking with kernelized correlation filters)算法已经算是一篇非常经典的文章了,而且也被各路大神分析得很详尽了。我打算写这篇分析有两个原因:1.相关滤波器CF(correlation filter)值得学习,值得深入探讨,可以被实际工程所用。
2.我想做个总结,主要想把相关滤波器有关的算法理一下。
好,废话不多说,下面开始,部分内容参考几位博主的文章和作者主页,如下:
http://blog.csdn.net/shenxiaolu1984/article/details/50905283
KCF高速跟踪详解:
http://blog.csdn.net/mhz9123/article/details/51670802
论文作者主页:
http://www.robots.ox.ac.uk/~joao/#
算法描述
算法把跟踪问题抽象为一个线性回归模型的求解,设代表目标图像的输入为z,权重w,输出为f(w)=wTx,目的就是找到f,能够最小化样本xi经分类器模型输出f(xi)和期望回归值yi的最小均方差的解:minw∑(f(xi)−yi))2+λ∥w∥2(1)
其中λ是防过拟合的正则化参数。论文描述上述问题的解
w=(XHX+λI)−1XHy(2)
其中XH=(X∗)T,*表示复共轭,T表示转置,X的每一行是xi,上述解的推导有兴趣的可以去了解下。由于该式子不易求解,运算复杂是O(n^2),故作者采用了一个巧妙方法——循环矩阵。
循环矩阵
先给出循环矩阵的作用:根据循环矩阵能够被离散傅里叶矩阵对角化,使得矩阵求逆转换为特征值求逆的性质;能够将问题(2)转换到频域进行运算,应用离散傅里叶变换(DFT)提高运算速度,然后再将解逆变换回空域从而得到响应最大的解ymax。这就是本算法的最重要的地方,我们也可以类比MOSSE算法中的相关滤波器的作用,两者是相通的。
循环矩阵X的构造是每一行由基样本(base sample)x的循环偏移向量组成,如下:
如果用图像形象化描述就是
中间的基样本图像分别左移和右移得到其余的样本,而且循环矩阵所具备的性质正是帮助对式2求解的关键:
1.循环矩阵C(x)可以被DFT矩阵F对角化:
X=Fdiag(x^)FH(3)
其中x^是x的傅里叶变换,F是离散傅里叶矩阵。
DFT矩阵:
F=1K−−√⎡⎣⎢⎢⎢⎢11111ww2w31w2w4w61w3w6w9⎤⎦⎥⎥⎥⎥,w=e−2πi/K(4)
DFT矩阵的性质:
-对称矩阵
-满足FFH=FHF=I
我们可以用matlab试验上述性质:
%1 diagnolize 对角化 K=5; %dimension of problem x_base=rand(1,K); %generator vector X=zeros(K,K); %circulant matrix for k=1:K X(k,:)=circshift(x_base,[0 k-1]); end x_hat=fft(x_base); %DFT F=transpose(dftmtx(K))/sqrt(K); %转置 得到DFT matrix X2=F*diag(x_hat)*F'; %"‘"指转置共轭,对应于T display(X); display(real(X2));%X=X2 验证X=F*diag(x_hat)*F'性质
因此循环矩阵的作用是:将矩阵求逆变换为特征值求逆,从而提高运算速度。
关键公式推导
根据公式2先求XXH:XH=(X∗)T=(F∗diag(x^∗)FH∗)T=(FHdiag(x^∗)F)T=Fdiag(x^∗)FH(5)
这里的圆圈符号,相当于矩阵点乘运算。之后对公式2进行展开:
w=(XX+λI)−1XHy=(Fdiag(x^∗⨀x^)FH+Fdiag(λ)FH)−1XHy=(Fdiag(x^∗⨀x^+λ)FH)−1XHy=(Fdiag(x^∗x^∗⨀x^+λ)FH)y(6)
利用反对角化性质:Fdiag(y)FH=C(F−1(y))得到:
w=C(F−1(x^∗x^∗⨀x^+λ))y(7)
再利用循环矩阵卷积性质:F(C(x)y)=F∗(x)⨀F(y)得到:
F(w)=F(C(x)y)=(x^∗x^∗⨀x^+λ)∗⨀F(y)=x^⨀y^x^∗⨀x^+λ(8)
论文中的分子部分是错误的,但是代码中还是正确的。
这里就是本文的核心,而据此我们可以通过上式逆傅里叶变换得到线性回归系数w。
核化技巧
上述仅是线性问题的求解,作者在文中进行了非线性问题的解的拓展,即引入了核来将问题扩展到非线性空间。核技巧在SVM中应用最广,这里不具体展开,有不少博客和书籍写得不错。上述问题的回归系数w用x和对偶空间α的线性组合表示如下:
w=∑iαiψ(xi)
回归问题就转为:
f(z)=wTz=∑i=1nαiψ(xi)ψ(zi)=∑i=1nαiκ(z,xi)(9)
其中κ(z,xi)=ψ(z)ψ(xi)就是核函数,常用的有高斯核、多项式核和线性核,本文中默认用的是高斯核。故将求回归系数w转化为求α。
根据文献8,我们可以得到非线性问题的解:
α=(K+λI)−1y
这里根据文中的定理1结合之前w的推导,可以得到
α^=y^k^xx+λ(10)
其中kxx是核矩阵K=C(kxx)的第一行。
这样对于输入z,同样构造矩阵Kz=C(kxz),kxz就是x和z的核相关,据此我们可以对所有的pathch进行回归检测:
f^(z)=k^xz⨀α^(11)
将响应值f^(z)逆变换回空域,找到最大值对应的patch既是结果。至于如何进行核相关,参见文中第6小节所述。
运行流程
根据上述的理论分析,我们可以给出KCF算法的pipeline:总结
KCF算法是近年来相当流行和高速的跟踪算法,其与相关滤波器也有这本质上的联系,非常值得学习,这篇算法很大一部分都是拾人牙慧,不过是想用自己的思路再梳理一边,感谢其他博主的贡献。在下篇DSST算法中,我将对两者的细节之处进行对比,其实作者也在文中末尾提到了两者的区别,但是还想说几句。学习了一阵算法后愈发觉得数学的重要性,这些简洁和神奇的idea着实令人惊奇和着迷。相关文章推荐
- Python OpenCV学习笔记之:Meanshift算法目标跟踪
- <<High-Speed Tracking with Kernelized Correlation Filters>> KCF(核化相关滤波)跟踪算法学习笔记
- KCF目标跟踪算法笔记
- <<High-Speed Tracking with Kernelized Correlation Filters>> KCF(核化相关滤波)跟踪算法学习笔记
- 目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)
- OpenCV学习笔记——Kalman滤波做运动目标跟踪
- 目标跟踪学习笔记_4(particle filter初探3)
- 2014新跟踪算法KCF笔记 --续2
- OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video
- 目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)
- 2014新跟踪算法KCF笔记 --续(代码部分)
- OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video
- [学习笔记]运动目标跟踪
- 2014新跟踪算法KCF笔记 --续(代码部分)
- opencv学习-模板匹配算法(单图像模板匹配和基于模板匹配的目标跟踪)
- 【OpenCV学习笔记 019】SIFT和SURF算法实现目标检测
- 目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)
- 目标跟踪学习笔记_(opencv中kalman点跟踪例子)
- 目标跟踪学习笔记_2(particle filter初探1)
- 目标跟踪学习算法之二:DSST