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

Mit der Aufgabe „MediaPipe Face Landmarker“ können Sie Gesichtsmerkmale und Gesichtsausdrücke in Bilder und Videos. Mit dieser Aufgabe können Sie menschliche Gesichtsausdrücke, Filter und Effekte für das Gesicht anwenden und virtuelle Avatare erstellen. Bei dieser Aufgabe werden Modelle für maschinelles Lernen (ML), die mit einzelnen Bildern oder einem kontinuierlichen einen Stream von Bildern. Die Aufgabe gibt dreidimensionale Orientierungspunkte für Gesichter aus: blendshape Werte (Koeffizienten, die den Gesichtsausdruck repräsentieren) ableiten, um detaillierte Gesichtsausdrücke abzuleiten in Echtzeit und Transformationsmatrizen, um die Transformationen, die für das Effektrendering erforderlich sind.

Das in dieser Anleitung beschriebene Codebeispiel ist auf GitHub Weitere Informationen zu Funktionen, Modellen und Konfigurationsoptionen Sehen Sie sich die Übersicht an.

Codebeispiel

Der Beispielcode von MediaPipe Tasks ist eine einfache Implementierung eines Face Landmarker. 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 in Bilder und Videos aus der Gerätegalerie.

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 Face Landmarker 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, damit Sie nur die Dateien für die Face Landmarker-Beispiel-App:
    cd mediapipe
    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 importieren in Android Studio ein und führen die App aus. Anweisungen hierzu finden Sie im Einrichtungsleitfaden für Android-Geräte

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für dieses Beispiel mit Markierungen für Gesichter Anwendung:

  • FaceLandmarkerHelper.kt: Initialisiert den Gesichts-Landmarker und verwaltet das Modell und die Delegierung 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: Auf dem Display wird für erkannte Gesichter ein Face Mesh implementiert.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und für die Verwendung von Face Landmarker erstellen. Allgemeine Informationen zu Einrichten Ihrer Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Anforderungen an die Plattformversion finden Sie im Einrichtungsleitfaden für Android-Geräte

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

Abhängigkeiten

Bei der Aufgabe „Face Landmarker“ wird die Bibliothek com.google.mediapipe:tasks-vision verwendet. Hinzufügen diese Abhängigkeit zur build.gradle-Datei deiner Android-App:

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

Modell

Für die Aufgabe „MediaPipe Face Landmarker“ ist ein trainiertes Modell-Bundle erforderlich, das mit für diese Aufgabe. Weitere Informationen zu verfügbaren trainierten Modellen für Face Landmarker 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 haben, wird das Modell im FaceLandmarkerHelper.kt Datei:

baseOptionsBuilder.setModelAssetPath(MP_FACE_LANDMARKER_TASK)

Aufgabe erstellen

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

Face Landmarker unterstützt die folgenden Eingabedatentypen: Standbilder, Video und Live-Videostreams. Du musst den Laufmodus angeben die dem Eingabedatentyp entsprechen. Tab auswählen für Ihren Eingabedatentyp, um zu sehen, wie Sie die Aufgabe erstellen und ausführen Inferenz.

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)
    

Mit der Implementierung des Beispielcodes für Face Landmarker können 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 setupFaceLandmarker() in der Spalte FaceLandmarkerHelper.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
numFaces Die maximale Anzahl an Gesichtern, die von FaceLandmarker. Die Glättung wird nur angewendet, num_faces ist auf „1“ festgelegt. Integer > 0 1
minFaceDetectionConfidence Der minimale Konfidenzwert für die Gesichtserkennung als erfolgreich angesehen wird. Float [0.0,1.0] 0.5
minFacePresenceConfidence Der minimale Konfidenzwert für die Anwesenheit von Gesichtern bei der Erkennung von Gesichtsmerkmalen. Float [0.0,1.0] 0.5
minTrackingConfidence Der minimale Konfidenzwert für die Gesichtserkennung um als erfolgreich zu gelten. Float [0.0,1.0] 0.5
outputFaceBlendshapes Gibt an, ob Face Landmarker Überblendungen von Gesichtern ausgibt. Mischformen für Flächen werden für das Rendern des 3D-Gesichtsmodells verwendet. Boolean False
outputFacialTransformationMatrixes Gibt an, ob FaceLandmarker das Gesicht ausgibt Transformationsmatrix. FaceLandmarker verwendet die um die Orientierungspunkte von einem kanonischen Gesichtsmodell erkanntes Gesicht, sodass Nutzer Effekte auf die erkannten Sehenswürdigkeiten anwenden können. Boolean False
resultListener Legt fest, dass der Ergebnis-Listener die Landmark-Ergebnisse empfangen soll asynchron, 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 kann mit Bildern, Videodateien und Live-Videostreams verwendet werden. 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 Face Landmarker-Beispielcode erfolgt die Datenvorbereitung in der FaceLandmarkerHelper.kt -Datei.

Aufgabe ausführen

Je nach Art der Daten, mit denen Sie arbeiten, verwenden Sie 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 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 zum Ausführen von Face Landmarker in diesen verschiedenen Datenmodi:

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:

  • Im Video- oder Livestreammodus müssen Sie Zeitstempel des Eingabe-Frames für die Face Landmarker-Task.
  • Im Bild- oder Videomodus werden die Aufgaben in den aktuellen Thread verschieben, bis die Verarbeitung des Eingabebilds oder -frames abgeschlossen ist. Bis Blockierung der Benutzeroberfläche vermeiden, Verarbeitung im Hintergrund ausführen Diskussions-Thread.
  • Im Livestreammodus wird die Aufgabe „Face Landmarker“ zurückgegeben: sofort und blockiert den aktuellen Thread nicht. Das Ergebnis wird aufgerufen. Listener mit dem Erkennungsergebnis, sobald er die Verarbeitung eines Eingabe-Frame.

Im Face Landmarker-Beispielcode werden detect, detectForVideo und detectAsync-Funktionen sind in den FaceLandmarkerHelper.kt -Datei.

Ergebnisse verarbeiten und anzeigen

Face Landmarker gibt für jede Erkennung ein FaceLandmarkerResult-Objekt zurück. ausführen. Das Ergebnisobjekt enthält für jedes erkannte Gesicht ein Face Mesh mit Koordinaten für jede Orientierungsstelle der Gesichter. Optional kann das Ergebnisobjekt auch Mimikformen enthalten, die Gesichtsausdrücke kennzeichnen, und eine Gesichtsform Transformationsmatrizen, um Gesichtseffekte auf die erkannten Orientierungspunkte 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]
    ...

Die folgende Abbildung zeigt eine Visualisierung der Aufgabenausgabe:

Der Beispielcode für Face Landmarker zeigt, wie die zurückgegebenen Ergebnisse angezeigt werden. sehen Sie sich die OverlayView .