OTB Benchmark 学习(下载链接、评价指标、配置)

最近刚刚开始学习目标跟踪方法,在看程序和论文的时候发现评价指标和跟踪算法比较图的时候,思考这些是从哪里来的,查到了一下有关评价方法:OTB Benchmark 、VOT toolkit、pysot 和got10k-toolkit等Toolkit。
先将OTB Benchmark进行学习和总结,后续学习余下的。

文章目录

  • 一、OTB(包含:数据集百度云下载链接)
  • 二、OTB评价指标
    • 1. precision plot 精度图(中心位置误差)
    • 2. Success Plot 成功率图(区域重叠面积比率)
    • 2. OPE、TRE、SRE
  • 三、OTB Benchmark 使用(Matlab版本)
    • 1.下载
    • 2.文件介绍
    • 3.修改程序中的部分设置
    • 4.运行
    • 5.显示
    • 6.画图


一、OTB(包含:数据集百度云下载链接)

OTB 可以用来衡量你的目标跟踪算法好坏,它包含一些 benchmark 结果,打好标记(即ground-truth.txt )的数据集,以及一个用来测试你的算法的代码库。
数据集包括50帧的序列和100帧的序列,其中50帧序列的数据集是2013年提出来的,100帧的数据集是2015年提出来的,所以OTB50也叫OTB2013,OTB100也叫OTB2015。
现在测试基本都使用OTB100做。
相关的数据集和测试代码库都可以在Visual Tracker Benchmark官方网址下载。
OTB50,数据集下载,百度云,密码:rrsr
OTB100,数据集下载,百度云,密码:faqb
建议直接下载OTB100,OTB100包含了OTB50中的所有图像序列。
注明:
1.Jogging和Skating2有两个序列,在序列Human4中的groundtruth_rect.1.txt是空的(原版也是空的)
2.发现在Jogging序列下有个ground_rect.txt,删去即可
3.注意序列BlurCar1,BlurCar3,BlurCar4里面图片序号不是从1开始的

二、OTB评价指标

先抛出两个概念,也是最常见的评价标准。
评价标准通常包含两个基本参数:中心位置误差和区域重叠面积比率
中心位置误差:
是跟踪目标的中心位置 和人工标注的准确位置之间的平均像素距离。
区域重叠面积比率:
通过统计跟踪算法得到的边界框和人工标注的准确边界框之间的面积重叠比衡量跟踪算法的性能。
OTB Benchmark 学习(下载链接、评价指标、配置)_第1张图片

1. precision plot 精度图(中心位置误差)

在跟踪精确度的评估中, 中心位置误差是一个广泛使用的标准, 是跟踪目标的中心位置和人工标注的准确位置之间的平均像素距离(欧几里得距离)。通常, 采用一个序列中所有帧的平均中心位置误差来评价跟踪算法对该序列的总体性能。然而,当跟踪器丢失目标时,预测的跟踪位置是随机的,此时平均误差值可能无法准确评估跟踪器的性能。因此,在 OTB 数据集上将其进一步扩展为精确度曲线图, 统计在不同阈值距离下的成功跟踪比例,并采用阈值为 20 个像素点所对应的数值作为代表性的精确度评价指标。
该评估方法的缺点:无法反映目标物体大小与尺度的变化。
例如:下图为MDNet在OTB100的测试结果,图中蓝色箭头指示的就是阈值20个像素下,MDNet方法的精度为0.909。怎么计算的呢?举例,如一个视频为1000帧,小于20像素距离的帧数有909帧,那边精度为0.909。当然,图中的结果为OTB100数据集的测试的平均结果。

OTB Benchmark 学习(下载链接、评价指标、配置)_第2张图片

2. Success Plot 成功率图(区域重叠面积比率)

