OTB官方评估代码python版本--评估自己跟踪器,对比其他跟踪器

  • 代码环境准备
    • 环境安装
    • 数据集准备
  • 跑自己跟踪器
    • 结果格式准备
    • 生成json文件并画图
  • Bonus

OTB数据集是目标跟踪领域里面一个基准评估数据集,很多论文都会使用这个做实验,然后放上自己的实验结果,所以我也就花了几天时间仔细研究了一下,发现大家在使用OTB toolkit过程中都会有这样的问题:

  • 我有自己的跟踪器(特别现在python编写的),怎么在这个数据集上跑出结果?
  • 我自己的结果怎么和别的跟踪器的结果做一个对比?

这两个问题我自己刚开始也是很困扰,但是经过一番折腾终于出来解决方法了,看完这一篇你也可以解决上面两个问题!!

代码环境准备

去官网首页可以看到评估代码是在MATLAB环境下的,虽然自己觉得自己matlab学过,但是还是很多需要查考和拾起,所以选择了他的python版本的评估代码,既然也是官网上放出来的,也是具有权威性的,只不过哪个语言的结果跑出来会好点,这个还需进一步实验。
注:个人感觉matlab版本迟早要去了解的,因为之后对于LaSOT这种更大的数据集也是matlab下的,所以搞懂OTB benchmark的matlab版本,对之后其余数据集评估是大有益处的,好了,废话不多说,上干货!
matlab版本的toolkit使用教程已更新,已经打包好一些论文中的tracker的结果,可以直接运行出来,想省事的可以看这篇博客: 【OTB100/2015 matlab toolkit的使用】(整理不易,希望请我喝杯奶茶,谢谢)

环境安装

先去download代码:https://github.com/jwlim/tracker_benchmark,有41.6M,难下的话可以去这里下,代码中有几处bug,等一下再说。我在win10上试验的,ubuntu应该也没有问题!

可以在README.md看到,需要安装的包是:Matlab Engine for python、matplotlib、numpy、Python Imaging Library (PIL),并且这个代码是python 2.7.10下的,可以用anaconda安装conda环境:
我在ubuntu下更高版本的anaconda下似乎找不到python2.7.10了,通过conda search python发现最低也是python2.7.13,证明也是可以的

conda create -n py27 python=2.7.10 matplotlib=2.2.2 numpy=1.14.3 pillow=5.1.0
# 这样就安装好了一个名字为'py27'的conda环境,激活一下:
conda activate py27

环境创建好之后,来看一下几处需要修改的bug:

  • 在butil/load_results.py 63行,需要把attr = Attribute(**j)改成attr = Score(**j),因为代码里面没有Attribute类。
  • 在butil/eval_results.py 84行发现没有precisionList,所以需要在55-56行之间插入一句:precisionList = [],缩进与55行一样

数据集准备

这个数据集因为评估需要,对于数据集有一定的格式安排,并不是官网上一个一个序列下载就好的,有三种方法准备:

  1. 在运行run_trackers.py到42行的时候:butil.setup_seqs(loadSeqs),会去这样的网址下载:http://cvlab.hanyang.ac.kr/tracker_benchmark/seq_new/seqname.zip。注意官网上下载地址是http://cvlab.hanyang.ac.kr/tracker_benchmark/seq/seqname.zip,这里新的主要是一些序列目录下不仅有img和groundtruth_rect.txt文件,还有init_omit.txt文件,如果你网络可以,那这样下载下来是最省事的。
  2. 可以去我【资源】已经打包好整理后的data,还有后面的示例结果:SiamFC下面有100个txt和一个times文件夹。希望小费支持
  3. 如果不想浪费流量,之前又是官网一个个序列下载下来的【这里有官网中打包好的序列:常见目标跟踪数据集下载链接整理(更新中)】,需要按照下面来更改(主要是init_omit.txt和几个特殊序列):
  • Jogging下的img复制到代码中的data中的Jogging-1Jogging-2下,把groundtruth_rect.1.txtjogging-1.txt复制到Jogging-1下,分别重命名为groundtruth_rect.txtinit_omit.txt;同理把groundtruth_rect.2.txtjogging-2.txt复制到Jogging-2下,同样分别重命名为groundtruth_rect.txtinit_omit.txt
  • Skating2下的img复制到代码中的data中的Skating2-1Skating2-2下,把groundtruth_rect.1.txt复制到Skating2-1下,重命名为groundtruth_rect.txt;同理,把groundtruth_rect.2.txt复制到Skating2-2下,重命名为groundtruth_rect.txt
  • Human4下的img复制到代码中的data中的Human4-2下,然后把groundtruth_rect.2.txt复制到Human4-2下,重命名为groundtruth_rect.txt
  • 在matlab版本的benchmark_v1.0.zip里面有个initOmit文件夹【不想下整个zip的可以去这里下initOmit】,里面对应27个序列中不能作为初始化帧的记录,只要把他们都复制到对应序列下,并且全部重命名成init_omit.txt

