מדריך זיהוי של ציון דרך ל-iOS

המשימה מיקום של ARIA מאפשרת לכם לזהות ציוני דרך של גופות אדם בתמונה או וידאו. אפשר להשתמש במשימה הזאת כדי לזהות מיקומים עיקריים של הגוף, לנתח את התנוחה ולסווג תנועות. המשימה הזו משתמשת במודלים של למידת מכונה (ML) שעובדים עם תמונות או סרטונים בודדים. במשימה נוצרת ציוני דרך בתמונה של תנוחת הגוף ובקואורדינטות תלת ממדיות בעולם.

ההוראות הבאות מראות איך להשתמש ב-Pose Scoreer באפליקציות ל-iOS. הקוד דוגמה שמתוארת בהוראות האלה זמינה GitHub.

אפשר לראות את המשימה הזו באתר . מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה במשימה הזאת סקירה כללית

קוד לדוגמה

הקוד לדוגמה של Tasks ב-MediaPipe הוא הטמעה בסיסית של Pose למטהerer. אפליקציה ל-iOS. בדוגמה, נעשה שימוש במצלמה במכשיר iOS פיזי כדי לזהות זיהוי תנוחות בשידור וידאו רציף. האפליקציה יכולה גם לזהות תנוחות תמונות וסרטונים מגלריית המכשיר.

אפשר להשתמש באפליקציה כנקודת התחלה של אפליקציה משלך ל-iOS, או להתייחס אליה כשמשנים אפליקציה קיימת. הקוד לדוגמה של Pose Placeer מתארח ב- GitHub.

להורדת הקוד

בהוראות הבאות מוסבר איך ליצור עותק מקומי של הדוגמה באמצעות כלי שורת הפקודה git.

כדי להוריד את הקוד לדוגמה:

  1. משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. לחלופין, להגדיר את מכונת ה-Git שלך לשימוש בקופה עם היעדר תשלום, כדי רק את הקבצים עבור האפליקציה לדוגמה של Pose Scoreer:

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

אחרי שתיצרו גרסה מקומית של הקוד לדוגמה, תוכלו להתקין את ספריית המשימות של MediaPipe, פותחים את הפרויקט באמצעות Xcode ומריצים את האפליקציה. עבור ההוראות מפורטות במדריך ההגדרה ל-iOS.

רכיבים מרכזיים

הקבצים הבאים מכילים את הקוד החשוב של הדוגמה Pose Courter יישום:

  • PoseLandmarkerService.swift: מאתחל את הסמן, מטפל בבחירת המודל ומפעיל הסקת מסקנות בנתוני הקלט.
  • CameraViewController: הטמעה של ממשק המשתמש עבור מצב הקלט של פיד המצלמה בשידור חי והצגה חזותית של של ציוני דרך.
  • MediaLibraryViewController.swift: מטמיע את ממשק המשתמש עבור מצב קלט של קובצי תמונה ווידאו שמציג את ציוני הדרך.

הגדרה

בקטע הזה מתוארים השלבים העיקריים להגדרת סביבת הפיתוח כדי להשתמש ב-Pose Lander. לקבלת מידע כללי על הגדרת סביבת פיתוח לשימוש במשימות MediaPipe, כולל גרסת פלטפורמה מומלץ לעיין במדריך ההגדרה ל-iOS.

יחסי תלות

ב-Pose Scoreer נעשה שימוש בספרייה MediaPipeTasksVision, שחובה להתקין. באמצעות CocoaPods. הספרייה תואמת גם לאפליקציות Swift ו-Objective-C ולא נדרשת הגדרה נוספת ספציפית לשפה.

הוראות להתקנת CocoaPods ב-macOS מפורטות במאמר CocoaPods במדריך ההתקנה. לקבלת הוראות ליצירת Podfile עם ה-pods שדרושים באפליקציה, קראו את המאמר שימוש CocoaPods.

מוסיפים את הרצף של MediaPipeTasksVision ב-Podfile באמצעות הקוד הבא:

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

אם האפליקציה שלך כוללת יעדים לבדיקת יחידות, יש לעיין במדריך ההגדרה של iOS למידע נוסף על ההגדרה Podfile.

דגם

