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

function [mme, c, fp, m, g, d, ious, alltracked, allfalsepos, M] = clearMOTLoopMatlab(gtInfo, stateInfo, options) gtInd=~~gtInfo.W; stInd=~~stateInfo.W; [Fgt, Ngt]=size(gtInfo.X); [F, N]=size(stateInfo.X); F = Fgt; % mapping M=zeros(F,Ngt); M=sparse(M); mme=zeros(1,F); % ID Switchtes (mismatches) c=zeros(1,F); % matches found fp=zeros(1,F); % false positives m=zeros(1,F); % misses = false negatives g=zeros(1,F); d=zeros(F,Ngt); % all distances; ious=Inf*ones(F,Ngt); % all overlaps matched=@matched2d; if options.eval3d, matched=@matched3d; end td = options.td; alltracked=zeros(F,Ngt); allfalsepos=zeros(F,N); for t=1:F g(t)=numel(find(gtInd(t,:))); % mapping for current frame if t>1 mappings=find(M(t-1,:)); for map=mappings if gtInd(t,map) && stInd(t,M(t-1,map)) && matched(gtInfo,stateInfo,t,map,M(t-1,map),td) M(t,map)=M(t-1,map); if options.VERBOSE fprintf('%d: preserve %d\n', t, map); end end end end GTsNotMapped=find(~M(t,:) & gtInd(t,:)); EsNotMapped=setdiff(find(stInd(t,:)),M(t,:)); % reshape to ensure horizontal vector in empty case EsNotMapped=reshape(EsNotMapped,1,length(EsNotMapped)); GTsNotMapped=reshape(GTsNotMapped,1,length(GTsNotMapped)); if options.eval3d alldist=Inf*ones(Ngt,N); uid = 0; % unique identifier to break ties for o=GTsNotMapped GT=[gtInfo.Xgp(t,o) gtInfo.Ygp(t,o)]; for e=EsNotMapped E=[stateInfo.Xgp(t,e) stateInfo.Ygp(t,e)]; alldist(o,e)=norm(GT-E); if alldist(o,e) > td alldist(o,e) = 1e8; else alldist(o,e) = alldist(o,e) + 1e-9 * uid; uid = uid + 1; end end end tmpai = alldist; tmpai_compact = tmpai(GTsNotMapped, EsNotMapped); [Mtch,Cst]=MinCostMatching(tmpai_compact); [u,v]=find(Mtch); [u, iu] = sort(u); v = v(iu); u = GTsNotMapped(u); v = EsNotMapped(v); for mmm=1:length(u) if tmpai(u(mmm),v(mmm)) == 1e8 continue; end M(t,u(mmm))=v(mmm); if options.VERBOSE fprintf('%d: map %d with %d\n', t, u(mmm), v(mmm)); end end % while mindist < td && numel(GTsNotMapped)>0 && numel(EsNotMapped)>0 % for o=GTsNotMapped % GT=[gtInfo.Xgp(t,o) gtInfo.Ygp(t,o)]; % for e=EsNotMapped % E=[stateInfo.Xgp(t,e) stateInfo.Ygp(t,e)]; % alldist(o,e)=norm(GT-E); % end % end % % [mindist cind]=min(alldist(:)); % % if mindist <= td % [u v]=ind2sub(size(alldist),cind); % M(t,u)=v; % alldist(:,v)=Inf; % GTsNotMapped=find(~M(t,:) & gtInd(t,:)); % EsNotMapped=setdiff(find(stInd(t,:)),M(t,:)); % end % end else allisects=zeros(Ngt,N); tmpai = Inf * ones(size(allisects)); uid = 0; for o=GTsNotMapped GT=[gtInfo.X(t,o)-gtInfo.W(t,o)/2 ... gtInfo.Y(t,o)-gtInfo.H(t,o) ... gtInfo.W(t,o) gtInfo.H(t,o) ]; for e=EsNotMapped E=[stateInfo.Xi(t,e)-stateInfo.W(t,e)/2 ... stateInfo.Yi(t,e)-stateInfo.H(t,e) ... stateInfo.W(t,e) stateInfo.H(t,e) ]; allisects(o,e)= boxiou(GT(1),GT(2),GT(3),GT(4),E(1),E(2),E(3),E(4)); tmpai(o,e) = 1 - allisects(o,e); if tmpai(o,e) > td tmpai(o,e) = 1e8; else tmpai(o,e) = tmpai(o,e) + 1e-9 * uid; uid = uid + 1; end end end if options.VERBOSE fprintf('%d: UnmappedGTs: ', t); for i = 1:length(GTsNotMapped) fprintf('%d, ', GTsNotMapped(i)); end fprintf('\n%d: UnmappedEs: ', t); for i = 1:length(EsNotMapped) fprintf('%d, ', EsNotMapped(i)); end fprintf('\n'); end tmpai_compact = tmpai(GTsNotMapped, EsNotMapped); [Mtch,Cst]=MinCostMatching(tmpai_compact); [u,v]=find(Mtch); [u, iu] = sort(u); v = v(iu); u = GTsNotMapped(u); v = EsNotMapped(v); for mmm=1:length(u) if tmpai(u(mmm),v(mmm)) == 1e8 continue; end M(t,u(mmm))=v(mmm); if options.VERBOSE fprintf('%d: map %d with %d\n', t, u(mmm), v(mmm)); end end % GTsNotMapped=find(~M(t,:) & gtInd(t,:)); % EsNotMapped=setdiff(find(stInd(t,:)),M(t,:)); % while maxisect > td && numel(GTsNotMapped)>0 && numel(EsNotMapped)>0 % % for o=GTsNotMapped % GT=[gtInfo.X(t,o)-gtInfo.W(t,o)/2 ... % gtInfo.Y(t,o)-gtInfo.H(t,o) ... % gtInfo.W(t,o) gtInfo.H(t,o) ]; % for e=EsNotMapped % E=[stateInfo.Xi(t,e)-stateInfo.W(t,e)/2 ... % stateInfo.Yi(t,e)-stateInfo.H(t,e) ... % stateInfo.W(t,e) stateInfo.H(t,e) ]; % allisects(o,e)=boxiou(GT(1),GT(2),GT(3),GT(4),E(1),E(2),E(3),E(4)); % end % end % % [maxisect, cind]=max(allisects(:)); % % if maxisect >= td % [u, v]=ind2sub(size(allisects),cind); % M(t,u)=v; % allisects(:,v)=0; % GTsNotMapped=find(~M(t,:) & gtInd(t,:)); % EsNotMapped=setdiff(find(stInd(t,:)),M(t,:)); % end % % end end curtracked=find(M(t,:)); alltrackers=find(stInd(t,:)); mappedtrackers=intersect(M(t,find(M(t,:))),alltrackers); falsepositives=setdiff(alltrackers,mappedtrackers); alltracked(t,:)=M(t,:); % allfalsepos(t,1:length(falsepositives))=falsepositives; allfalsepos(t,falsepositives)=falsepositives; %% mismatch errors if t>1 for ct=curtracked lastnotempty=find(M(1:t-1,ct),1,'last'); if gtInd(t-1,ct) && ~isempty(lastnotempty) && M(t,ct)~=M(lastnotempty,ct) mme(t)=mme(t)+1; end end end c(t)=numel(curtracked); for ct=curtracked eid=M(t,ct); if options.eval3d d(t,ct)=norm([gtInfo.Xgp(t,ct) gtInfo.Ygp(t,ct)] - ... [stateInfo.Xgp(t,eid) stateInfo.Ygp(t,eid)]); else gtLeft=gtInfo.X(t,ct)-gtInfo.W(t,ct)/2; gtTop=gtInfo.Y(t,ct)-gtInfo.H(t,ct); gtWidth=gtInfo.W(t,ct); gtHeight=gtInfo.H(t,ct); stLeft=stateInfo.Xi(t,eid)-stateInfo.W(t,eid)/2; stTop=stateInfo.Yi(t,eid)-stateInfo.H(t,eid); stWidth=stateInfo.W(t,eid); stHeight=stateInfo.H(t,eid); ious(t,ct)=boxiou(gtLeft,gtTop,gtWidth,gtHeight,stLeft,stTop,stWidth,stHeight); end end fp(t)=numel(find(stInd(t,:)))-c(t); m(t)=g(t)-c(t); end % if ~options.eval3d d = max(0,1-ious); end end function ret=matched2d(gtInfo,stateInfo,t,map,mID,td) gtLeft=gtInfo.X(t,map)-gtInfo.W(t,map)/2; gtTop=gtInfo.Y(t,map)-gtInfo.H(t,map); gtWidth=gtInfo.W(t,map); gtHeight=gtInfo.H(t,map); stLeft=stateInfo.Xi(t,mID)-stateInfo.W(t,mID)/2; stTop=stateInfo.Yi(t,mID)-stateInfo.H(t,mID); stWidth=stateInfo.W(t,mID); stHeight=stateInfo.H(t,mID); ret = boxiou(gtLeft,gtTop,gtWidth,gtHeight,stLeft,stTop,stWidth,stHeight) >= td; end function ret=matched3d(gtInfo,stateInfo,t,map,mID,td) Xgt=gtInfo.Xgp(t,map); Ygt=gtInfo.Ygp(t,map); X=stateInfo.Xgp(t,mID); Y=stateInfo.Ygp(t,mID); ret=norm([Xgt Ygt]-[X Y])<=td; end