Leitfaden zur Erkennung von Positionsmarkierungen für iOS

Mit der Aufgabe „Pose Landmarker“ können Sie Orientierungspunkte menschlicher Körper in einem Bild oder Video. Sie können diese Aufgabe nutzen, um wichtige Körperregionen zu identifizieren, und kategorisieren Sie Bewegungen. Bei dieser Aufgabe werden Modelle für maschinelles Lernen (ML) verwendet, mit einzelnen Bildern oder Videos. Die Aufgabe gibt Text und Markierungen im Bild aus und in dreidimensionalen Weltkoordinaten angegeben werden.

In dieser Anleitung erfahren Sie, wie Sie den Pose Landmarker mit iOS-Apps verwenden. Der Code das in dieser Anleitung beschriebene Beispiel GitHub

Sie können diese Aufgabe in Aktion sehen, indem Sie dieses Web- Weitere Informationen zu Funktionen, Modellen und Konfigurationsoptionen sehen Sie sich die Übersicht:

Codebeispiel

Der Beispielcode von MediaPipe Tasks ist eine einfache Implementierung eines Pose Landmarker. App für iOS. In diesem Beispiel wird die Kamera eines physischen iOS-Geräts verwendet, um Posen in einem durchgehenden Videostream erkennen. Die App kann auch Posen in Bilder und Videos aus der Gerätegalerie.

Du kannst die App als Ausgangspunkt für deine eigene iOS-App verwenden oder darauf verweisen wenn Sie eine vorhandene App ändern. Der Beispielcode für Pose 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.

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 Beispiel-App Pose Landmarker an:

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/pose_landmarker/ios/
    

Nachdem Sie eine lokale Version des Beispielcodes erstellt haben, können Sie den MediaPipe-Aufgabenbibliothek, öffnen Sie das Projekt mit Xcode und führen Sie die App aus. Für finden Sie im Einrichtungsleitfaden für iOS.

Schlüsselkomponenten

Die folgenden Dateien enthalten den wichtigen Code für das Beispiel Pose Landmarker Anwendung:

  • PoseLandmarkerService.swift: Initialisiert den Landmarker, übernimmt die Modellauswahl und führt eine Inferenz aus für die Eingabedaten.
  • CameraViewController: Implementiert die Benutzeroberfläche für den Live-Kamerafeed-Eingabemodus und visualisiert die Sehenswürdigkeiten.
  • MediaLibraryViewController.swift: Implementiert die Benutzeroberfläche für den Eingabemodus für Standbilder und Videodateien und die Orientierungspunkte visualisieren.

Einrichtung

In diesem Abschnitt werden die wichtigsten Schritte zum Einrichten Ihrer Entwicklungsumgebung und für die Verwendung von Pose Landmarker programmieren. Allgemeine Informationen zum Einrichten der Entwicklungsumgebung für die Verwendung von MediaPipe-Aufgaben, einschließlich Plattformversion finden Sie im Einrichtungsleitfaden für iOS.

Abhängigkeiten

Pose Landmarker verwendet die Bibliothek MediaPipeTasksVision, die installiert werden muss mit CocoaPods. Die Bibliothek ist sowohl mit Swift- als auch mit Objective-C-Apps kompatibel. und erfordert keine zusätzliche sprachspezifische Einrichtung.

Eine Anleitung zur Installation von CocoaPods unter macOS findest du im Artikel zu CocoaPods Installationsanleitung. Eine Anleitung zum Erstellen eines Podfile mit den für Ihr Projekt erforderlichen Pods erhalten Sie unter Verwendung CocoaPods

Fügen Sie den MediaPipeTasksVision-Pod mit dem folgenden Code in Podfile ein:

target 'MyPoseLandmarkerApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

Falls Ihre App Einheitentestziele enthält, lesen Sie den Einrichtungsleitfaden für iOS: Weitere Informationen zur Einrichtung Dein Podfile.

Modell

Für die Aufgabe „MediaPipe Pose Landmarker“ ist ein trainiertes Bundle erforderlich, bei dieser Aufgabe. Weitere Informationen zu verfügbaren trainierten Modellen für Pose Landmarker, siehe Aufgabenübersicht Modelle .

