来自马超大神的论文:Long-term Correlation Tracking
代码跑起来先
论文才刚开始看,但是代码先跑了一下看结果,有一点小坑,记录下:
首先去论文的github上去下载代码:点这里
readme里其实写了怎么搞:
Quickstart
- Unzip code or clone it from
https://github.com/chaoma99/lct-tracker.git- Add the vl_feat toolbox in your current path
http://www.vlfeat.org/- If you don't have the object tracking benchmark (OTB) dataset yet, run 'download_videos.m' (it will automatically download the OTB-100 sequences)
- Run utility/compile.m to comile calcIIF.cpp and im2colstep.c. These files are tested with opencv3.0. Notice the compatibility issue if your opencv version is earlier than 3.0
- The source files "assignToBins1.c", "gradientMex.cpp", 'imResample.cpp' are from Pitor Dollar's toolbox. If the compiled files do not work on your system, get it from
http://vision.ucsd.edu/~pdollar/toolbox/doc/index.html
这里再说一些操作细节:
- 首先是把整个项目下载下来解压,clone也可以,我是直接下载的zip解压。
- 然后去下载这个工具包:vl_feat toolbox,这是一个matlab的工具包,下载之后解压,记住路径,然后再matlab中运行:
run('C:\vlfeat-0.9.20\toolbox\vl_setup')
这个路径就是vl_setup.m
所在的路径。这个方法是每次打开matlab都要运行一次,还有一种方法是把整个文件夹添加进matlab的路径:
这样就相当于安装了这个工具包,其他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
还有:这几个路径也要改:- 然后下载数据就可以了,作者给出的download_video.m就可用,或者自己手动去下载也行,完了就可以跑代码了。我用作者给的代码下载了几个,但是效果并不是特别好,但这个算法是long-term的一个经典算法,还是想过一遍。
文章思路
大概看了一遍,因为效果不是很好,速度也极慢(个位数的帧率),看文章的时候发现竟然用了47个通道的特征,除了31维的fhog之外还加了一些,所以只是大概看了一下思路,这还只是平移,尺度更新和DSST稍有不同,DSST是训练了一个一维的尺度滤波器,这里没有,而是用hog特征求了响应(是一个二维的滤波器),取一个响应的最大值(和SAMF倒是有点像,不过这里的尺度要多一些)。
这是long-term的一篇比较经典的文章。
前面看过的KCF,CN等都是针对于短时跟踪的,对于遮挡的效果尤其不好,因为是每一帧都更新模型,虽然已经加入了一个学习率来更新以提高鲁棒性,但是如果一连数帧都被遮挡,那么滤波器就会漂移到遮挡物上,很难再更新回来。也就会跟丢了。
所以长时跟踪主要要解决几个个问题:
- 能够判断什么时候跟丢了。
- 跟丢了要找回来,要就是要配置一个detector,而且这个detector还必须足够好足够快,检测失败还不如不检测,速度跟不上不符合tracking的要求。
- detector也需要在线更新,因为被跟踪物体可能存在变形和尺寸变化等。
先来看一个图:
Rc:加padding,加汉明窗,用的是fhog加一些其他的特征,共47维。细节没看。
Rt:不加padding,不加汉明窗,用hog特征。
两个滤波器的作用不同,下面说,再看一张图:
Rc用来平移估算,也就是位置更新,基本和DCF中的是相同的,滤波器每帧都更新。
Rt用来尺度估算,具体就是构建尺度金字塔,然后resize到固定大小,取hog,每一个都送入Rt,响应最大的那一个的尺度当做最佳尺度。
另外Rt还负责检验目标的置信度,一旦判定目标不可信,就调用detector重新检测,但也不是检测到的就采用,还是有一定的条件。具体如下:
- 首先,Rt不是每一帧都更新的,只有当响应max_response(原文中式5的结果)大于一个阈值Ta(外观阈值)时才更新,这说明平移检测足够可信,就依此来更新Rt。
- 如果max_response<Tr(运动阈值)时,则调用detector来重新检测目标,但并不是这样就直接采用detector的结果,只有当检测到的响应(检测到的结果送入滤波器算响应)大于1.5倍的max_response时才会采用,否则还沿用平移检测到的结果。这段原文中没有提及,代码里可能有具体值。伪代码中是和Tr进行的比较。
用到的随机簇检测我也没仔细看,是一种全帧检测,还有用到KNN分类(公开代码说是用SVM代替了),这些细节我都没有去看代码。
总结
理论上来说,这种方法对于遮挡的处理结果应该是不错的,但是我实测来看,对于快速运动和遮挡还是有跟丢的情况,而且再也找不回来,另外这两个非常重要且精确的阈值是怎么得来的也未可知,不过这种思路是值得借鉴的,也很直观。大概就这样。