LCT代码跑起来先文章思路总结

时间:2022-06-09
本文章向大家介绍LCT代码跑起来先文章思路总结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

来自马超大神的论文:Long-term Correlation Tracking

代码跑起来先

论文才刚开始看,但是代码先跑了一下看结果,有一点小坑,记录下: 首先去论文的github上去下载代码:点这里 readme里其实写了怎么搞:

Quickstart

  1. Unzip code or clone it from https://github.com/chaoma99/lct-tracker.git
  2. Add the vl_feat toolbox in your current path http://www.vlfeat.org/
  3. If you don't have the object tracking benchmark (OTB) dataset yet, run 'download_videos.m' (it will automatically download the OTB-100 sequences)
  4. 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
  5. 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

这里再说一些操作细节:

  1. 首先是把整个项目下载下来解压,clone也可以,我是直接下载的zip解压。
  2. 然后去下载这个工具包:vl_feat toolbox,这是一个matlab的工具包,下载之后解压,记住路径,然后再matlab中运行: run('C:vlfeat-0.9.20toolboxvl_setup')这个路径就是vl_setup.m所在的路径。这个方法是每次打开matlab都要运行一次,还有一种方法是把整个文件夹添加进matlab的路径:

set path

add_path 这样就相当于安装了这个工具包,其他matlab工具包的安装也可以参照这个过程。 如果自己写的函数想要在matlab工程里调用的话也可参照这种方法,matlab的程序组织就是这种形式,简单粗暴。

  1. 编译calcIIF.cpp and im2colstep.c,这几个文件依赖于opencv3.0以上版本,我用的3.3也是可以的,需要改几个路径,都在compile.m文件里,如下: 这两个路径改成自己opencv的安装路径。
opts.opencv_include_path    =   'C:opencvbuildinclude'; % OpenCV include path
opts.opencv_lib_path        =   'C:opencvbuildx64vc14lib'; % OpenCV lib path

还有:这几个路径也要改:

路径改动

  1. 然后下载数据就可以了,作者给出的download_video.m就可用,或者自己手动去下载也行,完了就可以跑代码了。我用作者给的代码下载了几个,但是效果并不是特别好,但这个算法是long-term的一个经典算法,还是想过一遍。

文章思路

大概看了一遍,因为效果不是很好,速度也极慢(个位数的帧率),看文章的时候发现竟然用了47个通道的特征,除了31维的fhog之外还加了一些,所以只是大概看了一下思路,这还只是平移,尺度更新和DSST稍有不同,DSST是训练了一个一维的尺度滤波器,这里没有,而是用hog特征求了响应(是一个二维的滤波器),取一个响应的最大值(和SAMF倒是有点像,不过这里的尺度要多一些)。 这是long-term的一篇比较经典的文章。 前面看过的KCF,CN等都是针对于短时跟踪的,对于遮挡的效果尤其不好,因为是每一帧都更新模型,虽然已经加入了一个学习率来更新以提高鲁棒性,但是如果一连数帧都被遮挡,那么滤波器就会漂移到遮挡物上,很难再更新回来。也就会跟丢了。 所以长时跟踪主要要解决几个个问题:

  1. 能够判断什么时候跟丢了。
  2. 跟丢了要找回来,要就是要配置一个detector,而且这个detector还必须足够好足够快,检测失败还不如不检测,速度跟不上不符合tracking的要求。
  3. detector也需要在线更新,因为被跟踪物体可能存在变形和尺寸变化等。

先来看一个图:

filter

这是文中用的两个滤波器。 Rc:加padding,加汉明窗,用的是fhog加一些其他的特征,共47维。细节没看。 Rt:不加padding,不加汉明窗,用hog特征。 两个滤波器的作用不同,下面说,再看一张图:

framework

Rc用来平移估算,也就是位置更新,基本和DCF中的是相同的,滤波器每帧都更新。 Rt用来尺度估算,具体就是构建尺度金字塔,然后resize到固定大小,取hog,每一个都送入Rt,响应最大的那一个的尺度当做最佳尺度。 另外Rt还负责检验目标的置信度,一旦判定目标不可信,就调用detector重新检测,但也不是检测到的就采用,还是有一定的条件。具体如下:

  1. 首先,Rt不是每一帧都更新的,只有当响应max_response(原文中式5的结果)大于一个阈值Ta(外观阈值)时才更新,这说明平移检测足够可信,就依此来更新Rt。
  2. 如果max_response<Tr(运动阈值)时,则调用detector来重新检测目标,但并不是这样就直接采用detector的结果,只有当检测到的响应(检测到的结果送入滤波器算响应)大于1.5倍的max_response时才会采用,否则还沿用平移检测到的结果。这段原文中没有提及,代码里可能有具体值。伪代码中是和Tr进行的比较。

基本就是这样,伪代码也比较清晰:

伪代码

用到的随机簇检测我也没仔细看,是一种全帧检测,还有用到KNN分类(公开代码说是用SVM代替了),这些细节我都没有去看代码。

总结

理论上来说,这种方法对于遮挡的处理结果应该是不错的,但是我实测来看,对于快速运动和遮挡还是有跟丢的情况,而且再也找不回来,另外这两个非常重要且精确的阈值是怎么得来的也未可知,不过这种思路是值得借鉴的,也很直观。大概就这样。