Verwenden Sie die download_models.sh Skript um die Modelle herunterzuladen und mit Xcode zu Ihrem Projektverzeichnis hinzuzufügen. Für Eine Anleitung zum Hinzufügen von Dateien zu Ihrem Xcode-Projekt finden Sie unter Dateien verwalten und Ordner in Ihrem Xcode Projekt.

Verwenden Sie das Attribut BaseOptions.modelAssetPath, um den Pfad zum Modell anzugeben in deinem App Bundle. Ein Codebeispiel finden Sie im nächsten Abschnitt.

Aufgabe erstellen

Sie können die Aufgabe „Pose Landmarker“ erstellen, indem Sie einen ihrer Initialisierer aufrufen. Die Der PoseLandmarker(options:)-Initialisierer akzeptiert Werte für die Konfiguration Optionen.

Wenn kein Pose Landmarker mit benutzerdefinierter Konfiguration initialisiert werden muss können Sie mit dem PoseLandmarker(modelPath:)-Initialisierer ein Posen-Markierung mit den Standardoptionen. Weitere Informationen zur Konfiguration finden Sie unter Konfigurationsübersicht.

Die Aufgabe „Pose Landmarker“ unterstützt drei Eingabedatentypen: Standbilder, Videodateien und Live-Videostreams. Standardmäßig initialisiert PoseLandmarker(modelPath:) einen für Standbilder angelangt. Wenn Sie möchten, dass Ihre Aufgabe für die Verarbeitung von Videos initialisiert wird Dateien oder Live-Videostreams verwenden, geben Sie das Video mit PoseLandmarker(options:) an oder den Livestream-Laufmodus. Der Livestream-Modus erfordert außerdem die zusätzlichen poseLandmarkerLiveStreamDelegate, mit der die Pose Landmarker, um dem Bevollmächtigten die Ergebnisse der Erkennung von Pose-Markierungen zu senden asynchron programmiert.

Wählen Sie den Tab für Ihren Ausführungsmodus aus, um zu sehen, wie die Aufgabe erstellt wird und eine Inferenz ausführen.

Swift

Bild

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "pose_landmarker",
                                      ofType: "task")

let options = PoseLandmarkerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image
options.minPoseDetectionConfidence = minPoseDetectionConfidence
options.minPosePresenceConfidence = minPosePresenceConfidence
options.minTrackingConfidence = minTrackingConfidence
options.numPoses = numPoses

let poseLandmarker = try PoseLandmarker(options: options)
    

Video

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "pose_landmarker",
                                      ofType: "task")

let options = PoseLandmarkerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video
options.minPoseDetectionConfidence = minPoseDetectionConfidence
options.minPosePresenceConfidence = minPosePresenceConfidence
options.minTrackingConfidence = minTrackingConfidence
options.numPoses = numPoses

let poseLandmarker = try PoseLandmarker(options: options)
    

Livestream

import MediaPipeTasksVision

// Class that conforms to the `PoseLandmarkerLiveStreamDelegate` protocol and
// implements the method that the pose landmarker calls once it finishes
// performing pose landmark detection in each input frame.
class PoseLandmarkerResultProcessor: NSObject, PoseLandmarkerLiveStreamDelegate {

  func poseLandmarker(
    _ poseLandmarker: PoseLandmarker,
    didFinishDetection result: PoseLandmarkerResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the pose landmarker result or errors here.

  }
}

let modelPath = Bundle.main.path(forResource: "pose_landmarker",
                                      ofType: "task")

let options = PoseLandmarkerOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream
options.minPoseDetectionConfidence = minPoseDetectionConfidence
options.minPosePresenceConfidence = minPosePresenceConfidence
options.minTrackingConfidence = minTrackingConfidence
options.numPoses = numPoses

// Assign an object of the class to the `poseLandmarkerLiveStreamDelegate`
// property.
let processor = PoseLandmarkerResultProcessor()
options.poseLandmarkerLiveStreamDelegate = processor

let poseLandmarker = try PoseLandmarker(options: options)
    

Objective-C

Bild

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker"
                                                      ofType:@"task"];

MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;
options.minPoseDetectionConfidence = minPoseDetectionConfidence;
options.minPosePresenceConfidence = minPosePresenceConfidence;
options.minTrackingConfidence = minTrackingConfidence;
options.numPoses = numPoses;

MPPPoseLandmarker *poseLandmarker =
  [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
    

Video

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker"
                                                      ofType:@"task"];

MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;
options.minPoseDetectionConfidence = minPoseDetectionConfidence;
options.minPosePresenceConfidence = minPosePresenceConfidence;
options.minTrackingConfidence = minTrackingConfidence;
options.numPoses = numPoses;

MPPPoseLandmarker *poseLandmarker =
  [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
    

Livestream

@import MediaPipeTasksVision;

// Class that conforms to the `MPPPoseLandmarkerLiveStreamDelegate` protocol
// and implements the method that the pose landmarker calls once it finishes
// performing pose landmarks= detection in each input frame.

@interface APPPoseLandmarkerResultProcessor : NSObject 

@end

@implementation APPPoseLandmarkerResultProcessor

-   (void)poseLandmarker:(MPPPoseLandmarker *)poseLandmarker
    didFinishDetectionWithResult:(MPPPoseLandmarkerResult *)poseLandmarkerResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the pose landmarker result or errors here.

}

@end

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"pose_landmarker"
                                                      ofType:@"task"];

MPPPoseLandmarkerOptions *options = [[MPPPoseLandmarkerOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;
options.minPoseDetectionConfidence = minPoseDetectionConfidence;
options.minPosePresenceConfidence = minPosePresenceConfidence;
options.minTrackingConfidence = minTrackingConfidence;
options.numPoses = numPoses;

// Assign an object of the class to the `poseLandmarkerLiveStreamDelegate`
// property.
APPPoseLandmarkerResultProcessor *processor =
  [APPPoseLandmarkerResultProcessor new];
options.poseLandmarkerLiveStreamDelegate = processor;

MPPPoseLandmarker *poseLandmarker =
  [[MPPPoseLandmarker alloc] initWithOptions:options error:nil];
    

Hinweis:Im Video- oder Livestream-Modus werden für die Pose-Markierung um zu verhindern, dass in jedem Frame das Handflächenerkennungsmodell ausgelöst wird. die Latenz zu reduzieren.

Konfigurationsoptionen

Diese Aufgabe bietet die folgenden Konfigurationsoptionen für iOS-Apps:

Option Beschreibung Wertebereich Standardwert
running_mode 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 poseLandmarkerLiveStreamDelegate auf Eine Instanz einer Klasse, die den PoseLandmarkerLiveStreamDelegate, um die Ergebnisse von Asynchrone Erkennung von Sehenswürdigkeiten durchführen.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
num_poses Die maximale Anzahl der Posen, die vom Pose-Markierung Integer > 0 1
min_pose_detection_confidence Der minimale Konfidenzwert für die Pose-Erkennung als erfolgreich angesehen wird. Float [0.0,1.0] 0.5
min_pose_presence_confidence Der minimale Konfidenzwert für die Präsenz in Posen bei der Erkennung von Orientierungspunkten für Posen. Float [0.0,1.0] 0.5
min_tracking_confidence Der minimale Konfidenzwert für das Positions-Tracking um als erfolgreich zu gelten. Float [0.0,1.0] 0.5
output_segmentation_masks Legt fest, ob Pose Landmarker eine Segmentierungsmaske für die erkannte Pose. Boolean False
result_callback Legt den Ergebnis-Listener so fest, dass er die Landmark-Ergebnisse empfängt asynchron, wenn sich Pose Landmarker im Livestreammodus befindet. Kann nur verwendet werden, wenn der Ausführungsmodus auf LIVE_STREAM festgelegt ist ResultListener N/A

Livestreamkonfiguration

Wenn der Laufmodus auf „Livestream“ gesetzt ist, benötigt der Pose Landmarker die Berechtigung zusätzliche poseLandmarkerLiveStreamDelegate-Konfigurationsoption, die ermöglicht es dem Pose Landmarker, Ergebnisse zur Erkennung von Pose-Markierungen zu liefern asynchron programmiert. Der Bevollmächtigte muss den Parameter Methode poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:), den der Pose Landmarker aufruft, nachdem er die Ergebnisse der Pose-Ausführung verarbeitet hat Erkennung von Sehenswürdigkeiten in jedem Frame.

Optionsname Beschreibung Wertebereich Standardwert
poseLandmarkerLiveStreamDelegate Aktiviert Pose Landmarker, um die Ergebnisse einer Pose zu erhalten im Livestream-Modus asynchron erkennen. Die Klasse, deren Instanz auf diese Eigenschaft eingestellt ist, muss den poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) . Nicht zutreffend Nicht festgelegt

