evaluation/UAV-benchmark-MOTD_v1.0/utils/costFunction.m (43 lines of code) (raw):

function [cost, fp, fn] = costFunction( tr1, tr2, THRESHOLD, world ) frames_gt = tr1(:,2); frames_pred = tr2(:,2); % If trajectories don't overlap in time then return cost or inf overlapTest = (frames_gt(1) >= frames_pred(1) && frames_gt(1) < frames_pred(end)) || ... (frames_gt(end) >= frames_pred(1) && frames_gt(end) <= frames_pred(end)) || ... (frames_pred(1) >= frames_gt(1) && frames_pred(1) <= frames_gt(end)) || ... (frames_pred(end) >= frames_gt(1) && frames_pred(end) <= frames_gt(end)); if ~overlapTest fp = length(frames_pred); fn = length(frames_gt); cost = fp + fn; return; end [isfoundGT, posGT] = ismember_mex(frames_gt, frames_pred); [isfoundPred, posPred] = ismember_mex(frames_pred, frames_gt); % Use points at infinity when no match exists columns = [7,8]; if ~world columns = [3 4 5 6]; end % Ground truth data and the corresponding data from the prediction pointsGT = tr1(isfoundGT, columns); pointsGTPred = tr2(posGT(isfoundGT),columns); % Prediction data and the corresponding data from ground truth pointsPred = tr2(isfoundPred, columns); pointsPredGT = tr1(posPred(isfoundPred),columns); unmatchedGT = sum(isfoundGT==0); unmatchedPred = sum(isfoundPred==0); distanceGTvsPred = distanceFunction(pointsGT, pointsGTPred, world); distancePredvsGT = distanceFunction(pointsPred, pointsPredGT, world); if world % Euclidean distance test fn = unmatchedGT + sum( distanceGTvsPred > THRESHOLD ); fp = unmatchedPred + sum( distancePredvsGT > THRESHOLD ); else % IntersectionOverUnion test fn = unmatchedGT + sum( distanceGTvsPred < THRESHOLD ); fp = unmatchedPred + sum( distancePredvsGT < THRESHOLD ); end cost = fp + fn; % Sanity check tp1 = length(frames_gt) - fn; tp2 = length(frames_pred) - fp; assert(tp1 == tp2, 'Something is wrong in the input. Make sure there are no duplicate frames...'); end function distance = distanceFunction(point1, point2, world) if world % Euclidean distance distance = sqrt(sum(abs(point1 - point2).^2,2)); else % Intersection_over_union box1 = point1; box2 = point2; area1 = box1(:,3) .* box1(:,4); area2 = box2(:,3) .* box2(:,4); l1 = box1(:,1); r1 = box1(:,1) + box1(:,3); t1 = box1(:,2); b1 = box1(:,2) + box1(:,4); l2 = box2(:,1); r2 = box2(:,1) + box2(:,3); t2 = box2(:,2); b2 = box2(:,2) + box2(:,4); x_overlap = max(0, min(r1,r2) - max(l1,l2)); y_overlap = max(0, min(b1,b2) - max(t1,t2)); intersectionArea = x_overlap .* y_overlap; unionArea = area1 + area2 - intersectionArea; iou = intersectionArea ./ unionArea; distance = iou; end end