那么现在前期代码和数据集都已经准备好了!

跑自己跟踪器

结果格式准备

相信无论什么语言写的跟踪器,预测结果就是一个序列中每帧物体的坐标,而OTB里面的GT BBox的形式是ltwh的,我这里举例的是我这篇博客【siamfc-pytorch代码讲解(三):demo&track】里面的结果,该示例结果可以在【资源】下载,这个链接和上面给出的资源链接是同一个:
跟踪结果文件目录结构(SiamFC下面有100个txt和一个times文件夹,这一点在下面的utils.py中有体现,并且几个特殊序列的名字是Human4、Jogging.1、Jogging.2、Skating2.1、Skating2.2):

├── SiamFC
│   ├── Basketball.txt
│   ├── ...
│   ├── Woman.txt
│   ├── times
│   │   ├── Basketball_time.txt
│   │   ├── ...
│   │   ├── Woman_time.txt

每一个序列txt文件里面都是N×4的坐标,比如Basketball.txt里面如下图所示:

生成json文件并画图

在代码根目录下新建两个py文件:save_to_json.pyutil.py,分别复制以下代码,其中txt_Results需要替换成你自己的路径:
save_to_json.py:

from scripts import *
from config import *
from util import compare_name, calcu_speed, load_seq_resultloadSeqs = 'tb100'
evalType = 'OPE'
tracker = 'SiamFC'
# replace your own path
txt_Results = 'C:\\Users\\Ezra\\Desktop\\SiamFC'if SETUP_SEQ:print 'Setup sequences ...'"""Doing in setup_seqs:1. check integrity of data, if not, download all2. write cfg.json and attrs.txt in each seq directory"""butil.setup_seqs(loadSeqs)# 'otb50', 'otb100' transform to corresponding seqs name list
seqNames = butil.get_seq_names(loadSeqs)
# load from saved cfg.json and return list contain Class Sequence instances
seqs = butil.load_seq_configs(seqNames)resNames = os.listdir(txt_Results)
resNames.remove('times')
resNames = [res_name[:-4] for res_name in resNames]
print "=========================================================="isSameName = compare_name(resNames, seqNames)if isSameName:for s in seqs:seqResults = []res_type = 'rect'# fps is optinalfps = round(calcu_speed(txt_Results, s.name), 3)boxes = load_seq_result(txt_Results, s.name)res = boxes.tolist()# for OPEr = Result(tracker, s.name, s.startFrame, s.endFrame,res_type, evalType, res, fps, None)seqResults.append(r)if SAVE_RESULT:print "Now write to results/{0}/{1}/{2}.json".format(evalType, tracker, s.name)# 'results/evalType/Tracker/seqName.json'butil.save_seq_result(seqResults)print "Have written all seqs!"

util.py:

import os
import numpy as npDIFF_NAMES = ('Human4-2', 'Jogging-1', 'Jogging-2','Skating2-1', 'Skating2-2')def _convert_name(oldname):newname = Noneif oldname == 'Human4-2':newname = 'Human4'elif oldname == 'Jogging-1':newname = 'Jogging.1'elif oldname == 'Jogging-2':newname = 'Jogging.2'elif oldname == 'Skating2-1':newname = 'Skating2.1'elif oldname == 'Skating2-2':newname = 'Skating2.2'return newnamedef compare_name(resnames, seqnames):flag = Trueassert len(resnames) == len(seqnames),\'The length between resnames and seqnames is not same!'for seqName in seqnames:if seqName in DIFF_NAMES:seqName = _convert_name(seqName)if seqName not in resnames:print seqName + ' is not in resnames'flag = Falsebreakreturn flagdef calcu_speed(timetxtdir, seq_name):speed = 0.0if seq_name in DIFF_NAMES:seq_name = _convert_name(seq_name)time_file = os.path.join(timetxtdir, 'times/%s_time.txt' % seq_name)if os.path.isfile(time_file):times = np.loadtxt(time_file)times = times[times > 0]if len(times) > 0:speed = np.mean(1. / times)return speeddef load_seq_result(boxtxtdir, seq_name):if seq_name in DIFF_NAMES:seq_name = _convert_name(seq_name)record_file = os.path.join(boxtxtdir, '%s.txt' % seq_name)boxes = np.loadtxt(record_file, delimiter=',')return boxes

