KCF算法全称是Kernelized Correlation Filters,是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista提出来的跟踪算法,这个算法不论是在跟踪效果还是跟踪速度上都有十分亮眼的表现。该算法主要使用循环矩阵对样本进行采集,使用快速傅里叶变换对算法进行加速计算。

第一部分 线性回归

Linear regression

       首先介绍一下脊回归,线性回归函数是f(z)=wTz,给定样本xi和对应的标签yi,目标是优化最大平方和误差来求出参数w,即

kcf算法 opencv kcf算法优化_核函数

       其中λ是正则化参数,来防止过拟合现象的发生,就像深度学习中的那样。这个函数的通用求解公式是

kcf算法 opencv kcf算法优化_目标跟踪_02

       其中,矩阵X的每一行对应着一个向量xi,向量y的每一个值对应着yi,I是一个单位矩阵。

       

kcf算法 opencv kcf算法优化_核函数_03

,每个样本是一个n*1维的向量       

kcf算法 opencv kcf算法优化_核函数_04

,X一共有m个样本      

kcf算法 opencv kcf算法优化_目标跟踪_05

      

kcf算法 opencv kcf算法优化_循环矩阵_06

      

kcf算法 opencv kcf算法优化_计算机视觉_07

Cyclic shifts

       为了简单说明这种操作,先考虑一个通道,一维信号的情况。考虑一个n*1的向量x来表示一个感兴趣区域,把它当作一个基本样本,我们的目标是用基本样本(一个正样本)和通过移位操作来得到的几个虚假样本(作为负样本)来训练分类器。我们可以用循环移位算子来模拟这个向量的一维平移操作,用P矩阵来操作,P是n*n的矩阵:

kcf算法 opencv kcf算法优化_核函数_08

                                                                       

kcf算法 opencv kcf算法优化_目标跟踪_09

       通过用P矩阵和向量x相乘的方式,我们就可以得到另一个向量,那么再用P*Px我们就可以再得到一个不同的向量,我们就可以说,通过在x向量前面乘上P的1到n-1次幂,我们能得到n-1个不同的虚假向量,得到新的负样本,如下图所示:

kcf算法 opencv kcf算法优化_循环矩阵_10

       对于二维图片,经过这种平移操作,可以得到很多张新的图片,如下图所示:

kcf算法 opencv kcf算法优化_循环矩阵_11

 

Circulant matrices

       经过上面的操作,我们只需要给出一个样本,我们就能生成n个不同的样本,那么对于求解脊回归问题,我们给出一个基础向量x=[x1,x2,x3,…,xn]T,然后我们就能得到X了:

kcf算法 opencv kcf算法优化_目标跟踪_12

       带入到上面脊回归的求解公式,我们就可以计算出w了,是不是很巧妙呐。可是如果进行这种矩阵运算求解还是很复杂,所以怎么办呐?一个非常令人震惊的有用的发现出现了,所有的循环矩阵都能够在傅氏空间中使用离散傅里叶矩阵进行对角化,X相似于对角阵

kcf算法 opencv kcf算法优化_循环矩阵_13

       其中kcf算法 opencv kcf算法优化_kcf算法 opencv_14对应于生成X的向量(就是X的第一行矩阵)x傅里叶变化后的值,kcf算法 opencv kcf算法优化_核函数_15=F(x)=

kcf算法 opencv kcf算法优化_目标跟踪_16

,F是离散傅里叶矩阵,是常量

kcf算法 opencv kcf算法优化_kcf算法 opencv_17

 

Putting it all together

       现在我们发现可以用上面的方式在求X了,上面脊回归在傅里叶域的求解方法是这样的

kcf算法 opencv kcf算法优化_kcf算法 opencv_18

       然后我们就可以X=

kcf算法 opencv kcf算法优化_计算机视觉_19

带入上面的公式里了

kcf算法 opencv kcf算法优化_循环矩阵_20

注意这里的分号是点除运算,就是对应元素相除。因为

kcf算法 opencv kcf算法优化_kcf算法 opencv_21

 

所以

kcf算法 opencv kcf算法优化_计算机视觉_22


kcf算法 opencv kcf算法优化_循环矩阵_23

       非常简洁高效的公式,不由得说一句,数学真美!!!

