来自马超大神的论文:Long-term Correlation Tracking
论文才刚开始看,但是代码先跑了一下看结果,有一点小坑,记录下: 首先去论文的github上去下载代码:点这里 readme里其实写了怎么搞:
Quickstart
这里再说一些操作细节:
run('C:\vlfeat-0.9.20\toolbox\vl_setup')
这个路径就是vl_setup.m
所在的路径。这个方法是每次打开matlab都要运行一次,还有一种方法是把整个文件夹添加进matlab的路径:
set path
add_path 这样就相当于安装了这个工具包,其他matlab工具包的安装也可以参照这个过程。 如果自己写的函数想要在matlab工程里调用的话也可参照这种方法,matlab的程序组织就是这种形式,简单粗暴。
calcIIF.cpp and im2colstep.c
,这几个文件依赖于opencv3.0以上版本,我用的3.3也是可以的,需要改几个路径,都在compile.m文件里,如下:
这两个路径改成自己opencv的安装路径。opts.opencv_include_path = 'C:\opencv\build\include'; % OpenCV include path
opts.opencv_lib_path = 'C:\opencv\build\x64\vc14\lib'; % OpenCV lib path
还有:这几个路径也要改:
路径改动
大概看了一遍,因为效果不是很好,速度也极慢(个位数的帧率),看文章的时候发现竟然用了47个通道的特征,除了31维的fhog之外还加了一些,所以只是大概看了一下思路,这还只是平移,尺度更新和DSST稍有不同,DSST是训练了一个一维的尺度滤波器,这里没有,而是用hog特征求了响应(是一个二维的滤波器),取一个响应的最大值(和SAMF倒是有点像,不过这里的尺度要多一些)。 这是long-term的一篇比较经典的文章。 前面看过的KCF,CN等都是针对于短时跟踪的,对于遮挡的效果尤其不好,因为是每一帧都更新模型,虽然已经加入了一个学习率来更新以提高鲁棒性,但是如果一连数帧都被遮挡,那么滤波器就会漂移到遮挡物上,很难再更新回来。也就会跟丢了。 所以长时跟踪主要要解决几个个问题:
先来看一个图:
filter
这是文中用的两个滤波器。 Rc:加padding,加汉明窗,用的是fhog加一些其他的特征,共47维。细节没看。 Rt:不加padding,不加汉明窗,用hog特征。 两个滤波器的作用不同,下面说,再看一张图:
framework
Rc用来平移估算,也就是位置更新,基本和DCF中的是相同的,滤波器每帧都更新。 Rt用来尺度估算,具体就是构建尺度金字塔,然后resize到固定大小,取hog,每一个都送入Rt,响应最大的那一个的尺度当做最佳尺度。 另外Rt还负责检验目标的置信度,一旦判定目标不可信,就调用detector重新检测,但也不是检测到的就采用,还是有一定的条件。具体如下:
基本就是这样,伪代码也比较清晰:
伪代码
用到的随机簇检测我也没仔细看,是一种全帧检测,还有用到KNN分类(公开代码说是用SVM代替了),这些细节我都没有去看代码。
理论上来说,这种方法对于遮挡的处理结果应该是不错的,但是我实测来看,对于快速运动和遮挡还是有跟丢的情况,而且再也找不回来,另外这两个非常重要且精确的阈值是怎么得来的也未可知,不过这种思路是值得借鉴的,也很直观。大概就这样。