למשימה MediaPipe Pose Landerer נדרשת חבילה מאומנת שמתאימה ותאימות במשימה הזו. לקבלת מידע נוסף על מודלים זמינים מאומנים של Pose Scoreer, בודקים את הסקירה הכללית של המשימה Models .

שימוש בdownload_models.sh סקריפט כדי להוריד את המודלים ולהוסיף אותם לספריית הפרויקט באמצעות Xcode. עבור לקבלת הוראות להוספת קבצים לפרויקט Xcode, קראו את המאמר ניהול קבצים ותיקיות ב-Xcode project.

משתמשים במאפיין BaseOptions.modelAssetPath כדי לציין את הנתיב למודל ב-App Bundle. בקטע הבא מופיע קוד לדוגמה.

יצירת המשימה

כדי ליצור את המשימה Pose Scoreer אפשר להפעיל אחד מהמאתחלים שלה. המאתחל של PoseLandmarker(options:) מקבל ערכים להגדרה אפשרויות.

אם אין לכם צורך ב-Pose Placeer שאותחל עם הגדרה מותאמת אישית אפשר להשתמש במאתחל של PoseLandmarker(modelPath:) כדי ליצור מציצים בציון דרך עם אפשרויות ברירת המחדל. מידע נוסף על הגדרה אפשרויות נוספות, ראו סקירה כללית של ההגדרות.

במשימה של Pose Placeer יש תמיכה בשלושה סוגים של נתוני קלט: תמונות סטילס וקובצי וידאו בסטרימינג של וידאו בשידור חי. כברירת מחדל, PoseLandmarker(modelPath:) מאתחל לתמונות סטילס. אם רוצים שהמשימה תופעל כדי לעבד סרטון קבצים או שידורים חיים, צריך להשתמש ב-PoseLandmarker(options:) כדי לציין את הסרטון או במצב ריצה בשידור חי. במצב השידור החי נדרשות גם פעולות נוספות את אפשרות ההגדרה של poseLandmarkerLiveStreamDelegate, שמאפשרת השתמש בציון דרך כדי למסור למקבל הגישה את תוצאות הזיהוי של ציון הדרך באופן אסינכרוני.

כדי לראות איך יוצרים את המשימה, צריך לבחור את הכרטיסייה שמתאימה למצב הריצה ולהריץ את ההסקה.

Swift

תמונה

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)
    

וידאו

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)
    

שידור חי

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

תמונה

@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];
    

וידאו

@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];
    

שידור חי

@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];
    

הערה: אם משתמשים במצב סרטון או במצב שידור חי, Pose Scoreer משתמש כדי להימנע מהפעלת מודל זיהוי כף היד בכל פריים, להפחית את זמן האחזור.

אפשרויות תצורה

המשימה הזו כוללת את אפשרויות ההגדרה הבאות לאפליקציות ל-iOS:

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
running_mode מגדיר את מצב הריצה של המשימה. יש שלושה סוגים מצבים:

IMAGE: המצב לקלט של תמונה יחידה.

סרטון: המצב של פריימים מפוענחים בסרטון.

LIVE_STREAM: המצב לשידור חי של קלט נתונים ממצלמה, במצב הזה, צריך להגדיר את poseLandmarkerLiveStreamDelegate לערך מופע במחלקה שמיישם את PoseLandmarkerLiveStreamDelegate כדי לקבל את התוצאות של ביצוע זיהוי של ציון דרך באופן אסינכרוני.
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
num_poses המספר המקסימלי של תנוחות שהמערכת יכולה לזהות תנו לציוני דרך. Integer > 0 1
min_pose_detection_confidence ציון הסמך המינימלי שצריך להיות לזיהוי התנוחה נחשב למוצלח. Float [0.0,1.0] 0.5
min_pose_presence_confidence ציון הסמך המינימלי של הנוכחות בתנוחת הפוקוס בזיהוי התנוחה של ציון הדרך. Float [0.0,1.0] 0.5
min_tracking_confidence ציון הסמך המינימלי למעקב אחרי התנוחה כדי להיחשב כהצלחה. Float [0.0,1.0] 0.5
output_segmentation_masks האם Pose srcer מפיק מסיכת פילוח עבור של התנוחה. Boolean False
result_callback מגדיר את אוזן התוצאות לקבל את תוצאות ה-לדווח באופן אסינכרוני כש-Pose Lander נמצא במצב שידור חי. אפשר להשתמש באפשרות הזו רק כשמצב הריצה מוגדר ל-LIVE_STREAM ResultListener N/A

