前段时间研究了一下KCF算法,单单看论文有很多看不懂的地方。查阅参考了,很多博客和其他材料才算了解了文章的大题思路,现将个人的理解在此记录,作为笔记。
0.1 目标跟踪的背景介绍
0.2 学习该算法需先了解的预备知识
0.3 原论文提出的算法——KCF
0.4 实际使用时KCF的实现流程
————————————————————————————————————————————
通常,我们所说的目标跟踪任务指的是单目标跟踪任务,即给定一个图像序列,在第一帧中给出一个矩形框,然后跟踪算法需要在后续帧中跟踪这个框的内容。 视觉中的目标跟踪方法一般被分成两个大类:生成类(generative)和判别类(discriminative)模型方法。
生成类方法:在当前帧中对目标区域建模,在下一帧中寻找与模型最为相似的区域认为是预测的目标位置,典型的有卡尔曼滤波器,Mean-shift算法等。
判别类方法:当前帧以目标区域为正样本,背景为负样本,机器学习方法训练分类器,然后在下一帧中用训练好的分类器去寻找最优的区域。大部分的视觉跟踪方法都属于这一类,这类方法的特点是图像特征+机器学习,也叫tracking-by-detection。
核相关滤波器(Kernelized Correlation Filters,KCF)就是一种典型的判别类方法,这类目标跟踪方法的思路一般如下:
1. 在第t帧(常常是第一帧)中框选出待跟踪的目标,在框选位置附近采样,训练得到一个回归器(分类器,滤波器??就叫回归器吧)。该回归器能够计算图像像素位置的响应值。
2. 在t+1帧中,在前一帧的目标位置附近采样,用训练出的回归器在采样位置与图像进行相关操作(correlation,和卷积一样是信号处理中的概念),记录每个采样点的响应。
3. 响应最强且满足预先给定阈值条件的采样被认为是t+1帧中目标的位置。
图1. 图像某一帧中框中一架飞机
—————————————————————————————————————————————
古语有云: ”磨刀不误砍柴工“,毛爷爷也说:”不打没有准备之仗,不打没有把握之仗“。
这个论文主要描述的是推到出KCF的过程,里面涉及很多数学知识是必须要掌握的。论文在推导过程中都是将信号看作一维情况进行推导,然后将推导出的公式推广到适用于图像这类二维信号的情况。所以,这一章介绍的数学知识都以一维情况介绍,介绍完整个算法之后再解二维情况下这些东西是怎样的(计算时其实用不着理解这些东西从1D-2D的推广过程,所以后面也可能泛滥不会提)。
主要涉及的知识有:(1)岭回归,(2)循环位移和循环矩阵;(3)傅立叶对角化,建议还有(4)方向梯度直方图(HOG)。
首先,对于一个已拥有m个观测训练数据集X来说,回归的目的就是要对新输入的n维输入X'预测一个或者说多个目标输出。一般,线性回归的目的就是为了构建形如公式(1)所示的回归模型:
上式中,Z是输入数据,w是回归模型的参数矩阵(回归器),f(z)是回归的结果,也就是响应值。岭回归(或者叫脊回归,ridge regression)的损失函数就是在最小二乘回归(矩阵论、数值分析,各种数学课学过很多遍了,可别因为这种思想简单而认为它不重要)的基础加上参数矩阵w的F范数作为惩罚项,如公式(2)所示:
其中,lamda是惩罚项的系数,始终不小于0,该系数越大时惩罚项的作用越明显,反之惩罚想的作用越小。系数为0时,岭回归就退化成了最小二乘回归。公式(2)有关于w的闭式解,将公式对矩阵w求导,并且令导数等于0,就可以求出w的解析解,如公式(3)所示:
将公式(3)推广到傅立叶域,有公式(4),这个式子就是岭回归的回归器的庐山真面目。
从公式(2)到公式(3)的具体推导过程,论文作者在文章的附录部分描述了过程。如果想更深入了解岭回归(以及类似改进对小二乘,比如索回归,SVM等),可以看论文的推导以及查看更多资料。
相信有一部分人看到上面的矩阵求导,什么矩阵求导?如果是这样的话,请点开维基百科看看矩阵是怎么求导的->点击打开链接,以及这个博客->点击打开链接。
考虑一维的情况,给定一个nx1的向量x,我们可以用一个置换矩阵P将x进行循环移位,如下所示:
将x的各个循环移位副本,按行拼成的矩阵称为x构成的循环矩阵。
直白地说,我们可以将这句话看作一个定理:“任意的循环矩阵可以被傅立叶变换矩阵对角化”,如公式(8)
式中的X是由向量x构成的循环矩阵,F是傅立叶变换矩阵,等式右边的对角阵的主对角元素由向量x的傅立叶变换后的各个元素组成。利用傅立叶对角化的好处是,我们可以把有关循环矩阵的运算降维成向量运算。
F,傅立叶变换矩阵(DFT matrix),以4阶的情况为例,形式如式(9)。
式中,n是矩阵的阶数,在上式中就是4。我们可以直接利用DFT矩阵计算信号(矩阵,向量)的离散傅立叶变换:
(11)
有关DFT矩阵和傅立叶对角化的更多性质,可以参考这篇博客->点击打开链接
在表示图像的时候,我们常常会用各种各样的特征描述子去描述图像的特征,以确保不同特征的图像特征是更可分的,忽视一些不关键的信息而突出我们感兴趣的部分。常见特征描述子,比如SIFT, SURF, HOG, BRIEF,LSK等等。构造一种图像的特征描述子通常是根据像素点与周边像素的各种关系(亮度,梯度,差异性,各向异性),优秀的特征描述子会考虑尺度变化,透视变换,亮度变化等等因素。
方向梯度直方图就是利用像素局部邻域的梯度方向的分布当作特征,构造过程和原理比较简单。这篇博客把提出HOG的原文翻译了一遍,如想详细了解可以戳链接。
————————————————————————————————————————————————————
文章的主体分别根据线性回归和非线性回归的方式,利用刚刚提到的这些预备知识将模型进行简化。从而可以大大地简化回归器的训练过程。
在这里先插入一个概念,P-N训练,即正负样本训练。正样本,指的就是框选出的目标区域;负样本,指的是目标区域周围的背景环境的区域。论文在引言部分提到,为了提高回归器的性能,在训练回归器时最好能结合正负样本一起训练,这样的回归器的性能会更加优秀。这一点在之前就有很多论文是这么干的了,开山鼻祖MOSSE训练的时候将样本进行仿射变换来构造各种角度下的正样本;CSK将选框在目标周围移动,实现稠密采样,多了很多负样本。但是因为CSK是稠密的,计算过程就很烦躁啊。于是论文的作者就发现,哇靠,我可以利用循环矩阵来简化这个过程啊,于是就有了下面的部分。
想起政治书里面的话,掌握科学的工作方法,人们认识事物的秩序总是从易到难,由特殊到普遍。难怪说“哲学指导自然科学”,论文的作者就从容易的、特殊的线性回归开始了。
如介绍岭回归的部分所说,线性回归的目的就是构造形如公式(1)的线性回归模型。我们直接以岭回归作为损失函数,回归器的解析式如公式(4),把它拿过来用:
这里X不是直接将样本x(依然在1维情况讨论,暂且把它看作向量)按行拼成的,而是通过将样本x构建成一个循环矩阵。即,这样做就是为了增加负样本(x的每个循环移位副本就可以看作负样本,2D情况如何理解待后面叙述)。于是,公式(4)中有关循环矩阵X的运算就都可以用傅立叶对角化来进行简化了,如公式(12)。
将公式回代到公式(4)中,并且利用傅立叶矩阵是酉对称矩阵这一性质,可以对W的解析式进行化简,如下:
将(14)等式两边利用DFT矩阵求傅立叶变换,就可以得到回归器在傅域的形式:
这个就是论文提出的第一个回归器,基于线性回归的。如果你之前看了MOSSE那篇文章会发现,二者形式很像。这篇文章不像MOSSE中,训练样本只需要输入样本(其实也有负样本,只不过因为循环矩阵的性质而被化简了)。只需要将样本x利用FFT变换到傅域,并且将样本标签y进行傅立叶变换,求解到回归器的傅域形式后反变换会到时域即可。
式(15)中的训练标签矩阵y使用的是二维高斯函数的离散矩阵
线性回归总归是不够全面的不够好的,因为有很多复杂的情况导致输入时线性不可分的。这时就需要使用更为普遍的非线性回归的方法。首先,介绍一下什么是核技巧(Kernel Trick)。核技巧用一句话来概括的话,我会说“更高维空间中内积的快速运算”。
但是,用传统的方法,在高维空间Z下计算内积会很慢(如果升维到无穷维,还能计算的了?)。而如果用核技巧通过核函数隐式地将X空间映射到Z空间中,不必显示地计算,就可以实现快速运算。
比如,取,传统方法计算过程如式(17),核技巧的计算方法如式(18)。 (17)
在上式中,为核函数,核函数的选取原则就是使得样本在升维后的Z空间中变得线性可分(在读可以达到目标的情况下,应该选方便于计算的)。
举个例子(图和栗子都是借来的)(详细可参看知乎上这个话题的讨论):
上面两张图像中,图中的红色区域和写有文字的黑色区域是线性不可分的。当用上述的多项式函数P(x,y)对图像进行升维以后,变得线性可分了。在升维的空间中,传统方法计算内积时每次都需要计算三个元素的向量内急,而如果使用和技巧只需要计算出该空间内向量的闭式解,直接代入低维的原始数据进行计算。
-------------------------------------------------------------------------------------------------------------------
回到非线性回归中,当样本不能在线性可分的时候,将样本x通过适当的核函数将样本映射到高维工件,记核函数为。于是可以假设回归器的解析式为:
代入到回归模型的公式就有:
于是,非线性版本的回归模型就得到了,但是如果直接将样本一一代入模型训练岂不是满的很? 于是怎么快速地求出系数,以及核技巧的内积运算就是下一步要解决的问题。
--------------------------------------------------------------------------------------------------------------------
仍然利用岭回归作为回归模型,式(21)的损失函数,有式(22):
代入式(21)化简,有式(23):
等式(23)两边同时对系数求导,并且令导数等于0,可以得到核空间下岭回归的闭式解:
到这里,已经求出了系数的解析式,但是核矩阵K 的维数很高,直接计算会很慢。如果选取合适的核函数使得核矩阵K 变成循环矩阵,那么式(24)就可以进一步化简到傅域了,如式(25):
始终,尖帽子状的符号便是向量的DFT, 是矩阵K 的第一行(这里说的是一维的情况),也即K是有它构造的。满足使得核矩阵为循环矩阵的核函数有,高斯核函数、多项式核函数、卡方核函数,等等。
--------------------------------------------------------------------------------------------------------------------
于是整个模型的计算过程都得到了简化,接下来只需要求出和就可以了。选用高斯核函数如式(30),有:
式(31)便可以求出两个单通道向量的核相关内积,论文在最后还给出了当输入为多通道(彩色图,特征图)时,核相关计算的公式:
至此,非线性回归的模型已经得到终极加速buff,KCF的主要贡献就是提出了这种快速计算相关的过程。后面有论文说明了目标跟踪的效果与选择的回归模型,回归模型的损失函数关系不大,主要取决是输入的样本特征。KCF代码里面输入的特征是HOG特征,后续有一些论文采用其他特征利用该回归模型训练得到了更好效果。
——————————————————————————————————————————————
实现过程一般如下:
1. 在第一帧中框选出带最终目标的位置,将矩形的选择框区域扩大2.5倍,记大小为MxN。
2. 将矩形窗的样本进行余弦加权,然后计算HOG特征,得到31维的HOG特征图。特征的每个维度看成以恶搞MxN大小的样本输入,记为x1, x2, x3, ..., x31。
3. 利用二维高斯函数生成和样本MxN大小一致的训练标签矩阵y。
针对输入的HOG特征图,训练出一个非线性回归器:
5. 在一下帧中,在之前帧的目标位置框选出MxN大小的图片,也是进行余弦加权,然后求HOG特征图,得到z1,z2, ..., z31, 利用上面的公式求得。
6. 利用如下公式,计算傅域下的响应矩阵,然后计算IFT得到响应矩阵f(Z)。
7. 在矩阵f(Z)中找到最大的响应位置,若响应值超过余弦给定阈值,则该位置为当前帧中的目标位置;若最大的响应值仍小于阈值,则采取不久措施(比如用全图搜索匹配的方法)重新选择一个目标区域,然后重复到步骤1重新开始。
8. 然后是更新模型,以新找到的目标位置选取样本,重复步骤2-步骤5,计算用于当前帧的模型记为,则再下一帧使用的模型有当前计算模型与开始的模型插值得到,如:
m为学习率,是一个0-1之间的值。m越大说明以前的模型影响越大(太大容易跟丢),m越小说明以前的模型影响越小(太小容易不鲁棒)。
9. 重复步骤6开始的检测过程。
———————————————————————————————————————————————————— 公式化简到了最后,使用算法的时候已经不需要去考虑在2D的情况下,核矩阵K这个循环矩阵式如何构造而来的了,计算只要知道就可以了。 实际上,在二维情况下核矩阵是一个循环分块矩阵。如果样本是MxN的大小,则K就是一个(MxN)x(MxN)的大小,它由通过置换矩阵循环移位得到。有一篇基于KCF改进的Adapt Color特征的论文提到了这个,有兴趣的话可以去看看。