evaluation/UAV-benchmark-MOTD_v1.0/utils/IDmeasures.m (85 lines of code) (raw):
% Tracking Performance Measures as described in the paper:
%
% Performance Measures and a Data Set for Multi-Target, Multi-Camera Tracking.
% E. Ristani, F. Solera, R. S. Zou, R. Cucchiara and C. Tomasi.
% ECCV 2016 Workshop on Benchmarking Multi-Target Tracking.
%
% Ergys Ristani
% Duke University 2016
function [measures] = IDmeasures( groundTruthMat, predictionMat, threshold, world )
% Input:
% groundTruthMat - frame, ID, left, top, width, height, worldX, worldY
% predictionMat - frame, ID, left, top, width, height, worldX, worldY
% threshold - Ground plane distance (1m) or intersection_over_union
% world - boolean paramenter determining if the evaluation is
% done in the world ground plane or in the image plane
% Convert input trajectories from .top format to cell arrays. Each cell has
% data for one identity.
idsPred = unique(predictionMat(:,2));
idsGT = unique(groundTruthMat(:,2));
ground_truth = cell(length(idsGT),1);
prediction = cell(length(idsPred),1);
for i = 1:length(idsGT)
ground_truth{i} = groundTruthMat(groundTruthMat(:,2) == idsGT(i),:);
end
for i = 1:length(idsPred)
prediction{i} = predictionMat(predictionMat(:,2) == idsPred(i),:);
end
% Initialize cost matrix blocks
cost = zeros(length(prediction) + length(ground_truth));
cost( length(ground_truth) + 1:end, 1:length(prediction)) = inf;
cost( 1:length(ground_truth), length(prediction) + 1 : end) = inf;
fp = zeros(size(cost));
fn = zeros(size(cost));
% Compute cost block
[costBlock, fpBlock, fnBlock] = costBlockMex(ground_truth, prediction, threshold, world);
% for i = 1:length(ground_truth)
% for j = 1:length(prediction)
% [cost(i,j), fp(i,j), fn(i,j)] = costFunction(ground_truth{i}, prediction{j}, threshold, world);
% end
% end
cost(1:size(costBlock,1),1:size(costBlock,2)) = costBlock;
fp(1:size(costBlock,1),1:size(costBlock,2)) = fpBlock;
fn(1:size(costBlock,1),1:size(costBlock,2)) = fnBlock;
% Compute FP block
for i = 1:length(prediction)
cost(i+length(ground_truth),i) = size(prediction{i},1);
fp(i+length(ground_truth),i) = size(prediction{i},1);
end
% Compute FN block
for i = 1:length(ground_truth)
cost(i,i+length(prediction)) = size(ground_truth{i},1);
fn(i,i+length(prediction)) = size(ground_truth{i},1);
end
% Solve truth-to-result identity matching
[optimalMatch, totalCost] = MinCostMatching(cost);
for i = 1:size(optimalMatch,1)
assignment(i) = find(optimalMatch(i,:));
end
% For visualization
% solutionMatrix = zeros(size(cost));
% for i = 1:length(assignment), solutionMatrix(i,assignment(i)) = 1; end
numGT = sum(cellfun(@(x) size(x,1), ground_truth));
numPRED = sum(cellfun(@(x) size(x,1), prediction));
% Count assignment errors
IDFP = 0;
IDFN = 0;
for i = 1:length(assignment)
IDFP = IDFP + fp(i,assignment(i));
IDFN = IDFN + fn(i,assignment(i));
end
IDTP = numGT - IDFN;
% Sanity check
assert(IDTP == numPRED - IDFP);
IDPrecision = IDTP / (IDTP + IDFP);
if numPRED == 0, IDPrecision = 0; end
IDRecall = IDTP / (IDTP + IDFN);
IDF1 = 2*IDTP/(numGT + numPRED);
measures.IDP = IDPrecision * 100;
measures.IDR = IDRecall * 100;
measures.IDF1 = IDF1 * 100;
measures.numGT = numGT;
measures.numPRED = numPRED;
measures.IDTP = IDTP;
measures.IDFP = IDFP;
measures.IDFN = IDFN;