دليل رصد المعالم لنظام التشغيل iOS

تتيح لك مهمة Pose Signer رصد معالم جسم بشرية في إحدى الصور أو الفيديو القادم. يمكنك استخدام هذه المهمة لتحديد المواقع الرئيسية للجسم وتحليل الوضعية ونصنِّف الحركات. تستخدِم هذه المَهمّة نماذج تعلُّم الآلة (ML) التي تعمل باستخدام صور فردية أو فيديوهات فردية تتيح لك المهمة إخراج معالم وضعية الجسم في الصورة. وإحداثيات العالم ثلاثية الأبعاد.

توضّح لك هذه التعليمات كيفية استخدام Pose Lookerer مع تطبيقات iOS. الرمز النموذج الموصوف في هذه التعليمات على GitHub.

يمكنك رؤية هذه المهمة وهي قيد التنفيذ من خلال عرض الويب هذا تجريبي. مزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط هذه المهمة، فراجع نظرة عامة:

مثال على الرمز البرمجي

رمز مثال "مهام MediaPipe" هو تنفيذ أساسي لمصوّر Pose Scroller لنظام التشغيل iOS. يستخدم المثال الكاميرا الموجودة على جهاز iOS فعلي لاكتشاف ورصد الأوضاع في بث فيديو مستمر. يمكن للتطبيق أيضًا اكتشاف الأوضاع في الصور والفيديوهات من معرض الجهاز.

يمكنك استخدام التطبيق كنقطة بداية لتطبيق iOS، أو الرجوع إليه عند تعديل تطبيق حالي. تتم استضافة نموذج الرمز البرمجي Pose Lookerer على. GitHub.

تنزيل الرمز

توضّح لك التعليمات التالية كيفية إنشاء نسخة على الجهاز من هذا المثال. باستخدام أداة سطر الأوامر git.

لتنزيل نموذج الرمز:

  1. استنساخ مستودع git باستخدام الأمر التالي:

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. يمكنك اختياريًا ضبط مثيل git لاستخدام عملية دفع متفرقة، وبالتالي فقط ملفات تطبيق Pose Markdown كمثال:

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

بعد إنشاء نسخة محلية من نموذج الرمز، يمكنك تثبيت مكتبة مهام MediaPipe، افتح المشروع باستخدام Xcode وشغِّل التطبيق. بالنسبة التعليمات، راجِع دليل إعداد iOS.

المكوّنات الرئيسية

تحتوي الملفات التالية على الكود المهم لمثال Pose تاريخيer app:

  • PoseLandmarkerService.swift: يؤدي هذا الإعداد إلى إعداد معلم الجذب ومعالجة اختيار النموذج وتنفيذ الاستنتاج. على بيانات الإدخال.
  • CameraViewController: لتنفيذ واجهة المستخدم لوضع إدخال خلاصة الكاميرا المباشرة وعرض المعالم.
  • MediaLibraryViewController.swift: لتنفيذ واجهة المستخدم لوضع إدخال الصور الثابتة وملفات الفيديو يتصور المعالم.

ضبط إعدادات الجهاز

يصف هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير لترميز الرموز البرمجية لاستخدام Pose Premierer. للحصول على معلومات عامة حول إعداد بيئة تطوير لاستخدام مهام MediaPipe، بما في ذلك إصدار النظام الأساسي المتطلبات، يُرجى الاطّلاع على دليل الإعداد لنظام التشغيل iOS.

التبعيات

يستخدم Pose Scroller مكتبة "MediaPipeTasksVision" التي يجب تثبيتها. باستخدام CocoaPods. المكتبة متوافقة مع تطبيقَي Swift وObjective-C ولا تتطلب أي إعداد إضافي خاص بلغة معيّنة.

للحصول على تعليمات حول تثبيت CocoaPods على نظام التشغيل macOS، يُرجى الرجوع إلى مقالة CocoaPods. دليل التركيب. للحصول على تعليمات حول كيفية إنشاء Podfile باستخدام المجموعات الصغيرة اللازمة التطبيق، راجع استخدام CocoaPods

أضِف لوحة MediaPipeTasksVision في Podfile باستخدام الرمز التالي:

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

إذا كان تطبيقك يتضمّن أهداف اختبار وحدات، راجِع دليل إعداد iOS للحصول على معلومات إضافية حول إعداد Podfile.

