Leitfaden zur Gesichtserkennung für Android

Mit der Aufgabe „MediaPipe Face Detector“ können Sie Gesichter in einem Bild oder Video erkennen. Sie können um Gesichter und Gesichtsmerkmale innerhalb eines Rahmens zu finden. Bei dieser Aufgabe wird ein ML-Modell, das mit einzelnen Bildern oder einem kontinuierlichen einen Stream von Bildern. Die Aufgabe gibt die Gesichterstandorte zusammen mit den folgenden Gesichtspunkte im Gesicht: linkes Auge, rechtes Auge, Nasenspitze, Mund, Tragion linkes Auge und rechtes Auge.

Das in dieser Anleitung beschriebene Codebeispiel ist am GitHub Weitere Informationen zu den Funktionen, Modellen und Die Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.

Codebeispiel

Der Beispielcode für MediaPipe Tasks ist eine einfache Implementierung eines Gesichtsdetektors. für Android. In diesem Beispiel wird die Kamera eines physischen Android-Geräts verwendet, um in einem kontinuierlichen Videostream Gesichter erkennen. Die App kann auch Gesichter auf Bildern und Videos in der Gerätegalerie erkennen.

Du kannst die App als Ausgangspunkt für deine eigene Android-App verwenden oder darauf verweisen wenn Sie eine vorhandene App ändern. Der Beispielcode für die Gesichtserkennung wird auf GitHub

Code herunterladen

In der folgenden Anleitung erfahren Sie, wie Sie eine lokale Kopie des Beispiels erstellen. mit dem Befehlszeilentool git erstellen.

<ph type="x-smartling-placeholder">

So laden Sie den Beispielcode herunter:

  1. Klonen Sie das Git-Repository mit dem folgenden Befehl:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Konfigurieren Sie optional Ihre Git-Instanz für den Sparse-Checkout. Sie haben also nur die Dateien für die Beispiel-App zur Gesichtserkennung:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_detector/android
    

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie das Projekt importieren in Android Studio ein und führen die App aus. Anweisungen finden Sie in der Einrichtungsleitfaden für Android

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für dieses Beispiel zur Gesichtserkennung Anwendung:

  • FaceDetectorHelper.kt Initialisiert den Gesichtserkennung, verarbeitet das Modell und delegiert Auswahl.
  • CameraFragment.kt Verwaltet die Gerätekamera und verarbeitet die Bild- und Videoeingabedaten.
  • GalleryFragment.kt Interagiert mit OverlayView, um das Ausgabebild oder -video anzuzeigen.
  • OverlayView.kt Implementiert die Anzeige mit Begrenzungsrahmen für erkannte Gesichter.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und zur Nutzung von Gesichtserkennung programmieren. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversionsanforderungen finden Sie in der Einrichtungsleitfaden für Android

<ph type="x-smartling-placeholder">

Abhängigkeiten

Für die Aufgabe „Gesichtserkennung“ wird com.google.mediapipe:tasks-vision verwendet Bibliothek. Füge diese Abhängigkeit in die build.gradle-Datei deiner Android-App ein:

dependencies {
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

Modell

Für die Aufgabe „MediaPipe Face Detector“ ist ein trainiertes Modell-Bundle erforderlich, das mit für diese Aufgabe. Weitere Informationen zu verfügbaren trainierten Modellen für die Gesichtserkennung finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.

Wählen Sie das Modell aus, laden Sie es herunter und speichern Sie es in Ihrem Projektverzeichnis:

<dev-project-root>/src/main/assets

Geben Sie den Pfad des Modells innerhalb des Parameters ModelAssetPath an. Im Beispielcode, Das Modell ist in der FaceDetectorHelper.kt definiert. Datei:

val modelName = "face_detection_short_range.tflite"
baseOptionsBuilder.setModelAssetPath(modelName)

Aufgabe erstellen

Bei der Aufgabe „MediaPipe Face Detector“ wird mit der Funktion createFromOptions() für die Aufgabe. Die Funktion createFromOptions() akzeptiert Werte für die Konfiguration Optionen. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfigurationsoptionen.

Die Gesichtserkennung unterstützt die folgenden Eingabedatentypen: Standbilder, Videodateien und Live-Videostreams. Du musst den Laufmodus für deine Eingabedatentyp beim Erstellen der Aufgabe. Wählen Sie die Registerkarte für Ihre Eingabedatentyp, um zu sehen, wie die Aufgabe erstellt und eine Inferenz ausgeführt wird.

Bild

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)
    

Livestream

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)
    

Durch die Implementierung des Beispielcodes für die Gesichtserkennung kann der Nutzer zwischen Verarbeitungsmodi. Dieser Ansatz macht den Code zur Aufgabenerstellung komplizierter und ist möglicherweise für Ihren Anwendungsfall ungeeignet. Sie sehen diesen Code in der setupFaceDetector() in der Spalte FaceDetectorHelper.kt -Datei.

Konfigurationsoptionen

Diese Aufgabe bietet die folgenden Konfigurationsoptionen für Android-Apps:

Option Beschreibung Wertebereich Standardwert
runningMode Legt den Ausführungsmodus für die Task fest. Es gibt drei Modi:

IMAGE: Der Modus für Einzelbildeingaben.

VIDEO: Der Modus für decodierte Frames eines Videos.

LIVE_STREAM: Der Modus für einen Livestream mit Eingabe zum Beispiel von einer Kamera. In diesem Modus muss der resultListener wird aufgerufen, um einen Listener für den Empfang von Ergebnissen einzurichten asynchron programmiert.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
minDetectionConfidence Der minimale Konfidenzwert, mit dem die Gesichtserkennung als erfolgreich gilt. Float [0,1] 0.5
minSuppressionThreshold Der minimale Grenzwert für die nicht-maximale Unterdrückung, damit die Gesichtserkennung als überlappend gilt. Float [0,1] 0.3
resultListener Legt den Ergebnis-Listener fest, der die Erkennungsergebnisse empfängt asynchron, wenn sich die Gesichtserkennung im Livestream befindet . Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist. N/A Not set
errorListener Legt einen optionalen Fehler-Listener fest. N/A Not set

Daten vorbereiten

Die Gesichtserkennung funktioniert mit Bildern, Videodateien und Live-Videostreams. Die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Größenanpassung, Rotation und Wert. Normalisierung.

Der folgende Code zeigt, wie Daten zur Verarbeitung übergeben werden. Diese Die Beispiele enthalten Details zum Umgang mit Daten aus Bildern, Videodateien und Livestreams Videostreams.

Bild

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()
    

Livestream

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()
    

Im Gesichtserkennung verwenden, erfolgt die Datenvorbereitung in der FaceDetectorHelper.kt -Datei.

Aufgabe ausführen

Je nach Art der Daten, mit denen Sie arbeiten, verwenden Sie faceDetector.detect...()-Methode, die für diesen Datentyp spezifisch ist. Verwenden Sie detect() für einzelne Bilder, detectForVideo() für Frames in Videodateien und detectAsync() für Videostreams. Wenn Sie Erkennungen auf einem Video-Stream gesehen haben, führen Sie die Erkennungen in einem separaten Thread aus, um sodass der Benutzeroberflächen-Thread blockiert wird.

Die folgenden Codebeispiele zeigen einfache Beispiele für die Ausführung von Gesichtserkennung. in diesen verschiedenen Datenmodi:

Bild

val result = faceDetector.detect(mpImage)
    

Video

val timestampMs = i * inferenceIntervalMs

faceDetector.detectForVideo(mpImage, timestampMs)
    .let { detectionResult ->
        resultList.add(detectionResult)
    }
    

Livestream

val mpImage = BitmapImageBuilder(rotatedBitmap).build()
val frameTime = SystemClock.uptimeMillis()

faceDetector.detectAsync(mpImage, frameTime)
    

Wichtige Hinweise:

  • Im Video- oder Livestreammodus müssen Sie Zeitstempel des Eingabeframes an die Gesichtserkennungsaufgabe übergeben.
  • Bei der Ausführung im Bild- oder Videomodus kann die Gesichtserkennung blockiert den aktuellen Thread, bis die Verarbeitung des Eingabebildes Frame. Damit die Benutzeroberfläche nicht blockiert wird, führen Sie die Verarbeitung in einem im Hintergrund.
  • Im Livestreammodus gibt die Aufgabe „Gesichtserkennung“ sofort und blockiert den aktuellen Thread nicht. Das Ergebnis wird aufgerufen. Listener mit dem Erkennungsergebnis, sobald er die Verarbeitung eines Eingabe-Frame. Ob die Erkennungsfunktion aufgerufen wird, wenn die Aufgabe „Gesichtserkennung“ mit der Verarbeitung eines anderen Frames beschäftigt ist, ignoriert die Aufgabe den neuen Eingabeframe.

Im Beispielcode für Gesichtserkennung, detect, detectForVideo und detectAsync-Funktionen sind in den FaceDetectorHelper.kt -Datei.

Ergebnisse verarbeiten und anzeigen

Die Gesichtserkennung gibt für jede Erkennung ein FaceDetectorResult-Objekt zurück. ausführen. Das Ergebnisobjekt enthält Begrenzungsrahmen für die erkannten Gesichter und einen Konfidenzwert für jedes erkannte Gesicht.

Im Folgenden sehen Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:

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)

Die folgende Abbildung zeigt eine Visualisierung der Aufgabenausgabe:

Informationen für das Bild ohne Begrenzungsrahmen finden Sie im Originalbild.

Der Beispielcode für die Gesichtserkennung zeigt, wie die der Aufgabe zurückgegebene Ergebnisse finden Sie in der OverlayView .