目标跟踪环境配置(四):OTB配置安装 (从下载到绘图)

目标跟踪基础与智能前沿

点击上方链接,微信关注回复下方安装包对应的关键词,获得对应的百度云下载链接

论文原文

1) Online Object Tracking: A Benchmark

1、下载OTB数据集

1)官网下载地址(国内网速原因很慢):
2)百度云下载地址: 自动回复关键词“OTB”

2、预先安装好matlab : matlab安装

3、下载OTB测试工具

1)下载地址:Visual Tracker Benchmark

tracker_benchmark_v1.0.zip (229MB).

4、安装OTB,下载上述安装包之后解压缩

5、使用OTB

1) 各个文件的功能

(1) main_running.m 是用来在测试集上跑跟踪代码的,跑出的结果存在results文件夹中;

(2) perfPlot.m 用来把测试结果画出图来,就是benchmark网上的图的效果。

如果你第一次下载tracker_benchmark_v1.0的测试代码,可以先运行perfPlot.m就可以直接画出漂亮的图。只不过这些图是已有的跟踪算法和测试结果,作者都保存在results文件夹里面了;

(3) drawResultBB.m 用于画每个帧上不同跟踪器的边界框的主函数

(4) anno 注释文件(边界框和属性)的目录;

(5) initOmit 包含由于遮挡或目标超出视野而被省略的用于跟踪初始化的帧的注释 的目录;

(6) rstEval 包含了很多用于计算跟踪性能或者画出结果的脚本的目录;

(7) trackers 包含了很多跟踪器代码的目录,里面有20多个跟踪代码,有matlab版,也有c++版;

(8) tmp 用来存放临时结果或者日志文件的目录;

(9) results包含了所有已有跟踪算法测试结果;

(10) util 包含主函数里用到的脚本的目录***(主要就是这个文件夹里的文件需要改***)。

————————————————

2) 首次安装,测试 perfPlot.m

(1)打开matlab

cd /usr/local/MATLAB/R2017b/bin
matlab

(2) 在matlab 里打开 上述解压后的文件夹 :tracker_benchmark_v1.0

(3) 找到perfPlot.m ,运行会报错 , 试试修改代码

3)更改测试代码

在这里插入图片描述
(1)util/configTrcakers.m文件,打开,这里面是所有跟踪算法名字的数组,会在main_running.m和perfPlot.m中被调用到。因为results文件夹中已经包含已有跟踪算法的测试结果,所以其实没必要再重新跑一遍所有算法,时间太长。故而直接将configTrackers.m文件中的所有注释掉,改成如下三行代码即可:(就是说让这个文件夹里只有你自己写的跟踪算法,这样一会执行main_running.m的时候,就不用在测试集上挨个跑已有跟踪算法了)
修改前:

function trackers=configTrackers

trackersVIVID={struct('name','VR','namePaper','VR-V'),...%gray-25%
    struct('name','TM','namePaper','TM-V'),...%dark red
    struct('name','RS','namePaper','RS-V'),...%orange
    struct('name','PD','namePaper','PD-V'),...%Turquoise
    struct('name','MS','namePaper','MS-V')%purple
};

trackers1={   struct('name','CT','namePaper','CT'),...
    struct('name','TLD','namePaper','TLD'),...    
    struct('name','IVT','namePaper','IVT'),...
    struct('name','DFT','namePaper','DFT'),...%yellow
    struct('name','ASLA','namePaper','ASLA'),...
    struct('name','L1APG','namePaper','L1APG'),...    
    struct('name','ORIA','namePaper','ORIA'),...
    struct('name','MTT','namePaper','MTT'),...
    struct('name','CSK','namePaper','CSK'),...
    struct('name','SCM','namePaper','SCM'),...
    struct('name','LOT','namePaper','LOT')};

trackersEXE={ struct('name','CPF','namePaper','CPF'),...
    struct('name','Struck','namePaper','Struck'),...
    struct('name','MIL','namePaper','MIL'),...
    struct('name','OAB','namePaper','OAB'),...
    struct('name','SBT','namePaper','SemiT'),...
    struct('name','BSBT','namePaper','BSBT'),...
    struct('name','Frag','namePaper','Frag'),...
    struct('name','KMS','namePaper','KMS'),...
    struct('name','SMS','namePaper','SMS'),...
    struct('name','LSK','namePaper','LSK'),...
    struct('name','VTS','namePaper','VTS'),...
    struct('name','VTD','namePaper','VTD'),...
    struct('name','CXT','namePaper','CXT')};

