0. 写在前面
对相关滤波算法综述比较强的文档:
NIUBILITY的相关滤波框架详解 - 知乎 (zhihu.com)
1. 概述
相关滤波算法问世之前,跟踪算法饱受运行时间的困扰,直到MOSSE算法出现,直接将算法速度提到了615fps,第一次将跟踪算法和相关滤波扯上关系,一下就激发了全民优化的热情。
从MOSSE(615)->CSK(362)->KCF(175)->CN(152),速度虽然有些下降,但效果越来越好。始终保持在高速水平。
2. CSK
KCF和DCF这两种算法和CSK差别不大,先从单通道灰度特征的,没有kernel-trick(核技巧)的CSK开始,了解相关滤波算法原理和具体流程。
1. 岭回归(Ridge Regression),相关滤波也是判别类算法,选择了最简单的机器学习方法岭回归,岭回归和封闭解,见如下公式:
岭回归简单点描述就是最小二乘法+二次正则项,且最大优势封闭解可以快速优化;卷积操作与相关操作的区别仅在于是否将卷积核旋转180度,如果卷积核对称,卷积就和相关一样了。
这里还要提一下,线性分类器,训练完成后的分类器参数W可视化之后,能得到目标轮廓的模糊图像,也就是分类模板,同样,类比岭回归,训练中,得到目标的模子之后,测试过程中拿测试样本逐个和模子对比,如果和模子相似,就会得到比较接近1的结果,完全对不上就是0。所以相关滤波也属于模板类方法,所用的特征叫做模板类特征。
2.循环移位(Cyclic shifts),相关滤波的训练样本是通过循环移位产生的,原因有二:
(1)密集采样得到的样本与循环移位产生的样本很像,可以用循环移位来近似;
(2)卷积(相关)运算在傅里叶域对应点乘运算,可以减少计算量,循环矩阵经过傅里叶变换会对角化,可以进一步减小计算量。
3. 训练标签,又高斯函数产生的连续值,相关滤波是回归非分类;原始样本是跟踪框和1~1.5倍padding得到的图像块,再乘一个余弦窗,训练样本集是原始样本通过循环移位得到的,原始图像中心点移位后对应高斯图位置的值就是这个移位样本的标签。
将封闭解变换到傅里叶域,结合循环矩阵的特性将样本集进行化简,得到最终的封闭解:
4. 循环移位的样本集是隐形的,并未有真正的产生过,只是在推导过程中用到了,所以不需要额外开辟内存空间去存储这些样本。
5. 检测过程,用训练得到的分类器对检测区域图像块的每一块循环移位样本做相关操作,得到一个响应值,所以移位样本的响应值会构成一幅响应图,与特征图的大小一致,最大响应点就是跟踪目标的中心;这里也可以在傅里叶域简化,而不用真正去循环移位产生检测样本并分类,计算高效节省内存;
举个例子,100*100的检测块,目标中心位于边缘附近(20,20)位置,在检测过程中会持续循环移位并于滤波模板比较,只有当目标移位到中心时响应最大,这个最大值会写入响应图(20,20)位置。
6. 作者发现给岭回归加入kernel-trick,也可以推导出封闭解,推荐高斯核。
到现在,CSK算法基本成型了,100*100的图像块,经过傅里叶变换和简单的元素级点乘计算,事实上已经完成了10000个样本和10000个样本的检测,复杂度由O(mn*mn)降低到了O(mn*log(mn)),m和n是图像的高乘宽,也就是说CSK的复杂度与图像块的像素点总数有关,padding大小会影响复杂度;循环移位生成的近似样本集结合FFT(傅里叶变换)巨降计算量,;
虽然也有边界效应带来的负面影响,但检测速度和效果都碾压以前的跟踪的算法。
3. 最后
下一篇就是和MOSSE算法的联系和KCF的改进。