Détection de repères faciaux avec Dlib, OpenCV et Python

Identifier des visages dans des photos ou des vidéos est très cool, mais ce n’est pas assez d’informations pour créer des applications puissantes. nous avons besoin de plus d’informations sur le visage de la personne, comme sa position, la bouche ouverte ou fermée, si les yeux sont ouverts ou fermés, etc.

Face Landmark Opencv

La semaine dernière, nous avons appris à installer et à configurer OpenCV et Python sur macOS.

Dans cet article, je vais vous présenter le Dlib, une bibliothèque capable de vous donner 68 points de repère. Aujourd'hui, nous allons utiliser dlib et OpenCV pour détecter les points de repère du visage dans une image.

Les repères de visage sont utilisés pour localiser et représenter les régions saillantes du visage, telles que :

 

  • Les yeux
  • Les sourcils
  • Nez
  • Bouche
  • Jawline

Mapping faciale (la localisation de points d’intérêts - landmarks) avec Dlib, OpenCV et Python

Quels sont les points de repère du visage?

Landmarked Face

Exemple des 68 repères faciaux détectés par le prédicteur de forme pré-entraîné par Dlib (source)

La détection de points de repère pour le visage est un sous-ensemble du problème de prédiction de forme. Étant donné une image d'entrée, un prédicteur de forme tente de localiser les principaux points d'intérêt le long de la forme.

La détection des repères faciaux est un processus en deux étapes:

 

  • Étape 1: Localiser le visage dans l'image.
  • Étape 2: Détecter les principales structures faciales sur le visage.

 

La détection des visages (étape 1) peut être réalisée de différentes manières. L'algorithme utilisé pour détecter le visage dans l'image n'a pas d'importance. Au lieu de cela, l’important est d’obtenir la boîte englobant le visage (c’est-à-dire les coordonnées (x, y) du visage dans l’image).

Etant donné la région du visage, nous pouvons ensuite appliquer l’étape 2: détecter les principales structures faciales dans la région du visage.

Il existe une variété de détecteurs de points de repère faciaux, mais toutes les méthodes essaient essentiellement de localiser et d’étiqueter les régions faciales suivantes:

 

  • Bouche
  • Sourcil droit
  • Sourcil gauche
  • L'œil droit
  • Oeil gauche
  • Nez
  • Mâchoire

 

Qu'est-ce que Dlib?

C’est un détecteur facial avec des modèles pré-formés, le Dlib est utilisé pour estimer l’emplacement de 68 coordonnées (x, y) qui cartographient les points du visage sur le visage d’une personne, comme dans l’image ci-dessous.

Figure 68 Markup

Visualisation des 68 coordonnées du repère facial à partir du jeu de données iBUG 300-W.

Ces annotations font partie de l'ensemble de données iBUG 300-W en 68 points sur lequel le prédicteur de repère de visage dlib a été formé. Si vous avez besoin d'annotations plus détaillées, Il existe d'autres détecteurs de repères faciaux.

Détection de repères faciaux avec dlib, OpenCV et Python

Nous allons commencer par installer 2 bibliothèques nécessaires.

$ pip install imutils
$ pip install dlib

imutils est une série de fonctions pratiques permettant de simplifier les fonctions de traitement d'images telles que la traduction, la rotation, le redimensionnement, la squelettisation et l'affichage d'images Matplotlib avec OpenCV et Python.

Étant donné ces deux bibliothèques, nous sommes maintenant prêts à détecter les repères de la face dans les images.

Créez un nouveau fichier, nommez-le facial-landmarks.py et insérez le code suivant:

# importer les paquets nécessaires
from imutils import face_utils
import argparse
import imutils
import dlib
import cv2
# construire l'argument parser et analyser les arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="chemin d'accès à l'image d'entrée")
args = vars(ap.parse_args())

Nous utiliserons le sous-module face_utils de imutils pour accéder aux fonctions d’aide détaillées ci-dessus.

--image : Le chemin d'accès à l'image d'entrée sur laquelle nous voulons détecter les points de repère du visage.

# initialiser le détecteur de visage de dlib (basé sur HOG)
detector = dlib.get_frontal_face_detector()
# répertoire de modèles pré-formés
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 standard Histogram of Gradients Oriented + Linear SVM pour la détection d’objets.

Predictor = notre répertoire modèle pré-formé, dans mon cas, il se trouve dans le même répertoire que le script.

Nous devons détecter le visage dans notre image d'entrée:

# charger l'image d'entrée, redimensionner et convertir en niveaux de gris
image = cv2.imread(args["image"])
image = imutils.resize(image, width=600)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# détecter les visages
rects = detector(gray, 1)

 

  • charger notre image d'entrée à partir du disque via OpenCV
  • pré-traite l'image en la redimensionnant pour avoir une largeur de 500 pixels
  • convertir en niveaux de gris

 

Le premier paramètre du detector est notre image en niveaux de gris.

Le deuxième paramètre est le nombre de couches de pyramide d'image à appliquer lors de la mise à l'échelle de l'image avant l'application du détecteur.

Si vous souhaitez en savoir plus sur les méthodes pyramidales dans le traitement des images, consultez cet article.

L’augmentation de la résolution de l’image d’entrée avant la détection des visages a pour avantage de nous permettre de détecter plus de visages dans l’image. L’inconvénient est que plus la taille de l’image d’entrée est grande, plus le processus de détection est coûteux.

Nous pouvons appliquer la détection des repères faciaux à chacune des régions du visage:

# Pour chaque visage détecté, recherchez le repère.
for (i, rect) in enumerate(rects):
# déterminer les repères du visage for the face region, then
# convertir le repère du visage (x, y) en un array NumPy
shape = predictor(gray, rect)
shape = face_utils.shape_to_np(shape)
# convertir le rectangle de Dlib en un cadre de sélection de style OpenCV
# dessiner le cadre de sélection
(x, y, w, h) = face_utils.rect_to_bb(rect)
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1)
# boucle sur les coordonnées (x, y) pour les repères faciaux
# et dessine-les sur l'image
for (x, y) in shape:
cv2.circle(image, (x, y), 1, (0, 0, 255), -1)
# afficher l'image de sortie avec les détections de visage + repères de visage
cv2.imshow("Output", image)
cv2.waitKey(0)

Nous commençons à boucler sur chacune des détections de visage.  Pour chacune des détections de visage, nous appliquons la détection de repères faciaux, ce qui nous donne les coordonnées 68 (x, y) qui correspondent aux caractéristiques faciales spécifiques de l'image.

 

  • convertir l'objet forme Dlib en un array NumPy
  • dessiner le cadre de sélection entourant le visage détecté sur l'image
  • boucle sur les repères du visage détectés et dessinez chacun d'eux individuellement.
  • affichez simplement l'image de sortie sur notre écran.

 

pour tester le script, exécutez la commande suivante:

$ python facial-landmarks.py --image images/test.jpg

Face Landmark Opencv

Et voici un autre test avec 2 personnes dans une image :

Multi Face Landmark Opencv

Voir cela, je prends la photo du côté droit et mon visage est légèrement incliné.

Un autre test avec plusieurs personnes: 

Crowd Face Landmark Opencv

Détection de repères faciaux pour plusieurs personnes dans une image (source)

Nous ne sommes pas en mesure de détecter tous les visages dans cette image. Les personnes à l'arrière sont des visages flous et difficiles à détecter.

Bonus : Nous pouvons détecter les repères de visage en temps réel avec une caméra.

Résumé

Nous avons appris quels sont les repères faciaux et comment les détecter avec Dlib, OpenCV et Python..