2014新跟踪算法KCF笔记

作者的主页:http://home.isr.uc.pt/~henriques/

可以下载到文章和代码,文章的名字叫 High-Speed Tracking with Kernelized Correlation Filters.

这是另外一个,可以下载各种语言的代码  http://www.robots.ox.ac.uk/~joao/circulant/

总结来说,这也是一种Tracking By Detection的跟踪方法,跟TLD,OAB同宗,以跟踪对象为正样本,以周围坏境为负样本,训练一个判别分类器.paper的实验结果显示,kcF(Kernelized Correlation Filter)准确率比StruckTLD都高(paper中提到With HOG features, both the linear DCF and non-linear KCF outperform by a large margin top-ranking trackers, such as Struck [7] or Track-Learn-Detect(TLD) [4], while comfortably running at hundreds of frames-per-second.)。之所以能有这么快的速度,得益于作者巧妙地通过循环偏移构建出了分类器的训练样本,从而使得数据矩阵变成了一个循环矩阵。然后基于循环矩阵的特性把问题的求解变换到了离散傅里叶变换域,从而避免了矩阵求逆的过程,降低了好几个数量级的算法复杂度.

  4.1 样本训练过程实际上是一个岭回归问题,或者叫做正则化最小二乘问题,即

(公式直接从文章截图了)

公式1大家都很熟悉把,回忆一下SVM的原理,我们可以知道,训练的最终目的就是为寻找一组权值W,得到公式2


X,y就是对应的样本和类别.因为考虑到后面要在傅里叶域进行计算,这里来转化一下,给出一个复数情况下的求解结果,其中 XH X 的共轭转置, w w 的共轭。

随着样本数目的增加,直接求解公式3时非常耗时的(因为有求逆计算).这篇作者的贡献就是非常高效的避开了求逆运算,接着看.

(样本循环着移来移去利用了循环矩阵的性质,使得只需要计算循环矩阵的第一行就可以达到计算循环整个矩阵的效果.)

重要思想:All circulant matrices are made diagonal by the Discrete Fourier Transform (DFT), regardless of the generating vector x. 
              任意循环矩阵可以被傅里叶变换矩阵对角化。

4.2 Cyclic shifts(循环偏移)***

(3) 中的样本矩阵 X 如果是一个循环矩阵的话,该式子的计算就会变得容易很多。即,

X=C(x)=x1xnxn1x2x2x1xnx3x3x2x1x4xnxn1xn2x1(4)

其中, x 是矩阵的第一行,整个矩阵式由这一行的循环偏移得到的。那我们假设存在这么一个循环矩阵,看看接下来式 (3) 会变成怎样。首先列出一个循环矩阵拥有的一个性质5如下:

X=FHdiag(x^)F(5)

其中, x 头上的那个小帽 x^ 代表 x 的傅里叶变换, F 是离散傅里叶变换矩阵,即满足 x^=Fx 。这样把式 (5) 代入式 (3) 中得,

w=(FHdiag(x^)FFHdiag(x^)F+λI)1FHdiag(x^)Fy=F1(diag(x^x^)+λI)1diag(x^)Fy=F1diag(x^x^x^+λ)Fy(6)

其中, 代表向量对应元素相乘,然后两边同时左乘 F 得,

w^=x^y^x^x^+λ(7)

至此,我们可以看出通过上述变换后,权重向量 w 的求解变换到了傅里叶变换域,而且计算量大大降低。

为什么能降低计算量,因为可以利用循环矩阵的性质的将许多运算转换成更简单的运算。例如:

XHX=Fdiag(x^x^)FH=C(F1(x^x^))

原始计算量:两个方阵相乘( O(K3) ) 
转化后的计算量:反向傅里叶( KlogK )+向量点乘( K


以上介绍的都是线性回归的情况,如果能引入核函数,分类器的性能将会更好。核函数的引入是把特征空间映射到一个更高维的空间去,这里我们假设这个映射函数为 φ(x) ,则分类器的权重向量变为,

w=iαiφ(x)(8)

这样我们最终要求解的参数就由 w 变为 α ,这里 α={α1,α2,...,αi,...}T 。因为其实我们并不知道核函数映射的高维空间是什么,我们只是知道高维空间下的两个向量的乘积可以通过一个映射函数把其在低维空间下的乘积映射到高维空间,也就是核函数。这里设不同样本之间的乘积的核函数结果组成的矩阵为

Kij=κ(xi,xj)(9)

这样最终的回归函数变为,

f(z)=wTz=i=1nαiκ(z,xi))(10)

直接计算上述函数相对来说是很耗时的,下面还是结合循环矩阵的特性实现一种快速的核函数计算方法。

快速训练

基于核函数下的岭回归的解为6

α=(K+λI)1y(11)

其中, K 核函数矩阵,如式 (9) 所示。如果我们能够证明 K 是循环矩阵,则上式的求解就可以转换到DFT域,即,

α^=y^k^xx+λ(12)

这里, kxx 是核函数矩阵 K 的第一行元素组成的向量。

如果两个向量的元素的次序发生变化不影响最终通过核函数计算的结果,则该核函数构成的矩阵就是一个循环矩阵,像高斯核函数,多项式核函数都是满足上面条件的。

快速检测

上面已经提到直接计算式 (10) 是非常耗时的,快速的解法是像式 (9) 那样,通过构建测试样本和训练样本的核函数矩阵如下,

Kz=C(kxz)(13)

其中, kxz 是这个循环矩阵的第一行组成的向量。这样就可以同时计算基于测试样本 z 的循环偏移构成的所有测试样本的响应,即,

f(z)=(Kz)Tα(14)

注意这里 f(z) 不同于式 (10) ,它是一个向量,由基于base样本 z 不同循环偏移下的响应值组成。根据循环矩阵的性质(如式 (5) 所示),上式变换到DFT域后,

f^(z)=(k^xz)α^(15)

快速计算核函数相关性

到现在为止,只剩下前面部分提到的 kxx kxz 没有阐明如何计算了。首先列出 kxx^' 的计算公式如下,

kxx=g(C(x)x)(16)

其中, g(x) 是核函数, C(x) 是基于 x 为第一行的循环矩阵。参考式 (5) 所示循环矩阵的特性,代入上式得,

kxx=g(F1(x^x^))(17)

所以,对于多项式核函数,其计算公式如下,

kxx=(F1(x^x^)+a)b(18)

对于高斯核函数,其计算公式如下,

kxx=exp(1σ2(x2+x22F1(x^x^)))(19)

附上伪代码,感觉这伪代码逻辑特别清晰

Inputs
• x: training image patch, m × n × c
• y: regression target, Gaussian-shaped, m × n
• z: test image patch, m × n × c
Output
• responses: detection score for each location, m × n
function alphaf = train(x, y, sigma, lambda)
k = kernel_correlation(x, x, sigma);
alphaf = fft2(y) ./ (fft2(k) + lambda);
end
function responses = detect(alphaf, x, z, sigma)
k = kernel_correlation(z, x, sigma);
responses = real(ifft2(alphaf .* fft2(k)));
end
function k = kernel_correlation(x1, x2, sigma)
c = ifft2(sum(conj(fft2(x1)) .* fft2(x2), 3));
d = x1(:)’*x1(:) + x2(:)’*x2(:) - 2 * c;
k = exp(-1 / sigma^2 * abs(d) / numel(d));
end


你可能感兴趣的:(cv)