KCF再理解记录

转自        YaqiLYU  知乎文章    NIUBILITY的相关滤波框架详解

              https://zhuanlan.zhihu.com/p/26415984

  • 接下来就是循环移位(Cyclic shifts)。相关滤波的训练样本是通过循环移位产生的,理由1:密集采样得到的样本与循环移位产生的样本很像,可以用循环移位来近似。理由2:卷积(相关)运算在傅里叶域对应点乘运算,可以减小计算量,而循环矩阵经过傅里叶变换会对角化,可以进一步减小计算量。

  • 训练标签是由高斯函数产生的连续值,相关滤波是回归而非分类,这点和以前的判别类方法区别较大。训练样本和标签如下图。原始样本是跟踪框加1~1.5倍padding得到的图像块,再乘一个余弦窗,训练样本集是原始样本通过循环移位产生,原始图像中心(红点)移位后对应高斯图位置的值就是这个移位样本的标签(蓝点):

用户上传的图片


接下来将封闭解变换到傅里叶域,结合循环矩阵的特性将样本集进行化简,得到最终的封闭解:

用户上传的图片


其实循环移位的样本集是隐性的,并没有真正产生过,只是在推导过程中用到了,所以我们也不需要真正的内存空间去存储这些样本。

  • 快速检测。检测过程也是类似,用训练得到的分类器对检测区域图像块的每个循环移位样本做相关操作,得到一个响应值,所有移位样本的响应值会构成一幅响应图,与特征图的大小一致,最大响应点就是跟踪目标的中心。这个过程也可以在傅里叶域简化,而不用真正去循环移位产生检测样本并分类,计算高效节省内存:

 

用户上传的图片

在举个简单例子,100*100的检测块,目标中心位于边缘附近(20,20)位置,在检测过程中会持续循环移位并与滤波模板比较,只有当目标移位到中心时响应最大,这个最大值会写入响应图(20,20)位置。

此外,作者发现如果给岭回归加入kernel-trick,也可以推导出封闭解,推荐是高斯核。至此,CSK算法就成型了。总结一下,如果是100*100的图像块,经过傅里叶变换和几个简单的元素级点乘计算,事实上已经完成了10000个样本的训练和10000个样本的检测,复杂度由O(mn*mn)降低到了O(mn*log(mn)),m和n是图像的高乘宽,也就是说CSK的复杂度与图像块的像素点总数有关,padding大小会影响复杂度。循环移位生成的近似样本集结合FFT以近乎恐怖的方式降低了计算量,但是,这种近似以引入边界效应为代价,再但是,即使存在边界效应KCF/DCF依然碾压了Struck。接下来,再看几个可视化结果,依次是某些帧的检测响应,模板权值和跟踪结果:

用户上传的图片


首先看第二列的分类器参数,和前面的分析一致,可视化的模板权值就是跟踪目标的内容(模子,建模成功)。相关响应在理想情况下呈现单峰,与训练时的期望高斯图比较类似,有遮挡或在变形严重(模板对不上号)时会呈现多峰。

 

  • MOSSE中,过程基本类似,第一帧初始化加了随机仿射,优化目标没有正则项,但最大区别还是训练和检测都没有加padding(主要区别)来扩展背景信息,仅建模了目标区域。提出了一种跟踪置信度的评价指标峰值旁瓣比PSR,更新方式是以固定学习率更新分类器参数,但形式略有区别,是滤波器的分子和分母分别更新,这种更新方式使用更加广泛:

 

用户上传的图片

  • 然后,多通道特征扩展只需要频域通道响应求和,就这么简单。首先来看KCF/DCFJoão F. Henriques,将CSK中的单通道灰度特征扩展成多通道的HOG特征,采用HOG+线性核的方法叫做DCF,采用HOG+高斯核的方法叫做KCF,依靠傅里叶变换的快速算法FFT和HOG的快速算法fHOG,KCF/DCF成功起飞。作者提供了一份没有尺度更新的MATLAB代码,和三份C++代码,一份扩展了LAB颜色特征和简单的3尺度检测,一份扩展了CN特征和尺度估计,最后一份是OPENCV版本前面提到过,仅扩展了CN特征没有尺度更新。其实在这之前Hamed Kiani在MCCF MCCF中就尝试用多通道特征(SIFT, HOG)的MOSSE去做检测,证明HOG效果比较好,之所以会提到这个是因为这个名字后面还会出现:
  • Kiani Galoogahi H, Sim T, Lucey S. Multi-channel correlation filters [C]// ICCV, 2013.

