62 lines
2.3 KiB
Matlab
62 lines
2.3 KiB
Matlab
function [ bboxes, shapes ] = detect_faces( image, types )
|
|
%DETECT_FACES Detecting faces in a given image using one of the three detectors
|
|
% INPUT:
|
|
% image - the image to detect the faces on
|
|
% type - cell array of the face detectors to use: 'zhu', 'yu', 'cascade'
|
|
% OUTPUT:
|
|
% bboxes - a set of bounding boxes describing the detected faces 4 x
|
|
% num_faces, the format is [min_x; min_y; max_x; max_y];
|
|
% shapes - if the face detector detects landmarks as well, output them
|
|
% n_points x 2 x num_faces
|
|
|
|
use_zhu = any(strcmp('zhu', types));
|
|
use_yu = any(strcmp('yu', types));
|
|
use_cascade = any(strcmp('cascade', types));
|
|
|
|
% Start with fastest one
|
|
shapes = [];
|
|
bboxes = [];
|
|
|
|
if(use_cascade)
|
|
% Check if vision toolbox is available
|
|
if(~isempty(ver('vision')))
|
|
face_detector = vision.CascadeObjectDetector();
|
|
bboxes_det = step(face_detector, image);
|
|
if(~isempty(bboxes_det))
|
|
|
|
% Convert to the right format
|
|
bboxes = bboxes_det';
|
|
|
|
% Correct the bounding box to be around face outline
|
|
% horizontally and from brows to chin vertically
|
|
% The scalings were learned using the Face Detections on LFPW, Helen, AFW and iBUG datasets
|
|
% using ground truth and detections from openCV
|
|
|
|
% Correct the widths
|
|
bboxes(3,:) = bboxes(3,:) * 0.8534;
|
|
bboxes(4,:) = bboxes(4,:) * 0.8972;
|
|
|
|
% Correct the location
|
|
bboxes(1,:) = bboxes(1,:) + bboxes_det(:,3)'*0.0266;
|
|
bboxes(2,:) = bboxes(2,:) + bboxes_det(:,4)'*0.1884;
|
|
|
|
bboxes(3,:) = bboxes(1,:) + bboxes(3,:);
|
|
bboxes(4,:) = bboxes(2,:) + bboxes(4,:);
|
|
end
|
|
else
|
|
fprintf('Vision toolbox not present in Matlab, it is necessary for Cascade face detection\n');
|
|
end
|
|
end
|
|
|
|
if(use_yu && isempty(bboxes))
|
|
od = cd('../face_detection/face_detection_yu/');
|
|
[bboxes, shapes] = Detect_tree_based_yu_multi(image);
|
|
cd(od);
|
|
end
|
|
|
|
if(use_zhu && isempty(bboxes))
|
|
[bboxes, shapes] = Detect_tree_based_zhu(image);
|
|
end
|
|
|
|
end
|
|
|