L'attività Indicatore del volto di MediaPipe ti consente di rilevare i punti di riferimento e le espressioni facciali all'interno di immagini e video. Con questa attività puoi 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 un flusso continuo di immagini. L'attività genera punti di riferimento tridimensionali dei volti, i punteggi di miscelazione (coefficienti che rappresentano l'espressione facciale) per dedurre le superfici facciali dettagliate in tempo reale e le matrici di trasformazione per eseguire le trasformazioni richieste 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 Face Referenceer 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 dalla 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 Referenceer è ospitato su GitHub.
Scarica il codice
Le seguenti istruzioni 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 la tua istanza Git in modo da utilizzare un pagamento sparse, in modo da avere solo i file dell'app di esempio di Face Scoreer:
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 le istruzioni, consulta la Guida alla configurazione per Android.
Componenti chiave
I seguenti file contengono il codice fondamentale per questa applicazione di esempio di creazione di punti di riferimento per i volti:
- FaceLandmarkerHelper.kt: inizializza l'indicatore di riferimento del volto e gestisce il modello e la selezione dei delegati.
- 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 un mesh per i volti per i volti rilevati.
Configurazione
In questa sezione vengono descritti i passaggi chiave per configurare l'ambiente di sviluppo e codificare i progetti in modo specifico per l'utilizzo di Riferimento per volti. Per informazioni generali sulla configurazione dell'ambiente di sviluppo per l'utilizzo delle attività di MediaPipe, inclusi i requisiti di versione della piattaforma, consulta la Guida alla configurazione per Android.
Dipendenze
L'attività Indicatore dei volti utilizza la raccolta com.google.mediapipe:tasks-vision
. Aggiungi
questa dipendenza al file build.gradle
della tua app Android:
dependencies {
implementation 'com.google.mediapipe:tasks-vision:latest.release'
}
Modello
L'attività Riferimento per volti di MediaPipe richiede un bundle di modelli addestrato compatibile con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per l'indicatore di riferimento dei volti, consulta la sezione Modelli della panoramica dell'attività.
Seleziona e scarica il modello e archivialo all'interno della 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)
Creare l'attività
L'attività Indicatore di riferimento dei volti di MediaPipe utilizza la funzione createFromOptions()
per configurarla. La funzione createFromOptions()
accetta i valori per le opzioni di configurazione. Per maggiori informazioni sulle opzioni di configurazione, consulta
Opzioni di configurazione.
La funzionalità di riferimento per i volti supporta i seguenti tipi di dati di input: immagini fisse, file video e stream video in diretta. Devi specificare la modalità di esecuzione corrispondente al tipo di dati di input quando crei l'attività. Scegli la scheda relativa 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 di codice di esempio di Punti di riferimento per i volti consente all'utente di passare da una modalità di elaborazione all'altra. Questo approccio rende più complicato
il codice per la creazione delle attività 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à prevede 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
modalità: IMAGE: la modalità per gli input 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 listener per ricevere i risultati in modo asincrono. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
numFaces |
Il numero massimo di volti che possono essere rilevati dall'FaceLandmarker . Il perfezionamento viene applicato solo quando
num_faces è impostato su 1.
|
Integer > 0 |
1 |
minFaceDetectionConfidence |
Il punteggio di affidabilità minimo affinché il rilevamento dei volti venga considerato efficace. | Float [0.0,1.0] |
0.5 |
minFacePresenceConfidence |
Il punteggio di affidabilità minimo del punteggio della presenza di un volto nel rilevamento dei punti di riferimento del volto. | Float [0.0,1.0] |
0.5 |
minTrackingConfidence |
Il punteggio di affidabilità minimo affinché il monitoraggio dei volti venga considerato efficace. | Float [0.0,1.0] |
0.5 |
outputFaceBlendshapes |
Consente di impostare l'output delle forme dei volti in Tracciato dei volti. Le forme di fusione dei volti vengono utilizzate per il rendering del modello del volto 3D. | Boolean |
False |
outputFacialTransformationMatrixes |
Indica se FaceLandMark restituisce la matrice di trasformazione facciale. FaceLandMark utilizza la matrice per trasformare i punti di riferimento dei volti da un modello del volto canonico al volto rilevato, in modo che gli utenti possano applicare effetti sui punti di riferimento rilevati. | Boolean |
False |
resultListener |
Imposta il listener di risultati per ricevere i risultati del punto di riferimento in modo asincrono quando FaceLandMark è 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 errori facoltativo. | ErrorListener |
N/A |
Preparazione dei dati
Face Scoreer funziona con immagini, file video e stream video in diretta. L'attività gestisce la pre-elaborazione dell'input dei dati, tra cui il ridimensionamento, la rotazione e la 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 stream di video dal vivo.
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 Punti di riferimento volti, la preparazione dei dati viene gestita nel file FaceLandmarkerHelper.kt
.
Esegui l'attività
A seconda del tipo di dati con cui lavori, utilizza il
metodo FaceLandmarker.detect...()
specifico per quel tipo di dati. Utilizza
detect()
per le singole immagini, detectForVideo()
per i frame nei file video
e detectAsync()
per gli stream video. Quando esegui rilevamenti su uno stream video, assicurati di eseguirli in un thread separato per evitare di bloccare il thread dell'interfaccia utente.
I seguenti esempi di codice mostrano semplici esempi di come eseguire Punti di riferimento per i volti 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 riportato di seguito:
- Quando l'app è in modalità video o live streaming, devi fornire il timestamp del frame di input all'attività di Fattore di riferimento per i volti.
- Quando viene eseguita in modalità immagine o video, l'attività Fattore di riferimento per i volti blocca il thread corrente finché non termina l'elaborazione dell'immagine o del frame di input. Per evitare di bloccare l'interfaccia utente, esegui l'elaborazione in un thread in background.
- Quando è in esecuzione in modalità live streaming, l'attività Fattore di riferimento per i volti restituisce immediatamente e non blocca il thread corrente. Richiama l'elenco dei risultati con il risultato del rilevamento ogni volta che termina l'elaborazione di un frame di input.
Nel codice di esempio di Riferimento volto, le funzioni detect
, detectForVideo
e detectAsync
sono definite nel file FaceLandmarkerHelper.kt
.
Gestire e visualizzare i risultati
La funzionalità di riferimento per i volti restituisce un oggetto FaceLandmarkerResult
per ogni esecuzione
di rilevamento. L'oggetto risultato contiene un mesh per i volti per ogni volto rilevato, con coordinate per ogni punto di riferimento dei volti. Facoltativamente, l'oggetto risultato può anche contenere forme di fusione, che denotano le espressioni facciali, e una matrice di trasformazione facciale per applicare effetti per i 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 del Punto di riferimento dei volti mostra come visualizzare i risultati restituiti dall'attività. Per ulteriori dettagli, consulta la classe OverlayView
.