第二部分 非线性回归

Kernel trick – brief overview

       对于非线性回归问题来说,我们希望找到一个非线性映射函数kcf算法 opencv kcf算法优化_目标跟踪_24,使映射后的函数在线性空间下是可分的,那么对于非线性回归问题我们就可以描述为找到一个回归函数

kcf算法 opencv kcf算法优化_核函数_25

,给定样本xi和对应的标签yi,目标是优化最大平方和误差来求出参数w。

       设w由训练样本的非线性变换ψ(xi)的线性组合构成:

kcf算法 opencv kcf算法优化_循环矩阵_26

kcf算法 opencv kcf算法优化_核函数_27

       记κ(xi,xj)=ψ(xi)ψ(xj),称为核函数。所以

kcf算法 opencv kcf算法优化_循环矩阵_28

       

kcf算法 opencv kcf算法优化_kcf算法 opencv_29


kcf算法 opencv kcf算法优化_kcf算法 opencv_30

,k(z)中的第i个元素为训练样本xi和测试样本z的核函数值。

Fast kernel regression

f(z)是关于z的非线性函数,但却是关于κ(z)的线性函数,可以使用线性函数的优化方法求解α。

kcf算法 opencv kcf算法优化_kcf算法 opencv_31

       K是所有训练样本的核相关矩阵。如果核函数选择得当,使得x内部元素顺序更换不影响核函数取值,则可以保证K也是循环矩阵。以下核都满足这样的条件:

kcf算法 opencv kcf算法优化_核函数_32

kcf算法 opencv kcf算法优化_kcf算法 opencv_33

kcf算法 opencv kcf算法优化_核函数_34

这里k是核相关矩阵的第一行,表示原始生成向量x0和移位了i的向量xi的核函数。

kcf算法 opencv kcf算法优化_kcf算法 opencv_35

       两者都是同一个向量和自身位移结果进行运算。因为所有涉及到的核函数都只和位移的绝对值有关,所以ki=kN−i,即k是对称向量。因为对称向量的傅里叶变换是实数,有:

kcf算法 opencv kcf算法优化_kcf算法 opencv_36

Fast detection

       对于第一帧图像来说,在第一帧标注好的框的周围划分一个上下文目标区域,得到训练样本和标签来训练检测器,其中训练集是由上下文目标区域和由其移位得到的若干样本组成,对应的标签是根据距离越近正样本可能性越大的准则赋值的,然后可以得到α。

假设我们要预测第二帧图中目标的位置,我们就在上一帧框的附近划分一个感兴趣区域,对于这个感兴趣区域z,我们对这个感兴趣区域进行移位操作,即

kcf算法 opencv kcf算法优化_循环矩阵_37


kcf算法 opencv kcf算法优化_目标跟踪_38

,其中                                                                                           

kcf算法 opencv kcf算法优化_计算机视觉_39

                                                       

kcf算法 opencv kcf算法优化_计算机视觉_40

,X是循环矩阵,每一行表示的是训练集x向量                                                                                         

kcf算法 opencv kcf算法优化_计算机视觉_41

然后选择f(zj)值最大的作为新目标区域,由zj可以知道目标移动的位置。

定义kcf算法 opencv kcf算法优化_核函数_42是测试样本和训练样本在核空间上的核矩阵

kcf算法 opencv kcf算法优化_kcf算法 opencv_43


kcf算法 opencv kcf算法优化_计算机视觉_44

       

kcf算法 opencv kcf算法优化_kcf算法 opencv_45

,ψ(Z)中的每一行代表zj向量,1*n X n*n X n*n=1*n.      

kcf算法 opencv kcf算法优化_目标跟踪_46

,因为kcf算法 opencv kcf算法优化_kcf算法 opencv_47是循环矩阵,所以

kcf算法 opencv kcf算法优化_kcf算法 opencv_48


kcf算法 opencv kcf算法优化_kcf算法 opencv_49

,类似前面的推导,                                                                                                     

kcf算法 opencv kcf算法优化_计算机视觉_50

第三部分 核相关矩阵快速计算

Dot-product and polynomial kernels

