L'attività MediaPipe Face Landmarker consente di rilevare punti di riferimento del viso ed espressioni facciali in 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 singole immagini o con uno stream continuo di immagini. L'attività genera punti di riferimento del viso tridimensionali, punteggi di blendshape (coefficienti che rappresentano l'espressione facciale) per dedurre superfici del viso dettagliate in tempo reale e matrici di trasformazione per eseguire le trasformazioni necessarie per il rendering degli effetti.
L'esempio di codice descritto in queste istruzioni è disponibile su GitHub. Per ulteriori informazioni sulle funzionalità, sui modelli e sulle opzioni di configurazione di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio di MediaPipe Tasks è una semplice implementazione di un'app di rilevamento dei punti di riferimento del viso per Android. L'esempio utilizza la fotocamera di un dispositivo Android fisico per rilevare i volti in uno stream video continuo. L'app può anche rilevare i volti nelle immagini e nei video della galleria del dispositivo.
Puoi utilizzare l'app come punto di partenza per la tua app per Android o farvi riferimento quando modifichi un'app esistente. Il codice di esempio di Face Landmarker è ospitato su GitHub.
Scarica il codice
Le istruzioni riportate di seguito mostrano come creare una copia locale del codice di esempio utilizzando lo strumento a riga di comando git.
Per scaricare il codice di esempio:
- Clona il repository git utilizzando il seguente comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
- Facoltativamente, configura l'istanza Git in modo da utilizzare il controllo sparse, in modo da avere solo i file per l'app di esempio Face Landmarker:
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 questa applicazione di esempio di rilevamento dei punti di riferimento del viso:
- FaceLandmarkerHelper.kt: inizializza l'indicatore di punti di riferimento del volto e gestisce la selezione del modello e del delegato.
- CameraFragment.kt: gestisce la fotocamera del dispositivo ed elabora i dati di input di immagini e video.
- GalleryFragment.kt: interagisce con
OverlayView
per visualizzare l'immagine o il video di output. - OverlayView.kt: implementa il display con una mesh del viso per i volti rilevati.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e i progetti di codice specificamente per utilizzare Face Landmarker. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività MediaPipe, inclusi i requisiti della versione della piattaforma, consulta la guida alla configurazione per Android.
Dipendenze
L'attività di rilevamento dei punti di riferimento del volto utilizza la libreria com.google.mediapipe:tasks-vision
. Aggiungi
questa dipendenza al file build.gradle
della tua app per Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Modello
L'attività di rilevamento dei punti di riferimento del volto di MediaPipe richiede un bundle di modelli addestrati compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Face Landmarker, consulta la sezione Modelli della panoramica dell'attività.
Seleziona e scarica il modello e memorizzalo nella directory del progetto:
<dev-project-root>/src/main/assets
Specifica il percorso del modello all'interno del parametro ModelAssetPath
. Nel codice di esempio, il modello è definito nel file FaceLandmarkerHelper.kt
:
baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)
Crea l'attività
Il compito MediaPipe Face Landmarker utilizza la funzione createFromOptions()
per configurare il compito. La funzione createFromOptions()
accetta valori per le opzioni di configurazione. Per ulteriori informazioni sulle opzioni di configurazione, consulta Opzioni di configurazione.
Face Landmarker supporta i seguenti tipi di dati di input: immagini fisse, file video e streaming video dal vivo. Quando crei l'attività, devi specificare la modalità di esecuzione corrispondente al tipo di dati di input. Scegli la scheda corrispondente al tipo di dati di input per scoprire 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 Landmarker consente all'utente di passare da una modalità di elaborazione all'altra. L'approccio rende il codice di creazione delle attività più complicato e potrebbe non essere appropriato per il tuo caso d'uso. Puoi vedere questo codice nella funzione setupFaceLandmarker()
del file FaceLandmarkerHelper.kt
.
Opzioni di configurazione
Questa attività offre le seguenti opzioni di configurazione per le app per Android:
Nome opzione | Descrizione | Intervallo di valori | Valore predefinito |
---|---|---|---|
runningMode |
Imposta la modalità di esecuzione dell'attività. Esistono tre
modalità: IMMAGINE: la modalità per l'inserimento di singole immagini. VIDEO: la modalità per i fotogrammi decodificati di un video. LIVE_STREAM: la modalità per un live streaming di dati di input, ad esempio da una videocamera. In questa modalità, resultListener deve essere chiamato per configurare un ascoltatore per ricevere i risultati in modo asincrono. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
numFaces |
Il numero massimo di volti che possono essere rilevati dal
FaceLandmarker . L'appiattimento viene applicato solo quando
num_faces è impostato su 1.
|
Integer > 0 |
1 |
minFaceDetectionConfidence |
Il punteggio di attendibilità minimo per il rilevamento del volto deve essere considerato positivo. | Float [0.0,1.0] |
0.5 |
minFacePresenceConfidence |
Il punteggio di attendibilità minimo del punteggio di presenza del volto nel rilevamento dei punti di riferimento del volto. | Float [0.0,1.0] |
0.5 |
minTrackingConfidence |
Il punteggio di attendibilità minimo per il monitoraggio del volto da considerare riuscito. | Float [0.0,1.0] |
0.5 |
outputFaceBlendshapes |
Indica se Face Landmarker genera blendshape del viso. Le blendshape del viso vengono utilizzate per il rendering del modello 3D del viso. | Boolean |
False |
outputFacialTransformationMatrixes |
Indica se FaceLandmarker deve o meno produrre la matrice di trasformazione del volto. FaceLandmarker utilizza la matrice per trasformare i landmark del volto da un modello di volto canonico al volto rilevato, in modo che gli utenti possano applicare effetti ai landmark rilevati. | Boolean |
False |
resultListener |
Imposta l'ascoltatore dei risultati in modo da ricevere i risultati dei landmark in modo asincrono quando FaceLandmarker è in modalità live streaming.
Può essere utilizzato solo quando la modalità di esecuzione è impostata su LIVE_STREAM |
ResultListener |
N/A |
errorListener |
Imposta un listener di errore facoltativo. | ErrorListener |
N/A |
Preparazione dei dati
Face Landmarker funziona con immagini, file video e live streaming video. L'attività gestisce la preelaborazione dei dati di input, tra cui ridimensionamento, rotazione e normalizzazione dei valori.
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 streaming di video live.
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 Landmarker, la preparazione dei dati viene gestita nel
file FaceLandmarkerHelper.kt
.
Esegui l'attività
A seconda del tipo di dati con cui stai lavorando, utilizza il metodo
FaceLandmarker.detect...()
specifico per quel tipo di dati. Utilizza
detect()
per le singole immagini, detectForVideo()
per i fotogrammi nei file video
e detectAsync()
per gli stream video. Quando esegui i rilevamenti su un
spostamento video, assicurati di eseguirli in un thread separato per evitare
di bloccare il thread dell'interfaccia utente.
I seguenti esempi di codice mostrano esempi semplici di come eseguire Face Landmarker in queste diverse modalità di 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 esegui l'operazione in modalità video o live streaming, devi fornire il timestamp del frame di input all'attività di rilevamento dei punti di riferimento del viso.
- Quando viene eseguita in modalità immagine o video, l'attività di rilevamento dei punti di riferimento del volto blocca il thread corrente fino al termine dell'elaborazione dell'immagine o dell'inquadratura di input. Per evitare di bloccare l'interfaccia utente, esegui l'elaborazione in un thread in background.
- Quando viene eseguita in modalità live streaming, l'attività di rilevamento dei punti di riferimento del volto restituisce immediatamente il risultato e non blocca il thread corrente. Evocherà l'ascoltatore dei risultati con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input.
Nel codice di esempio di Face Landmarker, le funzioni detect
, detectForVideo
e
detectAsync
sono definite nel
FaceLandmarkerHelper.kt
file.
Gestire e visualizzare i risultati
L'elemento Face Landmarker restituisce un oggetto FaceLandmarkerResult
per ogni esecuzione del rilevamento. L'oggetto risultato contiene un mesh del volto per ogni volto rilevato, con le coordinate di ogni punto di riferimento del volto. Se vuoi, l'oggetto risultato può anche contenere blendshape, che indicano le espressioni facciali, e matrici di trasformazione facciale per applicare effetti sul viso 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 Landmarker mostra come visualizzare i risultati restituiti dall'attività. Per maggiori dettagli, consulta la classe OverlayView
.