High-Speed Tracking with Kernelized Correlation Filters
2016-03-28 17:50
302 查看
KCF
最近刚接触了跟踪算法,KCF是第一个深读的算法,接下来主要详细地说下该算法原理,此算法的优势就是速度快,这主要得益于作者巧妙地通过循环偏移构建出了分类器的训练样本,从而使得数据矩阵变成了一个循环矩阵。然后基于循环矩阵的特性把问题的求解变换到了傅里叶变换域,从而避免了矩阵求逆的过程,大大降低了算法的复杂度。1)首先看一下简单的线性回归模型,给定一些样本,训练的目的是找到一个函数,使如下残差最小。
∑(f(xi)−yi)2+λ||w||2(1)
根据线性最小二乘求解,可得
w=(XTX+λI)−1XTy(2)
这里X是由一个样本的特征向量占一行组成的样本矩阵。 y是对应每个样本的回归值yi组成的列向量。I是个单位矩阵。
如果直接求解上述闭式解,其中的求逆计算随着样本数的增大是非常耗时的。显然直接求解的方式是不靠谱的,这里这篇paper的作者通过巧妙地把上述闭式解变换到傅里叶变换域的方式,从而避开了矩阵求逆的运算,大大节省了运行时间。
2)DFT下的线性回归,我们先用x为一维向量的时候开始分析。
我们先把2式变换到一个复数的求解结果
w∗=(XHX+λI)−1XHy(3)
其中XH是X的共轭转置,W∗是W的共轭。
为了简化3式的计算,这里用到了一个关于循环矩阵的性质,如下(X是一个循环矩阵)
X=FHdiag(x^)F(4)
其中x^是x的傅里叶变换,F是离散傅里叶变换矩阵,即。
将4试代入3式,可求解
w^∗=x^∗⨀y^x^∗⨀x^+λ
我们可以看到,权重向量w的求解变换到了傅里叶变换域,而且计算量大大降低。
3)接下来的任务就是我们如何来构建一个循环样本矩阵,常规的方法是以目标图像为base图像,基于该图像左右上下偏移得出一系列的图像块作为负样本进行训练。而通过对base图像进行循环偏移的方法可以得到一些近似的的负样本作为训练样本进行训练。这里我们发现通过循环偏移得到的图像在边界处并不是很平滑,消除这种现象的方式就是通过对base图像乘以一个汉宁窗来降低边缘图像的权重。
4)以上的一些都是建立在线性回归之上的,为了更好的分类器性能,我们就需要引入一个核函数,把特征空间映射到一个更高维的空间去,我们假设分类器的映射函数是,我们之后把它也叫做核函数,则分类器的权重向量变为,我们把不同样本之间的乘积的核函数结果组成的矩阵为,这样最终的回归函数可以写成
f(z)=wTz=∑inαik(z,xi)(6)
5)快速训练,要直接求解上面的这个函数还是比较费时的,这里我们就要利用上面的关于循环矩阵的那个性质了,基于核函数的回归解为
α=(K+λI)−1y(7)
如果K为循环矩阵,我们可以把7式的求解转换到DFT域
α^∗=y^k^xx+λ
其中kxx是核函数矩阵K的第一行元素组成的向量。
6)快速检测,这个过程的思路基本上和上一步,快速训练的思路类似,不同点就在于构建循环矩阵上,在这一过程中我们需要构建测试样本和训练样本的核函数矩阵,其中kxz是循环矩阵第一行组成的向量,这样就可以计算测试样本z的循环偏移构成的测试样本,
f(z)=(Kz)Tα
再根据循环矩阵的性质,把上式变换到DFT域,
f^(z)=(K^xz)∗⨀α^
7)现在还剩下一个问题,如何来计算核函数的相关性,kxx和kxz。Kxx’的计算公式如下
kxx′=g(C(x′)x)
把4式中循环矩阵的性质代入上式,可得
kxx′=g(F−1(x^⨀x^∗))
因为在之后代码实现中,我们选用的是高斯核函数,这里就不列出多项式核函数的计算公式了,高斯核函数的计算公式如下
kxx′=exp(−1σ2(||x||2+||x′||2=2F−1(x^⨀x^∗)))
作者主页,上面有matlab和C++的代码,本人都已经跑通验证其可行性。
http://www.robots.ox.ac.uk/~joao/#
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- 在ADF中跟踪SQL执行时间实现代码
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例