最近刚刚开始学习目标跟踪方法,在看程序和论文的时候发现评价指标和跟踪算法比较图的时候,思考这些是从哪里来的,查到了一下有关评价方法: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评价指标

先抛出两个概念,也是最常见的评价标准。
评价标准通常包含两个基本参数:中心位置误差和区域重叠面积比率
中心位置误差:
是跟踪目标的中心位置 和人工标注的准确位置之间的平均像素距离。
区域重叠面积比率:
通过统计跟踪算法得到的边界框和人工标注的准确边界框之间的面积重叠比衡量跟踪算法的性能。

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

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

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

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/
tracker Results 是OTB运行的跟踪算法的结果,可以直接下载使用。(官网下载,使用迅雷下载会快一点)
百度云链接,密码:cx5o

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

2.文件介绍

解压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文件下。
更改后,所示:

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=configSeqsseqVTD={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中就可以显示跟踪过程结果。

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;

画图的时候,如何出现如下的报错:

原因是:缺少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)(介绍、配置、使用)

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

  1. Zotero 超好用插件的下载链接及配置方法(PDF-translate/ZotFile/茉莉花/Zotero Scihub)

    目录 前言 插件安装方法 插件一:文献翻译插件(pdf-translate) 插件二:文献附件管理(ZotFile) 插件三:中文文献插件(茉莉花) 插件四:Sci-Hub 自动下载文献(Zotero ...

  2. opencv-4.1.0-百度云盘下载链接-环境配置

    很好的一个搭建opencv的文章: 链接:https://pan.baidu.com/s/1-DgYuMxNydHlwBX1y40F_A 提取码:o6b1 VS2017 + opencv4.1.0环境 ...

  3. 学习下载MySQL安装配置

    一.下载MySQL网址 Mysql官网下载地址:https://downloads.mysql.com/archives/installer/ 1.选择安装的版本,点击Download下载 本人为了稳 ...

  4. hfss matlab联合仿真_一文搞定matlab 与 STK 联合调试仿真环境配置(文末附软件下载链接)...

    最近在做导师给的课题:卫星星座的快速优化设计. 需要用到matlab 和 STK 来进行联合调试仿真,但是这第一步的环境配置就让我头疼了几天.在好几次重装,失败和查找资料之后,我终于成功实现了matl ...

  5. 机器人学习--自主移动机器人导论资料(附下载链接)

    对于想做移动机器人 定位.建图.SLAM(声呐.激光等测距传感器的SLAM)方面的学习值得参考:很经典的书籍: 英文和中文版都有了 第二版:  部分内容和<概率机器人>有点交集,可以结合着 ...

  6. SLAM学习--视觉slam学习教材推荐(附相关技术文档下载链接)

    (理论上看完前三本,足够掌握视觉slam的所有理论知识,实践部分参考各种开源代码) 一.<视觉slam十四讲>,高翔,清华大学出版社,(目前已出第二版,优先推荐) 以上教材,其实是基于国外 ...

  7. 【深度学习】CVPR 2021 全部论文链接公布!最新1660篇论文合集!附下载链接

    大家好呀,CVPR 官方公布了接受的所有论文的链接,我最近几天上班摸鱼把 CVPR2021 的全部论文下载下来了.踩了不少坑,如果对你有所帮助,欢迎分享一下,谢谢啦! 文末附带爬虫教程. CVPR20 ...

  8. Neo4j【环境部署 01】图形数据库(简介+下载地址+安装+配置+demo源码+学习教程地址)

    1.简介 Neo4j是一个高性能的.NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌入式的.基于磁盘的.具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数 ...

  9. 资源下载】512页《神经网络与深度学习》(附下载链接)

    [导读]Charu C. Aggarwal是IBM沃森研究中心的杰出研究员,其最新深度学习著作<Neural Networks and Deep Learning>,共512页从一线工业界 ...

最新文章

  1. Machine Learning | 机器学习简介
  2. python生成姓名,python自动生成姓名
  3. 创建JAVASCRIPT对象3种方法
  4. 中国蚁剑 代码解压出错:【object Object】解决方法
  5. 如何使用jmeter进行并发登录测试
  6. 公开说说别人看不到_当听到别人在说自己坏话时,心里是什么感受?
  7. 双重检查锁定及单例模式
  8. ASUS蓝屏和重装系统之后驱动问题总结
  9. 基于python 爬虫网络舆情分析系统_基于Python的网络爬虫系统
  10. 上海麻辣马资深程序员叶劲峰:我的游戏人生
  11. U3D PDF 旋转中心设置方法
  12. 全国通用 专升本计算机基础(简答题背诵可用)
  13. tomcat示例文件漏洞解决方案
  14. java sencha_基于SenchaCmd搭建ExtJS 6.2版本开发环境(图文教程)
  15. 【新东郊商城】周年店庆 关注微信,转发微博抽奖品!玩赚乐不停
  16. [ CTF ]【天格】战队WriteUp-第六届“强网杯”全国安全挑战赛(初赛)
  17. win10安装mmcv和mmcv-full报错
  18. python-科研绘图系列(2)-等高线图
  19. 双11销额超二三四五名总和,喜临门为床垫行业树立“高度和广度”
  20. Tecnomatix Process Designer Process Simulate用法

热门文章

  1. android开发常用组件和第三方库(二)
  2. Unity 模型顶点法线不统一————使用Blender修改顶点法线
  3. USB3.0转SATA2.0(硬盘盒设计)
  4. 技术文集:万能WINDOWS XP封装
  5. 毕业论文评审意见、导师意见范文、模板_Smile~风_百度空间
  6. python手机版_手机编程软件python
  7. 小白第一次注册机编写,c/bat/易某言(不好意思说2333)
  8. 2023年认证杯C题超详细思路配有实现代码
  9. android 屏幕dp值计算
  10. 改薄“20条底线”要求专项督导工作安排