Mit der MediaPipe-Aufgabe „Pose Landmarker“ können Sie in einem Bild oder Video die Körpermerkmale von Menschen erkennen. Mit dieser Aufgabe können Sie wichtige Körperstellen identifizieren, die Körperhaltung analysieren und Bewegungen kategorisieren. Für diese Aufgabe werden ML-Modelle verwendet, die mit einzelnen Bildern oder Videos funktionieren. Die Aufgabe gibt Markierungen für die Körperhaltung in Bildkoordinaten und in dreidimensionalen Weltkoordinaten aus.
In dieser Anleitung erfahren Sie, wie Sie den Pose Landmarker für Webanwendungen und JavaScript-Apps verwenden. Weitere Informationen zu den Funktionen, Modellen und Konfigurationsoptionen dieser Aufgabe finden Sie in der Übersicht.
Codebeispiel
Der Beispielcode für den Pose Landmarker bietet eine vollständige Implementierung dieser Aufgabe in JavaScript. Mit diesem Code können Sie diese Aufgabe testen und mit dem Erstellen Ihrer eigenen App für die Körperhaltungserkennung beginnen. Sie können den Beispielcode für die Körperhaltungserkennung ganz einfach in Ihrem Webbrowser aufrufen, ausführen und bearbeiten.
Einrichtung
In diesem Abschnitt werden die wichtigsten Schritte zur Einrichtung Ihrer Entwicklungsumgebung speziell für die Verwendung von Pose Landmarker beschrieben. Allgemeine Informationen zum Einrichten Ihrer Web- und JavaScript-Entwicklungsumgebung, einschließlich Anforderungen an die Plattformversion, finden Sie im Einrichtungsleitfaden für das Web.
JavaScript-Pakete
Der Code für die Landmark-Erkennung von Körperhaltungen ist über das @mediapipe/tasks-vision
NPM-Paket von MediaPipe verfügbar. Du kannst diese Bibliotheken finden und herunterladen, indem du der Anleitung im Einrichtungsleitfaden folgst.
Sie können die erforderlichen Pakete über NPM mit dem folgenden Befehl installieren:
npm install @mediapipe/tasks-vision
Wenn Sie den Aufgabencode über einen CDN-Dienst (Content Delivery Network) importieren möchten, fügen Sie den folgenden Code in das <head>-Tag in Ihrer HTML-Datei ein:
<!-- You can replace JSDeliver with another CDN if you prefer -->
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.js"
crossorigin="anonymous"></script>
</head>
Modell
Für die MediaPipe-Aufgabe „Pose Landmarker“ ist ein trainiertes Modell erforderlich, das mit dieser Aufgabe kompatibel ist. Weitere Informationen zu verfügbaren trainierten Modellen für den Pose-Landmarker finden Sie in der Aufgabenübersicht im Abschnitt „Modelle“.
Wählen Sie ein Modell aus, laden Sie es herunter und speichern Sie es in Ihrem Projektverzeichnis:
<dev-project-root>/app/shared/models/
Aufgabe erstellen
Verwenden Sie eine der createFrom...()
-Funktionen für die Pose-Landmark-Erfassung, um die Aufgabe für die Ausführung von Inferenzen vorzubereiten. Verwenden Sie die createFromModelPath()
-Funktion mit einem relativen oder absoluten Pfad zur Datei des trainierten Modells.
Wenn Ihr Modell bereits in den Arbeitsspeicher geladen ist, können Sie die Methode createFromModelBuffer()
verwenden.
Im folgenden Codebeispiel wird gezeigt, wie die Aufgabe mit der Funktion createFromOptions()
eingerichtet wird. Mit der Funktion createFromOptions()
können Sie den Positionsmarkierungs-Marker mit Konfigurationsoptionen anpassen. Weitere Informationen zu Konfigurationsoptionen finden Sie unter Konfigurationsoptionen.
Im folgenden Code wird gezeigt, wie die Aufgabe mit benutzerdefinierten Optionen erstellt und konfiguriert wird:
const vision = await FilesetResolver.forVisionTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const poseLandmarker = await poseLandmarker.createFromOptions(
vision,
{
baseOptions: {
modelAssetPath: "path/to/model"
},
runningMode: runningMode
});
Konfigurationsoptionen
Für diese Aufgabe sind die folgenden Konfigurationsoptionen für Web- und JavaScript-Anwendungen verfügbar:
Option | Beschreibung | Wertebereich | Standardwert |
---|---|---|---|
runningMode |
Legt den Ausführungsmodus für die Aufgabe fest. Es gibt zwei Modi: IMAGE: Der Modus für einzelne Bildeingaben. VIDEO: Der Modus für decodierte Frames eines Videos oder eines Livestreams von Eingabedaten, z. B. von einer Kamera. |
{IMAGE, VIDEO } |
IMAGE |
numPoses |
Die maximale Anzahl von Posen, die vom Landmarken-Tracker für Posen erkannt werden können. | Integer > 0 |
1 |
minPoseDetectionConfidence |
Die Mindestpunktzahl für die Konfidenz, damit die Körperhaltungserkennung als erfolgreich gilt. | Float [0.0,1.0] |
0.5 |
minPosePresenceConfidence |
Der Mindestwert der Konfidenz bei der Präsenz der Körperhaltung bei der Erkennung von Körperhaltungsmarkierungen. | Float [0.0,1.0] |
0.5 |
minTrackingConfidence |
Der Mindest-Konfidenzwert, damit die Körperhaltungserkennung als erfolgreich gilt. | Float [0.0,1.0] |
0.5 |
outputSegmentationMasks |
Gibt an, ob der Pose-Landmarker eine Segmentierungsmaske für die erkannte Pose ausgibt. | Boolean |
False |
Daten vorbereiten
Pose Landmarker kann Posen in Bildern in jedem vom Host-Browser unterstützten Format erkennen. Die Aufgabe umfasst auch die Vorverarbeitung der Dateneingabe, einschließlich Größenänderung, Drehung und Wertnormalisierung. Wenn du Posen in Videos markieren möchtest, kannst du mit der API schnell einen Frame nach dem anderen verarbeiten und anhand des Zeitstempels des Frames bestimmen, wann die Posen im Video vorkommen.
Aufgabe ausführen
Der Pose-Landmarker verwendet die Methoden detect()
(mit Ausführungsmodus IMAGE
) und detectForVideo()
(mit Ausführungsmodus VIDEO
), um Inferenzen auszulösen. Die Aufgabe verarbeitet die Daten, versucht, Posen zu markieren, und meldet dann die Ergebnisse.
Aufrufe der Methoden „Pose Landmarker“ detect()
und detectForVideo()
werden synchron ausgeführt und blockieren den User-Interpose-Thread. Wenn du Posen in Videoframes von der Kamera eines Geräts erkennst, wird der Haupt-Thread bei jeder Erkennung blockiert. Sie können dies verhindern, indem Sie Webworker implementieren, um die detect()
- und detectForVideo()
-Methoden in einem anderen Thread auszuführen.
Im folgenden Code wird gezeigt, wie die Verarbeitung mit dem Aufgabenmodell ausgeführt wird:
Bild
const image = document.getElementById("image") as HTMLImageElement; const poseLandmarkerResult = poseLandmarker.detect(image);
Video
await poseLandmarker.setOptions({ runningMode: "VIDEO" }); let lastVideoTime = -1; function renderLoop(): void { const video = document.getElementById("video"); if (video.currentTime !== lastVideoTime) { const poseLandmarkerResult = poseLandmarker.detectForVideo(video); processResults(detections); lastVideoTime = video.currentTime; } requestAnimationFrame(() => { renderLoop(); }); }
Eine vollständigere Implementierung zum Ausführen einer Pose-Landmark-Aufgabe finden Sie im Codebeispiel.
Ergebnisse verarbeiten und anzeigen
Der Positions-Landmarker gibt für jeden Erkennungslauf ein poseLandmarkerResult
-Objekt zurück. Das Ergebnisobjekt enthält Koordinaten für jedes Positionsmerkmal.
Im Folgenden finden Sie ein Beispiel für die Ausgabedaten dieser Aufgabe:
PoseLandmarkerResult:
Landmarks:
Landmark #0:
x : 0.638852
y : 0.671197
z : 0.129959
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.634599
y : 0.536441
z : -0.06984
visibility : 0.999909
presence : 0.999958
... (33 landmarks per pose)
WorldLandmarks:
Landmark #0:
x : 0.067485
y : 0.031084
z : 0.055223
visibility : 0.9999997615814209
presence : 0.9999984502792358
Landmark #1:
x : 0.063209
y : -0.00382
z : 0.020920
visibility : 0.999976
presence : 0.999998
... (33 world landmarks per pose)
SegmentationMasks:
... (pictured below)
Die Ausgabe enthält sowohl normalisierte Koordinaten (Landmarks
) als auch Weltkoordinaten (WorldLandmarks
) für jedes Wahrzeichen.
Die Ausgabe enthält die folgenden normalisierten Koordinaten (Landmarks
):
x
undy
: Koordinaten des Wahrzeichens, die anhand der Bildbreite (x
) und -höhe (y
) auf 0,0 bis 1,0 normalisiert sind.z
: Die Landmarkentiefe, wobei die Tiefe an der Mitte der Hüften als Ursprung dient. Je kleiner der Wert, desto näher ist das Wahrzeichen an der Kamera. Für die Größe von z wird ungefähr dieselbe Skala wie fürx
verwendet.visibility
: Die Wahrscheinlichkeit, dass das Wahrzeichen im Bild zu sehen ist.
Die Ausgabe enthält die folgenden Weltkoordinaten (WorldLandmarks
):
x
,y
undz
: Dreidimensionale Koordinaten in Metern, die vom Mittelpunkt der Hüften ausgehen.visibility
: Die Wahrscheinlichkeit, dass das Wahrzeichen im Bild zu sehen ist.
Die folgende Abbildung zeigt eine Visualisierung der Aufgabenausgabe:
Die optionale Segmentierungsmaske gibt an, wie wahrscheinlich es ist, dass jedes Pixel zu einer erkannten Person gehört. Das folgende Bild ist eine Segmentierungsmaske der Aufgabenausgabe:
Im Beispielcode für die Pose-Landmark-Funktion wird gezeigt, wie die von der Aufgabe zurückgegebenen Ergebnisse angezeigt werden. Weitere Informationen finden Sie im Codebeispiel.