trackers = [trackersVIVID,trackers1,trackersEXE];

修改后: 这样一会执行main_running.m的时候,就不用在测试集上挨个跑已有跟踪算法了)

function trackers=configTrackers
trackersNEW={struct('name','LCSVM','namePaper','LCSVM')};
trackers=trackersNEW;

? 自己的方法模型放在哪里?或者想要对比的模型代码放在哪里?

(2)util/configSeqs.m文件,打开,这里面是所有测试集的路径及其属性。需要把里面所有测试序列的路径改成你main_runing.m函数能够读到的路径,建议用绝对路径,类似于(这是测试集的路径):
'/media/yuuzh/dataDisk2T/Dataset/OTB/OTB100/Soccer/img

??原来的路径类似于\\ soccer
在这里插入图片描述

? [seqIVT,seqVTD,seqOther], 这几个序列的差别是?

上述修改后运行时出现问题,path之后的字段直接应该是路径+ img后加 / ,读取到的图像会继续读入 ,需要重新修改后路径如下:
在这里插入图片描述

(3)trackers/文件,打开,新建文件夹,命名LCSVM(你自己的方法)。打开LCSVM,将自己跟踪算法的可执行文件LCSVM.exe保存进来,然后再新建一个run_LCSVM.m文件,用来配置算法的接口。可以直接从其他trackers文件里面,把run_xx.m文件拷过来,因为大同小异。拷过来之后稍作修改,我把我的run_LCSVM.m展出来,读者可以观察和其他run_xx.m的区别,很好理解。
————————————————
下面是tracker 下的各个跟踪器。
Tracker 文件夹

? 自己的算法如何生成可执行文件exe

其实就是通过dos命令将测试序列的名称、路径、起始帧等喂给你的跟踪算法,当然前提是你的跟踪算法里面一定要预留这些接口。跟踪算法里面还要将每一帧的跟踪结果输出到LCSVM_ST.txt的文件夹里面,这样才能被上面的matlab代码读到来生成最终结果。

run_stuck.m

function results=run_Struck(seq, res_path, bSaveImage)% 

close all;

x=seq.init_rect(1)-1;%matlab to c
y=seq.init_rect(2)-1;
w=seq.init_rect(3);
h=seq.init_rect(4);

%featureName kernelName param svmC svmBudgetSize searchRadius seed
%featureName: raw haar histogram
%kernelName: linear gaussian intersection chi2
%seed: default - 0
tic
command = ['struck.exe haar gaussian 0.2 100 100 30 10 ' num2str(bSaveImage) ' ' num2str(bSaveImage) ' ' seq.name ' ' seq.path ' ' num2str(seq.startFrame) ' ' num2str(seq.endFrame) ' '  num2str(seq.nz) ' ' seq.ext ' ' num2str(x) ' ' num2str(y) ' ' num2str(w) ' ' num2str(h)];
dos(command);
duration=toc;

results.res = dlmread([seq.name '_ST.txt']);
results.res(:,1:2) =results.res(:,1:2) + 1;%c to matlab

results.type='rect';
results.fps=seq.len/duration;

results.fps = dlmread([seq.name '_ST_FPS.txt']);

(4)这些都做好了,就可以进入main_runing.m文件,执行这段代码。执行过程中可能会有问题,比如这段代码要注释掉(这是vlfeat工具集的路径,是OTB作者用来测试那些已有算法用的,我们这里只测试自己的跟踪算法):

在这里插入图片描述

· vlfeat 的安装

另外我把这个修改成了OPE,因为我只进行OPE的测试,认为足以。当然读者可以测试TRE和SRE。(这两个是用来测试时空鲁棒性的)

在这里插入图片描述
然后就应该不用改了,就可以执行main_running.m啦!!!就可以看到你的算法在所有测试集上面运行的效果啦!!!到这一步还是令人激动的。
————————————————

如果出现 某目录不存在的情况,请检查目录是否少了/, 和自己的文件夹目录核查一下
在这里插入图片描述
修改为OPE ,发现出现的错误:

目录配置正确之后运行结果:
在这里插入图片描述
当出现以下错误 : 未找到命令, 应该是各个跟踪器对应的.exe 没有载入
在这里插入图片描述