Daten vorbereiten

Konvertieren Sie das Eingabebild oder den Eingabe-Frame zuerst in ein MPImage-Objekt, an den Pose Landmarker übergeben. MPImage unterstützt verschiedene Arten von iOS-Bildern Formate und können sie in jedem ausgeführten Modus für die Inferenz verwenden. Weitere Informationen Informationen zu MPImage finden Sie in der MPImage-API

Wählen Sie je nach Anwendungsfall und Laufmodus ein iOS-Bildformat aus. Anwendung erforderlich.MPImage akzeptiert die UIImage, CVPixelBuffer und CMSampleBuffer iOS-Bildformate.

UIImage

Das Format UIImage eignet sich gut für die folgenden Laufmodi:

  • Bilder: Bilder aus einem App Bundle, einer Nutzergalerie oder einem Dateisystem, die wie folgt formatiert sind: UIImage-Bilder können in ein MPImage-Objekt konvertiert werden.

  • Videos: Verwenden Sie AVAssetImageGenerator. zum Extrahieren von Videoframes CGImage Format und konvertieren Sie sie in UIImage Bilder.

Swift

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(uiImage: image)
    

Objective-C

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

In diesem Beispiel wird ein MPImage mit dem Standardwert UIImage.Orientation.Up Ausrichtung. Sie können MPImage mit einer der unterstützten UIImage.Orientation Werte. Die Pose-Markierung unterstützt keine gespiegelten Ausrichtungen wie .upMirrored, .downMirrored, .leftMirrored, .rightMirrored.

Weitere Informationen zu UIImage findest du unter UIImage Apple Developer Dokumentation.

CVPixelBuffer

Das Format CVPixelBuffer eignet sich gut für Anwendungen, die Frames generieren. und verwenden Sie das iOS-CoreImage Framework für die Verarbeitung.

Das Format CVPixelBuffer eignet sich gut für die folgenden Laufmodi:

  • Bilder: Apps, die nach einer Verarbeitung CVPixelBuffer Bilder generieren mit dem CoreImage-Framework von iOS an den Pose Landmarker im Bildlaufmodus.

  • Videos: Videoframes können für folgendes Format in das CVPixelBuffer-Format konvertiert werden: und dann im Videomodus an den Pose Landmarker gesendet.

  • Livestream: Apps, die mit einer iOS-Kamera Frames generieren, werden möglicherweise zur Verarbeitung in das CVPixelBuffer-Format konvertiert, bevor sie an den Posiere den Landmark-Modus im Livestream-Modus.

Swift

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(pixelBuffer: pixelBuffer)
    

Objective-C

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

Weitere Informationen zu CVPixelBuffer finden Sie in der CVPixelBuffer Apple-Dokumentation Entwickler*in Dokumentation.

CMSampleBuffer

Das Format CMSampleBuffer speichert Medienbeispiele eines einheitlichen Medientyps und ist eignet sich gut für den Livestream-Laufmodus. Live-Frames von iOS-Kameras asynchron im CMSampleBuffer-Format von iOS bereitgestellt AVCaptureVideoDataOutput.

Swift

// Obtain a CMSampleBuffer.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(sampleBuffer: sampleBuffer)
    

Objective-C

// Obtain a `CMSampleBuffer`.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
    

Weitere Informationen zu CMSampleBuffer finden Sie im Artikel CMSampleBuffer Apple“. Entwickler*in Dokumentation.

Aufgabe ausführen

Verwenden Sie zum Ausführen des Pose Landmarker die Methode detect(), die für den zugewiesenen Laufmodus:

  • Standbild: detect(image:)
  • Video: detect(videoFrame:timestampInMilliseconds:)
  • Livestream: detectAsync(image:timestampInMilliseconds:)