الطراز

تتطلب مهمة MediaPipe Pose Insightser حزمة مدرَّبة متوافقة. بهذه المهمة. لمزيد من المعلومات حول النماذج المدربة المتاحة Pose تاريخي، راجع نظرة عامة على المهمة النماذج .

يمكنك استخدام download_models.sh. نص برمجي لتنزيل النماذج وإضافتها إلى دليل المشروع باستخدام Xcode. بالنسبة تعليمات حول كيفية إضافة ملفات إلى مشروع Xcode، راجِع مقالة إدارة الملفات والمجلدات في Xcode مشروعك.

استخدِم السمة BaseOptions.modelAssetPath لتحديد مسار النموذج. في حِزمة التطبيق. للاطّلاع على مثال على الرمز البرمجي، يُرجى مراجعة القسم التالي.

إنشاء المهمة

يمكنك إنشاء مهمة Pose Insightser من خلال استدعاء أحد أدوات الإعداد الخاصة بها. تشير رسالة الأشكال البيانية يقبل برنامج تهيئة "PoseLandmarker(options:)" قيم الإعدادات الخيارات.

إذا لم تكن بحاجة إلى أداة Pose Lookerer التي تم إعدادها باستخدام الإعدادات المخصّصة الخيارات، يمكنك استخدام أداة إعداد "PoseLandmarker(modelPath:)" لإنشاء أداة تحديد الوضع مع الخيارات التلقائية. لمزيد من المعلومات عن الإعدادات اطلع على نظرة عامة على التهيئة.

تتيح مَهمّة Pose Insightser استخدام 3 أنواع من بيانات الإدخال: الصور الثابتة وملفات الفيديو. وأحداث الفيديو المباشرة بشكل تلقائي، يتم إعداد 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 Marker. التتبع لتجنب تشغيل نموذج اكتشاف راحة اليد في كل إطار، مما يساعد تقليل وقت الاستجابة

خيارات الإعداد

تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات 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 Markdown يُخرج قناع تجزئة للجهاز الذي تم رصده وضعية. Boolean False
result_callback تعيين أداة معالجة النتيجة لتلقي نتائج المعلم بشكل غير متزامن عندما يكون Pose Insights في وضع البث المباشر لا يمكن استخدام الإذن إلا عند ضبط "وضع التشغيل" على LIVE_STREAM ResultListener N/A

إعدادات البث المباشر

عند ضبط وضع الجري على "البث المباشر"، يتطلّب برنامج Pose Scroller كلاً من خيار ضبط إضافي لـ poseLandmarkerLiveStreamDelegate، والذي يمكّن Pose Marker من عرض نتائج رصد معالم الوضعية بشكل غير متزامن. على المفوَّض تنفيذ طريقة واحدة (poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:))، الذي يستدعي Pose Markdown بعد معالجة نتائج أداء وضعية الكشف عن المعالم في كل إطار.

اسم الخيار الوصف نطاق القيمة القيمة الافتراضية
poseLandmarkerLiveStreamDelegate تفعيل Pose Lookerer من أجل تلقّي نتائج وضعية الأداء رصد المعالم بشكل غير متزامن في وضع البث المباشر الفصل الذي على هذه السمة يجب أن تنفذ poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) . غير منطبق لم يتم ضبط الوضع

تجهيز البيانات

يجب تحويل الصورة المدخلة أو الإطار إلى كائن MPImage قبل وتمريره إلى Pose Leveler. يتيح MPImage أنواعًا مختلفة من صور iOS. ويمكنك استخدامها في أي وضع من أوضاع الجري للاستنتاج. لمزيد من المعلومات، المعلومات حول MPImage، فيمكنك الرجوع إلى واجهة برمجة تطبيقات MPImage

اختَر تنسيق صورة لنظام التشغيل iOS بناءً على حالة الاستخدام ووضع الجري. يتطلب التطبيق.MPImage تقبل UIImage وCVPixelBuffer و CMSampleBuffer تنسيقات للصور على نظام التشغيل iOS

UIImage

يناسب تنسيق UIImage تمامًا أوضاع الجري التالية:

  • الصور: صور من حِزمة تطبيق أو معرض مستخدمين أو نظام ملفات بتنسيق يمكن تحويل 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 Marker مع الاتجاهات المعكوسة، مثل .upMirrored. .downMirrored و.leftMirrored و.rightMirrored