这里我们先忽略,不运行这些跟踪器(没有exe ,或许是文件位置的原因,但不影响其他跟踪器的运行。

4) 画出结果对比已有算法

main_running.m跑出的结果,会在results里面有体现:

由于我跑的是OPE,所以我的算法跑出的结果在results_OPE_CVPR13文件夹中,我把里面的结果全部复制,粘贴到results_SRE_CVPR13和results_TRE_CVPR13文件中(因为在perfPlot.m文件中画图的时候用到了这两个文件)。这个时候就可以直接运行perfPlot.m啦,出来的图应该是只有你自己的算法的运行结果,也就是只有一条曲线。原因是:需要返回身来,把configTrackers.m文件修改一下,要把所有的跟踪算法重新包含进来,当然还要加入自己的跟踪算法。
————————————————
在这里插入图片描述
运行时报错:
在这里插入图片描述
这是因为, 文件名后缀是 小写, matlab里面读取使用的都是大写。

统一修改文件名的后缀为大写就好

bsbt ivt ,替换成 大写的就好了

rename -v 's/_bsbt/_BSBT/' *.mat
rename -v 's/_ivt/_IVT/' *.mat

在这里插入图片描述

所有的该修改的修改之后,总结以下运行的顺序

1、util/configTrcakers.m 注释掉已经跑出结果的跟踪器,保留自己需要测试的跟踪器

在这里插入图片描述

2、util/configSeqs.m 修改测试集在本机上的目录

注意path中文件的大小写和目录下的大小写匹配,img后面 有‘/’

3、 trackers 目录下,模仿其他跟踪器,放入自己的跟踪器模型和可执行文件

4、 startup.m 启动 vl_feat库

初始启动vl_feat库, 因为main_runing.m中用到了

5、main_runing.m, 修改输出的结果类型

该文件用到了多处路径,注意源代码中的转移字符 \ 应该修改成路径字符/ ,运行跟踪器调用测试集,输出results

6、检查result文件夹,运行perfPlot.m, (对比configTrackers.m 加入所有跟踪器,最后的图曲线才全)

热门文章

暂无图片
编程学习 ·

vue打包后修改服务器地址

1.在public文件下新建config.js文件2.修改config.js文件 var PLATFROM_CONFIG = {}; // 本地环境 PLATFROM_CONFIG.baseUrl = "服务器地址" // 正式环境 // PLATFROM_CONFIG.baseUrl = "服务器地址"3.在封装好的axios里面去修改,我的是4.在index.html中引…
暂无图片
编程学习 ·

连续子数组的最大和

一、问题描述 给定一个数组, 找出数组的一个连续子数组, 这个子数组的和最大; 遍历数组,将数组的值加入到sum中, 如果sum大于0, 继续遍历下一个数据, 如果sum小于等于0,说明前面的子数组是无用的,丢弃前面的数组,从下一个数组开始继续遍历; 二、连续子数组的最大和代…
暂无图片
编程学习 ·

MIT 计算机操作环境导论Missing Semester Lesson 10 Q&A

最后一节课,我们回答学生提出的问题:学习操作系统相关内容的推荐,比如进程,虚拟内存,中断,内存管理等你会优先学习的工具有那些?使用 Python VS Bash脚本 VS 其他语言?source script.sh 和 ./script.sh 有什么区别?各种软件包和工具存储在哪里?引用过程是怎样的? /bi…
暂无图片
编程学习 ·

Android中给Layout添加点击事件

@Android中给Layout添加点击事件 步骤一:在layout控件中设置clickable和focuseable和id <LinearLayout android:id="@+id/to_anchor_dialog" android:onClick=“onClick” android:clickable=“true” android:layout_width=“match_parent” android:layout_hei…
暂无图片
编程学习 ·

c++ string操作

c++ string操作 #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std;void test01() {///*string& operator=(const char* s)* string& operator=(const string &s)* string& operato…
暂无图片
编程学习 ·

js实现复制并能保留原格式粘贴

使用textarea能粘贴的时候保留原格式。使用input粘贴的时候格式会丢失。const input = document.createElement(textarea);document.body.appendChild(input);input.value = “复制我呀”;// input.setAttribute(value, "复制我呀");input.select();if (document.ex…
暂无图片
编程学习 ·

Linux上远程命令

远程Linux: ssh -l root 192.168.0.1 -l 用户 远程成功了在输密码 远程Windows: rdesktop - u tedu -p tedu 192.168.0.10:3389 -u 用户 -p 密码
暂无图片
编程学习 ·

防火墙中的DMZ区域,Trust区域,Untrust区域

** 区域的作用: ** 1.安全策略都基于区域实施 2.在同一区域内部发生的数据流动是不存在风险的,不需要实施任何安全策略。 只有当不同安全区域之间发生数据流动时,才会触发设备的安全检查,并实施相应的安全策略。 3.一个接口只能属于一个区域,而一个区域可以有多个接口。 *…
暂无图片
编程学习 ·

Layui实现动态加载Tree

目录前言实现步骤初步准备构建data数据源 前言有空研究了一下Layui,感觉相对于EasyUI来说,美观了不少,结合后台加载动态Tree带大家初步了解一下这个框架实现步骤 初步准备 Layui官网 去官网下载好Layui,里面有示例和css、js等文件具体使用步骤: 要使用Layui,必须引入css文件…
暂无图片
编程学习 ·

进程保活

进程保活一.为什么需要进程保活二.进程优先级前台进程(Foreground process)可见进程(Visible process)服务进程(Service process)后台进程(Background process)空进程(Empty process)三.保活方式1. 利用 Notification 提升权限2. 利用系统Service机制拉活3. 添加Manifest文件属…
暂无图片
编程学习 ·

面试必问之 == 与 equals

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:情况1:类没有覆盖 equals() 方法。则通过 equals() 比…
暂无图片
编程学习 ·

vue中实现一个搜索框的组件

在前端开发中有些东西就会经常反复使用,这样的东西抽取成组件比较合适,最近工作中遇到一个搜索楼盘的页面需要反复多次使用,抽取成了组件,现在记录一下1.创建一个searchcom.vue文件2.文件中填入一下代码,具体内容在代码后边进行解释<template> <div><heade…
暂无图片
编程学习 ·

java 并发 join 之 老王泡茶

package juc;import java.util.concurrent.TimeUnit;/*** @author yanjun.liu* @date 2020/7/1--17:00*/ public class Test6 {public static void main(String[] args) throws InterruptedException {Thread lw= new Thread(()->{try {System.out.println("老王开始洗…
暂无图片
编程学习 ·

Linux彻底卸载Nginx

本机环境:centos7使用yum安装的Nginx1.首先输入命令 ps -ef | grep nginx检查一下nginx服务是否在运行。[root@localhost /]# ps -ef |grep nginx root 3163 2643 0 14:08 tty1 00:00:00 man nginx root 5427 1 0 14:50 ? 00:00:00 nginx: m…
暂无图片
编程学习 ·

datawhale-综合练习题目

这里写自定斜体样式义目录标题这两天考试多,休息的时间也没有,等我考完再重新做回来,等我!功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建…
暂无图片
编程学习 ·

springboot中application.yml配置中常用的配置信息

server:port:8001mybatis:config-location:classpath:mybtais/mybatis.cfg.xml #mybatis配置文件所在路径typ-aliases-package:com.auguigu.springcloud.entities #所有Entity别名类所在包mapper-location:- classpath:mybatis/mapper/**/*.xml #mapper映射文件spring:app…
暂无图片
编程学习 ·

Vue循环渲染&key的原理

v-for用于循环的数组里面的值可以是对象,也可以是普通元素<ul id="example-1"><!-- 循环结构-遍历数组 item 是我们自己定义的一个名字 代表数组里面的每一项 items对应的是 data中的数组--><li v-for="item in items">{{ item.mess…
暂无图片
编程学习 ·

美团数据库高可用架构的演进与设想

本文介绍最近几年美团MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新。同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我们的一些规划和展望。在2015年之前,美团(点评侧)长期使用MMM(Master-Master replication manage…
暂无图片
编程学习 ·

金秋十月,再聚蓉城!一展一会,涌动环保新商机!

如果不是……今天会是“第二届中国环博会成都展”与“2020中国环境产业高峰论坛”开幕的日子。现在,两大盛会确定改到10月13-15日,地点仍为中国成都西部国际博览城。在等待的日子里,我们一起来回顾一下去年展会的盛况,再跟朋友们说说今年的最新动态。 品牌环保展落户蓉城 强…