然后:

  • 先运行一下save_to_json.py,在results/OPE/下就会出现SiamFC文件夹,里面是各个序列的json文件。
  • 然后运行python run_trackers.py -t SiamFC -s tb100 -e OPE,中间会提示Input Test name :可以输入 tb100,tb50,cvpr13作为文件夹命名的一部分,在SiamFC文件夹下会生成scores_tb100文件夹,该文件夹下有11个属性的json文件和ALL.json,因为最后画图要用的就是ALL.json中的结果

运行完就可以得到以下结果:

Result of Sequences   -- 'SiamFC''Basketball'    aveCoverage : 38.878%   aveErrCenter : 75.946...'Woman'           aveCoverage : 50.644%   aveErrCenter : 4.957
Result of attributes     -- 'SiamFC''ALL'   overlap : 64.6%     failures : 3.4'BC'    overlap : 63.3%     failures : 4.9'DEF'   overlap : 59.8%     failures : 4.2'FM'    overlap : 63.8%     failures : 3.7'IPR'   overlap : 61.8%     failures : 3.9'IV'    overlap : 61.6%     failures : 4.3'LR'    overlap : 64.7%     failures : 4.3'MB'    overlap : 67.2%     failures : 3.3'OCC'   overlap : 63.3%     failures : 4.0'OPR'   overlap : 62.6%     failures : 3.8'OV'    overlap : 61.3%     failures : 5.0'SV'    overlap : 63.8%     failures : 3.6
  • 然后运行python draw_graph.py就可以得到成功率图(Success Plot):默认只画前10名的,其余的以灰色虚线画出来,准确率图 (Precision Plot)也是这样,可以看到咋们自己的跟踪器结果已经加进去和别的跟踪器有比较了,注意这里分数已经乘以100了【我这里训练结果比较差,仅供参考,跟GOT-10k里面的ExperimentOTB出来的0.529相差不大】
  • 然后运行python draw_graph.py precision就可以得到准确率图 (Precision Plot):

    大功告成,有不足之处欢迎批评指正交流,感觉有用的点个赞吧,使我更有动力更博客~

2020/05/09更新:把util.py 59行的dtype=int删除
2020/05/20更新:我想试试两个语言的官方评测结果是否会有出入,matlab的结果由我这篇博客【siamfc-pytorch代码讲解(三):demo&track】里面给出了,我就把.mat文件转换成.txt文件,用这个又尝试了一下,想不到python的结果没有matlab的好:success:0.582->0.5788;precision:0.771->0.76。下图为证:

有点不知道为什么会掉点,按理应该不会差太多的,我保证mat转txt没有失精度,难道是python和matlab里面计算的细节不太一样?或者两者计算保留精度不同?还请有尝试过的大佬提个醒
2020/05/24更新:提供一下txt转mat的代码,具体使用方法可以去见我的这篇博客:【siamfc-pytorch代码讲解(三):demo&track】:

clear all;clc;
root = 'D:...\your_txt_path\';
dst = 'D:...\your_mat_save_path\';
if ~exist(dst, 'dir')mkdir(dst);
end
% 下面这几句是为了获取一个目录下的txt文件名列表
fileFolder = fullfile(root);
dirOutput = dir(fullfile(fileFolder, '*.txt'));
fileNames={dirOutput.name}; % 1*100 cell
numFile = length(fileNames);
for idxFile = 1:numFilepath = [root  fileNames{idxFile}];res = load(path);[seq_l, xywh] = size(res);results{1}.res = res;results{1}.type = 'rect';results{1}.len = seq_l;seq_name = fileNames{idxFile}(1:end-4);sprintf(['now trans ' seq_name ' from txt to mat'])% 将需要的结构体结果写成mat格式save([dst seq_name '_SiamfcppCiresnet22Atten.mat'], 'results');
end

2020/07/06更新:放一下mat转txt的代码,有需要可以取用:

root = 'C:\Users\Ezra\Desktop\results_SiamFC-3s_OTB-100\';
dst = 'C:\Users\Ezra\Desktop\SiamFC-3s_OTB-100-txt\';
if ~exist(dst, 'dir')mkdir(dst);
endfileFolder = fullfile(root);
dirOutput = dir(fullfile(fileFolder, '*.mat'));
fileNames={dirOutput.name}; % 1*100 cell
numFile = length(fileNames);
for idxFile = 1:numFilepath = [root  fileNames{idxFile}];matfile = load(path);OPE_matfile = matfile.results{1};bbox = OPE_matfile.res;seq_name = fileNames{idxFile}(1:end-13);sprintf(['now trans ' seq_name ' from mat to txt'])dlmwrite([dst seq_name '.txt'],bbox,'precision','%.4f');
end

