המשימה מיקום של ARIA מאפשרת לכם לזהות ציוני דרך של גופות אדם בתמונה או וידאו. אפשר להשתמש במשימה הזאת כדי לזהות מיקומים עיקריים של הגוף, לנתח את התנוחה ולסווג תנועות. המשימה הזו משתמשת במודלים של למידת מכונה (ML) שעובדים עם תמונות או סרטונים בודדים. במשימה נוצרת ציוני דרך בתמונה של תנוחת הגוף ובקואורדינטות תלת ממדיות בעולם.
ההוראות הבאות מראות איך להשתמש ב-Pose Scoreer באפליקציות ל-iOS. הקוד דוגמה שמתוארת בהוראות האלה זמינה GitHub.
אפשר לראות את המשימה הזו באתר . מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה במשימה הזאת סקירה כללית
קוד לדוגמה
הקוד לדוגמה של Tasks ב-MediaPipe הוא הטמעה בסיסית של Pose למטהerer. אפליקציה ל-iOS. בדוגמה, נעשה שימוש במצלמה במכשיר iOS פיזי כדי לזהות זיהוי תנוחות בשידור וידאו רציף. האפליקציה יכולה גם לזהות תנוחות תמונות וסרטונים מגלריית המכשיר.
אפשר להשתמש באפליקציה כנקודת התחלה של אפליקציה משלך ל-iOS, או להתייחס אליה כשמשנים אפליקציה קיימת. הקוד לדוגמה של Pose Placeer מתארח ב- GitHub.
להורדת הקוד
בהוראות הבאות מוסבר איך ליצור עותק מקומי של הדוגמה באמצעות כלי שורת הפקודה git.
כדי להוריד את הקוד לדוגמה:
משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
git clone https://github.com/google-ai-edge/mediapipe-samples
לחלופין, להגדיר את מכונת ה-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
: הסבירות שציון הדרך יופיע בתמונה.
בתמונה הזו אפשר לראות את פלט המשימה:
מסכת הפילוח האופציונלית מייצגת את הסבירות של כל פיקסל לאדם שזוהה. התמונה הבאה היא מסכת הפילוח של פלט המשימה:
הקוד לדוגמה של 'ציון הדרך' מדגים איך להציג את ציון הדרך של 'מיקום' תוצאות.