67 lines
2.2 KiB
Matlab
67 lines
2.2 KiB
Matlab
function [ error_per_image ] = compute_mouth_error( ground_truth_all, detected_points_all, occluded )
|
|
%compute_error
|
|
% compute the average point-to-point Euclidean error of right eye normalized by the
|
|
% inter-ocular distance (measured as the Euclidean distance between the
|
|
% outer corners of the eyes)
|
|
%
|
|
% Inputs:
|
|
% grounth_truth_all, size: num_of_points x 2 x num_of_images
|
|
% detected_points_all, size: num_of_points x 2 x num_of_images
|
|
% Output:
|
|
% error_per_image, size: num_of_images x 1
|
|
|
|
mouth_inds_from_68 = 49:68;
|
|
mouth_inds_from_49 = 30:49;
|
|
|
|
mouth_inds_from_66 = 49:66;
|
|
|
|
mouth_inds_from_20 = [1:12, 14:16, 18:20];
|
|
|
|
num_of_images = size(ground_truth_all,3);
|
|
|
|
num_points_gt = size(ground_truth_all,1);
|
|
|
|
num_points_det = size(detected_points_all,1);
|
|
|
|
error_per_image = zeros(num_of_images,1);
|
|
|
|
for i =1:num_of_images
|
|
|
|
if(num_points_det == 20)
|
|
detected_points = detected_points_all(:,:,i);
|
|
elseif(num_points_det == 68)
|
|
detected_points = detected_points_all(mouth_inds_from_68,:,i);
|
|
elseif(num_points_det == 66)
|
|
detected_points = detected_points_all(mouth_inds_from_66,:,i);
|
|
elseif(num_points_det == 49)
|
|
detected_points = detected_points_all(mouth_inds_from_49,:,i);
|
|
end
|
|
|
|
ground_truth_points = ground_truth_all(:,:,i);
|
|
|
|
if(num_points_gt == 66 || num_points_gt == 68)
|
|
interocular_distance = norm(ground_truth_points(37,:)-ground_truth_points(46,:));
|
|
ground_truth_points = ground_truth_points(mouth_inds_from_68,:,:);
|
|
else
|
|
interocular_distance = norm(ground_truth_points(37-17,:)-ground_truth_points(46-17,:));
|
|
ground_truth_points = ground_truth_points(mouth_inds_from_68,:,:);
|
|
end
|
|
|
|
if(size(detected_points,1) == 18 && size(ground_truth_points,1) == 20)
|
|
ground_truth_points = ground_truth_points(mouth_inds_from_20,:);
|
|
end
|
|
sum=0;
|
|
|
|
for j=1:size(detected_points,1)
|
|
sum = sum+norm(detected_points(j,:)-ground_truth_points(j,:));
|
|
end
|
|
|
|
error_per_image(i) = sum/(size(detected_points,1)*interocular_distance);
|
|
end
|
|
|
|
if(nargin > 2)
|
|
error_per_image = error_per_image(~occluded);
|
|
end
|
|
|
|
end
|