Guida al rilevamento dei volti per Android

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:

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