وظیفه Pose Landmarker به شما امکان می دهد نشانه های بدن انسان را در یک تصویر یا ویدیو تشخیص دهید. شما می توانید از این کار برای شناسایی مکان های کلیدی بدن، تجزیه و تحلیل وضعیت بدن و دسته بندی حرکات استفاده کنید. این کار از مدلهای یادگیری ماشینی (ML) استفاده میکند که با تصاویر یا ویدیوهای منفرد کار میکنند. وظیفه خروجی نقاط عطف ژست بدن در مختصات تصویر و در مختصات جهان سه بعدی است.
این دستورالعملها به شما نشان میدهند که چگونه از Pose Landmarker با برنامههای iOS استفاده کنید. نمونه کد شرح داده شده در این دستورالعمل ها در GitHub موجود است.
شما می توانید با مشاهده این نسخه نمایشی وب، این کار را در عمل مشاهده کنید. برای اطلاعات بیشتر در مورد قابلیتها، مدلها و گزینههای پیکربندی این کار، به نمای کلی مراجعه کنید.
نمونه کد
کد مثال MediaPipe Tasks یک پیاده سازی اساسی از یک برنامه Pose Landmarker برای iOS است. این مثال از دوربین یک دستگاه فیزیکی iOS برای تشخیص وضعیتها در یک جریان ویدیویی مداوم استفاده میکند. این برنامه همچنین میتواند حالتها را در تصاویر و ویدیوهای گالری دستگاه تشخیص دهد.
میتوانید از برنامه بهعنوان نقطه شروع برای برنامه iOS خودتان استفاده کنید، یا هنگام تغییر یک برنامه موجود به آن مراجعه کنید. کد نمونه Pose Landmarker در GitHub میزبانی می شود.
کد را دانلود کنید
دستورالعمل های زیر به شما نشان می دهد که چگونه با استفاده از ابزار خط فرمان git یک کپی محلی از کد مثال ایجاد کنید.
برای دانلود کد نمونه:
با استفاده از دستور زیر مخزن git را کلون کنید:
git clone https://github.com/google-ai-edge/mediapipe-samples
به صورت اختیاری، نمونه git خود را برای استفاده از پرداخت پراکنده پیکربندی کنید، بنابراین فقط فایلهای برنامه نمونه Pose Landmarker را داشته باشید:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/pose_landmarker/ios/
پس از ایجاد یک نسخه محلی از کد نمونه، می توانید کتابخانه وظایف MediaPipe را نصب کنید، پروژه را با استفاده از Xcode باز کنید و برنامه را اجرا کنید. برای دستورالعملها، به راهنمای راهاندازی برای iOS مراجعه کنید.
اجزای کلیدی
فایل های زیر حاوی کد حیاتی برای برنامه مثال Pose Landmarker هستند:
- PoseLandmarkerService.swift : نشانگر را راهاندازی میکند، انتخاب مدل را مدیریت میکند و استنتاج را روی دادههای ورودی اجرا میکند.
- CameraViewController : رابط کاربری را برای حالت ورودی تغذیه دوربین زنده پیادهسازی میکند و نشانهها را تجسم میکند.
- MediaLibraryViewController.swift : رابط کاربری را برای حالت ورودی تصویر ثابت و فایل ویدیویی پیادهسازی میکند و نشانهها را به تصویر میکشد.
برپایی
این بخش مراحل کلیدی را برای راه اندازی محیط توسعه و پروژه های کد برای استفاده از Pose Landmarker شرح می دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه خود برای استفاده از وظایف MediaPipe، از جمله الزامات نسخه پلت فرم، به راهنمای راه اندازی برای iOS مراجعه کنید.
وابستگی ها
Pose Landmarker از کتابخانه MediaPipeTasksVision
استفاده می کند که باید با استفاده از CocoaPods نصب شود. این کتابخانه با هر دو برنامه Swift و Objective-C سازگار است و نیازی به تنظیمات زبان خاصی ندارد.
برای دستورالعملهای نصب CocoaPods در macOS، به راهنمای نصب CocoaPods مراجعه کنید. برای دستورالعملهای نحوه ایجاد یک Podfile
با پادهای لازم برای برنامه خود، به استفاده از CocoaPods مراجعه کنید.
با استفاده از کد زیر، MediaPipeTasksVision pod را در Podfile
اضافه کنید:
target 'MyPoseLandmarkerApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
اگر برنامه شما شامل اهداف تست واحد است، برای اطلاعات بیشتر در مورد راهاندازی Podfile
به راهنمای تنظیم برای iOS مراجعه کنید.
مدل
وظیفه MediaPipe Pose Landmarker به یک بسته آموزش دیده نیاز دارد که با این کار سازگار باشد. برای اطلاعات بیشتر در مورد مدلهای آموزشدیده موجود برای Pose Landmarker، به بخش مدلهای نمای کلی کار مراجعه کنید.
از اسکریپت download_models.sh
برای دانلود مدل ها استفاده کنید و با استفاده از Xcode آن را به فهرست پروژه خود اضافه کنید. برای دستورالعملهایی درباره نحوه افزودن فایلها به پروژه Xcode، به مدیریت فایلها و پوشهها در پروژه Xcode خود مراجعه کنید.
از ویژگی BaseOptions.modelAssetPath
برای تعیین مسیر مدل در بسته نرم افزاری خود استفاده کنید. برای مثال کد، بخش بعدی را ببینید.
کار را ایجاد کنید
می توانید وظیفه Pose Landmarker را با فراخوانی یکی از اولیه سازهای آن ایجاد کنید. اولیه PoseLandmarker(options:)
مقادیری را برای گزینه های پیکربندی می پذیرد.
اگر به Pose Landmarker اولیه با گزینه های پیکربندی سفارشی شده نیاز ندارید، می توانید از مقداردهی اولیه PoseLandmarker(modelPath:)
برای ایجاد Pose Landmarker با گزینه های پیش فرض استفاده کنید. برای اطلاعات بیشتر درباره گزینههای پیکربندی، به نمای کلی پیکربندی مراجعه کنید.
وظیفه Pose Landmarker از 3 نوع داده ورودی پشتیبانی میکند: تصاویر ثابت، فایلهای ویدیویی و جریانهای ویدیویی زنده. به طور پیش فرض، PoseLandmarker(modelPath:)
یک کار را برای تصاویر ثابت مقداردهی اولیه می کند. اگر میخواهید وظیفه شما برای پردازش فایلهای ویدیویی یا پخش جریانی زنده ویدیویی اولیه شود، از PoseLandmarker(options:)
برای تعیین حالت اجرای ویدیو یا پخش زنده استفاده کنید. حالت پخش زنده همچنین به گزینه پیکربندی poseLandmarkerLiveStreamDelegate
اضافی نیاز دارد، که Pose Landmarker را قادر میسازد تا نتایج تشخیص نقطه عطف پوز را به صورت ناهمزمان به نماینده ارائه دهد.
برای مشاهده نحوه ایجاد کار و اجرای استنتاج، برگه مربوط به حالت در حال اجرا خود را انتخاب کنید.
سریع
تصویر
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)
هدف-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 Landmarker از ردیابی برای جلوگیری از راهاندازی مدل تشخیص کف دست در هر فریم استفاده میکند که به کاهش تأخیر کمک میکند.
گزینه های پیکربندی
این کار دارای گزینه های پیکربندی زیر برای برنامه های iOS است:
نام گزینه | شرح | محدوده ارزش | مقدار پیش فرض |
---|---|---|---|
running_mode | حالت اجرا را برای کار تنظیم می کند. سه حالت وجود دارد: IMAGE: حالت برای ورودی های تک تصویر. VIDEO: حالت برای فریم های رمزگشایی شده یک ویدیو. LIVE_STREAM: حالت پخش زنده داده های ورودی، مانند دوربین. در این حالت، poseLandmarkerLiveStreamDelegate باید روی نمونه ای از کلاسی تنظیم شود که PoseLandmarkerLiveStreamDelegate را برای دریافت نتایج تشخیص نقطه عطف پوز به صورت ناهمزمان اجرا می کند. | { RunningMode.image, RunningMode.video, RunningMode.liveStream } | RunningMode.image |
num_poses | حداکثر تعداد پوزی که می تواند توسط Pose Landmarker شناسایی شود. | 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 Landmarker یک ماسک تقسیمبندی را برای ژست شناسایی شده خروجی میدهد یا خیر. | Boolean | False |
result_callback | شنونده نتیجه را طوری تنظیم می کند که وقتی Pose Landmarker در حالت پخش زنده است، نتایج نشانگر را به صورت ناهمزمان دریافت کند. فقط زمانی قابل استفاده است که حالت اجرا روی LIVE_STREAM تنظیم شده باشد | ResultListener | N/A |
پیکربندی پخش زنده
هنگامی که حالت اجرا روی پخش زنده تنظیم می شود، Pose Landmarker به گزینه پیکربندی اضافی poseLandmarkerLiveStreamDelegate
نیاز دارد، که Pose Landmarker را قادر می سازد تا نتایج تشخیص نقطه عطف پوز را به صورت ناهمزمان ارائه دهد. نماینده باید روش poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
را اجرا کند، که Pose Landmarker پس از پردازش نتایج انجام تشخیص نقطه عطف پوز در هر فریم آن را فراخوانی می کند.
نام گزینه | شرح | محدوده ارزش | مقدار پیش فرض |
---|---|---|---|
poseLandmarkerLiveStreamDelegate | Pose Landmarker را فعال میکند تا نتایج تشخیص نقطه عطف پوس را به صورت ناهمزمان در حالت پخش زنده دریافت کند. کلاسی که نمونه آن روی این ویژگی تنظیم شده است باید متد poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) را پیاده سازی کند. | قابل اجرا نیست | تنظیم نشده |
داده ها را آماده کنید
قبل از ارسال آن به Pose Landmarker باید تصویر یا فریم ورودی را به یک شی MPImage
تبدیل کنید. MPImage
از انواع فرمت های تصویر iOS پشتیبانی می کند و می تواند از آنها در هر حالت در حال اجرا برای استنتاج استفاده کند. برای اطلاعات بیشتر در مورد MPImage
، به MPImage API مراجعه کنید
یک قالب تصویر iOS را بر اساس مورد استفاده خود و حالت اجرای مورد نیاز برنامه خود انتخاب کنید. MPImage
فرمتهای تصویر UIImage
، CVPixelBuffer
، و CMSampleBuffer
را میپذیرد.
تصویر UII
فرمت UIImage
برای حالتهای اجرای زیر مناسب است:
تصاویر: تصاویر از یک بسته نرم افزاری، گالری کاربر یا سیستم فایل فرمت شده به عنوان تصاویر
UIImage
را می توان به یک شیMPImage
تبدیل کرد.ویدیوها: از AVAssetImageGenerator برای استخراج فریم های ویدیو به فرمت CGImage استفاده کنید، سپس آنها را به تصاویر
UIImage
تبدیل کنید.
سریع
// 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)
هدف-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 Landmarker از جهتهای آینهای مانند .upMirrored
، .downMirrored
، .leftMirrored
، .rightMirrored
پشتیبانی نمیکند.
برای اطلاعات بیشتر در مورد UIImage
، به UIImage Apple Developer Documentation مراجعه کنید.
CVPixelBuffer
فرمت CVPixelBuffer
برای برنامه هایی که فریم تولید می کنند و از چارچوب CoreImage iOS برای پردازش استفاده می کنند، مناسب است.
فرمت CVPixelBuffer
برای حالتهای اجرای زیر مناسب است:
تصاویر: برنامه هایی که تصاویر
CVPixelBuffer
را پس از مدتی پردازش با استفاده از چارچوبCoreImage
iOS تولید می کنند، می توانند در حالت اجرای تصویر به Pose Landmarker ارسال شوند.فیلمها: فریمهای ویدئو را میتوان برای پردازش به فرمت
CVPixelBuffer
تبدیل کرد و سپس در حالت ویدئو به Pose Landmarker فرستاد.پخش زنده: برنامه هایی که از دوربین iOS برای تولید فریم استفاده می کنند ممکن است قبل از ارسال به Pose Landmarker در حالت پخش زنده به فرمت
CVPixelBuffer
برای پردازش تبدیل شوند.
سریع
// 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)
هدف-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 مراجعه کنید.
CMSampleBuffer
فرمت CMSampleBuffer
نمونههای رسانهای از یک نوع رسانه یکنواخت را ذخیره میکند و برای حالت پخش زنده مناسب است. قابهای زنده دوربینهای iOS بهصورت ناهمزمان در قالب CMSampleBuffer
توسط iOS AVCaptureVideoDataOutput ارائه میشوند.
سریع
// 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)
هدف-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
، به مستندات توسعه دهنده Apple CMSampleBuffer مراجعه کنید.
وظیفه را اجرا کنید
برای اجرای Pose Landmarker، از متد detect()
مخصوص حالت اجرای اختصاص داده شده استفاده کنید:
- تصویر ثابت:
detect(image:)
- ویدیو:
detect(videoFrame:timestampInMilliseconds:)
- پخش زنده:
detectAsync(image:timestampInMilliseconds:)
نمونههای کد زیر نمونههای سادهای از نحوه اجرای Pose Landmarker در این حالتهای مختلف اجرا را نشان میدهند:
سریع
تصویر
let result = try poseLandmarker.detect(image: image)
ویدئو
let result = try poseLandmarker.detect( videoFrame: image, timestampInMilliseconds: timestamp)
پخش زنده
try poseLandmarker.detectAsync( image: image, timestampInMilliseconds: timestamp)
هدف-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 Landmarker اجرای هر یک از این حالتها را با جزئیات بیشتری نشان میدهد detect(image:)
, detect(videoFrame:timestampInMilliseconds:)
و detectAsync(image:timestampInMilliseconds:)
. کد مثال به کاربر اجازه می دهد تا بین حالت های پردازشی که ممکن است برای مورد استفاده شما مورد نیاز نباشد جابجا شود.
به موارد زیر توجه کنید:
هنگام اجرا در حالت ویدیو یا حالت پخش زنده، باید مهر زمانی فریم ورودی را نیز به وظیفه Pose Landmarker ارائه دهید.
هنگامی که در حالت تصویر یا ویدیو اجرا می شود، وظیفه Pose Landmarker رشته فعلی را مسدود می کند تا زمانی که پردازش تصویر یا فریم ورودی به پایان برسد. برای جلوگیری از مسدود کردن رشته فعلی، پردازش را در یک رشته پسزمینه با استفاده از چارچوبهای iOS Dispatch یا NSOperation انجام دهید.
وقتی در حالت پخش زنده اجرا میشود، وظیفه Pose Landmarker بلافاصله برمیگردد و رشته فعلی را مسدود نمیکند. پس از پردازش هر فریم ورودی، متد
poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)
را با نتیجه pose landmarker فراخوانی می کند. Pose Landmarker این روش را به صورت ناهمزمان در یک صف پخش سریال اختصاصی فراخوانی می کند. برای نمایش نتایج در رابط کاربری، پس از پردازش نتایج، نتایج را به صف اصلی ارسال کنید. اگر زمانی که وظیفه Pose Landmarker مشغول پردازش فریم دیگری است، تابعdetectAsync
فراخوانی شود، Pose Landmarker فریم ورودی جدید را نادیده می گیرد.
کنترل و نمایش نتایج
پس از اجرای استنتاج، وظیفه Pose Landmarker یک 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 Landmarker نحوه نمایش نتایج Pose Landmarker را نشان می دهد.