论文链接:https://link.zhihu.com/?target=http%3A//ieeexplore.ieee.org/abstract/document/6870486/
代码链接:http://www.robots.ox.ac.uk/~joao/
个人认为,这篇论文是近年来跟踪界最经典的论文,没有之一。主要思想就是利用了循环矩阵对角化等性质,使得核化之后的计算变得十分简单。原理很复杂(原文中公式竟然有60多个啊+_+),代码很简单(少到令人感动)。下面废话不多说,谈谈论文的主要思想。
1.总体思路:所谓的相关滤波方法就是根据当前帧的信息和之前帧的信息训练出一个相关滤波器,然后与新输入的帧进行相关性计算,得到的置信图就是预测的跟踪结果,显然,得分最高的那个点(或者块)就是最可能的跟踪结果。由于KCF里并没有任何的流程图,所以我们借助STC[1]中的配图来理解一下,看着配图应该能理解主要的流程了。这里要说一下,为什么能用其它论文的配图,因为我们介绍的这篇KCF和STC都是对12年CSK[2]的改进,不同的是,KCF是在CSK基础上加了HOG特征使得效果大大提升了,STC是在贝叶斯的框架下对CSK进行解释并在其中加入了上下文(context)信息的应用。所以本质上来说,这几个都是一样的流程。
1.1上面的部分就是利用之前帧的跟踪结果图片训练出相关滤波器。我们将原始的问题表述为:
优化函数由凸优化里最简单的最小二乘和正则项组成,也就是最常用的岭回归方法:
这里的理想回归期望(标签)假设是高斯型,直观上理解就是离上一帧跟踪结果越近,那么它是这一帧的跟踪结果的概率也就越大。如下图,下一帧中心点的位置在黄色点周围的可能性大,不会跑太远,所以理想回归函数也就是中间大周围小。
因为最小二乘类的优化方法已经很成熟了,所以我们可以直接用公式求解(其实就是求偏导令其等于0):
看起来比较复杂,又是共轭转置又是求逆的,所以要简化一下。那么本文也是常规思路,把非线性问题转化为线性问题,所以就想到了SVM中也用到的核技巧(注意我们这里推导的时候用的是点积核,但其实核函数还有多项式核、径向基核及高斯核等),引入核函数后能够把参数训练问题简化:
这里的K是两个矩阵的核相关性。看起来似乎已经简化了很多了,但是,还是有求逆!求逆杀伤力太强了,不行,一定还要简化。怎么办呢?这时循环矩阵对角化的性质派上用场了,利用循环矩阵的性质,使得训练过程进一步简化。
这里顶上的符号是复域的意思。不管你信不信,反正我是信了,竟然如此简单,这里详细的推导过程放在后面的部分。
1.2下面的部分就是对新输入的帧进行检测,其实就是跟滤波器计算出相关性再乘上回归系数,如果是新手听不懂没关系,后面会再讲的哦。右下角的置信图(就是各个点是跟踪结果的可能性)用公式来表达就是如下:
没错,就是这么简单就能求出输入帧的跟踪结果了。如上图右下角所示,新的跟踪结果比原跟踪结果往右上方移了一些,直观上来看红色框中David的脸确实往右上方移动了一些,所以结果应该是对的,当然这只是我们肉眼看到的结果,真正结果好不好还要看在数据集上跑的结果,KCF的结果会在之后的实验部分讲,结果是相当好的,当然那是在2014年的时候。
那么这里得到的响应矩阵(置信图)该怎么理解呢?便于理解,故放一张图。这里也是循环采样的精髓之处。
如上图,最后得到的响应矩阵其实可以理解成一种密集的采样对应的响应矩阵,左上角(上图中第1行第1列)的响应值就是预测的当前输入帧以这个点为中心的可能性,当然这个点的预测值肯定是很低的,因为我下一帧很难跑到那里去。以此类推,MxN个响应对应的就是MxN种循环移位。下面一句话是重点,所谓的循环矩阵到这里就大显身手了,仔细想想,第ij块表示原图下移i行右移j列,那么换句话说,好像我所有的这MxN个循环移位的矩阵只要用一个量就可以表示了。
有没有一种熟悉的感觉?对,就是基波和谐波。类比一下,我用一个基波和一个倍数就能表示所有的谐波了,这里的原图就是基波,而位移之后的图就是谐波。自然地,既然那么像,那我们就试试傅立叶变换呗,一试就成了,因为需要计算的量很少,所以速度快,因为密集采样样本大大增加,所以跟踪的效果又很好。
如果你不是做跟踪这行的话,可能会问,右下角t+1帧的时候为什么红色框的中心(也就是黄色小点)不是David的鼻子那里,那是因为这个红色框是根据上一帧的跟踪结果来画的,这个小黄点的位置其实是上一帧David(David也算是个数据集中的明星0.0)鼻子的位置,这也是常见做法,先用上一帧的结果在当前输入帧框出一个大框,然后跟最新的滤波器做相关性计算,相关性最大的就是鼻子那块,也就是当前输入帧的跟踪结果。
2.其实讲到这里已经把精髓讲完了,下面讲一些推导细节,加深理解。
2.1循环矩阵对角化有神奇效果,大大降低了运算量。首先举个例子,来展现它神奇的效果。就拿上文出现的岭回归公式当例子吧,看看能把它简化成什么样。
原始公式:
在复域中(H表示共轭转置)即:
化简过程:
这是我早前推的,比起他的公式,我个人更喜欢他的代码嘻嘻。这个公式推下来并没有用,只是让我们见识一下循环矩阵化简的威力,真正用到代码里去的是下面3个推导。
2.2大家是否还记得我们这里实际上用到的是核化的岭回归啊?也就是比普通的稍微简化了一些的,所以推导起来也比较容易。
原始公式:
化简过程:
嗯,好像看起来还不错哦,既没有求逆又没有很多矩阵乘法运算。它的代码其实更感人。
简单的不能再简单了,至此,训练过程结束。下面看检测过程,同样化简得面目全非。
2.3检测出跟踪结果,就是当前输入的帧和滤波器求相关性,相关性最大的即为跟踪结果。
原始公式:
化简过程:
嗯,这篇论文真是不断地感动着我们这些吃瓜群众,原来可以这么简单。看着公式,代码闭着眼睛都能编了。
现在只剩一个问题了,那就是核相关性怎么求。
2.4核相关性的化简。好像解决了这个就完美了,那这个核相关性好求吗?如果不好求的话,就空亏一篑了,放心,跟踪界的allstar Henriques(葡萄牙人的名字我至今不会读)当然已经帮我们解决好了,依然简单。
原式公式:
化简过程:
我们这里只推导点积核。剩下的多项式核,径向基核,高斯核类比就能得到。论文里效果最好的是高斯核。
注意,代码里第2行是使用HOG特征的关键,他把31层HOG特征全部加起来了,这个简单的操作使得之前的CSK能用很多高维特征,故性能大增。
3.实验。我在OTB50上跑了0.514,因为加入了形状特征HOG,所以抗光照等性能骤升,当时(2014年)能排世界第3,由于实现起来非常简单,在很多人眼里是近年来跟踪界当之无愧的最佳论文(其实是在我眼里)。
本人跑的结果:
作者论文中的对比实验结果:
4.总结
本论文使用了HOG特征+核函数法把相关滤波器领域又推到了一个新的高度上。KCF是原理很复杂,实现很简单的代表作之一。
[1] K. Zhang, L. Zhang, Q. Liu, D. Zhang, and M.-H. Yang. Fast visual tracking via dense spatio-temporal context learning. In Proceedings of the European Conference on Computer Vision, 2014.
[2] J. F. Henriques, R. Caseiro, P. Martins, and J. Batista. Exploiting the circulant structure of tracking-by-detection with kernels. In Proceedings of the European Conference on Computer Vision, 2012.