-
Laurent EL SHAFEY authoredLaurent EL SHAFEY authored
__init__.py 3.62 KiB
from . import _flandmark
from pkg_resources import resource_filename
def __filename__(f):
"""Returns the test file on the "data" subdirectory"""
return resource_filename(__name__, f)
class Localizer(_flandmark.Localizer):
"""A fast and effective facial landmark localization framework based on
flandmark
Consult http://cmp.felk.cvut.cz/~uricamic/flandmark/index.php for more
information.
"""
def __init__(self, detection_model=resource_filename(__name__,
'haarcascade_frontalface_alt.xml'),
localization_model=resource_filename(__name__,
'flandmark_model.dat')):
"""Builds a new facial localization model.
Raises RuntimeError's if the models either don't exist or can't be loaded.
Keyword parameters:
detection_model
An OpenCV (xml) detection model file for a CvHaarClassifierCascade. If not
specified, use a default installed with the package.
localization_model
A flandmark localization model file. If not specified, use a default
installed with the package. The default model provides the following
keypoints, in this order:
[0]
Face center
[1]
Canthus-rl (inner corner of the right eye). Note: The "right eye" means
the right eye at face w.r.t. itself - that is the left eye in the image.
[2]
Canthus-lr (inner corder of the left eye)
[3]
Mouth-corner-r (right corner of the mouth)
[4]
Mouth-corner-l (left corner of the mouth)
[5]
Canthus-rr (outer corner of the right eye)
[6]
Canthus-ll (outer corner of the left eye)
[7]
Nose
"""
super(Localizer, self).__init__(detection_model, localization_model)
def __call__(self, image):
"""Localizes facial keypoints on all faces detected at the input image.
Keyword parameters:
image
Either a gray-scale or colored image where to run the detection and
localization.
Returns a tuple composed of dictionaries. Each dictionary in the list has
two entries: ``bbox`` and ``landmark``. The ``bbox`` entry corresponds to
the OpenCV cascade face detected, whereas the ``landmark`` contains a list
of tuples (representing x,y coordinates) with the landmarks.
If no faces are detected on the input image, than the returned tuple is
empty.
"""
if image.ndim == 3:
from bob.ip import rgb_to_gray
gray = rgb_to_gray(image)
return super(Localizer, self).__call__(gray)
elif image.ndim == 2:
return super(Localizer, self).__call__(gray)
else:
raise TypeError, "Localizer accepts images as numpy.ndarray objects with either 2 or 3 dimensions"
def localize(self, image, b_y, b_x, b_height, b_width):
"""Localizes facial keypoints on all faces detected at the input image.
Keyword parameters:
image
Either a gray-scale or colored image where to run the detection and
localization.
b_y
The top-left y-coordinate of the bounding box
b_x
The top-left x-coordinate of the bounding box
b_height
The height of the bounding box
b_width
The width of the bounding box
Returns the landmarks which are a list of tuples
(representing x,y coordinates) with the landmarks.
"""
if image.ndim == 3:
from bob.ip import rgb_to_gray
gray = rgb_to_gray(image)
return super(Localizer, self).__call__(gray, b_y, b_x, b_height, b_width)
elif image.ndim == 2:
return super(Localizer, self).__call__(gray, b_y, b_x, b_height, b_width)
else:
raise TypeError, "Localizer accepts images as numpy.ndarray objects with either 2 or 3 dimensions"