由于中心位置误差无法评价目标在跟踪过程中的尺度变化,因此,提出基于区域重叠面积比的评价标准, 通过统计跟踪算法得到的边界框和人工标注的准确边界框之间的面积重叠比衡量跟踪算法的性能。
首先定义重合率得分(overlap score,OS),跟踪算法得到的bounding box(记为a),与ground-truth给的box(记为b)
重合率定义为:
OS = |a∩b|/|a∪b|,
|·|表示区域的像素数目。
当某一帧的OS大于设定的阈值时,则该帧被视为成功的(Success),总的成功的帧占所有帧的百分比即为成功率(Success rate)。OS的取值范围为0~1,因此可以绘制出阈值从 0 到 1 变化的成功率曲线图。
在特定的阈值(例如,阈值为0.5)下使用一个成功率值(Success rate)来评估跟踪算法可能不公平、不具有代表性。取而代之的是,使用每个成功图的曲线下面积(AUC)来对跟踪算法进行排名。
成功图比精度图更可取,因为精度仅使用边界框位置,而忽略大小或重叠。
例如:下图算法后面跟的数值,应该就是AUC
OTB Benchmark 学习(下载链接、评价指标、配置)_第3张图片

2. OPE、TRE、SRE

OPE
用ground-truth中目标的位置初始化第一帧,然后运行跟踪算法得到平均精度和成功率。这种方法被称为one-pass evaluation (OPE)一次性评估。
虽然它很简单,但这个指标有两个主要缺点。首先,跟踪算法可能对第一帧中的初始化敏感,并且其对于不同初始状态或帧的性能可能有显著差异。其次,大多数算法没有重新初始化机制,跟踪失败后的跟踪结果不能提供有意义的信息。
TRE、SRE
为进行鲁棒性(robustness)评估, OTB 提出在时间上( 即,从不同帧开始跟踪) 和空间上( 即,以不同的边界框开始跟踪) 扰乱初始化, 以模拟现实世界中由于位置或尺寸方面引入的初始化误差; 这两种评估称为时间鲁棒性评估(TRE,temporal robustness evaluation) 和空间鲁棒性评估( SRE,spatial robustness evaluation)。
TRE:在一个图片/视频序列中,每个跟踪算法从不同的帧作为起始进行追踪,通过视频序列在时间轴上平均找出20个点作为起点(比如分别从第一帧开始进行跟踪,从第十帧开始进行跟踪,从第二十帧开始进行跟踪等),终点还是原来的最后一帧,这样通过对20段视频序列运行算法,绘制平均的重叠率图或者像素误差图。
SRE:由于有些算法对初始化时给定的bounding box比较敏感,而目前测评用的ground-truth都是人工标注的,因此可能会对某些跟踪算法产生影响。因此为了评估这些跟踪算法是否对初始化敏感,作者通过将ground-truth轻微的平移和尺度的扩大与缩小来产生bounding box。平移的大小为目标物体大小的10%,尺度变化范围为ground-truth的80%到120%,每10%依次增加。最后取这些结果的平均值作为SRE score。
我们通过平移或缩放地面实值来采样第一帧中的初始边界框。这里,我们使用了8个空间移位,包括4个中心移位和4个角移位,以及4个比例变化(补充)。移动量为目标大小的10%,比例比在0.8、0.9、1.1和1.2之间变化,与实际情况相符。因此,我们对每个跟踪器进行了12次SRE评估。

在OTB2015中提出了,OPER和SRER。
原因:对于具有挑战性的序列,当场景中出现外观急剧变化或出现某些干扰时,跟踪算法可能会失败并失去对目标的跟踪。一旦一种方法失败,在没有任何外部输入(例如,由对象检测器重新检测或手动重新初始化)的情况下,不太可能恢复和跟踪目标。虽然TRE评分旨在缓解这种影响,但为了更好地衡量跟踪性能,需要使用不同的度量标准。
One-pass evaluation with restart (OPER):可重新启动的一次性评估,在跟踪期间,如果跟踪失败,那么就在下一帧重新初始化然后再跟踪,其余与OPE一样。
Spatial robustness evaluation with restart (SRER):基于重启的空间稳健性评估,通OPER。

三、OTB Benchmark 使用(Matlab版本)

1.下载

benchmark codebase,官方网址:http://cvlab.hanyang.ac.kr/tracker_benchmark/
OTB Benchmark 学习(下载链接、评价指标、配置)_第4张图片tracker Results 是OTB运行的跟踪算法的结果,可以直接下载使用。(官网下载,使用迅雷下载会快一点)
百度云链接,密码:cx5o

下载vlfeat工具包
网址:https://www.vlfeat.org/
VLFeat 开源库实现计算机视觉算法专业图像的理解和局部特征提取和匹配。它是用C编写的,以提高效率和兼容性,并带有MATLAB的接口,以易于使用。
为什么要下载呢?因为OTB用到了vlfeat 的一些东西。
OTB Benchmark 学习(下载链接、评价指标、配置)_第5张图片