הגדרות השידור החי

כשמצב הריצה מוגדר לשידור חי, ציון הדרך ב-Pose מציין אפשרות הגדרה נוספת של poseLandmarkerLiveStreamDelegate, מאפשר ל-Pose Lander לספק תוצאות זיהוי של ציוני דרך באופן אסינכרוני. מקבל הגישה צריך להטמיע אמצעי תשלום אחד (poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)), שה-Pose Lander קורא אחרי עיבוד התוצאות של התנוחה זיהוי של ציוני דרך בכל פריים.

שם האפשרות תיאור טווח ערכים ערך ברירת מחדל
poseLandmarkerLiveStreamDelegate מאפשר ל-Pose Lander לקבל את התוצאות של ביצוע התנוחה זיהוי של ציוני דרך באופן אסינכרוני במצב חי. הכיתה את המופע שמוגדר למאפיין הזה צריך להטמיע את הפונקציה poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) . לא רלוונטי לא מוגדר

הכנת נתונים

צריך להמיר את תמונת הקלט או המסגרת לאובייקט MPImage לפני ומעבירים אותו ל-Pose Lander. ב-MPImage יש תמיכה בסוגים שונים של קובצי תמונה ב-iOS ויכולים להשתמש בהם בכל מצב ריצה לצורך הסקת מסקנות. לקבלת מידע נוסף מידע על MPImage, מתייחס MPImage API

צריך לבחור פורמט תמונה ל-iOS בהתאם לתרחיש לדוגמה שלכם ולמצב הריצה מחייב.MPImage מקבל את UIImage, CVPixelBuffer, CMSampleBuffer פורמטים של תמונות ל-iOS.

UIImage

הפורמט UIImage מתאים במיוחד למצבי הריצה הבאים:

  • תמונות: תמונות מ-App Bundle, מגלריית משתמשים או ממערכת קבצים בפורמט אפשר להמיר UIImage תמונות לאובייקט MPImage.

  • סרטונים: משתמשים ב-AVAssetImageGenerator כדי לחלץ פריימים של וידאו CGImage וממירים אותן ל-UIImage תמונות.

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];
    

הדוגמה מאתחלת MPImage עם ברירת המחדל UIImage.Orientation.Up לכיוון מסוים. אפשר לאתחל MPImage עם כל אחד מהפורמטים הנתמכים UIImage.Orientation ערכים. ב-Pose למטה אין תמיכה בכיוונים משוכפלים כמו .upMirrored, .downMirrored, .leftMirrored, .rightMirrored.

למידע נוסף על UIImage, יש לעיין ב-UIImage Apple Developer מסמכים.

CVPixelBuffer

הפורמט CVPixelBuffer מתאים מאוד לאפליקציות שיוצרות פריימים ולהשתמש ב-CoreImage של iOS לעיבוד טקסט.

הפורמט CVPixelBuffer מתאים במיוחד למצבי הריצה הבאים:

  • תמונות: אפליקציות שיוצרות CVPixelBuffer תמונות לאחר עיבוד מסוים באמצעות ה-framework של CoreImage של iOS, ניתן לשלוח אל Pose Scoreer מצב הרצת התמונות.

  • סרטונים: ניתן להמיר פריימים של וידאו לפורמט CVPixelBuffer עבור מתבצע עיבוד, ולאחר מכן נשלחים ל-Pose Lander במצב וידאו.

  • בשידור חי: אפליקציות שמשתמשות במצלמת iOS ליצירת פריימים עשויים לעבור המרה בפורמט CVPixelBuffer לעיבוד לפני השליחה מציצים ב-Lioner במצב שידור חי.

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];
    

כדי לקבל מידע נוסף על CVPixelBuffer, אפשר לעיין ב-CVPixelBuffer Apple מפתחי המשחק מסמכים.

CMSampleBuffer

הפורמט CMSampleBuffer מאחסן דוגמאות מדיה מסוג מדיה אחיד, הוא גבוה מאוד למצב ההרצה של השידור החי. הפריימים בשידור חי ממצלמות iOS מועברים באופן אסינכרוני בפורמט CMSampleBuffer על ידי iOS 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];
    

מידע נוסף על CMSampleBuffer זמין ב-CMSampleBuffer Apple מפתחי המשחק מסמכים.

