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的源碼
其中MATLAB版是matlab實現的接口,Python版是後來新增的接口,可以根據需要選擇對應的版本,本次配置以matlab版為例進行配置
1.3 解壓源碼
解壓以後目錄結構如圖所示
首先對目錄中各文件進行說明
- anno文件:主要存儲的是數據集的bounding box
- figs文件:存儲的是一些實驗跑出的圖片,就是各種屬性的準確度或者成功率圖
- initOmit文件:包含由於遮擋或目標超出視野而被省略的用於跟蹤初始化的幀的註釋的目錄
- perfMat文件:存儲最終用於畫圖的mat文件
- results文件:存儲每個trackers的跟蹤結果的mat文件和perfMat不一樣,這個是相對於bounding box的跟蹤框數據
- rstEval文件: 包含了很多用於計算跟蹤性能或者畫出結果的腳本的目錄
- tmp文件:用來存放臨時結果或者日誌文件的目錄
- trackers文件:裡面包含各種你需要對比的跟蹤算法,要簡單瞭解可以看trackers.txt文件
- util文件:裡面包含各種重要的函數
- drawResultBB.m:用於畫每個幀上不同跟蹤器的邊界框的主函數
- main_running.m:是於在測試集上跑跟蹤代碼的,跑出的結果存在results文件夾中
- perfPlot.m:用來畫測試結果圖,就是benchmark網上的圖的效果,如果你第一次下載tracker_benchmark_v1.0的測試代碼,可以先運行perfPlot.m就可以直接畫出漂亮的圖。只不過這些圖是已有的跟蹤算法和測試結果,作者都保存在results文件夾裡面了
1.4 下載vlfeat工具
由於tracker_benchmark_v1.0用到了vlfeat的內容,因此需要首先加載vlfeat的源碼,vlfeat官網下載鏈接:http://www.vlfeat.org/
解壓下載的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張評估圖
1.8 配置後的MATLAB源碼下載
下載鏈接:https://pan.baidu.com/s/1bVu4jvTIc9HGjkzw09G16g
提取碼:gl3f
參考博客: