L'attività di rilevamento dei volti di MediaPipe ti consente di rilevare i volti in un'immagine o in un video. Puoi utilizzare questa attività per individuare volti e caratteristiche del viso all'interno di un'inquadratura. Questa attività utilizza un modello di machine learning (ML) che funziona con immagini singole o flusso di immagini. L'attività restituisce le posizioni dei volti, insieme a quanto segue punti chiave del volto: occhio sinistro, occhio destro, punta del naso, bocca, tragione dell'occhio sinistro tragione dell'occhio destro.
L'esempio di codice descritto in queste istruzioni è disponibile attivo GitHub. Per ulteriori informazioni su funzionalità, modelli di questa attività, consulta la Panoramica.
Esempio di codice
Il codice di esempio relativo alle attività di MediaPipe è una semplice implementazione di un rilevatore di 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ò 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 fare riferimento all'app quando modifichi un'app esistente. Il codice di esempio del rilevatore di volti è 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 l'istanza Git in modo da utilizzare il pagamento sparso,
quindi avrai solo i file dell'app di esempio Rilevamento dei volti:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/face_detector/android
Dopo aver creato una versione locale del codice di esempio, puoi importare il progetto in Android Studio ed eseguire l'app. Per istruzioni, vedi Guida alla configurazione per Android.
Componenti chiave
I file che seguono contengono il codice fondamentale per questo esempio di rilevamento dei volti applicazione:
- FaceDetectorHelper.kt: Inizializza il rilevatore di volti e gestisce il modello e delega selezione.
- CameraFragment.kt: Consente di gestire la fotocamera del dispositivo ed elaborare 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 la visualizzazione con riquadri di delimitazione per i volti rilevati.
Configurazione
Questa sezione descrive i passaggi chiave per configurare l'ambiente di sviluppo e di codice per usare specificatamente Face Detector. 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 Guida alla configurazione per Android.
Dipendenze
L'attività Rilevamento dei volti utilizza com.google.mediapipe:tasks-vision
libreria. 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 volti di MediaPipe richiede un bundle di modelli addestrato che siano compatibili con questa attività. Per ulteriori informazioni sui modelli addestrati disponibili per Face Detector, 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
esempio di codice,
Il modello è definito nel campo FaceDetectorHelper.kt
file:
val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)
Crea l'attività
L'attività di rilevamento dei 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, consulta
Opzioni di configurazione.
Il rilevatore di volti supporta i seguenti tipi di dati di input: immagini fisse, file video e video in live streaming. Devi specificare la modalità di corsa corrispondente di input durante la creazione dell'attività. Scegli la scheda corrispondente tipo di dati di input per vedere come creare l'attività ed eseguire l'inferenza.
Immagine
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.IMAGE) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
Video
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setRunningMode(RunningMode.VIDEO) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
Live streaming
val baseOptionsBuilder = BaseOptions.builder().setModelAssetPath(modelName) val baseOptions = baseOptionBuilder.build() val optionsBuilder = FaceDetector.FaceDetectorOptions.builder() .setBaseOptions(baseOptionsBuilder.build()) .setMinDetectionConfidence(threshold) .setResultListener(this::returnLivestreamResult) .setErrorListener(this::returnLivestreamError) .setRunningMode(RunningMode.LIVE_STREAM) val options = optionsBuilder.build() FaceDetector = FaceDetector.createFromOptions(context, options)
L'implementazione del codice di esempio del riconoscimento facciale consente all'utente di alternare tra
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 setupFaceDetector()
FaceDetectorHelper.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 |
minDetectionConfidence |
Il punteggio di confidenza minimo affinché il rilevamento dei volti abbia successo. | Float [0,1] |
0.5 |
minSuppressionThreshold |
La soglia minima non massima di soppressione affinché il rilevamento dei volti sia considerata sovrapposta. | Float [0,1] |
0.3 |
resultListener |
Imposta il listener dei risultati in modo che riceva i risultati del rilevamento
in modo asincrono quando il riconoscimento facciale è nel live streaming
. Può essere utilizzato solo quando la modalità di corsa è impostata su LIVE_STREAM . |
N/A |
Not set |
errorListener |
Imposta un listener di errori facoltativo. | N/A |
Not set |
Preparazione dei dati
Il rilevatore di volti 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()
Nella
Codice di esempio del rilevatore di volti, la preparazione dei dati viene gestita nel
FaceDetectorHelper.kt
.
Esegui l'attività
A seconda del tipo di dati con cui stai lavorando, utilizza
faceDetector.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 Detector in queste diverse modalità dati:
Immagine
val result = faceDetector.detect(mpImage)
Video
val timestampMs = i * inferenceIntervalMs faceDetector.detectForVideo(mpImage, timestampMs) .let { detectionResult -> resultList.add(detectionResult) }
Live streaming
val mpImage = BitmapImageBuilder(rotatedBitmap).build() val frameTime = SystemClock.uptimeMillis() faceDetector.detectAsync(mpImage, frameTime)
Tieni presente quanto segue:
- In modalità video o live streaming, devi: fornisci il timestamp del frame di input all'attività Rilevatore di volti.
- Durante l'esecuzione in modalità immagine o video, l'attività Rilevamento volti blocca il thread corrente finché non termina di elaborare l'immagine di input o frame. Per evitare di bloccare l'interfaccia utente, esegui l'elaborazione in una in background.
- Quando è attiva la modalità live streaming, l'attività Rilevamento dei 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 l'attività Rilevamento dei volti è impegnato a elaborare un altro frame, l'attività ignorerà il nuovo frame di input.
Nella
Codice di esempio del rilevatore di volti: detect
, detectForVideo
e
Le funzioni detectAsync
sono definite
FaceDetectorHelper.kt
.
Gestire e visualizzare i risultati
Il rilevatore di volti restituisce un oggetto FaceDetectorResult
per ogni rilevamento
vengono eseguiti tutti i test delle unità. L'oggetto risultato contiene riquadri di delimitazione per i volti rilevati e un
il punteggio di confidenza di ogni volto rilevato.
Di seguito è riportato un esempio dei dati di output di questa attività:
FaceDetectionResult:
Detections:
Detection #0:
BoundingBox:
origin_x: 126
origin_y: 100
width: 463
height: 463
Categories:
Category #0:
index: 0
score: 0.9729152917861938
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.18298381567001343
y: 0.2961040139198303
NormalizedKeypoint #1:
x: 0.3302789330482483
y: 0.29289937019348145
... (6 keypoints for each face)
Detection #1:
BoundingBox:
origin_x: 616
origin_y: 193
width: 430
height: 430
Categories:
Category #0:
index: 0
score: 0.9251380562782288
NormalizedKeypoints:
NormalizedKeypoint #0:
x: 0.6151331663131714
y: 0.3713381886482239
NormalizedKeypoint #1:
x: 0.7460576295852661
y: 0.38825345039367676
... (6 keypoints for each face)
L'immagine seguente mostra una visualizzazione dell'output dell'attività:
Per l'immagine senza riquadri di delimitazione, vedi l'immagine originale.
Il codice di esempio del rilevatore di volti mostra come visualizzare
i risultati restituiti dall'attività, controlla
OverlayView
per ulteriori dettagli.