للحصول على مزيد من المعلومات حول UIImage، يمكنك الرجوع إلى UIImage Apple Developer الوثائق.

CVPixelBuffer

إنّ تنسيق CVPixelBuffer مناسب تمامًا للتطبيقات التي تنشئ إطارات. واستخدام CoreImage لنظام التشغيل iOS إطار عمل المعالجة.

يناسب تنسيق CVPixelBuffer تمامًا أوضاع الجري التالية:

  • الصور: التطبيقات التي تنشئ CVPixelBuffer صورة بعد إجراء بعض المعالجة باستخدام إطار عمل CoreImage في iOS، يمكن إرسال هذا إلى Pose Designerer في وضع تشغيل الصور.

  • الفيديوهات: يمكن تحويل إطارات الفيديو إلى تنسيق CVPixelBuffer ثم إرسالها إلى أداة تحديد الموقع في وضع الفيديو.

  • البث المباشر: يمكن تحويل التطبيقات التي تستخدم كاميرا iOS لإنشاء الإطارات بتنسيق CVPixelBuffer لمعالجته قبل إرساله إلى Pose Marker في وضع البث المباشر

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 Insightser، استخدِم طريقة detect() الخاصة بالمَعلمة التي تم تعيينها. وضع الجري:

  • صورة ثابتة: detect(image:)
  • الفيديو: detect(videoFrame:timestampInMilliseconds:)
  • بث مباشر: detectAsync(image:timestampInMilliseconds:)

تعرض نماذج التعليمات البرمجية التالية أمثلة بسيطة حول كيفية تشغيل PoseMarker في أوضاع الجري المختلفة:

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 Marker عمليات تنفيذ كل وضع من هذه الأوضاع. بشكل أكثر تفصيلاً detect(image:)، detect(videoFrame:timestampInMilliseconds:)، وdetectAsync(image:timestampInMilliseconds:). يسمح المثال بالرمز البرمجي المستخدم للتبديل بين أوضاع المعالجة التي قد لا تكون مطلوبة لاستخدامك الحالة.

يُرجى ملاحظة ما يلي:

  • عند تشغيل وضع الفيديو في وضع الفيديو أو وضع البث المباشر، يجب أيضًا توفير: الطابع الزمني لإطار الإدخال لمهمة Pose Insightser

  • عند التشغيل في وضع الصور أو الفيديو، تمنع مهمة Pose Insightser سلسلة المحادثات الحالية إلى أن تنتهي من معالجة الصورة أو الإطار الذي تم إدخاله. إلى تجنَّب حظر سلسلة التعليمات الحالية، يُرجى تنفيذ المعالجة في الخلفية. سلسلة محادثات باستخدام iOS Dispatch أو NSOperation وأطر العمل.

  • عند التشغيل في وضع البث المباشر، يتم عرض مهمة Pose Scroller على الفور. ولا يحظر سلسلة المحادثات الحالية إنه يستدعي طريقة واحدة (poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)) مع نتيجة تحديد وضعية الجسم بعد معالجة كل إطار إدخال. تشير رسالة الأشكال البيانية يستدعي Pose Marker هذه الطريقة بشكل غير متزامن على رقم تسلسلي مخصّص قائمة انتظار الإرسال. لعرض النتائج على واجهة المستخدم، أرسل النتائج إلى قائمة الانتظار الرئيسية بعد معالجة النتائج. إذا كانت السمة detectAsync عند انشغال مهمة Pose تاريخي مشغولة بمعالجة الإطار، يتجاهل معلم Pose إطار الإدخال الجديد.

التعامل مع العملاء وعرض النتائج

عند تشغيل الاستنتاج، تعرض مهمة Pose Metricser رمز 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: احتمال ظهور المَعلم ضمن الصورة

تُظهر الصورة التالية تصورًا لنتج المهمة:

ويمثل قناع التقسيم الاختياري احتمالية انتماء كل بكسل. إلى شخص تم رصده الصورة التالية هي قناع تقسيم مخرجات المهمة:

يوضّح مثال رمز Pose Marker طريقة عرض أحد معلمَي Pose Insights. نتائجك.