Guida al rilevamento dei punti di riferimento dei volti per Python

L'attività Punti di riferimento per volti di MediaPipe consente di rilevare i punti di riferimento dei volti e le espressioni facciali in come immagini e video. Puoi utilizzare questa attività per identificare le espressioni facciali umane e applicare filtri ed effetti facciali per creare un avatar virtuale. Questa attività utilizza modelli di machine learning (ML) che possono funzionare con immagini singole o flusso di immagini. L'attività produce punti di riferimento tridimensionali per i volti, smoothshape (coefficienti che rappresentano l'espressione facciale) per dedurre superfici in tempo reale e matrici di trasformazione per eseguire trasformazioni necessarie per il rendering degli effetti.

L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. Per ulteriori informazioni su funzionalità, modelli e opzioni di configurazione di questa attività, consulta la Panoramica.

Esempio di codice

Il codice d'esempio di Face Taper fornisce un'implementazione completa un'attività in Python come riferimento. Questo codice ti consente di testare l'attività e ottenere ha iniziato a costruire il proprio assetto di riferimento per i volti. Puoi visualizzare, eseguire e modificare lo Esempio di Face Lookouter codice usando solo il browser web.

Se implementi Face Taper per Raspberry Pi, consulta le Esempio di Raspberry Pi Google Cloud.

Configurazione

Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e di codice per usare specificatamente Face riferimentoer. Per informazioni generali su configurare l'ambiente di sviluppo per l'utilizzo delle attività di MediaPipe, tra cui: i requisiti di versione della piattaforma, consulta la Guida alla configurazione per Python.

Pacchetti

L'attività MediaPipe Face Taper richiede il pacchetto PyPI mediapipe. Puoi installare ed eseguire importa queste dipendenze con quanto segue:

$ python -m pip install mediapipe

Importazioni

Importa le classi seguenti per accedere alle funzioni attività di Riferimento ai volti:

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

Modello

L'attività Tappa per viso di MediaPipe richiede un modello addestrato compatibile con questo dell'attività. Per ulteriori informazioni sui modelli addestrati disponibili per Face Scoreer, vedi la panoramica delle attività nella sezione Modelli.

Seleziona e scarica il modello, quindi archivialo in una directory locale:

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

Utilizza il parametro model_asset_path dell'oggetto BaseOptions per specificare il percorso dell'oggetto il modello da utilizzare. Per un esempio di codice, consulta la sezione successiva.

Crea l'attività

L'attività Punto di riferimento per volti di MediaPipe utilizza la funzione create_from_options per configurare dell'attività. La funzione create_from_options accetta valori per la configurazione e le opzioni da gestire. Per ulteriori informazioni sulle opzioni di configurazione, consulta Opzioni di configurazione.

Il codice seguente illustra come creare e configurare questa attività.

Questi esempi mostrano anche le varianti della costruzione dell'attività per le immagini, file video e live streaming.

Immagine

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.
  # ...
    

Video

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.
  # ...
    

Live streaming

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.
  # ...
    

Per un esempio completo della creazione di un Face Taper da utilizzare con un'immagine, consulta il codice esempio.

Opzioni di configurazione

Questa attività include le seguenti opzioni di configurazione per le applicazioni Python:

Nome opzione Descrizione Intervallo di valori Valore predefinito
running_mode Imposta la modalità di esecuzione per l'attività. Esistono tre tipi di modalità:

IMAGE: la modalità per gli input di immagini singole.

VIDEO: la modalità per i fotogrammi decodificati di un video.

LIVE_STREAM: la modalità per un live streaming di input dati, ad esempio quelli di una videocamera. In questa modalità, resultListener deve essere per impostare un listener in modo che riceva risultati in modo asincrono.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
num_faces Il numero massimo di volti che possono essere rilevati FaceLandmarker. Il perfezionamento viene applicato solo quando num_faces è impostato su 1. Integer > 0 1
min_face_detection_confidence Il punteggio di confidenza minimo per il rilevamento dei volti viene considerata riuscita. Float [0.0,1.0] 0.5
min_face_presence_confidence Il punteggio di confidenza minimo della presenza di volti di riconoscimento facciale nel rilevamento dei punti di riferimento. Float [0.0,1.0] 0.5
min_tracking_confidence Il punteggio di confidenza minimo per il monitoraggio dei volti per essere considerate efficaci. Float [0.0,1.0] 0.5
output_face_blendshapes Consente di stabilire se l'output di Face Taper crea combinazioni di forme. Le forme del volto vengono utilizzate per il rendering del modello del volto 3D. Boolean False
output_facial_transformation_matrixes Se FaceLandmarker restituisce il volto una matrice di trasformazione. FaceLandmarker utilizza lo strumento per trasformare i punti di riferimento dei volti da un modello di volto canonico a volto rilevato, per consentire agli utenti di applicare effetti sui punti di riferimento rilevati. Boolean False
result_callback Imposta il listener dei risultati per ricevere i risultati dei punti di riferimento in modo asincrono quando FaceLandmarker è in modalità live streaming. Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM ResultListener N/A

Preparazione dei dati

Prepara l'input come file immagine o array numpy, quindi convertilo in un mediapipe.Image oggetto. Se l'input è un file video o un live streaming da un webcam, puoi utilizzare una libreria esterna come OpenCV per caricare i frame di input come numpy di grandi dimensioni.

Immagine

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)
    

Video

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)
    

Live streaming

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)
    

Esegui l'attività

Riferimento per i volti utilizza detect, detect_for_video e detect_async per attivare le inferenze. Per fare riferimento ai volti, ciò comporta durante la pre-elaborazione dei dati di input e il rilevamento dei volti nell'immagine.

Il codice seguente mostra come eseguire l'elaborazione con l'attività un modello di machine learning.

Immagine

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

Video

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

Live streaming

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

Tieni presente quanto segue:

  • Quando utilizzi la modalità video o live streaming, specifica anche L'attività riconoscimento facciale esegue il timestamp del frame di input.
  • Durante l'esecuzione nell'immagine o nel modello video, l'attività Punti di riferimento volti si blocca sul thread corrente fino al termine dell'elaborazione dell'immagine o del frame di input.
  • Quando l'attività è in modalità live streaming, l'attività Punti di riferimento volti restituisce immediatamente e non blocca il thread corrente. Richiamerà il risultato con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input. Se la funzione di rilevamento viene chiamata quando viene eseguita l'attività è impegnato a elaborare un altro frame, l'attività ignorerà il nuovo frame di input.

Per un esempio completo dell'esecuzione di un riconoscimento facciale su un'immagine, consulta il codice esempio per maggiori dettagli.

Gestire e visualizzare i risultati

Punti di riferimento volti restituisce un oggetto FaceLandmarkerResult per ogni rilevamento vengono eseguiti tutti i test delle unità. L'oggetto risultato contiene un mesh per ogni volto rilevato, con per ogni punto di riferimento volto. Facoltativamente, l'oggetto risultato può anche contengono milkshake, che indicano le espressioni facciali, e un di trasformazione per applicare effetti volti ai punti di riferimento rilevati.

Di seguito è riportato un esempio dei dati di output di questa attività:

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'immagine seguente mostra una visualizzazione dell'output dell'attività:

Il codice di esempio di Face Taper mostra come visualizzare i risultati restituiti dall'attività, consulta il codice esempio per maggiori dettagli.