LCT代码跑起来先文章思路总结
来自马超大神的论文: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.20toolboxvl_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:opencvbuildinclude'; % OpenCV include path
opts.opencv_lib_path = 'C:opencvbuildx64vc14lib'; % OpenCV lib path
还有:这几个路径也要改:
路径改动
- 然后下载数据就可以了,作者给出的download_video.m就可用,或者自己手动去下载也行,完了就可以跑代码了。我用作者给的代码下载了几个,但是效果并不是特别好,但这个算法是long-term的一个经典算法,还是想过一遍。
文章思路
大概看了一遍,因为效果不是很好,速度也极慢(个位数的帧率),看文章的时候发现竟然用了47个通道的特征,除了31维的fhog之外还加了一些,所以只是大概看了一下思路,这还只是平移,尺度更新和DSST稍有不同,DSST是训练了一个一维的尺度滤波器,这里没有,而是用hog特征求了响应(是一个二维的滤波器),取一个响应的最大值(和SAMF倒是有点像,不过这里的尺度要多一些)。 这是long-term的一篇比较经典的文章。 前面看过的KCF,CN等都是针对于短时跟踪的,对于遮挡的效果尤其不好,因为是每一帧都更新模型,虽然已经加入了一个学习率来更新以提高鲁棒性,但是如果一连数帧都被遮挡,那么滤波器就会漂移到遮挡物上,很难再更新回来。也就会跟丢了。 所以长时跟踪主要要解决几个个问题:
- 能够判断什么时候跟丢了。
- 跟丢了要找回来,要就是要配置一个detector,而且这个detector还必须足够好足够快,检测失败还不如不检测,速度跟不上不符合tracking的要求。
- detector也需要在线更新,因为被跟踪物体可能存在变形和尺寸变化等。
先来看一个图:
filter
这是文中用的两个滤波器。 Rc:加padding,加汉明窗,用的是fhog加一些其他的特征,共47维。细节没看。 Rt:不加padding,不加汉明窗,用hog特征。 两个滤波器的作用不同,下面说,再看一张图:
framework
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代替了),这些细节我都没有去看代码。
总结
理论上来说,这种方法对于遮挡的处理结果应该是不错的,但是我实测来看,对于快速运动和遮挡还是有跟丢的情况,而且再也找不回来,另外这两个非常重要且精确的阈值是怎么得来的也未可知,不过这种思路是值得借鉴的,也很直观。大概就这样。
- 查找数组中重复的数字
- Lua学习笔记
- 使用Jpeglib
- 赋值运算符函数__from <剑指Offer>
- 从static变量导出问题解析 __declspec(dllexport) 和 __declspec(dllimport)的作用
- php实现SESSION跨域
- 使用cJSON解析JSON字符串
- 逻辑回归 | TensorFlow深度学习笔记
- MakeSureDirectoryPathExists与CreateDirectory的区别
- 粗略的物体碰撞预测及检测
- 讨厌算法的程序员 1 | 插入排序
- FFmpeg菜鸡互啄#第6篇#音频帧格式转换(重采样)
- TF.Learn 手写文字识别
- PHP中的防御性编程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 要点1:指针、数组和复合字面量
- akka-typed(9) - 业务分片、整合,谈谈lagom, 需要吗?
- com-IFileDlg 进行文件的 打开或者保存
- 哆啦A梦?不好记!安利一下Prometheus这款开源的企业监控报警平台
- Kotlin:03-变量、常量、数据类型
- nginx工程师,需要上承天命,下召九幽
- 新版视频流媒体平台EasyNVR如何在前端显示当前页面所在位置?
- Kotlin:04-基本数据类型详细介绍
- Kotlin:05-控制流 if、when、for、while
- android: API24 及以上版本调用系统相机时报:FileUriExposedException 的解决
- Typora 完美结合 PicGo,写作体验更佳!
- 视频流媒体服务器EasyNVR在CentOS6.5上编译报 No such file or directory错误
- Flink Timer(定时器)机制及实现详解
- android:运行时权限工具类的封装
- Android:非Activity跳转Activity时要加FLAG?