2017-01-04 23:32:38 +01:00
|
|
|
function [ err_outline, err_no_outline ] = Run_OF_on_images(output_loc, database_root, varargin)
|
2016-04-28 21:40:36 +02:00
|
|
|
|
|
|
|
dataset_dirs = {};
|
|
|
|
|
|
|
|
if(any(strcmp(varargin, 'use_afw')))
|
|
|
|
afw_loc = [database_root '/AFW/'];
|
|
|
|
dataset_dirs = cat(1, dataset_dirs, afw_loc);
|
|
|
|
end
|
|
|
|
if(any(strcmp(varargin, 'use_lfpw')))
|
|
|
|
lfpw_loc = [database_root 'lfpw/testset/'];
|
|
|
|
dataset_dirs = cat(1, dataset_dirs, lfpw_loc);
|
|
|
|
end
|
|
|
|
if(any(strcmp(varargin, 'use_ibug')))
|
|
|
|
ibug_loc = [database_root 'ibug/'];
|
|
|
|
dataset_dirs = cat(1, dataset_dirs, ibug_loc);
|
|
|
|
end
|
|
|
|
if(any(strcmp(varargin, 'use_helen')))
|
|
|
|
helen_loc = [database_root '/helen/testset/'];
|
|
|
|
dataset_dirs = cat(1, dataset_dirs, helen_loc);
|
|
|
|
end
|
|
|
|
|
|
|
|
if(any(strcmp(varargin, 'verbose')))
|
|
|
|
verbose = true;
|
|
|
|
else
|
|
|
|
verbose = false;
|
|
|
|
end
|
|
|
|
|
2017-01-04 23:32:38 +01:00
|
|
|
if(isunix)
|
2017-11-18 22:08:43 +01:00
|
|
|
executable = '"../../build/bin/FaceLandmarkImg"';
|
2017-01-04 23:32:38 +01:00
|
|
|
else
|
2017-11-18 22:08:43 +01:00
|
|
|
executable = '"../../x64/Release/FaceLandmarkImg.exe"';
|
2017-01-04 23:32:38 +01:00
|
|
|
end
|
|
|
|
|
2016-04-28 21:40:36 +02:00
|
|
|
if(any(strcmp(varargin, 'model')))
|
|
|
|
model = varargin{find(strcmp(varargin, 'model')) + 1};
|
|
|
|
else
|
|
|
|
% the default model is the 68 point in the wild one
|
|
|
|
model = '"model/main_wild.txt"';
|
|
|
|
end
|
|
|
|
|
|
|
|
if(any(strcmp(varargin, 'multi_view')))
|
|
|
|
multi_view = varargin{find(strcmp(varargin, 'multi_view')) + 1};
|
|
|
|
else
|
|
|
|
multi_view = 0;
|
|
|
|
end
|
|
|
|
|
2017-12-18 13:17:53 +01:00
|
|
|
command = sprintf('%s -mloc %s -multi_view %s -2Dfp ', executable, model, num2str(multi_view));
|
2017-11-18 22:08:43 +01:00
|
|
|
|
|
|
|
tic
|
2017-12-18 13:17:53 +01:00
|
|
|
for i=1:numel(dataset_dirs)
|
2016-04-28 21:40:36 +02:00
|
|
|
|
2017-11-18 22:08:43 +01:00
|
|
|
command_c = sprintf('%s -fdir "%s" -bboxdir "%s" -out_dir "%s" -wild ',...
|
|
|
|
command, dataset_dirs{i}, dataset_dirs{i}, output_loc);
|
2016-04-28 21:40:36 +02:00
|
|
|
|
2017-01-04 23:32:38 +01:00
|
|
|
if(isunix)
|
|
|
|
unix(command_c, '-echo');
|
|
|
|
else
|
|
|
|
dos(command_c);
|
|
|
|
end
|
2017-11-24 21:11:45 +01:00
|
|
|
|
2016-04-28 21:40:36 +02:00
|
|
|
end
|
|
|
|
toc
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
% Extract the error sizes
|
|
|
|
dirs = {[database_root '/AFW/'];
|
|
|
|
[database_root '/ibug/'];
|
|
|
|
[database_root '/helen/testset/'];
|
|
|
|
[database_root 'lfpw/testset/'];};
|
|
|
|
|
2017-11-22 21:21:59 +01:00
|
|
|
landmark_dets = dir([output_loc '/*.csv']);
|
2016-04-28 21:40:36 +02:00
|
|
|
|
|
|
|
landmark_det_dir = [output_loc '/'];
|
|
|
|
|
|
|
|
num_imgs = size(landmark_dets,1);
|
|
|
|
|
|
|
|
labels = zeros(68,2,num_imgs);
|
|
|
|
|
|
|
|
shapes = zeros(68,2,num_imgs);
|
|
|
|
|
|
|
|
curr = 0;
|
|
|
|
|
2017-11-24 08:47:50 +01:00
|
|
|
% work out which columns in the csv file are relevant
|
|
|
|
tab = readtable([landmark_det_dir, landmark_dets(1).name]);
|
|
|
|
column_names = tab.Properties.VariableNames;
|
|
|
|
landmark_inds_x = cellfun(@(x) ~isempty(x) && x==1, strfind(column_names, 'x_'));
|
|
|
|
landmark_inds_y = cellfun(@(x) ~isempty(x) && x==1, strfind(column_names, 'y_'));
|
|
|
|
|
2016-04-28 21:40:36 +02:00
|
|
|
for i=1:numel(dirs)
|
|
|
|
|
|
|
|
|
2017-11-22 21:21:59 +01:00
|
|
|
gt_labels = dir([dirs{i}, '*.pts']);
|
2016-04-28 21:40:36 +02:00
|
|
|
|
|
|
|
for g=1:numel(gt_labels)
|
|
|
|
curr = curr+1;
|
|
|
|
|
|
|
|
gt_landmarks = dlmread([dirs{i}, gt_labels(g).name], ' ', 'A4..B71');
|
2017-11-24 22:31:41 +01:00
|
|
|
[~, name, ~] = fileparts(gt_labels(g).name);
|
2016-04-28 21:40:36 +02:00
|
|
|
% find the corresponding detection
|
2017-11-24 21:11:45 +01:00
|
|
|
all_params = dlmread([landmark_det_dir, name, '.csv'], ',', 1, 0);
|
2017-11-24 08:47:50 +01:00
|
|
|
|
|
|
|
landmark_det = [all_params(landmark_inds_x); all_params(landmark_inds_y)]';
|
2016-04-28 21:40:36 +02:00
|
|
|
|
|
|
|
labels(:,:,curr) = gt_landmarks;
|
|
|
|
|
|
|
|
if(size(landmark_det,1) == 66)
|
|
|
|
inds_66 = [[1:60],[62:64],[66:68]];
|
|
|
|
shapes(inds_66,:,curr) = landmark_det;
|
|
|
|
else
|
|
|
|
shapes(:,:,curr) = landmark_det;
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
% Convert to correct format, so as to have same feature points in ground
|
|
|
|
% truth and detections
|
|
|
|
if(size(shapes,2) == 66 && size(labels,2) == 68)
|
|
|
|
inds_66 = [[1:60],[62:64],[66:68]];
|
|
|
|
|
|
|
|
labels = labels(inds_66,:,:);
|
|
|
|
shapes = shapes(inds_66,:,:);
|
|
|
|
end
|
|
|
|
|
2017-11-24 22:31:41 +01:00
|
|
|
% Center the pixel, and convert to OCV format
|
|
|
|
labels = labels - 1.5;
|
2016-04-28 21:40:36 +02:00
|
|
|
|
|
|
|
err_outline = compute_error(labels, shapes);
|
|
|
|
|
|
|
|
labels_no_out = labels(18:end,:,:);
|
|
|
|
shapes_no_out = shapes(18:end,:,:);
|
|
|
|
|
|
|
|
err_no_outline = compute_error(labels_no_out, shapes_no_out);
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
save([output_loc, 'res.mat'], 'labels', 'shapes', 'err_outline', 'err_no_outline');
|
|
|
|
|
|
|
|
end
|