Guide de détection des points de repère de visage pour Python

La tâche de détection des points de repère sur le visage MediaPipe vous permet de détecter les points de repère sur le visage et les expressions faciales dans les images et les vidéos. Vous pouvez utiliser cette tâche pour identifier les expressions faciales humaines et appliquer des filtres et des effets faciaux pour créer un avatar virtuel. Cette tâche utilise des modèles de machine learning (ML) qui peuvent fonctionner avec des images uniques ou un flux d'images continu. La tâche produit des repères faciaux tridimensionnels, des scores de blendshape (coefficients représentant l'expression faciale) pour inférer des surfaces faciales détaillées en temps réel et des matrices de transformation pour effectuer les transformations requises pour le rendu des effets.

L'exemple de code décrit dans ces instructions est disponible sur GitHub. Pour en savoir plus sur les fonctionnalités, les modèles et les options de configuration de cette tâche, consultez la section Présentation.

Exemple de code

L'exemple de code pour le détecteur de points de repère du visage fournit une implémentation complète de cette tâche en Python pour référence. Ce code vous aide à tester cette tâche et à commencer à créer votre propre outil de repère de visage. Vous pouvez afficher, exécuter et modifier l' exemple de code de Face Landmarker à l'aide de votre navigateur Web.

Si vous implémentez le détecteur de points de repère du visage pour Raspberry Pi, consultez l'application exemple pour Raspberry Pi.

Configuration

Cette section décrit les étapes clés à suivre pour configurer votre environnement de développement et vos projets de code spécifiquement pour utiliser Face Landmarker. Pour obtenir des informations générales sur la configuration de votre environnement de développement pour utiliser les tâches MediaPipe, y compris les exigences concernant la version de la plate-forme, consultez le guide de configuration pour Python.

Colis

La tâche MediaPipe Face Landmarker nécessite le package PyPI mediapipe. Vous pouvez installer et importer ces dépendances avec les commandes suivantes:

$ python -m pip install mediapipe

Importations

Importez les classes suivantes pour accéder aux fonctions de la tâche Face Landmarker:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

Modèle

La tâche de repère facial MediaPipe nécessite un modèle entraîné compatible avec cette tâche. Pour en savoir plus sur les modèles entraînés disponibles pour Face Landmarker, consultez la section Modèles de la présentation de la tâche.

Sélectionnez et téléchargez le modèle, puis stockez-le dans un répertoire local:

model_path = '/absolute/path/to/face_landmarker.task'

Utilisez le paramètre model_asset_path de l'objet BaseOptions pour spécifier le chemin d'accès au modèle à utiliser. Pour obtenir un exemple de code, consultez la section suivante.

Créer la tâche

La tâche de repère facial MediaPipe utilise la fonction create_from_options pour configurer la tâche. La fonction create_from_options accepte les valeurs des options de configuration à gérer. Pour en savoir plus sur les options de configuration, consultez la section Options de configuration.

Le code suivant montre comment créer et configurer cette tâche.

Ces exemples montrent également les variations de la création de tâches pour les images, les fichiers vidéo et les diffusions en direct.

Image

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.IMAGE)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Vidéo

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the video mode:
options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.VIDEO)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Diffusion en direct

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
FaceLandmarker = mp.tasks.vision.FaceLandmarker
FaceLandmarkerOptions = mp.tasks.vision.FaceLandmarkerOptions
FaceLandmarkerResult = mp.tasks.vision.FaceLandmarkerResult
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a face landmarker instance with the live stream mode:
def print_result(result: FaceLandmarkerResult, output_image: mp.Image, timestamp_ms: int):
    print('face landmarker result: {}'.format(result))

options = FaceLandmarkerOptions(
    base_options=BaseOptions(model_asset_path=model_path),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_result)

with FaceLandmarker.create_from_options(options) as landmarker:
  # The landmarker is initialized. Use it here.
  # ...
    

Pour obtenir un exemple complet de création d'un repère facial à utiliser avec une image, consultez l'exemple de code.

Options de configuration

Cette tâche propose les options de configuration suivantes pour les applications Python:

Nom de l'option Description Plage de valeurs Valeur par défaut
running_mode Définit le mode d'exécution de la tâche. Il existe trois modes:

IMAGE: mode pour les entrées d'une seule image.

VIDEO: mode des images décodées d'une vidéo.

