做目標跟蹤性能評價對比實驗時,使用官方的評價工具箱需要的結果文件是.mat數據,而比較算法提供的結果文件爲.txt數據。
將.txt文件轉化爲.mat文件的過程如下:
情況一:單個數據集文件存在一個文件夾
以跟蹤算法SiamBAN爲例,UAV123數據集
1、結果文件如下
2、轉換代碼:
clear;clc;
close all;
% txt路徑
txt_path = 'E:\Codes\MATLAB\Experiments\experimental_results\siamban_results\siamban_results\SiamBAN_UAV123\';
% mat路徑
mat_path = 'E:\Codes\MATLAB\Experiments\experimental_results\siamban_results\siamban_results\SiamBAN_UAV123Mat\';
mkdir(mat_path);
% 跟蹤器名字
tracker='SiamBAN';
txt_files = dir([txt_path '*.txt']);
txt_files={txt_files.name};
for i=1:numel(txt_files)
region=csvread([txt_path txt_files{i}]);
results{1}.type = 'rect';
results{1}.res = region;
results{1}.len = length(region);
videoname=txt_files{i};
videoname=videoname(1:length(videoname)-4);
save([mat_path videoname '_' tracker '.mat'], 'results');
end
3、轉換結果
4、評價工具箱畫圖
情況二:所有數據集結果存在於一個文件夾,且有規律
以跟蹤算法ATOM爲例,UAV123數據集
1、結果文件如下:
2、轉換代碼:
先找到單個數據集結果的特點,將uav_開頭的挑出來即可,然後再生成.mat文件。
clear;clc;
close all;
% txt路徑
txt_path = 'E:\Codes\MATLAB\Experiments\experimental_results\atom-20200626T063724Z-001\atom\default_000\';
% mat路徑
mat_path = 'E:\Codes\MATLAB\Experiments\experimental_results\atom-20200626T063724Z-001\atom\atom_UAV123Mat\';
mkdir(mat_path);
% 跟蹤器名字
tracker='ATOM';
txt_files = dir([txt_path 'uav_*.txt']);
txt_files={txt_files.name};
for i=1:numel(txt_files)
[data1,data2,data3,data4]=textread([txt_path txt_files{i}],'%n%n%n%n');
region=[data1 data2 data3 data4];
results{1}.type = 'rect';
results{1}.res = region;
results{1}.len = length(region);
videoname=txt_files{i};
videoname=videoname(5:length(videoname)-4);
save([mat_path videoname '_' tracker '.mat'], 'results');
end
3、轉換結果
4、評價工具箱畫圖
情況三:所有數據集結果存在於一個文件夾,且無規律
以跟蹤算法ATOM爲例,OTB-2015數據集
1、結果文件如下:各個數據集結果交叉在一起
2、轉換代碼
將需要轉換的序列一個個列出來,如果序列不重複可以直接讀取數據集中的目錄,因爲OTB-2015存在重複的情況,所以給出代碼是將每個視頻序列羅列出來的。
clear;clc;
close all;
% txt路徑
txt_path = 'E:\Codes\MATLAB\Experiments\experimental_results\atom-20200626T063724Z-001\atom\default_000\';
% mat路徑
mat_path = 'E:\Codes\MATLAB\Experiments\experimental_results\atom-20200626T063724Z-001\atom\atom_OTB-2015Mat\';
mkdir(mat_path);
% 跟蹤器名字
tracker='ATOM';
% 視頻序列
% videos = {'Basketball'};
videos = {'Soccer', 'Matrix', 'Ironman', 'Deer', 'Skating1', 'Shaking', ...
'Singer1', 'Singer2', 'CarDark', 'Car4', 'David2', 'Sylvester', 'Trellis', ...
'Fish', 'Mhyang', 'David', 'Coke', 'Bolt', 'Boy', 'Dudek', ...
'Crossing', 'Couple', 'Football1', 'Jogging-1', 'Jogging-2', 'Doll', ...
'Girl', 'Walking2', 'Walking', 'Fleetface', 'Freeman1', 'Freeman3', ...
'Freeman4', 'David3', 'Jumping', 'CarScale', 'Skiing', 'Dog1',...
'Suv', 'MotorRolling', 'MountainBike', 'Lemming', 'Liquor', 'Woman', 'Faceocc1', ...
'Faceocc2', 'Basketball', 'Football', 'Subway', 'Tiger1', 'Tiger2',...%OTB-2013
'Biker','Bird1','Bird2','BlurBody','BlurCar1','BlurCar2','BlurCar3',...
'BlurCar4','BlurFace','BlurOwl','Board','Bolt2','Box','Car1','Car2',...
'Car24','ClifBar','Coupon','Crowds','Dancer','Dancer2','Diving',...
'Dog','DragonBaby','Girl2','Gym','Human2','Human3','Human4_2','Human5',...
'Human6','Human7','Human8','Human9','Jump','KiteSurf','Man','Panda',...
'RedTeam','Rubik','Skater','Skater2','Skating2-1','Skating2-2','Surfer',...
'Toy','Trans','Twinnings','Vase'};
for vid = 1:numel(videos)
close all;
disp(videos{vid});
% 兩個視頻序列具有兩個目標,跟蹤兩次
if (strcmp(videos{vid}, 'Jogging-1'))
[seq, tracking_results] = load_video_info(txt_path,'Jogging_1');
elseif (strcmp(videos{vid}, 'Jogging-2'))
[seq, tracking_results] = load_video_info(txt_path,'Jogging_1');
elseif (strcmp(videos{vid}, 'Skating2-1'))
[seq, tracking_results] = load_video_info(txt_path,'Skating2_1');
elseif (strcmp(videos{vid}, 'Skating2-2'))
[seq, tracking_results] = load_video_info(txt_path,'Skating2_2');
else
[seq, tracking_results] = load_video_info(txt_path,videos{vid});
end
% 四個視頻並非從第一幀開始,最後一幀結束
seq.VidName = videos{vid};
st_frame = 1;
en_frame = seq.len;
if (strcmp(videos{vid}, 'David'))
st_frame = 300;
en_frame = 770;
elseif (strcmp(videos{vid}, 'Football1'))
st_frame = 1;
en_frame = 74;
elseif (strcmp(videos{vid}, 'Freeman3'))
st_frame = 1;
en_frame = 460;
elseif (strcmp(videos{vid}, 'Freeman4'))
st_frame = 1;
en_frame = 283;
end
seq.st_frame = st_frame;
seq.en_frame = en_frame;
% 幀數
num_frames=en_frame-st_frame+1;
% 預聲明目標框
rect_position = zeros(num_frames, 4);
for frame=st_frame:en_frame
% 傳遞結果
rect_position(frame-st_frame+1,:)=tracking_results(frame-st_frame+1,:);
end
% 原始數據集中,Tiger1的前5幀都是有遮擋的,所以需要直接去掉
if (strcmp(videos{vid}, 'Tiger1'))
st_frame1=st_frame+5;
else
st_frame1=st_frame;
end
% save resutls.
results{1}.type = 'rect';
results{1}.res = rect_position;
results{1}.fps = 1.0;
results{1}.len = num_frames;
results{1}.annoBegin = st_frame;
results{1}.startFrame = st_frame1;
save([mat_path videos{vid} '_' tracker '.mat'], 'results');
end
load_video_info.m
function [seq, tracking_results] = load_video_info(video_path,video)
tracking_results = dlmread([video_path video '.txt']);
seq.len = size(tracking_results, 1);
seq.init_rect = tracking_results(1,:);
end
3、轉換結果
4、 評價工具箱畫圖