Leitfaden zur Erkennung von Sehenswürdigkeiten auf Android-Geräten

Mit der MediaPipe Face Landmarker-Aufgabe können Sie Gesichts-Landmarks und Gesichtsausdrücke in Bildern und Videos erkennen. Mit dieser Aufgabe können Sie menschliche Gesichtsausdrücke erkennen, Gesichtsfilter und ‑effekte anwenden und virtuelle Avatare erstellen. Für diese Aufgabe werden ML-Modelle verwendet, die mit einzelnen Bildern oder einem kontinuierlichen Stream von Bildern arbeiten können. Die Aufgabe gibt dreidimensionale Gesichts-Landmarks, Blendshape-Werte (Koeffizienten, die den Gesichtsausdruck darstellen) aus, um detaillierte Gesichtsoberflächen in Echtzeit abzuleiten, sowie Transformationsmatrizen, um die für das Rendern von Effekten erforderlichen Transformationen durchzuführen.

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

Codebeispiel

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

Sie können die App als Ausgangspunkt für Ihre eigene Android-App verwenden oder sich daran orientieren, wenn Sie eine vorhandene App ändern. Der Beispielcode für Face Landmarker wird auf GitHub gehostet.

Code herunterladen

In der folgenden Anleitung wird beschrieben, wie Sie mit dem git-Befehlszeilentool eine lokale Kopie des Beispielcodes erstellen.

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. Optional können Sie Ihre Git-Instanz so konfigurieren, dass sie Sparse Checkout verwendet. So haben Sie nur die Dateien für die Face Landmarker-Beispiel-App:
    cd mediapipe-samples
    git sparse-checkout init --cone
    git sparse-checkout set examples/face_landmarker/android
    

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie das Projekt in Android Studio importieren und die App ausführen. Eine Anleitung dazu finden Sie im Einrichtungsleitfaden für Android.

Schlüsselkomponenten

Die folgenden Dateien enthalten den entscheidenden Code für diese Beispielanwendung zur Gesichtserkennung:

  • FaceLandmarkerHelper.kt: Initialisiert den Face Landmarker und verarbeitet die Auswahl von Modell und Delegat.
  • 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 einem Gesichts-Mesh für erkannte Gesichter.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und Ihrer Codeprojekte für die Verwendung von Face Landmarker beschrieben. Allgemeine Informationen zum Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich der Anforderungen an die Plattformversion, finden Sie im Einrichtungshandbuch für Android.

Abhängigkeiten

Für die Face Landmarker-Aufgabe wird die com.google.mediapipe:tasks-vision-Bibliothek verwendet. Fügen Sie diese Abhängigkeit der Datei build.gradle in Ihrer Android-App hinzu:

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

Modell

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

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 im Parameter ModelAssetPath an. Im Beispielcode wird das Modell in der Datei FaceLandmarkerHelper.kt definiert:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

Aufgabe erstellen

Für die MediaPipe Face Landmarker-Aufgabe wird die Funktion createFromOptions() verwendet, um die Aufgabe einzurichten. Die Funktion createFromOptions() akzeptiert Werte für die Konfigurationsoptionen. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfigurationsoptionen.

Der Face Landmarker unterstützt die folgenden Eingabedatentypen: Standbilder, Videodateien und Live-Videostreams. Beim Erstellen der Aufgabe müssen Sie den Ausführungsmodus angeben, der dem Eingabedatentyp entspricht. Wählen Sie den Tab für Ihren Eingabedatentyp aus, um zu sehen, wie Sie die Aufgabe erstellen und die Inferenz ausführen.

Bild

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)
    

Livestream

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)
    

Die Beispielcode-Implementierung für Face Landmarker ermöglicht es dem Nutzer, zwischen den Verarbeitungsmodi zu wechseln. Dieser Ansatz macht den Code zum Erstellen von Aufgaben komplizierter und ist möglicherweise nicht für Ihren Anwendungsfall geeignet. Sie können diesen Code in der Funktion setupFaceLandmarker() in der Datei FaceLandmarkerHelper.kt sehen.

Konfigurationsoptionen

Für Android-Apps stehen für diese Aufgabe die folgenden Konfigurationsoptionen zur Verfügung:

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

IMAGE: Der Modus für einzelne Bildeingaben.

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

LIVE_STREAM: Der Modus für einen Livestream von Eingabedaten, z. B. von einer Kamera. In diesem Modus muss „resultListener“ aufgerufen werden, um einen Listener einzurichten, der Ergebnisse asynchron empfängt.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
numFaces Die maximale Anzahl von Gesichtern, die von FaceLandmarker erkannt werden können. Die Glättung wird nur angewendet, wenn num_faces auf 1 gesetzt ist. Integer > 0 1
minFaceDetectionConfidence Der Mindestkonfidenzwert, damit die Gesichtserkennung als erfolgreich gilt. Float [0.0,1.0] 0.5
minFacePresenceConfidence Der minimale Konfidenzwert für die Gesichtserkennung bei der Erkennung von Gesichts-Landmarks. Float [0.0,1.0] 0.5
minTrackingConfidence Der Mindest-Konfidenzwert für das Gesichtstracking, damit es als erfolgreich gilt. Float [0.0,1.0] 0.5
outputFaceBlendshapes Gibt an, ob Face Landmarker Gesichts-Blendshapes ausgibt. Gesichts-Blendshapes werden zum Rendern des 3D-Gesichtsmodells verwendet. Boolean False
outputFacialTransformationMatrixes Gibt an, ob FaceLandmarker die Transformationsmatrix für das Gesicht ausgibt. FaceLandmarker verwendet die Matrix, um die markanten Stellen im Gesicht aus einem kanonischen Gesichtsmodell in das erkannte Gesicht zu transformieren. So können Nutzer Effekte auf die erkannten markanten Stellen anwenden. Boolean False
resultListener Legt den Ergebnis-Listener fest, der die Landmarker-Ergebnisse asynchron empfängt, wenn sich FaceLandmarker im Livestream-Modus befindet. Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist. ResultListener N/A
errorListener Legt einen optionalen Fehler-Listener fest. ErrorListener N/A

Daten vorbereiten

Face Landmarker funktioniert mit Bildern, Videodateien und Live-Videostreams. Die Aufgabe übernimmt die Vorverarbeitung der Dateneingabe, einschließlich Größenanpassung, Drehung und Wertnormalisierung.

Der folgende Code zeigt, wie Daten zur Verarbeitung übergeben werden. Diese Beispiele enthalten Details zum Umgang mit Daten aus Bildern, Videodateien und Live-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 Beispielcode für Face Landmarker wird die Datenvorbereitung in der Datei FaceLandmarkerHelper.kt durchgeführt.

Aufgabe ausführen

Verwenden Sie je nach Datentyp die FaceLandmarker.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 in einem Videostream durchführen, sollten Sie die Erkennungen in einem separaten Thread ausführen, um zu vermeiden, dass der Thread der Benutzeroberfläche blockiert wird.

Die folgenden Codebeispiele zeigen einfache Beispiele dafür, wie Face Landmarker in diesen verschiedenen Datenmodi ausgeführt wird:

Bild

val result = FaceLandmarker.detect(mpImage)
    

Video

val timestampMs = i * inferenceIntervalMs

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

Livestream

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

FaceLandmarker.detectAsync(mpImage, frameTime)
    

Wichtige Hinweise:

  • Wenn Sie den Videomodus oder den Livestream-Modus verwenden, müssen Sie den Zeitstempel des Eingabe-Frames für die Face Landmarker-Aufgabe angeben.
  • Wenn die Aufgabe im Bild- oder Videomodus ausgeführt wird, wird der aktuelle Thread blockiert, bis die Verarbeitung des Eingabebilds oder -frames abgeschlossen ist. Um die Benutzeroberfläche nicht zu blockieren, sollte die Verarbeitung in einem Hintergrundthread erfolgen.
  • Im Livestreammodus wird die Face Landmarker-Aufgabe sofort zurückgegeben und blockiert den aktuellen Thread nicht. Der Ergebnis-Listener wird mit dem Erkennungsergebnis aufgerufen, sobald die Verarbeitung eines Eingabe-Frames abgeschlossen ist.

Im Beispielcode für Face Landmarker werden die Funktionen detect, detectForVideo und detectAsync in der Datei FaceLandmarkerHelper.kt definiert.

Ergebnisse verarbeiten und anzeigen

Der Face Landmarker gibt für jeden Erkennungslauf ein FaceLandmarkerResult-Objekt zurück. Das Ergebnisobjekt enthält ein Gesichts-Mesh für jedes erkannte Gesicht mit Koordinaten für jedes Gesichtsmerkmal. Optional kann das Ergebnisobjekt auch Blendshapes enthalten, die Gesichtsausdrücke angeben, sowie Transformationsmatrizen für das Gesicht, um Gesichtseffekte auf die erkannten Landmarken anzuwenden.

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

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]
    ...

Das folgende Bild zeigt eine Visualisierung der Aufgabenausgabe:

Ein Mann, dessen Gesichtsbereiche geometrisch dargestellt sind, um die Form und Abmessungen seines Gesichts zu veranschaulichen

Der Beispielcode für Face Landmarker zeigt, wie die von der Aufgabe zurückgegebenen Ergebnisse angezeigt werden. Weitere Informationen finden Sie in der Klasse OverlayView.