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:
- Clona il repository git utilizzando il comando seguente:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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.