KCF跟踪算法原理 入门详解
一、算法介绍
KCF全称为Kernel Correlation Filter 核相关滤波算法。是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista提出来的,算法出来之后也算是轰动一时,这个算法不论是在跟踪效果还是跟踪速度上都有十分亮眼的表现,所以引起了一大批的学者对这个算法进行研究以及工业界也在陆续把这个算法应用在实际场景当中。这个算法主页里面有论文还有代码都可以在这里面下载,也有一些简介之类的,这篇文章在2015年作者又发在了TPAMI上面,所以大家可能会看到两个版本,但是没有改动,都是可以看到。论文下载地址相关滤波算法算是判别式跟踪,主要是使用给出的样本去训练一个判别分类器,判断跟踪到的是目标还是周围的背景信息。主要使用轮转矩阵对样本进行采集,使用快速傅里叶变化对算法进行加速计算。
二、详细介绍
这部分就直接根据论文当中的安排给大家解释一下,这样大家对照论文去看,也算是比较舒服的理解了。
Abstract:主要介绍了一下这篇文章的想法的由来以及算法的成就和所使用的东西,还介绍了一下论文在哪些数据集上测试了等。简介一般就是论文的总结,对论文做一个总体的介绍,大致的思想基本看了间接之后就能明白了,就是上面我写的那些,使用核相关滤波器训练一个判别式分类器,使用轮转矩阵生成样本去训练分类器,代码也是开源的。
1、Introduction
第一部分就是对整个跟踪的问题进行一个介绍,跟踪是计算机视觉领域一个比较重要的成分,可以应用在多种领域,人机交互、监控等我就不一一列举了,这个大家可以自己去查了,在第一部分比较重要的有这么几句话,Although the reasons for doing so are understandable, we argue that under sampling negatives is the main factor inhibiting performance in tracking. In this paper, we develop tools to analytically incorporate thousands of samples at different relative translations, without iterating over them explicitly. This is made possible by the discovery that, in the Fourier domain, some learning algorithms actually become easier as we add more samples, if we use a specific model for translations.
主要的意思就是说负样本对训练一个分类器是一个比较重要的存在,但是在训练的时候负样本的数量是比较少的,所以我们本文的算法就是为了更加方便地产生更多的样本,以便于我们能够训练一个更好的分类器。
Our framework easily incorporates multiple feature channels, and by using a linear kernel we show a fast extension of linear correlation filters to the multi-channel case.
相关滤波器是根据之前的MOSSE算法(论文地址)改进的,可以说是后来CSK、STC、Color Attributes等tracker的鼻祖。Correlation Filter(以下简称CF)源于信号处理领域,后被运用于图像分类等方面。而Correlation Filter应用于tracking方面最朴素的想法就是:相关是衡量两个信号相似值的度量,如果两个信号越相似,那么其相关值就越高,而在tracking的应用里,就是需要设计一个滤波模板,使得当它作用在跟踪目标上时,得到的响应最大,最大响应值的位置就是目标的位置。(详细的介绍大家可以参考一下王泥喜龙一的博客地址)如下图所示:
CSK(论文下载地址)是这个算法改进的初级版本,这篇是主要引进了循环矩阵生成样本,使用相关滤波器进行跟踪,本篇KCF是对CSK进行更进一步的改进,引进了多通道特征,可以使用比着灰度特征更好的HOG(梯度颜色直方图)特征或者其他的颜色特征等。
2、Related Work
2.1、基于检测的跟踪
这个听名字就比较好理解了,基于检测到的目标进行跟踪,首先在跟踪之前对目标进行检测,得到目标的位置,然后对目标进行学习,跟踪。
2.2、样本转换和相关滤波
对一些以前存在的样本转换的方法和相关滤波的一些知识进行一个介绍。For us, this hinted that a deeper connection between translated image patches and training algorithms was needed, in order to overcome the limitations of direct Fourier domain formulations.而且说出了样本和训练算法都是必须的,直接在频域使用傅里叶变化加快算法。
2.3、后来的工作
初始版本就是我上面说的CSK那篇,然后把多通道特征以及核函数这个加进来对算法进行提升。
3、Contributions
提出了一个快速的效果良好的跟踪算法,把以前只能用单通道的灰度特征改进为现在可以使用多通道的HOG特征或者其他特征,而且在现有算法中是表现比较好的,使用HOG替换掉了灰度特征,对实验部分进行了扩充,充分证明自己的效果是比较好的。使用核函数,对偶相关滤波去计算。
KCF的主要贡献
- 使用目标周围区域的循环矩阵采集正负样本,利用脊回归训练目标检测器,并成功的利用循环矩阵在傅里叶空间可对角化的性质将矩阵的运算转化为向量的Hadamad积,即元素的点乘,大大降低了运算量,提高了运算速度,使算法满足实时性要求。
- 将线性空间的脊回归通过核函数映射到非线性空间,在非线性空间通过求解一个对偶问题和某些常见的约束,同样的可以使用循环矩阵傅里叶空间对角化简化计算。
- 给出了一种将多通道数据融入该算法的途径。
4、一维脊回归
脊回归
设训练样本集,那么其线性回归函数,是列向量表示权重系数,可通过最小二乘法求解
其中用于控制系统的结构复杂性,也就是VC维以保证分类器的泛化性能。
写成矩阵形式
其中的每一行表示一个向量,是列向量,每个元素对应一个样本的标签,于是令导数为0,可求得
因为后面实在傅里叶域内计算,牵涉到复数矩阵,所以我们将结果都统一写成复数域中形式
其中表示复共轭转置矩阵。
循环矩阵
KCF中所有的训练样本是由目标样本循环位移得到的,向量的循环可有排列矩阵得到,比如
当然对于二维图像的话,可以通过x轴和y轴分别循环移动实现不同位置的移动
举例
循环矩阵傅氏空间对角化
所有的循环矩阵都能够在傅氏空间中使用离散傅里叶矩阵进行对角化
其中x对应于生成X的向量(就是X的第一行矩阵)的傅里叶变化后的值,,是离散傅里叶矩阵,是常量
关于矩阵的傅里叶对角化请参加 循环矩阵傅里叶对角化,后面的笔记会专门讲解傅里叶变换。
傅氏对角化简化的脊回归
将带入脊回归公式得到
注意这里的分号是点除运算,就是对应元素相除。因为,( 循环矩阵傅里叶对角化)对上式两边同时傅氏变换得
于是
这里和论文式(12)不一样,论文里(12)式分子上似乎多了个共轭符号,因为Appendix A.5中的式(55)后面那个应该是少了个共轭转置符号。
这样就可以使用向量的点积运算取代矩阵运算,特别是求逆运算,大大提高了计算速度。
5、核空间的脊回归
我们希望找到一个非线性映射函数列向量,使映射后的样本在新空间中线性可分,那么在新空间中就可以使用脊回归来寻找一个分类器,所以这时候得到的权重系数为
是行向量张成的空间中的一个向量,所以可以令
上式就变为
该问题称为的对偶问题
令关于列向量导数为0,
注:其实类似于核空间变量的协方差矩阵,矩阵的转置乘以矩阵,一定可逆。
对于核方法,我们一般不知道非线性映射函数的具体形式,而只是刻画在核空间的核矩阵,那么我们令表示核空间的核矩阵,由核函数得到,那么
于是
论文提出的一个创新点就是使循环矩阵的傅氏对角化简化计算,所以这里如果希望计算时可以同样将矩阵求逆运算变为元素运算,就希望将对角化,所以希望找到一个核函数使对应的核矩阵式循环矩阵。
Theorem 1. Given circulant data C(x), the corresponding kernel matrix K is circulatant if the kernel function satisfies ,for any permutation matrix M.
即核矩阵是循环矩阵应该满足两个条件:第一个样本和第二个样本都是由生成样本循环移位产生的,可以不是由同一个样本生成;满足,其中是排列矩阵。
证明:设,则,于是
因为K的第一行为所以相当于将第一行的第个元素放到K的第i行j列上,
那么就得到了循环矩阵,所以是循环矩阵。证明里表示除的余数,因为这个过程是循环的。
证毕。
若K是循环矩阵,则
其中是K中第一行。这里觉得奇怪?两个转置?这是因为我们已经约定是列向量,而的第i行是,是不是明白了~
这里推出来的公式和论文中公式(17)也不大一样
那么那些核函数满足上述性质呢?论文中给出
- Radial Basis Function kernels -e.g. Gaussian
- Dot-Product kernels -e.g. linear, polynomial
- Additive kernels - e.g. intersection, and Hellinger kernels
- Exponentiated additive kernels.
6、快速检测
首先由训练样本和标签训练检测器,其中训练集是由目标区域和由其移位得到的若干样本组成,对应的标签是根据距离越近正样本可能性越大的准则赋值的,然后可以得到
待分类样本集,即待检测样本集,是由预测区域和由其移位得到的样本集合
那么就可以选择最大的样本作为检测出的新目标区域,由判断目标移动的位置。
定义是测试样本和训练样本间在核空间的核矩阵
由于核矩阵满足,即类似于theorem 1 的证明可得是循环矩阵
我记得曾经见到过有人问非方阵的情况,假设采样窗口非方形,即那么采样窗口通过移位都会产生个样本,无论是训练样本还是测试样本,所以一定是方阵
于是得到各个测试样本的响应
注意我们说过小写的都是列向量,是列向量。注意我们这里是矩阵的第一行,即的第一列,而文中(22)式中是论文中的第一行,这是因为本文和论文中关于的定义正好是相转置的。也就是说我觉得(22)式只是少了一个共轭。。。
觉得蛮奇怪的,怎么和论文中推导结果好多都差一个共轭符号??
这是因为都是对称向量,而对称向量的共轭转置是实数,所以就和论文中一样了,这点参考KCF高速跟踪详解
7、核矩阵的快速计算
现在还存在的矩阵运算就是核矩阵的第一行的计算
内积和多项式核
这种核函数核矩阵可以表示成,于是
因此对于多项式核有
径向基核函数
比如高斯核,这类函数是的函数
所以
对于高斯核则有
1D到2D
上面公式推导的很爽,可是都是在1D情况下得到了结论,2D图像该怎么办呢?
这个问题困扰了我好久。。。。刚开始我也想从线性空间的脊回归推导,假设是目标图像,是由生成的循环矩阵块,即表示的第块,是由右移,下移得到的样本块。那么即使块循环矩阵能够通过2D傅里叶变换矩阵对角化又怎么用呢??因为我们不可能带入类似的式子中啊(这个式子是类比于1D脊回归写的,并无实际意义)
哎呀,想破脑袋啊!
啊哈,想明白了,线性假设下没办法用,直接在核空间推导,发现豁然开朗~
现在有一个函数,自变量,因变量,也不知道怎么映射的,也不知道是多少,反正是个确定但未知的值。那么在核空间我们就可以使用脊回归的公式了~
注意:由移位生成的样本共有个,所以,这里,是对应样本的标签,是对应样本标签的矩阵形式。
ok,现在再来看看定理2
Theorem 2. The block matrix with elements is a Block-Circulant Matrix (BCCM) if is a unitarily invariant kernel.
这里和Theorem 1是类似的,a unitarily invariant kernel就是说,定理的证明参见Theorem 1.
而径向基核,dot-product kernel等都满足这个条件,所以得到的核矩阵都是块循环矩阵。
块循环矩阵可以使用2D傅里叶变换矩阵对角化( 循环矩阵傅里叶对角化)
其中是2D傅里叶变换矩阵,是生成块循环矩阵的生成矩阵,表示对进行2D傅里叶变换的结果。
ok,那现在
其中表示全1的m维列向量。
这里的分别对应着的矩阵形式。
对应的响应
其中表示块循环矩阵的生成矩阵。
后面测试就类似于1D不推了
多通道问题
论文中在提取目标区域的特征时可以是灰度特征,但是使用Hog特征能够取得更好的效果,那么Hog特征该如何加入前面提到的模型呢?
Hog特征是将图像划分成较小的局部块,称为cell,在cell里提取梯度信息,绘制梯度方向直方图,然后为了减小光照影响,将几个cell的方向直方图串在一起进行block归一化,最终将所有的cell直方图串联起来就是图像的特征啦。
那么,按照传统的方式一张图像就提取出一个向量,但是这个向量怎么用啊?我们又不能通过该向量的移位来获得采样样本,因为,你想啊,把直方图的一个bin循环移位有什么意义啊?
所以论文中Hog特征的提取是将sample区域划分成若干的区域,然后再每个区域提取特征,代码中是在每个区域提取了32维特征,即,其中就是梯度方向划分的bin个数,每个方向提取了3个特征,2个是对方向bin敏感的,1个是不敏感的,另外4个特征是关于表观纹理的特征还有一个是零,表示阶段特征,具体参见fhog。提取了31个特征(最后一个0不考虑)之后,不是串联起来,而是将每个cell的特征并起来,那么一幅图像得到的结果就是一个立体块,假设划分cell的结果是,那么fhog提取结果就是,我们成31这个方向为通道。那么就可以通过cell的位移来获得样本,这样对应的就是每一通道对应位置的移位,所有样本的第i通道都是有生成图像的第i通道移位获得的,
,所以分开在每一个通道上计算,就可以利用循环矩阵的性质了。
我们来看1D的情况,1D弄明白了,2D也就明白咯,因为我们上面说了怎么推导2D的
样本cell数为M,每个cell特征维数为L,第个样本的第通道向量表示成,样本的总特征可以表示成.
于是K矩阵的第一行有
这里用到
这是dot product kernel的情况,那径向基核就很容易推了
8、总结
KCF相对于其他的tracking-by-detection方法速度得到了极大的提升,效果也相对较好,思想和实现十分简单。
借上图来总结下KCF的过程,左图是刚开始我们使用红色虚线框框定了目标,然后红色实线框就是使用的padding了,其他的框就是将padding循环移位之后对齐目标得到的样本,由这些样本就可以训练出一个分类器,当分类器设计好之后,来到了下一帧图像,也就是右图,这时候我们首先在预测区域也就是红色实线框区域采样,然后对该采样进行循环移位,对齐目标后就像图中显示的那个样子 了,(这是为了理解,实际中不用对齐。。。),就是周围那些框框啦,使用分类器对这些框框计算响应,显然这时候白色框响应最大,因为他和之前一帧红色框一样,那我们通过白色框的相对移位就能推测目标的位移了。
然后继续,再训练再检测。。。。
论文中还说到几点
- 对特征图像进行cosine window加权,这主要是为了减轻由于边界移位导致图像不光滑。
- padding的size是目标框的2.5倍,肯定要使用padding窗口,要不然移位一次目标就被分解重组合了。。。效果能好哪去。。
- 对于标签使用了高斯加权
- 对前后帧结果进行了线性插值,为了让他长记性,不至于模型剧烈变化。
但是其缺点也是很明显的。
- 依赖循环矩阵,对于多尺度的目标跟踪效果并不理想。当然可以通过设置多个size,在每个size上进行KCF运算,但这样的话很难确定应预先设置多少size,什么样的size,而且对size的遍历必将影响算法的速度。KCF最大的优势就是速度。
我在想能不能通过少量特征点的匹配来调整窗口的size,当然这样的话,速度也是个问题
这种情况下还能保证最大响应就对应着目标中心所在的框吗?如果不能偏差会不会越来越大?
- 初始化矩阵不能自适应改变,其实这个问题和上一个缺点类似,这里强调的是非刚体运动,比如跳水运动员,刚开始选定区域肯定是个瘦长的矩形框,但当运动员开始屈体的时候显然这个预选定框就很大误差了。
3.难处理高速运动的目标
- 难处理低帧率中目标,这个和3类似,都是说相邻帧间目标位移过大。
目标下一帧出现位置不在你的padding内,你怎么也不可能移位找到。。。
5.虽然算法中对模型系数进行线性插值,但是对于目标一旦被遮挡若干帧之后,可能模型就再也回不去了。。。因为模型已经完全被遮挡物污染掉了。
6.我觉的论文还有一个问题就是仅仅通过检测到的框中心和目标实际中心的距离来度量性能,这是有问题的。
比如我现在有一个人垂直我的镜头逐渐远去了,但他的中心一直在我镜头的中心处,那我就开始画个框就是镜头的视角范围,那这样我检测结果百分之百,可是有什么用呢。。。。当然论文方法是在很多不同数据集上检验的性能还是很有说服力的。我的意思就是对于单个数据集不能仅凭这个指标定方法的好坏。
9 EXPERIMENTS
9.1 Tracking pipeline
9.2 Evaluation
在50个序列集上进行测试对比。
最后结果是0.732,精度还是不错的,比着原有算法有大幅度提升。
10 CONCLUSIONS AND FUTURE WORK
In this work, we demonstrated that it is possible to analytically model natural image translations, showing that under some conditions the resulting data and kernel matrices become circulant. Their diagonalization by the DFT provides a general blueprint for creating fast algorithms that deal with translations. We have applied this blueprint to linear and kernel ridge regression, obtaining state-of-the-art trackers that run at hundreds of FPS and can be implemented with only a few lines of code. Extensions of our basic approach seem likely to be useful in other problems. Since the first version of this work, circulant data has been exploited successfully for other algorithms in detection [31] and video event retrieval [30]. An interesting direction for further work is to relax the assumption of periodic boundaries, which may improve performance. Many useful algorithms may also be obtained from the study of other objective functions with circulant data, including classical filters such as SDF or MACE [25], [26], and more robust loss functions than the squared loss. We also hope to generalize this framework to other operators, such as affine transformations or non-rigid deformations.
到此为止,本篇的主要目的就是给大家梳理一下,给那些不想深入去了解的同学一个可以分析的参考路线,看完我说的这些,基本上你对KCF计算有一个大致的方向,如果只是想拿来使用,基本没什么问题了,想要进一步提升的话就要你去仔细专研,如果只是想要毕业设计用这个来做,水一下,基本看完我说的这些,然后配合代码完全没问题的,希望各路同学和大牛们指出,如果有哪里分析不对和想要知道我没有写到的地方可以直接留言跟我说,我会回来继续补充完整,或者直接给你解答。
欢迎转载,转载请保留页面地址。帮助到你的请点个推荐。