got-toolkit的github仓库:https://github.com/got-10k/toolkit
got-toolkit是一个专门针对于单目标跟踪算法和单目标跟踪数据集建立的工具程序,我更愿意把got-toolkit理解成是一个建立在算法的数据集之间的桥梁,在算法和数据集中间搭建起一个容易切换的平台。对于现在存在的绝大部分单目标跟踪算法以及单目标跟踪数据集,使用got工具即可轻松实现算法在不同数据集之间的切换,降低使用不同数据集时带来的成本。但是,got工具在带来便利的同时,也会有一些麻烦,比如适用于got-toolkit的数据集有严格的规定,只能使用指定的数据集,再比如使用got-toolkit对现有的开源的单目标跟踪算法进行融合的时候,需要耗费较多的时间和精力在算法分析和程序融合上。解决第一个问题只能依靠got-toolkit官方不断地更新got工具以适应更多的数据集,而解决第二个问题需要一些小技巧。这篇文章的目的就是讲解在融合单目标跟踪算法和got-toolkit程序时可以使用的小技巧。
进入got-toolkit的github仓库以后,可以在README教程中初步了解如何使用got工具跑数据集。
根据README教程的指示,got-toolkit的框架文件如下所示:
from got10k.trackers import Tracker
from got10k.experiments import ExperimentGOT10k
class IdentityTracker(Tracker):
def __init__(self):
super(IdentityTracker, self).__init__(name='IdentityTracker')
def init(self, image, box):
self.box = box
def update(self, image):
return self.box
if __name__ == '__main__':
# setup tracker
tracker = IdentityTracker()
# run experiments on GOT-10k (validation subset)
experiment = ExperimentGOT10k('data/GOT-10k', subset='val')
experiment.run(tracker, visualize=True)
# report performance
experiment.report([tracker.name])
pip install --upgrade got10k
即可完成安装,详细的安装教程请参考got-toolkit的README第二部分的代码如下所示:
if __name__ == '__main__':
# setup tracker
tracker = IdentityTracker()
# run experiments on GOT-10k (validation subset)
experiment = ExperimentGOT10k('data/GOT-10k', subset='val')
experiment.run(tracker, visualize=True)
# report performance
experiment.report([tracker.name])
tracker = IdentityTracker()
– 生成一个IdentityTracker类的实例,也就是建立一个跟踪器对象,用于对数据集进行跟踪预测。experiment = ExperimentGOT10k('data/GOT-10k', subset='val')
– 生成一个”实验“对象,这个“实验”对象属于ExperimentGOT10K类,表示该实验是基于GOT10k数据集进行的实验。got-toolkit支持很多的数据集,例举如下:OTB (2013/2015), VOT (2013~2018), DTB70, TColor128, NfS (30/240 fps), UAV (123/20L), LaSOT , TrackingNet等。官方会持续更新got-toolkit以适应更多的数据集。experiment.run(tracker, visualize=True)
– 使用上面生成的experiment对象和IdentityTracker对象运行算法。run方法的第二个参数 visualize=True
表示是否显示算法的跟踪效果,True 代表程序运行过程中会显示数据集的图片和算法跟踪的效果(红色的框),False 代表不显示。experiment.report([tracker.name])
– 利用算法跟踪的结果绘制结果图。第一部分的代码如下:
class IdentityTracker(Tracker):
def __init__(self):
super(IdentityTracker, self).__init__(name='IdentityTracker')
def init(self, image, box):
self.box = box
def update(self, image):
return self.box
def __init__(self):
– 重写父类的 __init__
方法,对IdentityTracker类进行初始化。
super(IdentityTracker, self).__init__(name='IdentityTracker')
中把super
的第一个参数IdentityTracker改成自定义的类名,__init__
中的name参数改成便于区分的名称,这个用来标记生成的结果文件夹,可以使用类名,也可以使用算法的名称,比如 SiamFC、SiamMask等。init
和 update
方法。
init
和 update
方法,把算法融合到got-toolkit中,就需要知道 init
和 update
方法的前置条件和后置条件是什么,根据前置条件以及后置条件的需要,找到算法源码中的合适接口,嵌入到 init
和 update
方法中。可以简单的利用Python的print()函数和input()函数检查 init 和 update 方法的前置条件和后置条件。
在使用print和input方法重写 init update 方法之前,需要做一些准备工作:
建立一个文件夹,把算法文件(py文件)和数据集文件放入该文件夹中。文件架结构如下所示:
文件夹结构:
test
toolkit_test.py
data
GOT-10k
test
重写 init 方法的代码如下所示:
def init(self, image, box):
print("init")
print(image)
print(box)
input()
self.box = box
重写 update 方法的代码如下所示:
def update(self, image):
print("update")
print(image)
input()
return self.box
测试程序的代码如下:
#-*- coding : utf-8 -*-
from got10k.trackers import Tracker
from got10k.experiments import ExperimentGOT10k
class IdentityTracker(Tracker):
def __init__(self):
super(IdentityTracker, self).__init__(name='IdentityTracker')
def init(self, image, box):
print("init")
print(image)
print(box)
input()
self.box = box
def update(self, image):
print("update")
print(image)
input()
return self.box
if __name__ == '__main__':
# setup tracker
tracker = IdentityTracker()
# run experiments on GOT-10k (validation subset)
experiment = ExperimentGOT10k('data/GOT-10k', subset='test')
experiment.run(tracker, visualize=False)
# report performance
experiment.report([tracker.name])
运行测试程序,结果如下;
可以看到,box 参数的内容就是 groundtruth.txt 文件中的内容,也就是数据集第一帧的框图信息。
box 参数是一个列表,列表的前两个元素:395 和 340 代表框图左上角的点的位置坐标(x,y),后两个元素代表框图的长和宽(width,height)。
以此类推,后面出现的 box 变量都是含有四个元素的列表,并且每个元素的信息都是确定的,和上面描述的一致。
通过这篇文章,已经知道如何改写got-toolkit的框架文件来融合算法的got工具,但是不同的单目标跟踪算法的源码结构都是不同的,需要根据具体的算法实例来综合考虑如何融合算法源代码。