本文主要是记录一下是怎么使用GOT10K toolkit对跟踪器进行评估,以及使用python版本的OTB工具包画出最后的结果图。中间也是遇到很多地方不懂,记录下小白磕磕绊绊的过程。
GOT-10k Python Toolkit是一个很强大的工具包,该工具包对目前主要用到的跟踪基准测试集均提供非官方的数据下载接口以及跟踪的实现:OTB (2013/2015), VOT (2013~2018), DTB70, TColor128, NfS (30/240 fps), UAV (123/20L), LaSOT and TrackingNet benchmarks。 (ILSVRC VID and YouTube-BoundingBox (comming soon!))
下面我们将介绍该如何使用:
推荐使用方法
pip install --upgrade got10k
from got10k.trackers import Tracker
class IdentityTracker(Tracker):
def __init__(self):
super(IdentityTracker, self).__init__(
name='IdentityTracker', # tracker name
is_deterministic=True # stochastic (False) or deterministic (True)
)
def init(self, image, box):
self.box = box
def update(self, image):
return self.box
用该工具包定义自己需要测试的跟踪器时,只需要简单的定义IdentityTracker类里面的init和update函数即可。
from got10k.experiments import ExperimentGOT10k
# ... tracker definition ...
# instantiate a tracker
tracker = IdentityTracker()
# setup experiment (validation subset)
experiment = ExperimentGOT10k(
root_dir='data/GOT-10k', # GOT-10k's root directory
subset='val', # 'train' | 'val' | 'test'
result_dir='results', # where to store tracking results
report_dir='reports' # where to store evaluation reports
)
experiment.run(tracker, visualize=True)
# report tracking performance
experiment.report([tracker.name])
如果是其他的数据集,只需要稍微修改一下:
experiments = [
# ExperimentVOT('data/VOT2019', version=2019)
# ExperimentGOT10k('data/GOT-10k', subset='test'),
ExperimentOTB('data/OTB', version=2013),
# ExperimentOTB('data/OTB', version=2015),
# ExperimentDTB70('data/DTB70'),
# ExperimentTColor128('data/Temple-color-128'),
# ExperimentUAV123('data/UAV123', version='UAV123'),
# ExperimentUAV123('data/UAV123', version='UAV20L'),
# ExperimentNfS('data/nfs', fps=30),
# ExperimentNfS('data/nfs', fps=240)
]
# run tracking experiments and report performance
for e in experiments:
e.run(tracker, visualize=False)
e.report([tracker.name])
所有数据集的跟踪流程实现在e.run中
得到的结果存在result_dir,默认为/results/e/trackername
结果报告存在/reports/e/trackername
以OTB2015为例子
当e.run(tracker, visualize=False)时(这里的e可以是got10k包里面的任意数据库接口)
首先进入ExperimentOTB.run的函数中,
根据
for s, (img_files, anno) in enumerate(self.dataset):
将数据集中的每一个序列取出来并判断当前序列有没有已经测试好的结果,如果没有则:
boxes, times = tracker.track( img_files, anno[0, :], visualize=visualize)
然后进入
got10k.trackers.__init__.py
的track函数,
for f, img_file in enumerate(img_files):
把每一个序列中的每一个帧都迭代取出来送进init或者update函数
然后 我们的tracker(自己定义的tracker,从trackers继承下来的)已经定义好了init函数和update函数,对于每一个序列,只取出第一帧的边界框的值,将第一帧和第一帧的边界框值送入init函数。接下来的帧将送入update函数。
重点看一下e.report的结果,后面python版本的OTB包将主要用到这个
我拿来对比的主要是我测试的跟踪器SiamFC,可以看到该目录下直接生成了三个文件
可以看到直接就生成了success plot和precision plot,如果不需要与其他跟踪器对比,到这就可以结束了。
可以读出success score和precision score,以及speed fps。
首先去官网下载python版本的OTB包
OTB官网
也可以直接去github上下载
其次在github上可以看到相关的配置要求:
这里第一个包我的理解是如果你需要评估的跟踪器是用matlab代码写的,那么需要使用使用这个包调用到python中。但是我用python来进行评测主要就是因为我的代码都是python写的,matlab包对于我太麻烦,我也不想转mat文件。所以这个包就没下。其他三个包都下好了就完事了。还有一点注意是:需使用python2.7版本!!!
提前说明: 因为我已经前面已经完成了通过got10k的工具包对跟踪器在OTB(2013或2015)上的跟踪评估(注意got10k只生成OPE的结果),在这一步仅仅是把我们的跟踪器与2013或者2015的OTB上人家已经测试好的基线跟踪器结果进行对比(34个基线跟踪器)。所以我们只关注怎么出对比图。
所以我们只需要关注results/OPE这个文件夹下的文件(以OTB自带的第一个基线跟踪器ASLA为例):
{"name": "ALL", "desc": "All attributes", "tracker": "SiamFC", "evalType": "OPE", "seqs": ["BasketBall", "Biker", "Bird1", "BlurBody", "BlurCar2", "BlurFace", "BlurOwl", "Bolt", "Box", "Car1", "Car4", "CarDark", "CarScale", "ClifBar", "Couple", "Crowds", "David", "Deer", "Diving", "DragonBaby", "Dudek", "Football", "Freeman4", "Girl", "Human3", "Human4-2", "Human6", "Human9", "Ironman", "Jump", "Jumping", "Liquor", "Matrix", "MotorRolling", "Panda", "RedTeam", "Shaking", "Singer2", "Skating1", "Skating2-1", "Skating2-2", "Skiing", "Soccer", "Surfer", "Sylvester", "Tiger2", "Trellis", "Walking", "Walking2", "Woman"],
"overlap": 58.7795880263541,
"error": 7.794622900737891,
"overlapScores": [0.38392220858021286, 0.3883923043332954, 0.04390543001550806, 0.194683655138013, 0.15915973959142307, 0.0894964239129424, 0.22384329718365356, 0.011058817570470185, 0.34823984258950896, 0.6508906923934548, 0.7535802226025262, 0.8491585239311483, 0.6070066757641235, 0.15502168012198222, 0.07585873833995199, 0.67882906764084, 0.7484439296263788, 0.03283713375317789, 0.17190439303587005, 0.18311095262425905, 0.7365616854638956, 0.5309180662873945, 0.12747598289090473, 0.7111340918940541, 0.007423368132814519, 0.4085822187597404, 0.3808077356687787, 0.20574960140747073, 0.11846672425697576, 0.09741395465333871, 0.2264789895501827, 0.247066828890485, 0.12122690433373202, 0.10554569108891122, 0.5015786486577571, 0.6174378729799935, 0.46219086168452955, 0.04375909192824903, 0.49555436149055704, 0.08219681780947928, 0.28238781793584533, 0.09248756804048978, 0.11262941193015051, 0.40300662549663674, 0.5912677351263589, 0.14533729914861213, 0.8026553889859993, 0.7717167796943779, 0.3712854356456783, 0.1479269294507216],
"errorNum": [4.441379310344828, 5.563380281690141, 9.632352941176471, 8.203592814371257, 8.76923076923077, 9.24949290060852, 8.240887480190175, 9.857142857142858, 5.693367786391042, 0.029411764705882353, 0.0, 0.0, 3.0952380952380953, 7.598784194528876, 9.142857142857142, 1.0951008645533142, 0.4246284501061571, 9.71830985915493, 8.232558139534884, 8.495575221238937, 1.0305676855895196, 3.4806629834254146, 8.303886925795053, 0.9199999999999999, 9.935217903415783, 4.002998500749625, 5.416666666666666, 8.327868852459016, 8.734939759036145, 9.180327868852459, 8.338658146964855, 7.610568638713383, 9.8, 9.02439024390244, 5.8999999999999995, 2.226277372262774, 6.219178082191781, 9.6448087431694, 3.1, 9.365750528541225, 7.991543340380549, 8.88888888888889, 8.75, 4.867021276595745, 2.505576208178439, 8.575342465753424, 1.4235500878734622, 0.02427184466019417, 6.02, 8.056951423785595],
"successRateList": [],
"precisionList": []}
可以看到由于我们测得是OTB2013,所以seqs是50个序列的名字;"overlap"对应我们在got10k中得到的success_score,也就是AUC,只不过这里都*100,最后的跟踪器是按照这个排名的;"error"对应precision_score,这里我也不太懂为啥都×10,不过不影响,因为最后出图的时候也没用到;“overlapScores”"errorNum"没啥用,不用改;最重要的来了!!! 把got10k中得到的success_curve里的值粘贴到"successRateList"中,把precision_curve里的值粘贴到"precisionList"中。
Success rate plotting command: `python draw_graph.py`
Precision plotting commaind: `python draw_graph.py precision`
在 draw_graph.py中
def main():
evalTypes = ['OPE'] # 使用哪种评估方式
testname = 'tb50' # 是测OTB2013还是2015
graph = 'overlap' # 默认画的是successplot
if len(sys.argv) >= 2:
graph = sys.argv[1]
本人纯小白,刚刚入门跟踪领域一点点,可能有些地方别人一下子解决的我还需要弄很久呜呜。有的地方不对的欢迎大佬们指正。