Reconnaissance de visage et 68 points de structures faciales sur le visage
python
de longueur raisonnable
en utilisant dlib
, qui contient de base de nombreux exemples de reconnaissance d'objet avec le langage python
.
En suivant la majoration de 68 points Multi-PIE, Pose, Illumination, and Expression Database.
« Il existe une relation étroite entre l'avancement des algorithmes de reconnaissance faciale et la disponibilité de bases de données sur les visages, facteurs variables qui affectent l'apparence du visage d'une manière contrôlée. La base de données CMU PIE a été très influente dans l'avancement de la recherche sur la reconnaissance faciale à travers la pose et l'illumination. Malgré son succès, la base de données PIE présente plusieurs lacunes : un nombre limité de sujets, une seule session d'enregistrement et seulement quelques expressions capturées. Pour répondre à ces questions, nous avons collecté la base de données CMU Multi-PIE. Il contient 337 sujets, photographiés sous 15 points de vue et 19 conditions d'éclairage dans un maximum de quatre séances d'enregistrement. Dans cet article, nous présentons la base de données et décrivons la procédure d'enregistrement. Nous présentons en outre les résultats d'expériences de base utilisant des classificateurs PCA et LDA pour mettre en évidence les similitudes et les différences entre PIE et Multi-PIE. » Multi PIE, nbci, 2009, Ralph Gross, Iain Matthews, Jeff Cohn, Takeo Kanade, and Simon Baker
Avec l'aide d' OpenCV
Pour ficher un ou plusieurs visages nous devons résoudre 2 procédés logiques
Nous essayons de respecter 2 contraintes :
nous importons ce dont nous avons besoin :
-i
ou –image
en chemin d'accès à l'image d'entrée sur laquelle nous voulons détecter les points de repère#!/usr/bin/python # -*- coding: utf-8 -*- """delacroix.py A piece of python for citizen research on freedoms and bio/morphological risks by XavCC GNU GENERAL PUBLIC LICENSE Version 3 """ import argparse from imutils import face_utils import imutils import cv2 import dlib # build argument parser and analyze arguments bap = argparse.ArgumentParser() bap.add_argument('-i', '--image', required=True, help='path to the input image') args = vars(bap.parse_args()) # initialize the dlib face detector # (using histogram of oriented gradients HOG) detector = dlib.get_frontal_face_detector() # directory of shapes predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
Detector
: initialise le détecteur de visage pré-entraîné de dlib
en se basant sur une modification de la méthode Histogram of Gradients Oriented et Linear SVM pour la détection d’objets.
Predictor
: le répertoire nécessaire pour modèle pré-établi de détection de point de repères, disponible ici
nous visons à :
OpenCV
Nous ajoutons donc à la suite le code suivant :
# load image as input, resize and convert to grayscale image = cv2.imread(args['image']) image = imutils.resize(image, width=900) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # detect face rects = detector(gray, 1)
Le premier paramètre du detector
est notre image envoyée avec niveaux de gris.
Puis le choix opéré de la résolution de l’image d’entrée (image, width=900)
:
Le deuxième paramètre est le nombre de couches de pyramide d'image via OpenCV à appliquer lors de la mise à l'échelle de l'image avant l'application du détecteur.
Nous pouvons ensuite demander le détecttion de visage.
À la suite de notre prédent morceau de code, nous lançons la détection de repères faciaux sur les visages trouvés - par conversion de l'objet de forme provenant deDlib
en un array
provenant de NumPy
.
Puis nous amroçons une boucle sur chacune des détections de visage, sur chaune nous appliquons la détection de repères faciaux, ce qui nous donne les 68 coordonnées (x, y) qui correspondent aux caractéristiques faciales spécifiques.
# For each face detected search for marks for (i, rect) in enumerate(rects): # determine facial landmarks for the face region, then # convert the facial landmark (x, y) into a NumPy array shape = predictor(gray, rect) shape = face_utils.shape_to_np(shape) # convert the Dlib rectangle into an OpenCV style selection frame # draw the selection frame (x, y, w, h) = face_utils.rect_to_bb(rect) cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1) # loop on the coordinates (x, y) for facial landmarks # and draw them on picture for (x, y) in shape: cv2.circle(image, (x, y), 1, (0, 0, 255), -1) # display output image with face detection and face markers cv2.imshow('Output', image) cv2.waitKey(0)
Enfin nous :
Notre code final est
#!/usr/bin/python # -*- coding: utf-8 -*- """delacroix.py A piece of python for citizen research on freedoms and bio/morphological risks by XavCC GNU GENERAL PUBLIC LICENSE Version 3 """ import argparse from imutils import face_utils import imutils import cv2 import dlib # build argument parser and analyze arguments bap = argparse.ArgumentParser() bap.add_argument('-i', '--image', required=True, help='path to the input image') args = vars(bap.parse_args()) # initialize the dlib face detector # (using histogram of oriented gradients HOG) detector = dlib.get_frontal_face_detector() # directory of shapes predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat') # load image as input, resize and convert to grayscale image = cv2.imread(args['image']) image = imutils.resize(image, width=600) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # detect face rects = detector(gray, 1) # For each face detected search for marks for (i, rect) in enumerate(rects): # determine facial landmarks for the face region, then # convert the facial landmark (x, y) into a NumPy array shape = predictor(gray, rect) shape = face_utils.shape_to_np(shape) # convert the Dlib rectangle into an OpenCV style selection frame # draw the selection frame (x, y, w, h) = face_utils.rect_to_bb(rect) cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1) # loop on the coordinates (x, y) for facial landmarks # and draw them on picture for (x, y) in shape: cv2.circle(image, (x, y), 1, (0, 0, 255), -1) # display output image with face detection with face markers cv2.imshow('Output', image) cv2.waitKey(0)
Vérifions l'état de l'art de notre code, sachant que :
c
qui ne font pas partie de la stdlib python est un risque de sécurité et pourrait introduire du code malveillant1).–unsafe-load-any-extension=y
en ligne de commande. Cette fonctionnalité n'est pas documentée et est classée comme une option cachée (https://mail.python.org/pipermail/code-quality/2014-November/000439.html).pylint.rc
, unsafe-load-any-extensions=yes
. Ceci est recommandé par rapport à l'option 1 et inclut la documentation complète dans le fichier pylint.rc
par défaut (créé avec –generate-rcfile
).pylint.rc
en utilisant l'option extension-pkg-whitelist=
.pylint --const-rgx='[a-z\_][a-z0-9\_]{2,30}$' delacroix.py --extension-pkg-whitelist=cv2 ************* Module delacroix delacroix.py:22:11: I1101: Module 'dlib' has no 'get_frontal_face_detector' member, but source is unavailable. Consider adding this module to extension-pkg-whitelist if you want to perform analysis based on run-time introspection of living objects. (c-extension-no-member) delacroix.py:24:12: I1101: Module 'dlib' has no 'shape_predictor' member, but source is unavailable. Consider adding this module to extension-pkg-whitelist if you want to perform analysis based on run-time introspection of living objects. (c-extension-no-member) ------------------------------------------------------------------- Your code has been rated at 10.00/10
Testons maintenant sur une image de grève, par exemple en Inde, que nous nommerons india.jpg
$ python3 delacroix.py -i india.jpg
Et que se passe t'il maintenant si « La liberté guidant le peuple » était mise sous reconnaissance faciale