Visual Tracker Benchmark v1.0全过程配置方法,测试跟踪序列OTB50/OTB100

来源:互联网 发布:网络兼职业务员 编辑:程序博客网 时间:2024/05/22 06:22

Visual Tracker Benchmark v1.0全过程配置方法,测试跟踪序列OTB50/OTB100

前言:最近在实习公司做long-time tracking算法.主要目的是在实时的前提下,解决长时跟踪中遇到的out of view,occlusion,fast motion等问题(目前这个算法应对变形能力较差,需要改进!).写完了算法,接下来开始测试算法性能。目前主流的跟踪测试集有两个:VOT和OTB,由于VOT大多序列较短,而OTB有long-term的测试序列,故我采用了OTB作为测试视频集。这两个测试集的区别具体可以参考:OTB-2015 database与OpenCV320 tracking API
OTB测试集主要来源于此文:Online Object Tracking:A Benchmark 。文中,作者把之前先进的跟踪算法都集成了起来,通过Precision plot和Success plot来直观展示不同trackers的效果对比。贡献在于:
1、建立了50个全注释的datasets来评估算法性能。
2、集成了大多数公开可用的跟踪器,并设置了统一的输入和输出格式,以便于大规模性能评估。目前,它包括29个跟踪算法。
3、初始bounding boxs从时间和空间上进行采样来评估trackers的鲁棒性等性能。

闲言少叙,进入正题:

1. 下载所需代码和数据集

首先进入OTB的主页,下载所需的代码和数据集。这个包括已经存在的20多种跟踪算法的测试数据,还有如何测试你自己的跟踪算法的matlab代码
这个包括已经存在的20多种跟踪算法的测试数据,还有如何测试用的matlab代码。而同样在这个网站还有Datasets,也要把里面的视频序列一一下载。不过一个个下载太麻烦,我这里提供一个下载代码,读者可以直接在matlab环境下运行这段代码,就可以自动下载OTB100的数据集,非常方便。
在benchmark网站上下载完测试代码后,得到一个tracker_benchmark_v1.0的文件夹,下面将介绍每一个文件的功能。

2. 各文件功能

这里写图片描述
(1) main_running.m是用来在测试集上跑跟踪代码的,跑出的结果存在results文件夹中;
(2) perfPlot.m用来把测试结果画出图来,就是benchmark网上的图的效果,如果你第一次下载tracker_benchmark_v1.0的测试代码,可以先运行perfPlot.m就可以直接画出漂亮的图。只不过这些图是已有的跟踪算法和测试结果,作者都保存在results文件夹里面了;
(3) drawResultBB.m用于画每个帧上不同跟踪器的边界框的主函数。
(4) anno注释文件(边界框和属性)的目录;
(5) initOmit 包含由于遮挡或目标超出视野而被省略的用于跟踪初始化的帧的注释 的目录;
(6) rstEval 包含了很多用于计算跟踪性能或者画出结果的脚本的目录;
(7) trackers 包含了很多跟踪器代码的目录,里面有20多个跟踪代码,有matlab版,也有c++版;
(8) tmp 用来存放临时结果或者日志文件的目录;
(9) results包含了所有已有跟踪算法的测试结果;
(10) util 包含主函数里用到的脚本的目录(主要就是这个文件夹里的文件需要改)。

3. 更改测试代码

更改主要有以下几个部分:
(1)util/configTrcakers.m文件,打开,这里面是所有跟踪算法名字的数组,会在main_running.m和perfPlot.m中被调用到。因为results文件夹中已经包含已有跟踪算法的测试结果,所以其实没必要再重新跑一遍所有算法,时间太长。故而直接将configTrackers.m文件中的所有注释掉,改成如下三行代码即可:(就是说让这个文件夹里只有你自己写的跟踪算法,这样一会执行main_running.m的时候,就不用在测试集上挨个跑已有跟踪算法了)
function trackers=configTrackers
trackersNEW={struct('name','LCSVM','namePaper','LCSVM')};
trackers=trackersNEW;

(2)util/configSeqs.m文件,打开,这里面是所有测试集的路径及其属性。需要把里面所有测试序列的路径改成你main_runing.m函数能够读到的路径,建议用绝对路径,类似于(这是测试集的路径):
E:/software/matlab/bin/mywork/tracking_benchmark/Benchmark/Soccer/img/
改完之后效果大致如图:
这里写图片描述
(3)trackers/文件,打开,新建文件夹,命名LCSVM。打开LCSVM,将自己跟踪算法的可执行文件LCSVM.exe保存进来,然后再新建一个run_LCSVM.m文件,用来配置算法的接口。可以直接从其他trackers文件里面,把run_xx.m文件拷过来,因为大同小异。拷过来之后稍作修改,我把我的run_LCSVM.m展出来,读者可以观察和其他run_xx.m的区别,很好理解。

