vot是面向跟踪算法的全球挑战赛,每年都会举办一次,组委会制定了一套科学的跟踪器评价指标和方法用于提交作品的评分,该工具就是vot-toolkit,是一个基于Matlab的工具集。
挑战赛的官网是 http://votchallenge.net/
vot-toolkit在github提供下载 https://github.com/votchallenge/vot-toolkit.git
除了vot-toolkit本身以外,还需要下载一个叫TraX的库。Trax主要作用就是建立各种语言跟踪器与vot-toolkit的传输协议,方便我们对不同语言写的tracker进行统一分析。
TraX https://github.com/votchallenge/trax.git
在官网中有对比赛、数据集、各种tracker的详细介绍,虽然配置过程在文档中也有介绍,但从我个人和github的issue看,不少人还是有点问题,因此将个人的配置过程和遇到的坑记录下来。
Windows10 x64,其中Matlab版本未Matlab 2016b,VS版本是VS2015
下载vot-toolkit-master文件并解压,其中中包含很多文件夹,我们需要新建一个文件夹名为native,下载traX-master并解压,将traX-master文件夹改名为traX放进native中,这样程度就准备完成了。
matlab程序运行起来以后会自动检测数据集的存在,如果没有数据集会自动下载,考虑到墙的问题还是最好提前下载,毕竟后期可能会增加自己的数据集。
数据集需要在vot-toolkit-master主文件夹中新建sequences文件夹,并放入数据。
数据的格式需要按照工具的读取形式,很多教程写的不清楚。
sequences的目录结构应该是这样
- sequences
|-- ball
|-- color
|-- 00000001.jpg
|-- 00000002.jpg
|-- ...
|-- camera_motion.tag
|-- groundtruth.txt
|-- ...
|-- car
|-- book
|--...
|--lists.txt
其中lists.txt是一个文本格式文档,记录了想要处理的数据集名称,vot-kit从这个文档读取文件夹名来依次处理。
这个过程说白了就是根据你的需要自动产生一些代码用来跑数据集用,真正做到一键处理。这些代码来自于主文件夹下的模板(其实这样做增加了复杂度,一开始还不容易看明白)。
执行操作如下:
执行时根据需要选择 跟踪器名 - 数据集 - 编程语言 即可,选错了也没关系,可以直接修改生成的m文件。假设我们跟踪器的是ncc-vot2015
如果跟踪器是Matlab写的,我们以.\tracker\examples\matlab 下的ncc为例进行说明
默认的tracker_ncc.m接口如下:
error('Tracker not configured! Please edit the tracker_ncc.m file.'); % Remove this line after proper configuration
% The human readable label for the tracker, used to identify the tracker in reports
% If not set, it will be set to the same value as the identifier.
% It does not have to be unique, but it is best that it is.
tracker_label = [];
% For MATLAB implementations we have created a handy function that generates the appropritate
% command that will run the matlab executable and execute the given script that includes your
% tracker implementation.
%
% Please customize the line below by substituting the first argument with the name of the
% script (not the .m file but just the name of the script as you would use it in within Matlab)
% of your tracker and also provide the path (or multiple paths) where the tracker sources
% are found as the elements of the cell array (second argument).
tracker_command = generate_matlab_command('', {''});
tracker_interpreter = 'matlab';
% tracker_linkpath = {}; % A cell array of custom library directories used by the tracker executable (optional)
写的很清楚了,第一步注释掉首行的error,label可改可不改,主要是把调用接口填正确。
Matlab 的调用接口其实就是m文件路径,第一处填m文件的文件名,第二处填所在文件夹。
tracker_command = generate_matlab_command('ncc', {'D:\GitLibray\vot-toolkit-master\tracker\examples\matlab'});
直接执行run_test.m,如果程序正常运行会让你选择测试数据集名,稍等待一会就弹出跟踪图像和标准框及跟踪框的位置,鼠标点击切下一帧。test通过以后,后续的试验和报告等应该不会有什么问题了。这样Matlab跟踪器的设置就完成了。
其实\vot-toolkit-master\tracker\examples下已经将支持的demo接口给出了,所以当我们想再次设置跟踪器时可以不需要跑一遍workspace_create,直接修改对应的tracker_xx.m就行了。
和Matlab跟踪器的配置流程是一样的,需要注意的地方是接口文件的配置
tracker_label = 'Demo_py';
% Note: be carefull for double backslashes on Windows
tracker_command = generate_python_command('python_ncc', ...
{'D:\\GitLibray\\vot-toolkit-master\\tracker\\examples\\python', ... % tracker source and vot.py are here
'D:\\GitLibray\\vot-toolkit-master\\native\\trax\\support\\python'});
tracker_interpreter = 'python';
tracker_linkpath = {'D:\\GitLibray\\vot-toolkit-master\\native\\trax\\build\\Release'};
这里几个需要注意的tips:
编译traX需要使用cmake生成VS工程文件sln,然后在vs中编译出traX的库文件(trax.lib,trax.dll),tracker_linkpath就是指向这个路径的。
配置完成后,执行run_test.m,后续就和上述一样了。
原生程序的配置是最简单的,Matlab程序其实就是帮忙执行跟踪器的exe文件,配置如下(是的就一行):
tracker_command = 'D:\\GitLibray\\vot-toolkit-master\\tracker\\examples\\native\\cppDemo\\x64\\Release\\cppDemo.exe';
我编译c++的NCC例子时发现cmake失败的情况,原因是traX的配置不成功导致cmake无法自动生成,找了半天没找到原因,后来干脆手动生成。
如果只想跑demo,编译时加入的c++文件是vot.h和ncc.cpp,需要手动配置opencv和traX库,这个不用说了吧。所以有的时候简单的问题过度考虑自动化反而影响效率。
通过C++工程,我们很容易就知道traX和整个程序是怎么互相依赖的。
这样,我们就将vot-toolkit支持的语言都配置了一遍,我们得到的认识是vot-toolkit通过tracker_command来自动化调用跟踪器 脚本/原生程序,生成跟踪结果,并通过traX传输到matlab端进行显示和分析出图。我觉得有这样的认识后,一些更复杂的tracker依赖应该也能理清楚了。
PS:鉴于可能的编译问题,这里把traX的编译过程放上来供大家参考。
首先从github下载traX库,安装了git的直接clone,没有就直接下载压缩包。工程是用cmake管理的。
第二部,安装cmake,过程略。然后按照下图填写,这些其实是基本的cmake-gui使用。
点击configure进行预配置,
红色的条目就是需要我们进一步配置的了,其实如果不打算深入研究traX代码就不用管了,继续点击configure完成配置。好了全白了。再点击生成工程,就完成了cmake工程的本地化,可以用vs继续编译了。
修改为release模式后,在VS解决方案右击选择生成解决方案,这样就完成了traX库的编译。
在\trax-master\build\Release目录下就可以找到编译好的动态库。
已经完成一半了,后面就需要用这个traX库来编译我们自己的跟踪器。以我上面使用的NCC跟踪器为例。
新建一个VS工程,在包含目录中添加traX的include文件夹,库目录添加我们刚刚编译好的lib库所在文件夹,链接器填上trax.lib,并把这两个文件加入工程,编译出跟踪器的exe可执行程序。
总结:traX的使用与一般的C++开源库使用没有什么区别,也不需要过多的配置
,从这里可以看出,traX库是我们的跟踪器和vot工具沟通的桥梁,所以我们的跟踪器需要包含这个库。附上使用opencv自带的kcf跟踪器的main函数,非常简单。
int main(int argc, char** argv) {
TrackerKCF::Params para;
para.detect_thresh = 0.25;
para.max_patch_size = 96*96;
Ptr tracker = TrackerKCF::create(para);
VOT vot;
cv::Rect initialization;
initialization << vot.region();
cv::Mat image = cv::imread(vot.frame());
Rect2d initialization2d(initialization.x, initialization.y, initialization.width, initialization.height);
tracker->init(image, initialization2d);
rectangle(image, initialization2d,Scalar(255,0,0));
imshow("", image);
waitKey(1);
cv::Rect2d rect;
while (!vot.end()) {
cout << para.detect_thresh;
string imagepath = vot.frame();
if (imagepath.empty()) break;
cv::Mat image = cv::imread(imagepath);
bool bsuc = tracker->update(image, rect);
if (!bsuc)
{
cout << "跟踪失败!" << endl;
return -1;
}
cv::Rect r(rect.x, rect.y, rect.width, rect.height);
vot.report(r, 1);
}
唯一需要注意的就是两点,一个是跟踪器的接口必须包含初始化和更新。第二必须使用vot.region()来初始化,跟踪完成后需要用vot.report(r, 1);来向vot工具传输结果。
完结。