GOT10K toolkit的使用以及使用python版本的OTB工具包对tracker对比

本文主要是记录一下是怎么使用GOT10K toolkit对跟踪器进行评估,以及使用python版本的OTB工具包画出最后的结果图。中间也是遇到很多地方不懂,记录下小白磕磕绊绊的过程。

GOT10K toolkit在不同数据集上对跟踪器进行评估

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!))

下面我们将介绍该如何使用:

1下载安装

推荐使用方法

pip install --upgrade got10k

2定义我们需要测试的跟踪器

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类里面的initupdate函数即可。

  • init函数:接收的是测试视频序列当中的初始帧以及初始帧的bbox。
  • update函数:接收的是后续帧,返回的是更新后的bbox。

3在GOT10K上运行对不同跟踪器的评估

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

4由于接下来主要是使用OTB工具包画trackers之间的比较图,所以我们再分析一下ExperimentOTB.run以及ExperimentOTB.report后的结果

以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,如果不需要与其他跟踪器对比,到这就可以结束了。

最重要的是json文件中的数据:
在这里插入图片描述

可以读出success score和precision score,以及speed fps。

python版本的OTB工具包对tracker对比

1安装以及配置环境

首先去官网下载python版本的OTB包
OTB官网
在这里插入图片描述
也可以直接去github上下载

其次在github上可以看到相关的配置要求:
在这里插入图片描述
这里第一个包我的理解是如果你需要评估的跟踪器是用matlab代码写的,那么需要使用使用这个包调用到python中。但是我用python来进行评测主要就是因为我的代码都是python写的,matlab包对于我太麻烦,我也不想转mat文件。所以这个包就没下。其他三个包都下好了就完事了。还有一点注意是:需使用python2.7版本!!!

2出对比图!

提前说明: 因为我已经前面已经完成了通过got10k的工具包对跟踪器在OTB(2013或2015)上的跟踪评估(注意got10k只生成OPE的结果),在这一步仅仅是把我们的跟踪器与2013或者2015的OTB上人家已经测试好的基线跟踪器结果进行对比(34个基线跟踪器)。所以我们只关注怎么出对比图。

所以我们只需要关注results/OPE这个文件夹下的文件(以OTB自带的第一个基线跟踪器ASLA为例):
在这里插入图片描述

  • results/OPE/ASLA/下有三个文件夹存放跟踪测试后的结果:scores_tb50和socres_cvpr2013都是存放OTB2013的结果,scores_tb100存放OTB2015的结果。
  • 以scores_tb50为例,下面分别有14个json文件分别存放不同挑战(如遮挡、快速移动等)下的跟踪结果。不同的挑战对应的测试序列不同,只有ALL.json对应的序列是所有序列(50个)。
  • 我们画图时其实只看ALL.json里面的结果。
  • 所以我们只需要把我们的跟踪器的跟踪结果做成ALL.json,放入对应的文件夹下,例如我的跟踪器是SiamFC,就放在results/OPE/SiamFC/(OTB2013的结果放在scores_tb50下,OTB2015的结果放在scores_tb100下)就可以直接出图啦!
  • 关于怎么改ALL.json很简单:还是以scores_tb50为例子
    复制一下其他的跟踪器ALL.json,然后把我们自己的参数改进去就好
{"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]
  • 最后结果(默认的只显示前10名)

在这里插入图片描述

在这里插入图片描述

本人纯小白,刚刚入门跟踪领域一点点,可能有些地方别人一下子解决的我还需要弄很久呜呜。有的地方不对的欢迎大佬们指正。

发布了2 篇原创文章 · 获赞 9 · 访问量 161

猜你喜欢

转载自blog.csdn.net/qq_45171138/article/details/104846847