73 lines
2.4 KiB
Mathematica
73 lines
2.4 KiB
Mathematica
|
%% 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
|