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:
- Klonen Sie das Git-Repository mit dem folgenden Befehl:
git clone https://github.com/google-ai-edge/mediapipe-samples
- 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
.