OTB是单目标跟踪中非常经典的一个数据集。它包含多种评估指标,最常用的有AUC(曲线下面积),DP(距离精度),这两种指标都可以通过OTB工具箱自动计算得到。然而,除了AUC/DP,为了对算法进行更加全面的评估,论文中常出现的还有OP(重叠精度),CLE(中心位置误差)和FPS(速度),且OTB工具箱中没有关于这三个指标的评估代码。本文通过参考其他代码,汇总了这三种指标的matlab代码。
mean OP(平均重叠精度)
OP的计算方式参考了BACF,将其计算单个视频的OP扩展到计算整个数据集的视频的OP,matlab代码如下:
clear
close all;
clc
addpath('./util');
base_path = 'E:/datasets/OTB100/';
seqs=configSeqs;
trackers=configTrackers;
numSeq=length(seqs);
numTrk=length(trackers);
rpAll='.\results\results_OPE_CVPR13\';
for idxTrk=1:numTrk
t = trackers{idxTrk};
total_OP=0;
for idxSeq=1:numSeq
s = seqs{idxSeq};
load([rpAll s.name '_' t.name '.mat']);
% compute the OP
[~, ground_truth] = load_video_info_all(base_path, s.name);
gt_boxes = [ground_truth(:,1:2), ground_truth(:,1:2) + ground_truth(:,3:4) - ones(size(ground_truth,1), 2)];
pd_boxes = results{1, 1}.res;
pd_boxes = [pd_boxes(:,1:2), pd_boxes(:,1:2) + pd_boxes(:,3:4) - ones(size(pd_boxes,1), 2) ];
OP = zeros(size(gt_boxes,1),1);
for i=1:size(gt_boxes,1)
b_gt = gt_boxes(i,:);
b_pd = pd_boxes(i,:);
OP(i) = computePascalScore(b_gt,b_pd);
end
OP_vid = sum(OP >= 0.5) / numel(OP);
total_OP = total_OP + OP_vid;
end
mean_OP = total_OP/numSeq;
disp([trackers{idxTrk}.name, '-------- mean OP:',num2str(mean_OP)]);
end
mean CLE(平均中心位置误差)
这部分代码主要参考了https://github.com/HonglinChu/visual_tracker_benchmark中的部分代码,matlab代码如下:
clear
close all;
clc
addpath('./util');
base_path = 'E:/datasets/OTB100/';
seqs=configSeqs;
trackers=configTrackers;
numSeq=length(seqs);
numTrk=length(trackers);
rpAll='.\results\results_OPE_CVPR13\';
for idxTrk=1:numTrk
t = trackers{idxTrk};
total_CLE=0;
for idxSeq=1:numSeq
s = seqs{idxSeq};
load([rpAll s.name '_' t.name '.mat']);
% compute the CLE
[~, ground_truth] = load_video_info_all(base_path, s.name);
centerGT = [ground_truth(:,1)+(ground_truth(:,3)-1)/2 ground_truth(:,2)+(ground_truth(:,4)-1)/2];
rectMat = results{1, 1}.res;
center = [rectMat(:,1)+(rectMat(:,3)-1)/2 rectMat(:,2)+(rectMat(:,4)-1)/2];
errCenter = zeros(size(centerGT,1),1);
for i=1:size(centerGT,1)
c_gt = centerGT(i,:);
c_pd = center(i,:);
errCenter(i) = sqrt(sum((c_gt - c_pd).^2));
end
CLE_vid = sum(errCenter) / numel(errCenter);
total_CLE = total_CLE + CLE_vid;
end
mean_CLE = total_CLE/numSeq;
disp([trackers{idxTrk}.name, '-------- mean CLE:',num2str(mean_CLE)]);
end
mean FPS(平均帧率)
同样参考https://github.com/HonglinChu/visual_tracker_benchmark中的部分代码,matlab代码如下:
clear
close all;
clc
addpath('./util');
seqs=configSeqs;
trackers=configTrackers;
% seqs = seqs(1:10);
% trackers = trackers(1:10);
numSeq=length(seqs);
numTrk=length(trackers);
evalType = 'OPE';
switch evalType
case 'OPE'
rpAll='.\results\results_OPE_CVPR13\';
case 'SRE'
rpAll='.\results\results_SRE_CVPR13\';
case 'TRE'
rpAll='.\results\results_TRE_CVPR13\';
end
for idxTrk=1:numTrk
t = trackers{idxTrk};
% time=0;
% frame=0;
totalFPS=0;
for idxSeq=1:numSeq
s = seqs{idxSeq};
load([rpAll s.name '_' t.name '.mat']);
res = results{1};
% time=time+(s.endFrame-s.startFrame+1)/res.fps; %总时间
% frame=frame+(s.endFrame-s.startFrame+1); %总帧数
totalFPS=totalFPS+res.fps;
end
% average_FPS=frame/time; %平均FPS
average_FPS=totalFPS/numSeq;
disp([trackers{idxTrk}.name, ' -------- mean FPS:',num2str(average_FPS)]);
end
【注】在计算OP和CLE的代码里都用到了computePascalScore.m这个函数,这个函数又调用了其他相关函数,这些函数都可以在BACF或上面的Github链接中找到。
以上只是本人根据自己理解完成的,如有误,欢迎指正!