2.文件介绍

OTB Benchmark 学习(下载链接、评价指标、配置)_第6张图片解压tracker_benchmark_v1.0,简单介绍一下文件内容:
1.anno文件:主要存储的是数据集的bounding box。 目前打开为52个文件,后续需要可以添加。默认下载下来的只有OTB50中视频序列的标注数据,要想测试OTB100就需要找到OTB100的标注数据将anno文件夹进行替换。很显然,没有标注好的数据就不能测试得到算法的跟踪精度及成功率。
2.figs文件:存储的是一些实验跑出的图片,准确度图、成功率图等。运行了perfPlot.m文件画完图之后,生成的图片就会存在这个文件夹里。
3.initOmit文件:包含由于遮挡或目标超出视野而被省略的用于跟踪初始化的帧的注释的目录。
4.perfMat文件:存储最终用于画图的mat文件。运行perfPlot.m画图文件之后生成的记录文件,所以当你新增或者更改了需要画图的算法时,最好把这个文件夹里overall里的所有文件删除,否则可能会画出之前保存的图片而不进行新图的绘制。
5.results文件:存储的每个trackers的跟踪结果的mat文件和perfMat不一样,这个是相对于bounding box的跟踪框数据。
6.rstEval文件:包含了很多用于计算跟踪性能或者画出结果的脚本的目录。
7.tmp文件:用来存放临时结果或者日志文件。
8.trackers文件:里面包含各种你需要对比的跟踪算法;要简单了解可以看trackers.txt文件 (注意:你必须把你需要测试的算法的代码放在这个文件夹里,并写好接口文件(run_算法名.m))
9.util文件:里面包含各种重要的函数和脚本。(其中,需要更改的函数有两个,configSeqs.m文件,这个文件是设置需要在哪些视频序列上进行测试。configTrackers.m文件,这个文件是设置需要测试哪些跟踪算法。)
.m文件
1.drawResultBB.m 用于画每个帧上不同跟踪器的边界框的主函数。将选择的所有算法的跟踪结果框(bounding_box)显示在同一张图片上的文件,运行这个文件首先需要把自己的算法在数据库上跑一遍,也就是要有results文件夹里要有算法跟踪结果文件。
2.genPerfMat.m 被调用生成图的值。
3.main_running.m 是用来在测试集上跑跟踪代码的,跑出的结果存在results文件夹中;
4.perfPlot.m 用来把测试结果画出图来,就是benchmark网上的图的效果

3.修改程序中的部分设置

修改vlfeat的路径:
main_running.m文件中:

addpath(('D:\vlfeat-0.9.14\toolbox'));
vl_setup

更改为自己解压的路径。
修改数据集图像路径,在util文件中的configSeqs.m,修改seq路径,为自己OTB数据集存放的路径。注意:图像序列在更深一层的img文件下。
OTB Benchmark 学习(下载链接、评价指标、配置)_第7张图片更改后,所示:

struct('name','soccer','path','E:\Datasets\OTB100\soccer\img\','startFrame',1,'endFrame',392,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...

参考其他博客给出configSeqs.m配置OTB100

function seqs=configSeqs
 
seqVTD={
     struct('name','soccer','path','E:\Datasets\OTB100\soccer\img\','startFrame',1,'endFrame',392,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','matrix','path','E:\Datasets\OTB100\matrix\img\','startFrame',1,'endFrame',100,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','ironman','path','E:\Datasets\OTB100\ironman\img\','startFrame',1,'endFrame',166,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','deer','path','E:\Datasets\OTB100\deer\img\','startFrame',1,'endFrame',71,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','skating1','path','E:\Datasets\OTB100\skating1\img\','startFrame',1,'endFrame',400,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','shaking','path','E:\Datasets\OTB100\shaking\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','singer1','path','E:\Datasets\OTB100\singer1\img\','startFrame',1,'endFrame',351,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','singer2','path','E:\Datasets\OTB100\singer2\img\','startFrame',1,'endFrame',366,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};
 
seqIVT={
     struct('name','carDark','path','E:\Datasets\OTB100\carDark\img\','startFrame',1,'endFrame',393,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','car4','path','E:\Datasets\OTB100\car4\img\','startFrame',1,'endFrame',659,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','david2','path','E:\Datasets\OTB100\david2\img\','startFrame',1,'endFrame',537,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...    
    struct('name','sylvester','path','E:\Datasets\OTB100\sylvester\img\','startFrame',1,'endFrame',1345,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','trellis','path','E:\Datasets\OTB100\trellis\img\','startFrame',1,'endFrame',569,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','fish','path','E:\Datasets\OTB100\fish\img\','startFrame',1,'endFrame',476,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','mhyang','path','E:\Datasets\OTB100\mhyang\img\','startFrame',1,'endFrame',1490,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','david','path','E:\Datasets\OTB100\david\img\','startFrame',300,'endFrame',770,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};
 
seqOther={
     struct('name','coke','path','E:\Datasets\OTB100\coke\img\','startFrame',1,'endFrame',291,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','bolt','path','E:\Datasets\OTB100\bolt\img\','startFrame',1,'endFrame',350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','boy','path','E:\Datasets\OTB100\boy\img\','startFrame',1,'endFrame',602,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','dudek','path','E:\Datasets\OTB100\dudek\img\','startFrame',1,'endFrame',1145,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','crossing','path','E:\Datasets\OTB100\crossing\img\','startFrame',1,'endFrame',120,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','couple','path','E:\Datasets\OTB100\couple\img\','startFrame',1,'endFrame',140,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','football1','path','E:\Datasets\OTB100\football1\img\','startFrame',1,'endFrame',74,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','jogging-1','path','E:\Datasets\OTB100\jogging\img\','startFrame',1,'endFrame',307,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','jogging-2','path','E:\Datasets\OTB100\jogging\img\','startFrame',1,'endFrame',307,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','doll','path','E:\Datasets\OTB100\doll\img\','startFrame',1,'endFrame',3872,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','girl','path','E:\Datasets\OTB100\girl\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','walking2','path','E:\Datasets\OTB100\walking2\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','walking','path','E:\Datasets\OTB100\walking\img\','startFrame',1,'endFrame',412,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','fleetface','path','E:\Datasets\OTB100\fleetface\img\','startFrame',1,'endFrame',707,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','freeman1','path','E:\Datasets\OTB100\freeman1\img\','startFrame',1,'endFrame',326,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','freeman3','path','E:\Datasets\OTB100\freeman3\img\','startFrame',1,'endFrame',460,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','freeman4','path','E:\Datasets\OTB100\freeman4\img\','startFrame',1,'endFrame',283,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','david3','path','E:\Datasets\OTB100\david3\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','jumping','path','E:\Datasets\OTB100\jumping\img\','startFrame',1,'endFrame',313,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','carScale','path','E:\Datasets\OTB100\carScale\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','skiing','path','E:\Datasets\OTB100\skiing\img\','startFrame',1,'endFrame',81,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','dog1','path','E:\Datasets\OTB100\dog1\img\','startFrame',1,'endFrame',1350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','suv','path','E:\Datasets\OTB100\suv\img\','startFrame',1,'endFrame',945,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','motorRolling','path','E:\Datasets\OTB100\motorRolling\img\','startFrame',1,'endFrame',164,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','mountainBike','path','E:\Datasets\OTB100\mountainBike\img\','startFrame',1,'endFrame',228,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),... 
    struct('name','lemming','path','E:\Datasets\OTB100\lemming\img\','startFrame',1,'endFrame',1336,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','liquor','path','E:\Datasets\OTB100\liquor\img\','startFrame',1,'endFrame',1741,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','woman','path','E:\Datasets\OTB100\woman\img\','startFrame',1,'endFrame',597,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','faceocc1','path','E:\Datasets\OTB100\faceocc1\img\','startFrame',1,'endFrame',892,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','faceocc2','path','E:\Datasets\OTB100\faceocc2\img\','startFrame',1,'endFrame',812,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','basketball','path','E:\Datasets\OTB100\basketball\img\','startFrame',1,'endFrame',725,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','football','path','E:\Datasets\OTB100\football\img\','startFrame',1,'endFrame',362,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','subway','path','E:\Datasets\OTB100\subway\img\','startFrame',1,'endFrame',175,'nz',4,'ext','jpg','init_rect', [0 0 0 0]),...    
    struct('name','tiger1','path','E:\Datasets\OTB100\tiger1\img\','startFrame',1,'endFrame',354,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','tiger2','path','E:\Datasets\OTB100\tiger2\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};
 
seqOTB49_100={
     struct('name','Biker','path','E:\Datasets\OTB100\Biker\img\','startFrame',1,'endFrame',142,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Bird1','path','E:\Datasets\OTB100\Bird1\img\','startFrame',1,'endFrame',408,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Bird2','path','E:\Datasets\OTB100\Bird2\img\','startFrame',1,'endFrame',99,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurBody','path','E:\Datasets\OTB100\BlurBody\img\','startFrame',1,'endFrame',334,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurCar1','path','E:\Datasets\OTB100\BlurCar1\img\','startFrame',247,'endFrame',988,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurCar2','path','E:\Datasets\OTB100\BlurCar2\img\','startFrame',1,'endFrame',585,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurCar3','path','E:\Datasets\OTB100\BlurCar3\img\','startFrame',3,'endFrame',359,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurCar4','path','E:\Datasets\OTB100\BlurCar4\img\','startFrame',18,'endFrame',397,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurFace','path','E:\Datasets\OTB100\BlurFace\img\','startFrame',1,'endFrame',493,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurOwl','path','E:\Datasets\OTB100\BlurOwl\img\','startFrame',1,'endFrame',631,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Board','path','E:\Datasets\OTB100\Board\img\','startFrame',1,'endFrame',698,'nz',5,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Bolt2','path','E:\Datasets\OTB100\Bolt2\img\','startFrame',1,'endFrame',293,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Box','path','E:\Datasets\OTB100\Box\img\','startFrame',1,'endFrame',1161,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Car1','path','E:\Datasets\OTB100\Car1\img\','startFrame',1,'endFrame',1020,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Car2','path','E:\Datasets\OTB100\Car2\img\','startFrame',1,'endFrame',913,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Car24','path','E:\Datasets\OTB100\Car24\img\','startFrame',1,'endFrame',3059,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','ClifBar','path','E:\Datasets\OTB100\ClifBar\img\','startFrame',1,'endFrame',472,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Coupon','path','E:\Datasets\OTB100\Coupon\img\','startFrame',1,'endFrame',327,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Crowds','path','E:\Datasets\OTB100\Crowds\img\','startFrame',1,'endFrame',347,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Dancer','path','E:\Datasets\OTB100\Dancer\img\','startFrame',1,'endFrame',225,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Dancer2','path','E:\Datasets\OTB100\Dancer2\img\','startFrame',1,'endFrame',150,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...   
    struct('name','Diving','path','E:\Datasets\OTB100\Diving\img\','startFrame',1,'endFrame',215,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Dog','path','E:\Datasets\OTB100\Dog\img\','startFrame',1,'endFrame',127,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','DragonBaby','path','E:\Datasets\OTB100\DragonBaby\img\','startFrame',1,'endFrame',113,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Girl2','path','E:\Datasets\OTB100\Girl2\img\','startFrame',1,'endFrame',1500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Gym','path','E:\Datasets\OTB100\Gym\img\','startFrame',1,'endFrame',767,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human2','path','E:\Datasets\OTB100\Human2\img\','startFrame',1,'endFrame',1128,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human3','path','E:\Datasets\OTB100\Human3\img\','startFrame',1,'endFrame',1698,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human4','path','E:\Datasets\OTB100\Human4\img\','startFrame',1,'endFrame',667,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human5','path','E:\Datasets\OTB100\Human5\img\','startFrame',1,'endFrame',713,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human6','path','E:\Datasets\OTB100\Human6\img\','startFrame',1,'endFrame',792,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human7','path','E:\Datasets\OTB100\Human7\img\','startFrame',1,'endFrame',250,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human8','path','E:\Datasets\OTB100\Human8\img\','startFrame',1,'endFrame',128,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human9','path','E:\Datasets\OTB100\Human9\img\','startFrame',1,'endFrame',305,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Jump','path','E:\Datasets\OTB100\Jump\img\','startFrame',1,'endFrame',122,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','KiteSurf','path','E:\Datasets\OTB100\KiteSurf\img\','startFrame',1,'endFrame',84,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Man','path','E:\Datasets\OTB100\Man\img\','startFrame',1,'endFrame',134,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Panda','path','E:\Datasets\OTB100\Panda\img\','startFrame',1,'endFrame',1000,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','RedTeam','path','E:\Datasets\OTB100\RedTeam\img\','startFrame',1,'endFrame',1918,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Rubik','path','E:\Datasets\OTB100\Rubik\img\','startFrame',1,'endFrame',1997,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Skater','path','E:\Datasets\OTB100\Skater\img\','startFrame',1,'endFrame',160,'nz',4,'ext','jpg','init_rect', [0,0,0,0])...
    struct('name','Skater2','path','E:\Datasets\OTB100\Skater2\img\','startFrame',1,'endFrame',435,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Skating2-1','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Skating2-2','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Surfer','path','E:\Datasets\OTB100\Surfer\img\','startFrame',1,'endFrame',376,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Toy','path','E:\Datasets\OTB100\Toy\img\','startFrame',1,'endFrame',271,'nz',4,'ext','jpg','init_rect',[0,0,0,0])...
    struct('name','Trans','path','E:\Datasets\OTB100\Trans\img\','startFrame',1,'endFrame',124,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Twinnings','path','E:\Datasets\OTB100\Twinnings\img\','startFrame',1,'endFrame',472,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Vase','path','E:\Datasets\OTB100\Vase\img\','startFrame',1,'endFrame',271,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};
 
seqOTB50={
     struct('name','basketball','path','E:\Datasets\OTB100\basketball\img\','startFrame',1,'endFrame',725,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Biker','path','E:\Datasets\OTB100\Biker\img\','startFrame',1,'endFrame',142,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Bird1','path','E:\Datasets\OTB100\Bird1\img\','startFrame',1,'endFrame',408,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurBody','path','E:\Datasets\OTB100\BlurBody\img\','startFrame',1,'endFrame',334,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurCar2','path','E:\Datasets\OTB100\BlurCar2\img\','startFrame',1,'endFrame',585,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurFace','path','E:\Datasets\OTB100\BlurFace\img\','startFrame',1,'endFrame',493,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','BlurOwl','path','E:\Datasets\OTB100\BlurOwl\img\','startFrame',1,'endFrame',631,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','bolt','path','E:\Datasets\OTB100\bolt\img\','startFrame',1,'endFrame',350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Box','path','E:\Datasets\OTB100\Box\img\','startFrame',1,'endFrame',1161,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Car1','path','E:\Datasets\OTB100\Car1\img\','startFrame',1,'endFrame',1020,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','car4','path','E:\Datasets\OTB100\car4\img\','startFrame',1,'endFrame',659,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','carDark','path','E:\Datasets\OTB100\carDark\img\','startFrame',1,'endFrame',393,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','carScale','path','E:\Datasets\OTB100\carScale\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','ClifBar','path','E:\Datasets\OTB100\ClifBar\img\','startFrame',1,'endFrame',472,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','couple','path','E:\Datasets\OTB100\couple\img\','startFrame',1,'endFrame',140,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Crowds','path','E:\Datasets\OTB100\Crowds\img\','startFrame',1,'endFrame',347,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','david','path','E:\Datasets\OTB100\david\img\','startFrame',300,'endFrame',770,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','deer','path','E:\Datasets\OTB100\deer\img\','startFrame',1,'endFrame',71,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Diving','path','E:\Datasets\OTB100\Diving\img\','startFrame',1,'endFrame',215,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','DragonBaby','path','E:\Datasets\OTB100\DragonBaby\img\','startFrame',1,'endFrame',113,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','dudek','path','E:\Datasets\OTB100\dudek\img\','startFrame',1,'endFrame',1145,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','football','path','E:\Datasets\OTB100\football\img\','startFrame',1,'endFrame',362,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','freeman4','path','E:\Datasets\OTB100\freeman4\img\','startFrame',1,'endFrame',283,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','girl','path','E:\Datasets\OTB100\girl\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human3','path','E:\Datasets\OTB100\Human3\img\','startFrame',1,'endFrame',1698,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human4','path','E:\Datasets\OTB100\Human4\img\','startFrame',1,'endFrame',667,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human6','path','E:\Datasets\OTB100\Human6\img\','startFrame',1,'endFrame',792,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Human9','path','E:\Datasets\OTB100\Human9\img\','startFrame',1,'endFrame',305,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','ironman','path','E:\Datasets\OTB100\ironman\img\','startFrame',1,'endFrame',166,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Jump','path','E:\Datasets\OTB100\Jump\img\img\img\','startFrame',1,'endFrame',122,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','jumping','path','E:\Datasets\OTB100\jumping\img\','startFrame',1,'endFrame',313,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','liquor','path','E:\Datasets\OTB100\liquor\img\','startFrame',1,'endFrame',1741,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','matrix','path','E:\Datasets\OTB100\matrix\img\','startFrame',1,'endFrame',100,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','motorRolling','path','E:\Datasets\OTB100\motorRolling\img\','startFrame',1,'endFrame',164,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Panda','path','E:\Datasets\OTB100\Panda\img\','startFrame',1,'endFrame',1000,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','RedTeam','path','E:\Datasets\OTB100\RedTeam\img\','startFrame',1,'endFrame',1918,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','shaking','path','E:\Datasets\OTB100\shaking\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','singer2','path','E:\Datasets\OTB100\singer2\img\','startFrame',1,'endFrame',366,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','skating1','path','E:\Datasets\OTB100\skating1\img\','startFrame',1,'endFrame',400,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Skating2-1','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Skating2-2','path','E:\Datasets\OTB100\Skating2\img\','startFrame',1,'endFrame',473,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','skiing','path','E:\Datasets\OTB100\skiing\img\','startFrame',1,'endFrame',81,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','soccer','path','E:\Datasets\OTB100\soccer\img\','startFrame',1,'endFrame',392,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','Surfer','path','E:\Datasets\OTB100\Surfer\img\','startFrame',1,'endFrame',376,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','sylvester','path','E:\Datasets\OTB100\sylvester\img\','startFrame',1,'endFrame',1345,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','tiger2','path','E:\Datasets\OTB100\tiger2\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','trellis','path','E:\Datasets\OTB100\trellis\img\','startFrame',1,'endFrame',569,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','walking2','path','E:\Datasets\OTB100\walking2\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','walking','path','E:\Datasets\OTB100\walking\img\','startFrame',1,'endFrame',412,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','woman','path','E:\Datasets\OTB100\woman\img\','startFrame',1,'endFrame',597,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};
 
% seqs=[seqIVT,seqVTD,seqOther]; %OTB-2013
seqs=[seqIVT,seqVTD,seqOther,seqOTB49_100];   %OTB100
% seqs = seqOTB50;   %OTB50

更改自己的路径即可。
运行的时候,anno文件也会有问题。
参考博客,进行下载替换即可。

4.运行

到这一步,直接运行main_running.m就可以了。
出现的小问题总结:
1.运行出现1_VR, 1_woman: 1/1 error的情况:
建议:把configTrackers.m文件中的

trackers = [trackersVIVID,trackers1,trackersEXE];

只选择:trackers = [trackers1];
2.由于 ‘.\results\results_OPE_CVPR13’ 不存在,无法创建 ‘soccer_VR.mat’。
建议:自己手动新建results_OPE_CVPR13文件夹。
为什么出现这个的错误:是应该在main_running.m中将
evalType=‘TRE’; %‘OPE’,‘SRE’,‘TRE’
修改为:evalType=‘OPE’; %‘OPE’,‘SRE’,‘TRE’
未修改结果存放路径:finalPath = [’./results/results_’ evalType ‘_CVPR13/’];

常用地方代码解释:
main_running.m
21行:
evalType就是选择跑OPE、TRE、SRE三种中的一种

evalType='TRE'; %'OPE','SRE','TRE'

28行:
运行跟踪算法返回的结果存放在result文件夹下的目录,结果的存放形式是mat

finalPath = ['./results/results_' evalType '_CVPR13/'];

perfPlot.m
103行:
画三种图,进行选择,可以只保留你想出的图,其他的删除。

evalTypeSet = {
     'SRE', 'TRE', 'OPE'};

105行:
这里原来是AUC,只能出成功率(success)图,要想出精度(precision)图的话,需要修改为threshold。这样就可以两种图都出。

rankingType = 'AUC';%AUC, threshod

注意,源码注释中的threshold拼写有误。改正即可。

如何添加自己的算法呢?
简单说一说吧。我还是建议大家使用python版本的,现在大多数都开始学习深学方面的目标跟踪算法了,大多数都是python程序了,与matlab的接口不是很方便,涉及到MAT文件的转化问题。还是比较麻烦的。(在python环境下得到txt转化成mat文件,使用matlab程序进行画图)
1.在trackers路径下新建要添加的文件夹,并且将算法代码放入文件夹中。
2.最重要的一步就是需要写一个将自己算法的输入输出对接到benchmark中的脚本run_tracker.m文件,打开其他算法时会发现每个算法中都会有run_tracker.m文件,例如run_CT.m run_CSK.m
这步很简单,参照其它算法 例如:run_CT.m对比CT.m文件 看到第一行的输入和最后一行的输出进行了统一,

function results=run_CT(seq, res_path, bSaveImage)


results.res=res;

results.type='rect';

results.fps=(seq.len-1)/duration;

disp(['fps: ' num2str(results.fps)])

输入:Seq代表着输入的图片,要将算法中输入的图片用Seq来代替

输出:res代表跟踪位置type 类型
3.修改完run_XXX.m之后。就是configtracker中加入算法的结构体。
struct(‘name’,‘xxx’,‘namePaper’,‘xxx’)
保存后就可以运行OTB的main_running.m获取自己修改的算法结果了。
例如:

trackersSiamfc={
     struct('name','siamfc','namePaper','SiamFC')};
trackers = trackersSiamfc;

5.显示

运行drawResultBB.m,跟踪结果保存在tracker_benchmark_v1.0\tmp\imgs目录中。

pathRes = '.\results\results_SRE_CVPR13\';% The folder containing the tracking results
pathDraw = '.\tmp\imgs\';% The folder that will stores the images with overlaid bounding box

pathRes 为默认读取mat文件
pathDraw 为图片存储位置。

seqs=configSeqs;

trks=configTrackers;

seqs读取configSeqs.m文件配置,trks读取configTrackers.m文件配置。
可以修改configTrackers.m中的trackers包含的算法来看,跟踪结果。
其中tracker排序是你在configTrackers.m文件中的tracker排序,对应的红色是第一个tracker,绿色是第二个tracker,一次类推。
把自己的跟踪算法,加入到trackers中就可以显示跟踪过程结果。
OTB Benchmark 学习(下载链接、评价指标、配置)_第8张图片OTB Benchmark 学习(下载链接、评价指标、配置)_第9张图片

6.画图

注:如果更新算法得到新的跟踪结果mat文件,在plot之前,请务必先删除 tracker_benchmark_v1.0\perfMat\overall目录下的所有.mat文件,否则数据将不会更新。
每次运行前先删除上次perfMat/overall中的文件。
多个算法对比:
更改configTrackers.m,例如

function trackers=configTrackers
trackersNew={
     
    struct('name','SMS','namePaper','SMS'),...
    struct('name','CT','namePaper','CT'),...
    struct('name','TLD','namePaper','TLD'),...
    struct('name','CSK','namePaper','CSK');
trackers = trackersNew;

画图的时候,如何出现如下的报错:
OTB Benchmark 学习(下载链接、评价指标、配置)_第10张图片
原因是:缺少Bird1_TLD.mat文件。
因为原本的自带的跟踪结果mat文件只针对OTB50的训练结果,如果自己训练的是OTB100的,进行比较时,seq设置的也是OTB100,那么进行画图的时候,就直接调用seq相关的mat文件,而TLD算法没有进行过OTB100的训练就缺少相关序列结果mat,就没办法画图。
解决方法:
测试对比的算法,每一个都要在自己设置的seq下训练出mat,就可以直接画图了。


具体方法在论文中有详细介绍:

Wu Y, Lim J, Yang M H. Online object tracking: A benchmark [C]// CVPR, 2013.
Wu Y, Lim J, Yang M H. Object tracking benchmark [J]. TPAMI, 2015.

整理不易,喜欢点赞。

上一篇:2020版本的pycharm支持官方汉化了
下一篇:学习 PySOT(1)(介绍、配置、使用)

你可能感兴趣的:(目标跟踪,目标跟踪)