Files
OpenFace/model_training/bounding_box_mapping/learn_mapping_mtcnn_menpo.m

86 lines
2.3 KiB
Matlab

load('menpo_mtcnn.mat')
% Find the ground truth bboxes
bboxes_gt = bboxes;
bboxes_det = dets;
non_detected = bboxes_det(:,3) == 0;
% Removing the outliers
widths_gt = bboxes_gt(:,3) - bboxes_gt(:,1);
widths_det = bboxes_det(:,3) - bboxes_det(:,1);
heights_gt = bboxes_gt(:,4) - bboxes_gt(:,2);
heights_det = bboxes_det(:,4) - bboxes_det(:,2);
tx_gt = bboxes_gt(:,1);
ty_gt = bboxes_gt(:,2);
tx_det = bboxes_det(:,1);
ty_det = bboxes_det(:,2);
bad_det_1 = abs(1 - widths_gt ./ widths_det) > 0.5;
bad_det_2 = abs(1 - heights_gt ./ heights_det) > 0.5;
bad_det_3 = abs((tx_gt - tx_det) ./ widths_det) > 0.4;
bad_det_4 = abs((ty_gt - ty_det) ./ heights_det) > 0.5;
non_detected = non_detected | bad_det_1 | bad_det_2 | bad_det_3 | bad_det_4;
% if the width is quite different from detection then it failed
bboxes_gt = bboxes_gt(~non_detected,:);
bboxes_det = bboxes_det(~non_detected,:);
%% some visualisations
% a = 1;
% plot(gt_labels(a,:,1), gt_labels(a,:,2), '.r');
% hold on;
% bbox = bboxes_detector(a,:);
% % bbox(2) = -bbox(2);
% rectangle('Position', bbox);
% hold off;
% axis equal;
% Want to find out what scaling and translation would lead to the smallest
% RMSE error between initialised landmarks and gt landmarks TODO
% Find the width and height mappings
widths_gt = bboxes_gt(:,3) - bboxes_gt(:,1);
widths_det = bboxes_det(:,3) - bboxes_det(:,1);
heights_gt = bboxes_gt(:,4) - bboxes_gt(:,2);
heights_det = bboxes_det(:,4) - bboxes_det(:,2);
s_width = widths_det \ widths_gt;
s_height = heights_det \ heights_gt;
tx_gt = bboxes_gt(:,1);
ty_gt = bboxes_gt(:,2);
tx_det = bboxes_det(:,1);
ty_det = bboxes_det(:,2);
s_tx = median((tx_gt - tx_det) ./ widths_det);
s_ty = median((ty_gt - ty_det) ./ heights_det);
%%
new_widths = widths_det * s_width;
new_heights = heights_det * s_height;
new_tx = widths_det * s_tx + tx_det;
new_ty = heights_det * s_ty + ty_det;
overlaps = zeros(numel(widths_det), 1);
new_overlaps = zeros(numel(widths_det), 1);
for i=1:numel(widths_det)
bbox_gt = bboxes_gt(i,:);
bbox_old = bboxes_det(i,:);
overlaps(i) = overlap(bbox_gt, bbox_old);
bbox_new = [new_tx(i), new_ty(i), new_tx(i) + new_widths(i), new_ty(i) + new_heights(i)];
new_overlaps(i) = overlap(bbox_gt, bbox_new);
end
fprintf('Orig - %.3f, now - %.3f\n', mean(overlaps), mean(new_overlaps));