sustaining_gazes/matlab_version/bounding_box_mapping/workout_window_size.m

73 lines
2.4 KiB
Matlab

%% Work out the eye scaling first using the PDM
addpath('../PDM_helpers/');
% also work out a size for each window
% Replace this with the location of in 300 faces in the wild data
if(exist([getenv('USERPROFILE') '/Dropbox/AAM/test data/'], 'file'))
root_test_data = [getenv('USERPROFILE') '/Dropbox/AAM/test data/'];
else
root_test_data = 'F:/Dropbox/Dropbox/AAM/test data/';
end
[~, detections, labels] = Collect_wild_imgs(root_test_data, true, true, true, true);
% load('../models/pdm/pdm_68_multi_pie');
load('../models/pdm/pdm_68_aligned_wild');
%%
shapes = zeros(size(labels));
num_points = 68;
for i=1:size(labels,1)
[ a_orig, R, ~, ~, ~, ~] = fit_PDM_ortho_proj_to_2D(M, E, V, squeeze(labels(i,:,:)));
view_actual = Rot2Euler(R);
views = [0,0,0; 0,-30,0; -30,0,0; 0,30,0; 30,0,0];
views = views * pi/180;
[~,view_id] = min(sum(abs(bsxfun(@plus, views, -view_actual)), 2));
rot = Euler2Rot(views(view_id,:));
rot_m = rot * reshape(M, num_points, 3)';
width_model = max(rot_m(1,:)) - min(rot_m(1,:));
height_model = max(rot_m(2,:)) - min(rot_m(2,:));
bounding_box = detections(i,:);
a = (((bounding_box(3) - bounding_box(1)) / width_model) + ((bounding_box(4) - bounding_box(2))/ height_model)) / 2;
tx = (bounding_box(3) + bounding_box(1))/2;
ty = (bounding_box(4) + bounding_box(2))/2;
% correct it so that the bounding box is just around the minimum
% and maximum point in the initialised face
tx = tx - a*(min(rot_m(1,:)) + max(rot_m(1,:)))/2;
ty = ty - a*(min(rot_m(2,:)) + max(rot_m(2,:)))/2;
% visualisation of the initial state
%hold off;imshow(Image);hold on;plot(a*rot_m(1,:)+tx, a*rot_m(2,:)+ty,'.r');hold on;rectangle('Position', [bounding_box(1), bounding_box(2), bounding_box(3)-bounding_box(1), bounding_box(4)-bounding_box(2)]);
global_params = [a, 0, 0, 0, tx, ty]';
global_params(2:4) = views(view_id);
local_params = zeros(numel(E), 1);
shape = GetShapeOrtho(M, V, local_params, global_params);
shape = shape(:,1:2);
shapes(i,:,:) = shape;
shapes(i,:,:) = shapes(i,:,:) / a_orig;
labels(i,:,:) = labels(i,:,:) / a_orig;
end
%%
errs_img = sort(squeeze(mean(mean(abs(labels - shapes), 2), 3)));
errs_lmk = squeeze(mean(mean(abs(labels - shapes), 1), 3));
errs_img_95 = errs_img(round(0.95*end));
scales = [0.25, 0.35, 0.5];
windows = floor(errs_img_95 * 2 * scales + 11) + 1