做目标跟踪性能评价对比实验时,使用官方的评价工具箱需要的结果文件是.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、 评价工具箱画图