天天看點

OTB資料集評測工具tracker_benchmark_v1.0(MATLAB版)配置教程

1. MATLAB版配置教程

1.1 tracker_benchmark_v1.0說明

tracker_benchmark_v1.0是OTB(object tracking benchmark)的matlab版本,實際是吳毅老師的兩篇論文

  • OTB50(OTB2013)包含50個視訊序列

原文連結:[Wu Y, Lim J, Yang M H. Online object tracking: A benchmark [C] CVPR, 2013.](

http://faculty.ucmerced.edu/mhyang/papers/cvpr13_benchmark.pdf)
  • OTB100(OTB2015)在OTB50的基礎上擴充視訊序列到100個

原文連結:[Wu Y, Lim J, Yang M H. Object tracking benchmark [J]. TPAMI, 2015.](

http://faculty.ucmerced.edu/mhyang/papers/pami16_object_tracking_benchmark.pdf)

1.2 下載下傳源碼

去官網

Visual Tracker Benchmark

下載下傳tracker_benchmark_v1.0的源碼

OTB資料集評測工具tracker_benchmark_v1.0(MATLAB版)配置教程

其中MATLAB版是matlab實作的接口,Python版是後來新增的接口,可以根據需要選擇對應的版本,本次配置以matlab版為例進行配置

1.3 解壓源碼

解壓以後目錄結構如圖所示

OTB資料集評測工具tracker_benchmark_v1.0(MATLAB版)配置教程

首先對目錄中各檔案進行說明

  1. anno檔案:主要存儲的是資料集的bounding box
  2. figs檔案:存儲的是一些實驗跑出的圖檔,就是各種屬性的準确度或者成功率圖
  3. initOmit檔案:包含由于遮擋或目标超出視野而被省略的用于跟蹤初始化的幀的注釋的目錄
  4. perfMat檔案:存儲最終用于畫圖的mat檔案
  5. results檔案:存儲每個trackers的跟蹤結果的mat檔案和perfMat不一樣,這個是相對于bounding box的跟蹤框資料
  6. rstEval檔案: 包含了很多用于計算跟蹤性能或者畫出結果的腳本的目錄
  7. tmp檔案:用來存放臨時結果或者日志檔案的目錄
  8. trackers檔案:裡面包含各種你需要對比的跟蹤算法,要簡單了解可以看trackers.txt檔案
  9. util檔案:裡面包含各種重要的函數
  10. drawResultBB.m:用于畫每個幀上不同跟蹤器的邊界框的主函數
  11. main_running.m:是于在測試集上跑跟蹤代碼的,跑出的結果存在results檔案夾中
  12. perfPlot.m:用來畫測試結果圖,就是benchmark網上的圖的效果,如果你第一次下載下傳tracker_benchmark_v1.0的測試代碼,可以先運作perfPlot.m就可以直接畫出漂亮的圖。隻不過這些圖是已有的跟蹤算法和測試結果,作者都儲存在results檔案夾裡面了

1.4 下載下傳vlfeat工具

由于tracker_benchmark_v1.0用到了vlfeat的内容,是以需要首先加載vlfeat的源碼,vlfeat官網下載下傳連結:

http://www.vlfeat.org/
OTB資料集評測工具tracker_benchmark_v1.0(MATLAB版)配置教程

解壓下載下傳的vlfeat源碼,然後修改main_runing.m中的vlfeat路徑為自己的源碼位置

addpath(('./vlfeat-0.9.21\toolbox'));           

1.5 整理測試序列

  • 首先下載下傳OTB100資料集
  • 在tracker_benchmark_v1.0根路徑下建立data_seq目錄,用于存放需要測試的序列
  • 根據tracker_benchmark_v1.0根路徑下的anno目錄對應的txt檔案将OTB100中對應的序列複制到data_seq目錄
  • 需要注意的是data_seq目錄中的序列名必須與anno目錄中的txt檔案保持嚴格一直,由于OTB100中序列的命名規則首字母大寫,而anno中txt對應檔案首字母小寫,是以提供如下的轉換腳本
clear all;
clc;
%% 确定目錄路徑
srcPath='./OTB100/';
dstPath='./OTB2015/';
if ~exist(dstPath,'dir')
    mkdir(dstPath);
end
%% 讀取源目錄檔案
contents=dir(srcPath);
contents=contents(3:length(contents),:);
%% 處理檔案名
for i=1:length(contents)
    newName=([lower(contents(i).name(1)) contents(i).name(2:end)]);
    mkdir([dstPath newName]);
    copyfile([srcPath contents(i).name],[dstPath newName]);
end           

1.6 修改測試序列

修改configSeqs.m中的路徑為你自己想要測試的序列路徑

function seqs=configSeqs

seqVTD={struct('name','soccer','path','./data_seq\soccer\img\','startFrame',1,'endFrame',392,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','matrix','path','./data_seq\matrix\img\','startFrame',1,'endFrame',100,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','ironman','path','./data_seq\ironman\img\','startFrame',1,'endFrame',166,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','deer','path','./data_seq\deer\img\','startFrame',1,'endFrame',71,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','skating1','path','./data_seq\skating1\img\','startFrame',1,'endFrame',400,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','shaking','path','./data_seq\shaking\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','singer1','path','./data_seq\singer1\img\','startFrame',1,'endFrame',351,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','singer2','path','./data_seq\singer2\img\','startFrame',1,'endFrame',366,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};

seqIVT={struct('name','carDark','path','./data_seq\carDark\img\','startFrame',1,'endFrame',393,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','car4','path','./data_seq\car4\img\','startFrame',1,'endFrame',659,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','david','path','./data_seq\david\img\','startFrame',300,'endFrame',770,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','david2','path','./data_seq\david2\img\','startFrame',1,'endFrame',537,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...    
    struct('name','sylvester','path','./data_seq\sylvester\img\','startFrame',1,'endFrame',1345,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','trellis','path','./data_seq\trellis\img\','startFrame',1,'endFrame',569,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','fish','path','./data_seq\fish\img\','startFrame',1,'endFrame',476,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','mhyang','path','./data_seq\mhyang\img\','startFrame',1,'endFrame',1490,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};

seqOther={struct('name','coke','path','./data_seq\coke\img\','startFrame',1,'endFrame',291,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','bolt','path','./data_seq\bolt\img\','startFrame',1,'endFrame',350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','boy','path','./data_seq\boy\img\','startFrame',1,'endFrame',602,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','dudek','path','./data_seq\dudek\img\','startFrame',1,'endFrame',1145,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','crossing','path','./data_seq\crossing\img\','startFrame',1,'endFrame',120,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','couple','path','./data_seq\couple\img\','startFrame',1,'endFrame',140,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','football1','path','./data_seq\football1\img\','startFrame',1,'endFrame',74,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','jogging-1','path','./data_seq\jogging-1\img\','startFrame',1,'endFrame',307,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','jogging-2','path','./data_seq\jogging-2\img\','startFrame',1,'endFrame',307,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','doll','path','./data_seq\doll\img\','startFrame',1,'endFrame',3872,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','girl','path','./data_seq\girl\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','walking2','path','./data_seq\walking2\img\','startFrame',1,'endFrame',500,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','walking','path','./data_seq\walking\img\','startFrame',1,'endFrame',412,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','fleetface','path','./data_seq\fleetface\img\','startFrame',1,'endFrame',707,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','freeman1','path','./data_seq\freeman1\img\','startFrame',1,'endFrame',326,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','freeman3','path','./data_seq\freeman3\img\','startFrame',1,'endFrame',460,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','freeman4','path','./data_seq\freeman4\img\','startFrame',1,'endFrame',283,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','david3','path','./data_seq\david3\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','jumping','path','./data_seq\jumping\img\','startFrame',1,'endFrame',313,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','carScale','path','./data_seq\carScale\img\','startFrame',1,'endFrame',252,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','skiing','path','./data_seq\skiing\img\','startFrame',1,'endFrame',81,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','dog1','path','./data_seq\dog1\img\','startFrame',1,'endFrame',1350,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','suv','path','./data_seq\suv\img\','startFrame',1,'endFrame',945,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','motorRolling','path','./data_seq\motorRolling\img\','startFrame',1,'endFrame',164,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','mountainBike','path','./data_seq\mountainBike\img\','startFrame',1,'endFrame',228,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),... 
    struct('name','lemming','path','./data_seq\lemming\img\','startFrame',1,'endFrame',1336,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','liquor','path','./data_seq\liquor\img\','startFrame',1,'endFrame',1741,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','woman','path','./data_seq\woman\img\','startFrame',1,'endFrame',597,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','faceocc1','path','./data_seq\faceocc1\img\','startFrame',1,'endFrame',892,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','faceocc2','path','./data_seq\faceocc2\img\','startFrame',1,'endFrame',812,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','basketball','path','./data_seq\basketball\img\','startFrame',1,'endFrame',725,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','football','path','./data_seq\football\img\','startFrame',1,'endFrame',362,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','subway','path','./data_seq\subway\img\','startFrame',1,'endFrame',175,'nz',4,'ext','jpg','init_rect', [0 0 0 0]),...    
    struct('name','tiger1','path','./data_seq\tiger1\img\','startFrame',1,'endFrame',354,'nz',4,'ext','jpg','init_rect', [0,0,0,0]),...
    struct('name','tiger2','path','./data_seq\tiger2\img\','startFrame',1,'endFrame',365,'nz',4,'ext','jpg','init_rect', [0,0,0,0])};

seqs=[seqVTD,seqIVT,seqOther];           

需要注意到這裡之後還要将測試序列路徑中的多餘“_c”删除

1.7 測試tracker_benchmark_v1.0源碼

到這裡就可以運作tracker_benchmark_v1.0源碼,運作順序configSeqs.m->main_running.m->PerfPlot.m能夠得到36張評估圖

OTB資料集評測工具tracker_benchmark_v1.0(MATLAB版)配置教程

1.8 配置後的MATLAB源碼下載下傳

下載下傳連結:

https://pan.baidu.com/s/1bVu4jvTIc9HGjkzw09G16g

提取碼:gl3f

參考部落格:

【1】

【OTB使用介紹一】tracker_benchmark_v1.0小白使用配置OTB100

【2】

OTB官方評估代碼python版本--評估自己跟蹤器,對比其他跟蹤器