evaluation/UAV-benchmark-MOTD_v1.0/utils/preprocessResult.m (140 lines of code) (raw):
function resFileClean = preprocessResult(resFile, seqName, dataDir, force, minvis)
% reads submitted (raw) MOT16 result from .txt
% and removes all boxes that are associated with ambiguous annotations
% such as sitting people, cyclists or mannequins.
% Also removes partially occluded boxes if minvis>0
% resFile='/home/amilan/research/projects/bmtt-dev/code/bae/res/0001/ADL-Rundle-6.txt';
% seqName = 'MOT16-09';
% assert(cleanRequired(seqName),'preproccessing should only be done for MOT16/17')
if nargin<4, force=1; end
if nargin<5, minvis=0; end
% fprintf('Preprocessing (cleaning) %s...\n',seqName);
% if file does not exist, do nothing
if ~exist(resFile,'file')
fprintf('Results file does not exist\n');
resFileClean = [];
return;
end
[p,f,e]=fileparts(resFile);
cleanDir = [p,filesep,'clean'];
if ~exist(cleanDir, 'dir'), mkdir(cleanDir); end
resFileClean = [cleanDir,filesep,f,e];
% if clean file already exists and no need to redo, skip
if ~force && exist(resFileClean, 'file')
fprintf('skipping...\n');
return;
end
% if file empty, just copy it
tf = dir(resFile);
if tf.bytes == 0
fprintf('Results file empty\n');
copyfile(resFile,resFileClean);
return;
end
if nargin<3, dataDir = getDataDir; end
% [seqName, seqFolder, imgFolder, imgExt, F, dirImages] ...
% = getSeqInfo(seq, dataDir);
[seqName, seqFolder, imgFolder, frameRate, F, imWidth, imHeight, imgExt] ...
= getSeqInfoFromFile(seqName, dataDir);
% read in result
resRaw = dlmread(resFile);
%%
% read ground truth
gtFile = [dataDir,seqName,'_gt.txt'];
gtRaw = dlmread(gtFile);
% make sure we have MOT16 ground truth (= 9 columns)
% assert(size(gtRaw,2)==9, 'unknown GT format')
% define which classes should be ignored
distractors = {'person_on_vhcl','static_person','distractor','reflection'};
keepBoxes = true(size(resRaw,1),1);
showVis = 0;
td=0.5; % overlap threshold
for t=1:F
if ~mod(t,100), fprintf('.'); end
% find all result boxes in this frame
resInFrame = find(resRaw(:,1)==t); N = length(resInFrame);
resInFrame = reshape(resInFrame,1,N);
% find all GT boxes in frame
GTInFrame = find(gtRaw(:,1)==t); Ngt = length(GTInFrame);
GTInFrame = reshape(GTInFrame,1,Ngt);
% compute all overlaps for current frame
allisects=zeros(Ngt,N);
g=0;
for gg=GTInFrame
g=g+1; r=0;
bxgt=gtRaw(gg,3); bygt=gtRaw(gg,4); bwgt=gtRaw(gg,5); bhgt=gtRaw(gg,6);
for rr=resInFrame
r=r+1;
bxres=resRaw(rr,3); byres=resRaw(rr,4); bwres=resRaw(rr,5); bhres=resRaw(rr,6);
if bxgt+bwgt<bxres, continue; end % ignore if no horizontal overlap
if bxgt>bxres+bwres, continue; end
if bygt+bhgt<byres, continue; end % ignore if no vertical overlap
if bygt>byres+bhres, continue; end
allisects(g,r)=boxiou(bxgt,bygt,bwgt,bhgt,bxres,byres,bwres,bhres);
end
end
% t
tmpai=allisects;
tmpai=1-tmpai;
tmpai(tmpai>td)=Inf;
[Mtch,Cst]=Hungarian(tmpai);
[mGT,mRes]=find(Mtch);
% pause
nMtch = length(mGT);
% go through all matches
for m=1:nMtch
g=GTInFrame(mGT(m)); % gt box
gtClassID = gtRaw(g,8);
gtClassString = classIDToString(gtClassID);
% if we encounter a distractor, mark to remove box
if ismember(gtClassString, distractors)
r = resInFrame(mRes(m)); % result box
keepBoxes(r) = false;
if showVis
bxgt=gtRaw(g,3); bygt=gtRaw(g,4); bwgt=gtRaw(g,5); bhgt=gtRaw(g,6); idgt=gtRaw(g,2);
bxres=resRaw(r,3); byres=resRaw(r,4); bwres=resRaw(r,5); bhres=resRaw(r,6); idres=resRaw(r,2);
clf
im = imread(fullfile(dataDir,seqName,'img1',sprintf('%06d.jpg',t)));
imshow(im); hold on
text(50,50,sprintf('%d',t),'color','w')
% show GT box
% text(bxgt,bygt-20,sprintf('%d',idgt),'color','w')
classString = insertEscapeChars(classIDToString(gtClassID));
text(bxgt+50,bygt-20,sprintf('%s',classString),'color','w')
rectangle('Position',[bxgt,bygt,bwgt,bhgt],'EdgeColor','w');
% show Res box
% text(bxres,byres-20,sprintf('%d',idres),'color','y')
rectangle('Position',[bxres,byres,bwres,bhres],'EdgeColor','y');
pause(.01)
end
end
% if we encounter a partially occluded box, mark to remove
if gtRaw(g,9)<minvis
r = resInFrame(mRes(m)); % result box
keepBoxes(r) = false;
if showVis
bxgt=gtRaw(g,3); bygt=gtRaw(g,4); bwgt=gtRaw(g,5); bhgt=gtRaw(g,6); idgt=gtRaw(g,2);
bxres=resRaw(r,3); byres=resRaw(r,4); bwres=resRaw(r,5); bhres=resRaw(r,6); idres=resRaw(r,2);
clf
im = imread(fullfile(dataDir,seqName,'img1',sprintf('%06d.jpg',t)));
imshow(im); hold on
text(50,50,sprintf('%d',t),'color','w')
% show GT box
text(bxgt+50,bygt-20,sprintf('vis %.1f',gtRaw(g,9)*100),'color','w')
rectangle('Position',[bxgt,bygt,bwgt,bhgt],'EdgeColor','w');
% show Res box
% text(bxres,byres-20,sprintf('%d',idres),'color','y')
rectangle('Position',[bxres,byres,bwres,bhres],'EdgeColor','y');
pause(.01)
pause
end
end
end
end
%%
% fprintf('\nRemoving %d boxes from solution...\n',numel(find(~keepBoxes)));
resNew = resRaw;
resNew=resNew(keepBoxes,:);
%% write new file into new dir (clean)
dlmwrite(resFileClean, resNew);
% end