同一时期, Martin Danelljan大牛(林雪平大学,这个名字还会出现很多很多次)用多通道颜色特征Color Names(CN)去扩展CSK得到了不错的效果,算法也简称CN Coloring Visual Tracking。将RGB的3通道图像投影到11个颜色通道,分别对应英语中常用的语言颜色分类,分别是black, blue, brown, grey, green, orange, pink, purple, red, white, yellow (对比汉语中常用的语言颜色分类:赤橙黄绿青蓝紫+黑白灰,英语和汉语对颜色的认知还是略有差异的),并归一化得到10通道颜色特征。作者还测试了多种颜色特征在相关滤波中的效果,发现CN最好,其次是LAB。下面是HOG特征和8个CN特征通道可视化的图像,随便画的随便看看:

用户上传的图片

接下来是CN的性能,作者选了41个彩色序列(25%灰度序列的OTB表现不出彩色特征方法的优势)进行比较,简单来说也是全面领先struck,10通道CN特征的FPS是78.9,压缩后两通道CN2特征的FPS是105,但这里需要强调一点,论文中的帧率FPS是和作者电脑的配置密切相关的,Martin Danelljan大神的电脑配置比较差算法普遍帧率低很多,这里我们以吴毅老师的电脑为参考,固定struck为20FPS,其他算法都换算到这个标准去比较,结果如下:CSK(362FPS), KCF(172FPS), DCF(292FPS), CN(152FPS), CN2(202FPS)。(后面其他算法类似,如DSST是53.6FPS

用户上传的图片


HOG是梯度特征,而CN是颜色特征,两者可以互补,所以HOG+CN在近两年的跟踪算法中成为了hand-craft特征标配。最后,再回到KCF/DCF的实验结果,讨论两个问题:

用户上传的图片

 

  • 1. 为什么只用单通道灰度特征的KCF和用了多通道HOG特征的KCF速度差异很小?

第一,HOG,作者用了HOG的快速算法fHOG,来自Piotr's Computer Vision Matlab Toolbox,C代码而且做了SSE优化。如对fHOG有疑问,请参考论文Object Detection with Discriminatively Trained Part Based Models第12页。 第二,HOG特征常用cell size是4,这就意味着,100*100的图像,HOG特征图的维度只有25*25=625像素点,而Raw pixels是灰度图归一化,维度依然是100*100 = 10000像素点,我们简单算一下:27通道HOG特征的复杂度是27*625*log(625) = 47180,而单通道灰度特征的复杂度是10000*log(10000) = 40000,
结果也是相差不多,符合表格(不知道这种算法对不对,如果有误请指出,谢谢)。
看代码你会发现,作者在扩展后目标区域面积较大时,会先对提取到的图像块做因子2的下采样,到50*50 = 2500像素点,这样复杂度就变成了2500*log(2500) = 8495,下降了非常多。那你可能会想,如果下采样再多一点,复杂度就更低了,但这是以牺牲跟踪精度为代价的,再举个例子,如果图像块面积为200*200,先下采样到100*100,再提取HOG特征,分辨率降到了25*25,这就意味着响应图的分辨率也是25*25,也就实说,响应图每位移1个像素,原始图像中跟踪框要移动8个像素,这样就降低了跟踪精度。在精度要求不高时,你完全可以稍微牺牲下精度提高帧率(但真的不能再下采样了~)。

  • 2. HOG特征的KCF和DCF哪个更好?

大部分人都会认为KCF效果超过DCF,而且各属性的准确度都在DCF之上,然而,如果换个角度来看,以DCF为基准,再来看加了kernel-trick的KCF,mean precision仅提高了0.4%,而FPS下降了41%,这么看是不是挺惊讶的呢?除了图像块像素总数,KCF的复杂度还主要和kernel-trick相关。所以,下文中的CF方法如果没有kernel-trick,就简称基于DCF,如果加了kernel-trick,就简称基于KCF(请注意区分其他方法有没有加核)。当然这里的CN也有kernel-trick,但请注意,这是Martin Danelljan大神第一次使用kernel-trick,也是最后一次。。。
可能会有这样的疑问,kernel-trick这么强大的东西,怎么才提高这么点?这里就不得不提到Winsty的另一篇大作:

  • Wang N, Shi J, Yeung D Y, et al. Understanding and diagnosing visual tracking systems [C]// ICCV, 2015. 

一句话总结,别看那些五花八门的机器学习方法,那都是虚的,目标跟踪算法中特征才是最重要的。(若有曲解,以论文为准)所以对于那些仅简单修改机器学习方法而不关注如何减小边界效应的相关滤波,也许可能大概会有效果,但在这里我一律不做评价讨论(如果您有不同看法,非常欢迎讨论),我更加关心那些速度比较快或者对边界效应处理的比较有效的方法。
以上就是前三个首先推荐的高速算法,CSK, KCF/DCF和CN,区别主要在于有没有Kernel trick和用什么特征(灰度像素,fHOG,Color Names)!当然任性组合也是没有问题的。

大佬写的很好,留着。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值