经过上面的推导,我们发现现在我们要计算的部分只有kcf算法 opencv kcf算法优化_目标跟踪_51了。

对于内积和多项式核:

kcf算法 opencv kcf算法优化_目标跟踪_52

kcf算法 opencv kcf算法优化_计算机视觉_53

kcf算法 opencv kcf算法优化_循环矩阵_54

kcf算法 opencv kcf算法优化_循环矩阵_55

对于多项式核:

kcf算法 opencv kcf算法优化_目标跟踪_56

Radial Basis Function and Gaussian kernels

       对于径向基核:

kcf算法 opencv kcf算法优化_计算机视觉_57

       对于高斯核:

kcf算法 opencv kcf算法优化_循环矩阵_58

第四部分 多通道问题

       首先让我们来看一下二维特征怎么应用到上面的各种公式中去。

       设图片

kcf算法 opencv kcf算法优化_目标跟踪_59

,假设存在一个函数kcf算法 opencv kcf算法优化_目标跟踪_60,使

kcf算法 opencv kcf算法优化_计算机视觉_61

,然后计算核相关矩阵K。       

kcf算法 opencv kcf算法优化_循环矩阵_62

移位生成的样本数量一共是m*n个,所以

kcf算法 opencv kcf算法优化_循环矩阵_63


kcf算法 opencv kcf算法优化_循环矩阵_64


kcf算法 opencv kcf算法优化_核函数_65

       其中,kcf算法 opencv kcf算法优化_kcf算法 opencv_66是二维傅里叶变换矩阵,kcf算法 opencv kcf算法优化_kcf算法 opencv_67是生成块矩阵K的生成矩阵,kcf算法 opencv kcf算法优化_循环矩阵_68是对kcf算法 opencv kcf算法优化_核函数_69进行傅里叶变换。

                                                                                    

kcf算法 opencv kcf算法优化_计算机视觉_70

       论文中在提取目标区域的特征时可以是灰度特征,但是使用Hog特征能够取得更好的效果,那么Hog特征该如何加入前面提到的模型呢?

       Hog特征是将图像划分成较小的局部块,称为cell,在cell里提取梯度信息,绘制梯度方向直方图,然后为了减小光照影响,将几个cell的方向直方图串在一起进行block归一化,最终将所有的cell直方图串联起来就是图像的特征啦。

那么,按照传统的方式一张图像就提取出一个向量,但是这个向量怎么用啊?我们又不能通过该向量的移位来获得采样样本,因为,你想啊,把直方图的一个bin循环移位有什么意义啊?

所以论文中Hog特征的提取是将sample区域划分成若干的区域,然后在每个区域提取特征,代码中是在每个区域提取了32维特征,即3XnOrients+5,其中nOrients=9就是梯度方向划分的bin个数,每个方向提取了3个特征,2个是对方向bin敏感的,1个是不敏感的,另外4个特征是关于表观纹理的特征还有一个是零,表示阶段特征。提取了31个特征(最后一个0不考虑)之后,不是串联起来,而是将每个cell的特征并起来,那么一幅图像得到的特征就是一个立体块,假设划分cell的结果是mXn,那么fhog提取结果就是mXnX31,我们就相当于得到了31张图片。那么就可以通过cell的位移来获得样本,这样对应的就是每一通道对应位置的移位,所有样本的第i通道都是有生成图像的第i通道移位获得的,所以独立的在每一个通道上计算,就可以利用循环矩阵的性质了。

对于线性核来说,求k的公式如下所示,其中xc和xc‘代表每个通道的图片:

kcf算法 opencv kcf算法优化_核函数_71

同理对于高斯核来说,公式如下:

kcf算法 opencv kcf算法优化_kcf算法 opencv_72

以此类推。。。

第五部分 整体代码和实验结果

kcf算法 opencv kcf算法优化_kcf算法 opencv_73

 

kcf算法 opencv kcf算法优化_循环矩阵_74

从实验结果可以看出,用hog特征对跟踪效果有个非常大的提升。

第五部分 总结

KCF算法引入了hog特征和核方法,在跟踪的精度核速度上都取得了非常好的效果,但是KCF也有一些问题,比如它对尺度变化,高度运动和遮挡问题会很敏感。