Leitfaden zur Erkennung von Positionsmarkierungen im Web

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 und y: 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ür x verwendet.

  • visibility: Die Wahrscheinlichkeit, dass das Wahrzeichen im Bild zu sehen ist.

Die Ausgabe enthält die folgenden Weltkoordinaten (WorldLandmarks):

  • x, y und z: 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:

Eine Frau in einer meditativen Pose. Ihre Pose wird durch einen Wireframe hervorgehoben, der die Positionierung ihrer Gliedmaßen und ihres Torsos angibt.

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:

Segmentierungsmaske des vorherigen Bildes, die die Form der Frau umreißt

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.