Die folgenden Codebeispiele zeigen einfache Beispiele für die Ausführung von Pose Landmarker in verschiedene Laufmodi zu testen:

Swift

Bild

let result = try poseLandmarker.detect(image: image)
    

Video

let result = try poseLandmarker.detect(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

Livestream

try poseLandmarker.detectAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

Bild

MPPPoseLandmarkerResult *result =
  [poseLandmarker detectImage:image error:nil];
    

Video

MPPPoseLandmarkerResult *result =
  [poseLandmarker detectVideoFrame:image
           timestampInMilliseconds:timestamp
                             error:nil];
    

Livestream

BOOL success =
  [poseLandmarker detectAsyncImage:image
           timestampInMilliseconds:timestamp
                             error:nil];
    

Das Codebeispiel für Pose Landmarker zeigt die Implementierungen dieser Modi detect(image:), detect(videoFrame:timestampInMilliseconds:), und detectAsync(image:timestampInMilliseconds:). Der Beispielcode ermöglicht es, zwischen Verarbeitungsmodi wechseln, was für Sie möglicherweise nicht erforderlich ist Fall.

Wichtige Hinweise:

  • Im Video- oder Livestream-Modus müssen Sie außerdem die Zeitstempel des Eingabe-Frames für die Aufgabe „Pose Landmarker“.

  • Im Bild- oder Videomodus blockiert die Aufgabe „Pose Landmarker“ die aktuellen Thread zu schreiben, bis die Verarbeitung des Eingabebilds oder -frames abgeschlossen ist. Bis Blockieren des aktuellen Threads vermeiden, Verarbeitung im Hintergrund ausführen Threads unter iOS verwenden Versand oder NSOperation Frameworks.

  • Im Livestream-Modus wird die Aufgabe „Pose Landmarker“ sofort zurückgegeben und blockiert den aktuellen Thread nicht. Es ruft die Methode poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)-Methode mit dem Pose-Landmarker-Ergebnis nach der Verarbeitung jedes Eingabeframes. Die Pose Landmarker ruft diese Methode asynchron auf einem dedizierten seriellen Weiterleitungswarteschlange. Erstellen Sie zum Anzeigen der Ergebnisse auf der Benutzeroberfläche den Befehl nach der Verarbeitung der Ergebnisse an die Hauptwarteschlange. Wenn die detectAsync wird aufgerufen, wenn die Pose Landmarker-Aufgabe mit der Verarbeitung einer anderen Aufgabe beschäftigt ist. -Frame ignoriert den neuen Eingabeframe.

Ergebnisse verarbeiten und anzeigen

Beim Ausführen einer Inferenz gibt die Pose Landmarker-Aufgabe ein PoseLandmarkerResult zurück. die die Koordinaten für jede Pose-Markierung enthält.

Im Folgenden sehen 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 Koordinaten (WorldLandmarks) für jede Sehenswürdigkeit.

Die Ausgabe enthält die folgenden normalisierten Koordinaten (Landmarks):

  • x und y: Sehenswürdigkeiten-Koordinaten, normalisiert zwischen 0,0 und 1,0 durch das Bildbreite (x) und -höhe (y).

  • z: die charakteristische Tiefe, wobei die Tiefe in der Mitte der Hüfte Ursprung. Je kleiner der Wert, desto näher liegt die Sehenswürdigkeit an der Kamera. Die Die Größe von z hat ungefähr den gleichen Maßstab wie x.

  • visibility: gibt an, wie wahrscheinlich es ist, dass die Sehenswürdigkeit im Bild zu sehen ist.

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

  • x, y und z: Reale dreidimensionale Koordinaten in Metern mit dem Attribut der Hüftmitte als Ursprung.

  • visibility: gibt an, wie wahrscheinlich es ist, dass die Sehenswürdigkeit 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 an eine erkannte Person gesendet. Das folgende Bild zeigt eine Segmentierungsmaske des Aufgabenausgabe:

Der Beispielcode für Pose Landmarker zeigt, wie der Pose Landmarker angezeigt wird Ergebnisse.