Guida al rilevamento dei punti di riferimento dei volti per Android

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, applicare filtri ed effetti facciali e creare avatar virtuali. 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 di esempio relativo alle attività di MediaPipe è una semplice implementazione di un elemento di riferimento per i volti per Android. L'esempio utilizza la fotocamera di un dispositivo Android fisico per rilevano i volti in uno stream video continuo. L'app può rilevare anche i volti di immagini e video dalla galleria del dispositivo.

Puoi utilizzare l'app come punto di partenza per la tua app per Android o fare riferimento all'app quando modifichi un'app esistente. Il codice di esempio Face Taper è ospitato su GitHub.

Scarica il codice

Le seguenti istruzioni mostrano come creare una copia locale dell'esempio utilizzando lo strumento a riga di comando git.

Per scaricare il codice di esempio:

  1. Clona il repository git utilizzando il comando seguente:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Facoltativamente, configura la tua istanza Git per l'utilizzo di un pagamento sparso, in modo da avere solo i file per l'app di esempio Face Lookout:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

Dopo aver creato una versione locale del codice di esempio, puoi importare il progetto in Android Studio ed eseguire l'app. Per istruzioni, consulta la Guida alla configurazione per Android.

Componenti chiave

I seguenti file contengono il codice fondamentale per questo esempio di riferimento dei volti applicazione:

  • FaceLandmarkerHelper.kt: inizializza lo strumento di riferimento per i volti e gestisce il modello e il delegato selezione.
  • CameraFragment.kt: gestisce la fotocamera del dispositivo ed elabora i dati di input dell'immagine e del video.
  • GalleryFragment.kt: interagisce con OverlayView per visualizzare l'immagine o il video di output.
  • OverlayView.kt: implementa il display con un mesh per i volti rilevati.

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

Dipendenze

L'attività Punti di riferimento volti utilizza la raccolta com.google.mediapipe:tasks-vision. Aggiungi questa dipendenza dal file build.gradle della tua app per Android:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Modello

L'attività Punti di riferimento per volti di MediaPipe richiede un bundle di modelli addestrato che siano compatibili con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Face riferimentoer, consulta la sezione Modelli della panoramica delle attività.

Seleziona e scarica il modello e archivialo nella directory del progetto:

<dev-project-root>/src/main/assets

Specifica il percorso del modello all'interno del parametro ModelAssetPath. Nella di esempio, il modello viene definito FaceLandmarkerHelper.kt file:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

Crea l'attività

L'attività Punto di riferimento per volti di MediaPipe utilizza la funzione createFromOptions() per configurare dell'attività. La funzione createFromOptions() accetta i valori per la configurazione le opzioni di CPU e memoria disponibili. Per ulteriori informazioni sulle opzioni di configurazione, vedi Configurazione opzioni.

I punti di riferimento per i volti supportano i seguenti tipi di dati di input: immagini fisse, video e stream video in diretta. Devi specificare la modalità di corsa corrispondenti al tipo di dati di input durante la creazione dell'attività. Scegli la scheda per il tipo di dati di input per vedere come creare l'attività ed eseguire l'inferenza.

Immagine

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.IMAGE)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

Video

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setRunningMode(RunningMode.VIDEO)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

Live streaming

val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(MP_FACE_LANDMARKER_TASK)
val baseOptions = baseOptionBuilder.build()

val optionsBuilder = 
    FaceLandmarker.FaceLandmarkerOptions.builder()
        .setBaseOptions(baseOptionsBuilder.build())
        .setMinFaceDetectionConfidence(minFaceDetectionConfidence)
        .setMinTrackingConfidence(minFaceTrackingConfidence)
        .setMinFacePresenceConfidence(minFacePresenceConfidence)
        .setNumFaces(maxNumFaces)
        .setResultListener(this::returnLivestreamResult)
        .setErrorListener(this::returnLivestreamError)
        .setRunningMode(RunningMode.LIVE_STREAM)

val options = optionsBuilder.build()
FaceLandmarker = FaceLandmarker.createFromOptions(context, options)
    

L'implementazione del codice di esempio di Face Taper consente all'utente di passare da una modalità all'altra di elaborazione. L'approccio rende il codice di creazione delle attività più complicato potrebbero non essere appropriati per il tuo caso d'uso. Puoi trovare questo codice nel nella funzione setupFaceLandmarker() FaceLandmarkerHelper.kt .

Opzioni di configurazione

Questa attività include le seguenti opzioni di configurazione per le app per Android:

Nome opzione Descrizione Intervallo di valori Valore predefinito
runningMode 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
numFaces Il numero massimo di volti che possono essere rilevati FaceLandmarker. Il perfezionamento viene applicato solo quando num_faces è impostato su 1. Integer > 0 1
minFaceDetectionConfidence Il punteggio di confidenza minimo per il rilevamento dei volti viene considerata riuscita. Float [0.0,1.0] 0.5
minFacePresenceConfidence 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
minTrackingConfidence Il punteggio di confidenza minimo per il monitoraggio dei volti per essere considerate efficaci. Float [0.0,1.0] 0.5
outputFaceBlendshapes 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
outputFacialTransformationMatrixes 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
resultListener 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
errorListener Imposta un listener di errori facoltativo. ErrorListener N/A

Preparazione dei dati

Face Taper funziona con immagini, file video e stream video in diretta. L'attività gestisce la pre-elaborazione dell'input di dati, tra cui il ridimensionamento, la rotazione e il valore della normalizzazione.

Il seguente codice mostra come trasferire i dati per l'elaborazione. Questi esempi includono dettagli su come gestire i dati di immagini, file video e stream video.

Immagine

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
    

Video

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

val argb8888Frame =
    if (frame.config == Bitmap.Config.ARGB_8888) frame
    else frame.copy(Bitmap.Config.ARGB_8888, false)

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(argb8888Frame).build()
    

Live streaming

import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage

// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(rotatedBitmap).build()
    

Nel codice di esempio di Face Taper, la preparazione dei dati viene gestita nella FaceLandmarkerHelper.kt .

Esegui l'attività

A seconda del tipo di dati con cui stai lavorando, utilizza FaceLandmarker.detect...() specifico per il tipo di dati. Utilizza le funzionalità di detect() per le singole immagini, detectForVideo() per i frame nei file video, e detectAsync() per gli stream video. Quando esegui rilevamenti su una nello stream video, assicurati di eseguire i rilevamenti su un thread separato per evitare bloccare il thread dell'interfaccia utente.

I seguenti esempi di codice mostrano semplici esempi di come eseguire Face Lookouter in queste diverse modalità dati:

Immagine

val result = FaceLandmarker.detect(mpImage)
    

Video

val timestampMs = i * inferenceIntervalMs

FaceLandmarker.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

Live streaming

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

FaceLandmarker.detectAsync(mpImage, frameTime)
    

Tieni presente quanto segue:

  • Quando utilizzi la modalità video o live streaming, devi fornire i campi il timestamp del frame di input all'attività Punti di riferimento volti.
  • Durante l'esecuzione in modalità immagine o video, l'attività Punti di riferimento volti si blocca sul thread corrente fino al termine dell'elaborazione dell'immagine o del frame di input. A evitare di bloccare l'interfaccia utente, eseguire l'elaborazione in background .
  • 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.

Nel codice di esempio di Face Taper, i campi detect, detectForVideo e Le funzioni detectAsync sono definite FaceLandmarkerHelper.kt .

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 matrici 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à, controlla OverlayView per ulteriori dettagli.