Table des matières

Note pour la conception d'un atelier sur la « reconnaissance faciale »

Reconnaissance de visage et 68 points de structures faciales sur le visage

Objetifs de cette note

Support tech

Python et 68 points de contrôle du visage

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

figure_68_markup.jpg

Avec l'aide d' OpenCV

Pré-requis

4 étapes de construction du code

2 objectifs

Pour ficher un ou plusieurs visages nous devons résoudre 2 procédés logiques

Contraintes

Nous essayons de respecter 2 contraintes :

  1. Coder ce que nous documentons et non l'inverse
  2. Rester sous les 50 lignes de code pour cette approche simplifiée et pédagogique

Initialiser la démarche

nous importons ce dont nous avons besoin :

#!/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

Détecter un visage

nous visons à :

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):

  1. avant la détection des visages = avantage de nous permettre de détecter plus de visages
  2. plus la taille de l’image d’entrée est grande, plus le processus de détection est vorace en demande de puissance de calcul

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.

Détecter les repères faciaux

À 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 :

Tester le code

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 :

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

Méthode d'atelier

  1. intro rapide, aka spitch par l'animatrice ou animateur en moins de 5 minutes
  2. 2 × 1h de code avec tests de variations et usages d'images photos et vidéo pair à pair ou mob programming
  3. 40 minutes de cercle samoan sur les apprentissages, enjeux induits et piste d'autodéfense
  4. 1h de pratiques et tests d'autodéfense et documentation
  5. 5 minutes de clôture pour aller vers un World_café

Pages liées

Ressources externes