版权声明:本文为博主原创文章,转载请注明出处。
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 的最小均方差的解:
先给出循环矩阵的作用:根据循环矩阵能够被离散傅里叶矩阵对角化,使得矩阵求逆转换为特征值求逆的性质;能够将问题(2)转换到频域进行运算,应用离散傅里叶变换(DFT)提高运算速度,然后再将解逆变换回空域从而得到响应最大的解 ymax 。
这就是本算法的最重要的地方,我们也可以类比MOSSE算法中的相关滤波器的作用,两者是相通的。
循环矩阵X的构造是每一行由基样本(base sample)x的循环偏移向量组成,如下:
%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 :
上述仅是线性问题的求解,作者在文中进行了非线性问题的解的拓展,即引入了核来将问题扩展到非线性空间。核技巧在SVM中应用最广,这里不具体展开,有不少博客和书籍写得不错。
上述问题的回归系数 w 用x和对偶空间 α 的线性组合表示如下:
根据上述的理论分析,我们可以给出KCF算法的pipeline:
KCF算法是近年来相当流行和高速的跟踪算法,其与相关滤波器也有这本质上的联系,非常值得学习,这篇算法很大一部分都是拾人牙慧,不过是想用自己的思路再梳理一边,感谢其他博主的贡献。在下篇DSST算法中,我将对两者的细节之处进行对比,其实作者也在文中末尾提到了两者的区别,但是还想说几句。学习了一阵算法后愈发觉得数学的重要性,这些简洁和神奇的idea着实令人惊奇和着迷。