function results=run_LCSVM(seq, res_path, bSaveImage)close all;x=seq.init_rect(1)-1;%matlab to cy=seq.init_rect(2)-1;w=seq.init_rect(3);h=seq.init_rect(4);ticcommand = ['LCSVM.exe' ' ' seq.name ' ' seq.path ' ' num2str(seq.startFrame) ' ' ...num2str(seq.endFrame) ' '  num2str(x) ' ' num2str(y) ' ' num2str(w) ' ' num2str(h)];dos(command);duration=toc;% results.res = dlmread([seq.name '_ST.txt']);results.res(:,1:2) =results.res(:,1:2) + 1;%c to matlabresults.type='rect';results.fps=seq.len/duration;% results.fps = dlmread([seq.name '_ST_FPS.txt']);

其实就是通过dos命令将测试序列的名称、路径、起始帧等喂给你的跟踪算法,当然前提是你的跟踪算法里面一定要预留这些接口。跟踪算法里面还要将每一帧的跟踪结果输出到LCSVM_ST.txt的文件夹里面,这样才能被上面的matlab代码读到来生成最终结果。
(4)这些都做好了,就可以进入main_runing.m文件,执行这段代码。执行过程中可能会有问题,比如这段代码要注释掉(这是vlfeat工具集的路径,是OTB作者用来测试那些已有算法用的,我们这里只测试自己的跟踪算法):
这里写图片描述
另外我把这个修改成了OPE,因为我只进行OPE的测试,认为足以。当然读者可以测试TRE和SRE。(这两个是用来测试时空鲁棒性的)
这里写图片描述
然后就应该不用改了,就可以执行main_running.m啦!!!就可以看到你的算法在所有测试集上面运行的效果啦!!!到这一步还是令人激动的。另外如果读者还发现问题,欢迎交流。

4. 画出结果对比已有算法

main_running.m跑出的结果,会在results里面有体现:
这里写图片描述
由于我跑的是OPE,所以我的算法跑出的结果在results_OPE_CVPR13文件夹中,我把里面的结果全部复制,粘贴到results_SRE_CVPR13和results_TRE_CVPR13文件中(因为在perfPlot.m文件中画图的时候用到了这两个文件)。这个时候就可以直接运行perfPlot.m啦,出来的图应该是只有你自己的算法的运行结果,也就是只有一条曲线。原因是:需要返回身来,把configTrackers.m文件修改一下,要把所有的跟踪算法重新包含进来,当然还要加入自己的跟踪算法。代码如下:

function trackers=configTrackers% trackersVIVID={struct('name','VR','namePaper','VR-V'),...%gray-25%    struct('name','TM','namePaper','TM-V'),...%dark red    struct('name','RS','namePaper','RS-V'),...%orange    struct('name','PD','namePaper','PD-V'),...%Turquoise    struct('name','MS','namePaper','MS-V')%purple};trackers1={   struct('name','CT','namePaper','CT'),...    struct('name','TLD','namePaper','TLD'),...        struct('name','IVT','namePaper','IVT'),...    struct('name','DFT','namePaper','DFT'),...%yellow    struct('name','ASLA','namePaper','ASLA'),...    struct('name','L1APG','namePaper','L1APG'),...        struct('name','ORIA','namePaper','ORIA'),...    struct('name','MTT','namePaper','MTT'),...    struct('name','CSK','namePaper','CSK'),...    struct('name','SCM','namePaper','SCM'),...    struct('name','LOT','namePaper','LOT')};trackersEXE={ struct('name','CPF','namePaper','CPF'),...    struct('name','Struck','namePaper','Struck'),...    struct('name','MIL','namePaper','MIL'),...    struct('name','OAB','namePaper','OAB'),...    struct('name','SBT','namePaper','SemiT'),...    struct('name','BSBT','namePaper','BSBT'),...    struct('name','Frag','namePaper','Frag'),...    struct('name','KMS','namePaper','KMS'),...    struct('name','SMS','namePaper','SMS'),...    struct('name','LSK','namePaper','LSK'),...    struct('name','VTS','namePaper','VTS'),...    struct('name','VTD','namePaper','VTD'),...    struct('name','CXT','namePaper','CXT')};trackersNEW={struct('name','LCSVM','namePaper','LCSVM')};% trackers=trackersNEW;trackers = [trackersVIVID,trackers1,trackersEXE,trackersNEW];

这回再来重新运行perfPlot.m来看看效果!!!就会有美图啦(暂且只附两张,相信你会自己看到很多张,到这一步,恭喜你)!

这里写图片描述

这里写图片描述
展示一下LCSVM跟踪效果
我写的算法主要是long-term tracking,最最主要的优势就是能够应对fast motion, motion blur, occlusion, out-of-view等。跟踪效果也是杠杠的!

原创粉丝点击