LIVE_STREAM: mode de diffusion en direct des données d'entrée, par exemple à partir d'une caméra. Dans ce mode, resultListener doit être appelé pour configurer un écouteur afin de recevoir les résultats de manière asynchrone.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces Nombre maximal de visages pouvant être détectés par FaceLandmarker. Le lissage n'est appliqué que lorsque num_faces est défini sur 1. Integer > 0 1
min_face_detection_confidence Score de confiance minimal pour que la détection de visage soit considérée comme réussie. Float [0.0,1.0] 0.5
min_face_presence_confidence Score de confiance minimal du score de présence de visage dans la détection des points de repère du visage. Float [0.0,1.0] 0.5
min_tracking_confidence Score de confiance minimal pour que le suivi du visage soit considéré comme réussi. Float [0.0,1.0] 0.5
output_face_blendshapes Indique si le pointeur de repère du visage génère des blendshapes de visage. Les blendshapes de visage sont utilisées pour afficher le modèle de visage 3D. Boolean False
output_facial_transformation_matrixes Indique si FaceLandmarker génère la matrice de transformation du visage. FaceLandmarker utilise la matrice pour transformer les points de repère du visage d'un modèle de visage canonique en visage détecté afin que les utilisateurs puissent appliquer des effets sur les points de repère détectés. Boolean False
result_callback Définit l'écouteur de résultats pour qu'il reçoive les résultats du repère de manière asynchrone lorsque FaceLandmarker est en mode diffusion en direct. Ne peut être utilisé que lorsque le mode d'exécution est défini sur LIVE_STREAM. ResultListener N/A

Préparer les données

Préparez votre entrée en tant que fichier image ou tableau numpy, puis convertissez-la en objet mediapipe.Image. Si votre entrée est un fichier vidéo ou un flux en direct à partir d'une webcam, vous pouvez utiliser une bibliothèque externe telle que OpenCV pour charger vos frames d'entrée en tant que tableaux numpy.

Image

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

Vidéo

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Diffusion en direct

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

Exécuter la tâche

Le détecteur de points de repère du visage utilise les fonctions detect, detect_for_video et detect_async pour déclencher des inférences. Pour le repère de visage, cela implique de prétraiter les données d'entrée et de détecter les visages dans l'image.

Le code suivant montre comment exécuter le traitement avec le modèle de tâche.

Image

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the image mode.
face_landmarker_result = landmarker.detect(mp_image)
    

Vidéo

# Perform face landmarking on the provided single image.
# The face landmarker must be created with the video mode.
face_landmarker_result = landmarker.detect_for_video(mp_image, frame_timestamp_ms)
    

Diffusion en direct

# Send live image data to perform face landmarking.
# The results are accessible via the `result_callback` provided in
# the `FaceLandmarkerOptions` object.
# The face landmarker must be created with the live stream mode.
landmarker.detect_async(mp_image, frame_timestamp_ms)
    

Veuillez noter les points suivants :

  • Lorsque vous exécutez la tâche Face Landmarker en mode vidéo ou en mode diffusion en direct, fournissez également le code temporel du frame d'entrée.
  • Lorsqu'elle s'exécute dans le modèle d'image ou de vidéo, la tâche de repère du visage bloque le thread actuel jusqu'à ce qu'elle ait terminé de traiter l'image ou le frame d'entrée.
  • Lorsqu'elle s'exécute en mode diffusion en direct, la tâche de détection des points de repère du visage renvoie immédiatement et ne bloque pas le thread en cours. Il appelle l'écouteur de résultats avec le résultat de la détection chaque fois qu'il a terminé le traitement d'un frame d'entrée. Si la fonction de détection est appelée lorsque la tâche Face Landmarker est occupée à traiter un autre frame, la tâche ignore le nouveau frame d'entrée.

Pour obtenir un exemple complet d'exécution d'un repère facial sur une image, consultez l'exemple de code.

Gérer et afficher les résultats

Le détecteur de points de repère du visage renvoie un objet FaceLandmarkerResult pour chaque exécution de détection. L'objet de résultat contient un maillage de visage pour chaque visage détecté, avec les coordonnées de chaque repère de visage. L'objet de résultat peut également contenir des blendshapes, qui désignent les expressions faciales, et une matrice de transformation faciale pour appliquer des effets sur le visage aux points de repère détectés.

Voici un exemple des données de sortie de cette tâche:

FaceLandmarkerResult:
  face_landmarks:
    NormalizedLandmark #0:
      x: 0.5971359014511108
      y: 0.485361784696579
      z: -0.038440968841314316
    NormalizedLandmark #1:
      x: 0.3302789330482483
      y: 0.29289937019348145
      z: -0.09489090740680695
    ... (478 landmarks for each face)
  face_blendshapes:
    browDownLeft: 0.8296722769737244
    browDownRight: 0.8096957206726074
    browInnerUp: 0.00035583582939580083
    browOuterUpLeft: 0.00035752105759456754
    ... (52 blendshapes for each face)
  facial_transformation_matrixes:
    [9.99158978e-01, -1.23036895e-02, 3.91213447e-02, -3.70770246e-01]
    [1.66496094e-02,  9.93480563e-01, -1.12779640e-01, 2.27719707e+01]
    ...

L'image suivante présente une visualisation du résultat de la tâche:

Homme dont les régions du visage sont cartographiées géométriquement pour indiquer sa forme et ses dimensions

L'exemple de code de Face Landmarker montre comment afficher les résultats renvoyés par la tâche. Pour en savoir plus, consultez l'exemple de code.