הרצת המשימה

כדי להריץ את ציון הדרך של Pose, צריך להשתמש ב-method detect() שספציפית להקצאה מצב ריצה:

  • תמונת סטילס: detect(image:)
  • סרטון: detect(videoFrame:timestampInMilliseconds:)
  • צפייה בשידור חי: detectAsync(image:timestampInMilliseconds:)

דוגמאות הקוד הבאות ממחישות איך להריץ את Pose Lander ב- מצבי הריצה השונים הבאים:

Swift

תמונה

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

וידאו

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

שידור חי

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

Objective-C

תמונה

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

וידאו

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

שידור חי

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

בדוגמה של הקוד של Pose Landerer רואים את ההטמעות של כל אחד מהמצבים האלה. בצורה מפורטת יותר detect(image:), detect(videoFrame:timestampInMilliseconds:), ו-detectAsync(image:timestampInMilliseconds:). הקוד לדוגמה מאפשר משתמש כדי לעבור בין מצבי עיבוד שייתכן שהם לא נדרשים לשימוש שלך מותאמת אישית.

שימו לב לנקודות הבאות:

  • כשמפעילים במצב וידאו או במצב שידור חי, צריך גם לספק את הפרטים הבאים: חותמת הזמן של מסגרת הקלט למשימה של Pose Lander.

  • בהפעלה במצב תמונה או סרטון, המשימה Pose Scoreer חוסמת את את ה-thread הנוכחי עד לסיום העיבוד של תמונת הקלט או המסגרת. שפת תרגום לא לחסום את השרשור הנוכחי, צריך לבצע את העיבוד ברקע שרשור באמצעות iOS שליחה או NSOperation של מסגרות.

  • כשפועלים במצב שידור חי, המשימה Pose Lander חוזרת באופן מיידי והיא לא חוסמת את השרשור הנוכחי. היא מפעילה את אמצעי תשלום אחד (poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)) בתוצאת ה-positer של ה-POS, אחרי העיבוד של כל פריים הקלט. Pose Landerer מפעיל את השיטה הזו באופן אסינכרוני במכשיר טורי ייעודי תור לשליחת הודעות. להצגת תוצאות בממשק המשתמש, יש לשלוח את יוצגו לתור הראשי אחרי עיבוד התוצאות. אם detectAsync נשלחת קריאה לפונקציה כאשר המשימה Pose Landerer עסוקה בעיבוד אחר מסגרת הקלט, Pose Scoreer מתעלם ממסגרת הקלט החדשה.

טיפול בתוצאות והצגתן

כשמריצים את ההסקה, המשימה Pose Lander מחזירה PoseLandmarkerResult שמכיל את הקואורדינטות של כל ציון דרך של מיקום.

בדוגמה הבאה אפשר לראות את נתוני הפלט מהמשימה:

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)

הפלט מכיל גם קואורדינטות מנורמלות (Landmarks) וגם את העולם את הקואורדינטות (WorldLandmarks) של כל ציון דרך.

הפלט מכיל את הקואורדינטות המנורמלות הבאות (Landmarks):

  • x ו-y: קואורדינטות של ציון דרך, מנורמלות בין 0.0 ל-1.0 באמצעות רוחב התמונה (x) וגובה התמונה (y).

  • z: העומק של ציון הדרך, כשהעומק בנקודת האמצע של הירכיים הוא המקור. ככל שהערך קטן יותר, כך ציון הדרך קרוב יותר למצלמה. הגודל z משתמש בסולם זהה לזה של x.

  • visibility: הסבירות שציון הדרך יופיע בתמונה.

הפלט מכיל את קואורדינטות העולם הבאות (WorldLandmarks):

  • x, y ו-z: קואורדינטות תלת-ממדיות בעולם האמיתי במטרים, כאשר נקודת האמצע של הירכיים בתור המקור.

  • visibility: הסבירות שציון הדרך יופיע בתמונה.

בתמונה הזו אפשר לראות את פלט המשימה:

מסכת הפילוח האופציונלית מייצגת את הסבירות של כל פיקסל לאדם שזוהה. התמונה הבאה היא מסכת הפילוח של פלט המשימה:

הקוד לדוגמה של 'ציון הדרך' מדגים איך להציג את ציון הדרך של 'מיקום' תוצאות.