Bonus

具体评价方法在论文中有介绍:

  • OTB2013 Online Object Tracking: A Benchmark
  • OTB2015 Object Tracking Benchmark

OTB官方评估代码python版本--评估自己跟踪器,对比其他跟踪器相关推荐

  1. OTB官方评估代码python版本

    可参考:OTB官方评估代码python版本--评估自己跟踪器,对比其他跟踪器 博主写的很好,按照步骤可以运行 以下有几点注意的地方 1.我是用ubuntu系统,创建虚拟环境安装的python=2.7. ...

  2. OTB官方评估代码matlab版本

    OTB最初就是MATLAB版本评估,后来又推出了python版本,不过精度貌似没有matlab高 python版本配置可以参考我另一篇博客:OTB官方评估代码python版本 tracker_benc ...

  3. 证件照排版功能代码-python版本

    环境要求 安装python3环境 安装pillow图片处理库 开发前准备 推荐使用conda 创建python环境 conda create -n pr python=3.8 # 创建环境 conda ...

  4. [pythonjava爬虫实战]-爬取学院老师信息之-java版本python版本

    文章目录 Java 版本 思路: 预备工作: 简述 代码 python版本 代码 这个实战文章仅作为自己学习笔记记录:使用java和python爬取相同的内容,由于爬取内容涉及个人信息,去除了敏感信息 ...

  5. RANSAC算法(附RANSAC直线拟合C++与Python版本)

    文章目录 RANSAC算法简介 RANSAC算法基本思想和流程 迭代次数推导 RANSAC与最小二乘区别 RANSAC直线拟合代码(C++及Python版本) C++版本代码 Python版本代码如下 ...

  6. mot_challenge官方评估代码

    mot_challenge官方代码使用介绍 评估mot17验证集:每个视频序列的后一半帧作为验证集 下载源码:git clone https://hub.fastgit.org/JonathonLui ...

  7. HPatches数据集(图像匹配)---2关于评估代码的解释---和python画出结果

    关于画图: 参考: Matplotlib系列: https://blog.csdn.net/yuyh131/category_7823048.html 关于评估代码的解释: 我们先提前下载所有算法对数 ...

  8. Windows 10环境下「MSCOCO Captions」评估代码踩坑记录

    文章目录 引言 解决python2→python3.x问题 验证评估代码是否可以正确运行 解决 jar 包运行出错的原因 排查jar包运行出错的原因 解决Could not reserve enoug ...

  9. 官方:最好的版本!Python 3.11正式版来了!

    (点击上方快速关注并设置为星标,一起学Python) 机器之心报道 编辑:陈萍.杜伟 想要体验新功能的小伙伴赶紧去试试新版本吧! 终于,Python 3.11 正式版发布了! 2020 年 1 月 1 ...

最新文章

  1. window.open() document.open()
  2. 逻辑回归Logistic Regression 之基础知识准备
  3. Java8--Lambda表达式对List集合操作
  4. Visual Studio下Qt调用IDL
  5. 玩转 IntelliJ IDEA 2020
  6. 阿里巴巴集团的几十款著名开源项目(Java)
  7. mybatisplus中的xml如何添加like条件,进行模糊查询
  8. linux grep (转)
  9. [原]超快速搞定linux的vnc
  10. php基于新浪ip库获取城市,WordPress-利用新浪IP库获取评论用户所在城市信息!
  11. 对六自由度机械臂的运动控制及python实现(附源码)
  12. Android 蓝牙BLE开发详解
  13. 关于locahost:8080一直在等待却不报错
  14. 华为荣耀20和x10比较_华为畅享20 Pro和荣耀X10哪个好 配置参数谁更胜一筹
  15. CSS中禁止文本选中和鼠标悬入变手型(已解决)
  16. java 判断经纬度_Java中根据经纬度来判断距离
  17. c语言作文的题目_C语言入门题
  18. python 查找重复文件,以及查找重复视频的一些思路
  19. office2021 版本2203现已适配win11界面风格
  20. ps -ef 和ps -aux 和ps aux

热门文章

  1. Procast调用外部函数
  2. 2008胡润中国富豪榜榜单前100名
  3. try catch在for循环外面还是里面
  4. 都有哪些好用的设备维护管理软件?这5款值得一试
  5. 关闭电脑浏览器快捷键
  6. 【杂事随写】 记一次移动硬盘写入速度骤降
  7. 【聊天机器人】深度学习构建检索式聊天机器人原理
  8. android ARouter源码分析
  9. 项目验收汇报ppt_项目汇报ppt制作公司
  10. melogin.cn主页登录_手机怎么进入melogin.cn登陆页面