evaluation/UAV-benchmark-MOTD_v1.0/evaluateTracking.m (110 lines of code) (raw):

function [allMets, metsBenchmark, metsMultiCam] = evaluateTracking(seqmap, resDir, gtDataDir, benchmark) % Input: % - seqmap % Sequence map. % % - resDir % The folder containing the tracking results. Each one should be saved in a % separate .txt file with the name of the respective sequence (see ./res/data) % % - gtDataDir % The folder containing the ground truth files. % % % Output: % - allMets % Scores for each sequence % % - metsBenchmark % Aggregate score over all sequences % % - metsMultiCam % Scores for multi-camera evaluation % % addpath(genpath('.')); % warning off; % Benchmark specific properties world = 0; threshold = 0.5; % Read sequence list sequenceListFile = seqmap; allSequences = parseSequences2(sequenceListFile); gtMat = []; resMat = []; % Evaluate sequences individually allMets = []; metsBenchmark = []; metsMultiCam = []; for ind = 1:length(allSequences) sequenceName = char(allSequences(ind)); fprintf('\t... %s\n',sequenceName); gtFilename = sprintf('%s%s%s',gtDataDir,sequenceName,'_gt.txt'); gtdata = dlmread(gtFilename); gtdata(gtdata(:,7)==0,:) = []; % ignore 0-marked GT gtdata(gtdata(:,1)<1,:) = []; % ignore negative frames [~, ~, ic] = unique(gtdata(:,2)); % normalize IDs gtdata(:,2) = ic; gtMat{ind} = gtdata; % Parse result resFilename = [resDir, sequenceName, '.txt']; if strcmp(benchmark, 'UAVDT') resFilename = preprocessResult(resFilename, sequenceName, gtDataDir); end % Skip evaluation if output is missing if ~exist(resFilename,'file') error('Invalid submission. Result for sequence %s not available!\n', sequenceName); end % Read result file if exist(resFilename,'file') s = dir(resFilename); if s.bytes ~= 0 resdata = dlmread(resFilename); else resdata = zeros(0,9); end else error('Invalid submission. Result file for sequence %s is missing or invalid\n', resFilename); end resdata(resdata(:,1)<1,:) = []; % ignore negative frames resdata(resdata(:,1) > max(gtMat{ind}(:,1)),:) = []; % clip result to gtMaxFrame file_gt_ign = sprintf('%s%s%s',gtDataDir,sequenceName,'_gt_ignore.txt'); pass = {'M0203','M0205','M0208','M0403','M0601','M0602','M0606','M0701','M0802','M1001','M1004','M1007','M1009','M1101','M1301','M1302','M1303','M1401'}; if ismember(sequenceName, pass) gt_ign = dlmread(file_gt_ign); for gt_i = 1:length(gt_ign(:,1)) resdata(resdata(:,1) == gt_ign(gt_i,1) & resdata(:,3)>gt_ign(gt_i,3) & resdata(:,4)>gt_ign(gt_i,4) & resdata(:,3)+resdata(:,5)<gt_ign(gt_i,3)+gt_ign(gt_i,5) & resdata(:,4)+resdata(:,6)<gt_ign(gt_i,4)+gt_ign(gt_i,6),:) = []; end end resMat{ind} = resdata; % Sanity check frameIdPairs = resMat{ind}(:,1:2); [u,I,~] = unique(frameIdPairs, 'rows', 'first'); hasDuplicates = size(u,1) < size(frameIdPairs,1); if hasDuplicates ixDupRows = setdiff(1:size(frameIdPairs,1), I); dupFrameIdExample = frameIdPairs(ixDupRows(1),:); rows = find(ismember(frameIdPairs, dupFrameIdExample, 'rows')); errorMessage = sprintf('Invalid submission: Found duplicate ID/Frame pairs in sequence %s.\nInstance:\n', sequenceName); errorMessage = [errorMessage, sprintf('%10.2f', resMat{ind}(rows(1),:)), newline]; errorMessage = [errorMessage, sprintf('%10.2f', resMat{ind}(rows(2),:)), newline]; assert(~hasDuplicates, errorMessage); end % Evaluate sequence [metsCLEAR, mInf, additionalInfo] = CLEAR_MOT_HUN(gtMat{ind}, resMat{ind}, threshold, world); metsID = IDmeasures(gtMat{ind}, resMat{ind}, threshold, world); mets = [metsID.IDF1, metsID.IDP, metsID.IDR, metsCLEAR]; allMets(ind).name = sequenceName; allMets(ind).m = mets; allMets(ind).IDmeasures = metsID; allMets(ind).additionalInfo = additionalInfo; printMetrics(mets); fprintf('\n'); evalFile = fullfile(resDir, sprintf('eval_%s.txt',sequenceName)); dlmwrite(evalFile, mets); end % Overall scores metsBenchmark = evaluateBenchmark(allMets, world); fprintf('\n'); fprintf(' ********************* Your %s Results *********************\n', benchmark); printMetrics(metsBenchmark); evalFile = fullfile(resDir, 'eval.txt'); dlmwrite(evalFile, metsBenchmark);