งานจุดสังเกตของท่าทางช่วยให้คุณตรวจหาจุดสังเกตของร่างกายมนุษย์ในรูปภาพหรือวิดีโอได้ คุณสามารถใช้งานนี้เพื่อระบุตำแหน่งสำคัญของร่างกาย วิเคราะห์ท่าทาง และจัดหมวดหมู่การเคลื่อนไหว งานนี้ใช้โมเดลแมชชีนเลิร์นนิง (ML) ที่ทำงานกับรูปภาพหรือวิดีโอรายการเดียว งานนี้จะแสดงผลจุดสังเกตของท่าทางร่างกายในพิกัดรูปภาพและพิกัดโลก 3 มิติ
วิธีการเหล่านี้แสดงวิธีใช้เครื่องหมายจุดสังเกตของท่าทางกับแอป iOS ตัวอย่างโค้ดที่อธิบายในวิธีการเหล่านี้มีอยู่ใน GitHub
คุณดูการทำงานของงานนี้ได้โดยดูเว็บสาธิตนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ รูปแบบ และตัวเลือกการกําหนดค่าของงานนี้ได้ที่ภาพรวม
ตัวอย่างโค้ด
โค้ดตัวอย่างของ MediaPipe Tasks คือการใช้งานพื้นฐานของแอปเครื่องหมายจุดสังเกตของท่าทางสำหรับ iOS ตัวอย่างนี้ใช้กล้องในอุปกรณ์ iOS จริงเพื่อตรวจจับท่าทางในสตรีมวิดีโอต่อเนื่อง นอกจากนี้ แอปยังตรวจจับท่าทางในรูปภาพและวิดีโอจากแกลเลอรีของอุปกรณ์ได้ด้วย
คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับแอป iOS ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างของ Pose Landmarker โฮสต์อยู่ใน GitHub
ดาวน์โหลดรหัส
วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git
วิธีดาวน์โหลดโค้ดตัวอย่าง
- โคลนที่เก็บ Git โดยใช้คําสั่งต่อไปนี้ - git clone https://github.com/google-ai-edge/mediapipe-samples
- คุณอาจกำหนดค่าอินสแตนซ์ git ให้ใช้การตรวจสอบแบบเบาบางเพื่อให้มีเฉพาะไฟล์สำหรับแอปตัวอย่าง Pose Landmarker เท่านั้น ดังนี้ - cd mediapipe-samples git sparse-checkout init --cone git sparse-checkout set examples/pose_landmarker/ios/
หลังจากสร้างโค้ดตัวอย่างเวอร์ชันในเครื่องแล้ว คุณจะติดตั้งไลบรารีงาน MediaPipe, เปิดโปรเจ็กต์โดยใช้ Xcode และเรียกใช้แอปได้ ดูวิธีการได้ที่คู่มือการตั้งค่าสำหรับ iOS
คอมโพเนนต์หลัก
ไฟล์ต่อไปนี้มีโค้ดสําคัญสําหรับตัวอย่างแอปพลิเคชัน Pose Landmarker
- PoseLandmarkerService.swift: เริ่มต้นใช้งานเครื่องหมาย จัดการการเลือกโมเดล และเรียกใช้การอนุมานจากข้อมูลอินพุต
- CameraViewController: ใช้ UI สําหรับโหมดอินพุตฟีดกล้องสดและแสดงภาพสถานที่สำคัญ
- MediaLibraryViewController.swift: ใช้ UI สำหรับโหมดอินพุตไฟล์ภาพนิ่งและวิดีโอ และแสดงภาพสถานที่สำคัญ
ตั้งค่า
ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมการพัฒนาและโปรเจ็กต์โค้ดเพื่อใช้ Pose Landmarker ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คู่มือการตั้งค่าสำหรับ iOS
การอ้างอิง
Pose Landmarker ใช้ไลบรารี MediaPipeTasksVision ซึ่งต้องติดตั้งโดยใช้ CocoaPods ไลบรารีนี้ใช้ได้กับทั้งแอป Swift และ Objective-C และไม่จำเป็นต้องมีการตั้งค่าเพิ่มเติมสำหรับภาษาใดภาษาหนึ่ง
ดูวิธีการติดตั้ง CocoaPods ใน macOS ได้ที่คู่มือการติดตั้ง CocoaPods
ดูวิธีการสร้าง Podfile ที่มี Pod ที่จําเป็นสําหรับแอปได้ที่การใช้ CocoaPods
เพิ่มพ็อด MediaPipeTasksVision ใน Podfile โดยใช้โค้ดต่อไปนี้
target 'MyPoseLandmarkerApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end
หากแอปมีเป้าหมายการทดสอบหน่วย ให้ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่า Podfile ในคู่มือการตั้งค่าสําหรับ iOS
รุ่น
งานเครื่องหมายจุดสังเกตท่าทางของ MediaPipe ต้องใช้แพ็กเกจที่ผ่านการฝึกอบรมซึ่งเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกแล้วสำหรับโปรแกรมระบุจุดสังเกตของท่าทางได้ที่ส่วนภาพรวมของงาน โมเดล
ใช้download_models.sh
สคริปต์เพื่อดาวน์โหลดโมเดลและเพิ่มลงในไดเรกทอรีโปรเจ็กต์โดยใช้ Xcode ดูวิธีการเพิ่มไฟล์ลงในโปรเจ็กต์ Xcode ได้ที่การจัดการไฟล์และโฟลเดอร์ในโปรเจ็กต์ Xcode
ใช้พร็อพเพอร์ตี้ BaseOptions.modelAssetPath เพื่อระบุเส้นทางไปยังโมเดลใน App Bundle ดูตัวอย่างโค้ดได้ที่ส่วนถัดไป
สร้างงาน
คุณสามารถสร้างงานตัวระบุจุดสังเกตของท่าทางโดยเรียกตัวสร้างค่าเริ่มต้นอย่างใดอย่างหนึ่ง ตัวเริ่มต้น PoseLandmarker(options:) จะยอมรับค่าสําหรับตัวเลือกการกําหนดค่า
หากไม่จําเป็นต้องเริ่มต้นใช้งาน Pose Landmarker ด้วยตัวเลือกการกําหนดค่าที่กําหนดเอง คุณสามารถใช้ตัวเริ่มต้น PoseLandmarker(modelPath:) เพื่อสร้าง Pose Landmarker ด้วยตัวเลือกเริ่มต้น ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ที่ภาพรวมการกําหนดค่า
งานจุดสังเกตของท่าทางรองรับข้อมูลอินพุต 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]; 
หมายเหตุ: หากคุณใช้โหมดวิดีโอหรือโหมดสตรีมแบบสด เครื่องมือระบุจุดสังเกตของท่าทางจะใช้การติดตามเพื่อหลีกเลี่ยงการเปิดใช้งานโมเดลการตรวจจับฝ่ามือในทุกเฟรม ซึ่งจะช่วยลดความล่าช้า
ตัวเลือกการกำหนดค่า
งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป iOS
| ชื่อตัวเลือก | คำอธิบาย | ช่วงของค่า | ค่าเริ่มต้น | 
|---|---|---|---|
| running_mode | ตั้งค่าโหมดการทํางานสําหรับงาน โดยโหมดมี 3 แบบ ดังนี้ รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ 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 | ฟีเจอร์จุดสังเกตของท่าทางจะแสดงผลหน้ากากการแบ่งกลุ่มสำหรับท่าทางที่ตรวจพบหรือไม่ | Boolean | False | 
| result_callback | ตั้งค่าตัวรับผลลัพธ์ให้รับผลลัพธ์ของจุดสังเกตแบบไม่พร้อมกันเมื่อจุดสังเกตท่าทางอยู่ในโหมดสตรีมแบบสด
      ใช้ได้เมื่อตั้งค่าโหมดการทํางานเป็น LIVE_STREAMเท่านั้น | ResultListener | N/A | 
การกําหนดค่าสตรีมแบบสด
เมื่อตั้งค่าโหมดการทํางานเป็น "สตรีมแบบสด" ตัวระบุจุดสังเกตของท่าทางต้องใช้ตัวเลือกการกําหนดค่า poseLandmarkerLiveStreamDelegate เพิ่มเติม ซึ่งจะช่วยให้ตัวระบุจุดสังเกตของท่าทางสามารถแสดงผลการตรวจหาจุดสังเกตของท่าทางแบบไม่พร้อมกัน โดยผู้รับมอบสิทธิ์ต้องใช้เมธอด poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) ซึ่ง Pose Landmarker จะเรียกใช้หลังจากประมวลผลผลลัพธ์ของการตรวจหาจุดสังเกตของท่าทางในแต่ละเฟรม
| ชื่อตัวเลือก | คำอธิบาย | ช่วงของค่า | ค่าเริ่มต้น | 
|---|---|---|---|
| poseLandmarkerLiveStreamDelegate | เปิดใช้ Pose Landmarker เพื่อรับผลลัพธ์ของการตรวจหาจุดสังเกตของท่าทางแบบไม่พร้อมกันในโหมดสตรีมแบบสด คลาสที่มีการตั้งค่าอินสแตนซ์เป็นพร็อพเพอร์ตี้นี้ต้องติดตั้งใช้งานเมธอด poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) | ไม่เกี่ยวข้อง | ไม่ได้ตั้งค่า | 
เตรียมข้อมูล
คุณต้องแปลงรูปภาพหรือเฟรมอินพุตเป็นออบเจ็กต์ MPImage ก่อนส่งไปยัง Pose Landmarker MPImage รองรับรูปแบบรูปภาพ iOS ประเภทต่างๆ และใช้รูปภาพเหล่านั้นในโหมดการทํางานใดก็ได้สําหรับการอนุมาน ดูข้อมูลเพิ่มเติมเกี่ยวกับ MPImage ได้ที่ MPImage API
เลือกรูปแบบรูปภาพ iOS ตาม Use Case และโหมดการทํางานที่แอปพลิเคชันของคุณจําเป็นMPImageยอมรับรูปแบบรูปภาพ iOS UIImage, CVPixelBuffer และ CMSampleBuffer
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 ที่รองรับค่าใดก็ได้ โปรแกรมระบุจุดสังเกตของท่าทางไม่รองรับการวางแนวที่มิเรอร์ เช่น .upMirrored,
.downMirrored, .leftMirrored, .rightMirrored
ดูข้อมูลเพิ่มเติมเกี่ยวกับ UIImage ได้ที่เอกสารประกอบสำหรับนักพัฒนาแอป Apple เกี่ยวกับ UIImage
CVPixelBuffer
รูปแบบ CVPixelBuffer เหมาะสําหรับแอปพลิเคชันที่สร้างเฟรมและใช้เฟรมเวิร์ก CoreImage ของ iOS ในการประมวลผล
รูปแบบ CVPixelBuffer เหมาะสําหรับโหมดการทํางานต่อไปนี้
- รูปภาพ: แอปที่สร้างรูปภาพ - CVPixelBufferหลังจากการประมวลผลบางอย่างโดยใช้เฟรมเวิร์ก- CoreImageของ iOS สามารถส่งไปยัง Pose Landmarker ในโหมดการเรียกใช้รูปภาพ
- วิดีโอ: เฟรมวิดีโอสามารถแปลงเป็นรูปแบบ - CVPixelBufferเพื่อประมวลผล จากนั้นส่งไปยังโปรแกรมระบุจุดสังเกตของท่าทางในโหมดวิดีโอ
- สตรีมแบบสด: แอปที่ใช้กล้อง iOS เพื่อสร้างเฟรมอาจได้รับการแปลงเป็นรูปแบบ - CVPixelBufferเพื่อประมวลผลก่อนที่จะส่งไปยังโปรแกรมระบุจุดสังเกตของท่าทางในโหมดสตรีมแบบสด
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 โดย iOSAVCaptureVideoDataOutput
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 ได้ที่เอกสารประกอบสำหรับนักพัฒนาแอปของ Apple เกี่ยวกับ CMSampleBuffer
เรียกใช้งาน
หากต้องการเรียกใช้เครื่องหมายจุดสังเกตของท่าทาง ให้ใช้เมธอด detect() สำหรับโหมดการทํางานที่กําหนด ดังนี้
- ภาพนิ่ง: detect(image:)
- วิดีโอ: detect(videoFrame:timestampInMilliseconds:)
- สตรีมสด: detectAsync(image:timestampInMilliseconds:)
ตัวอย่างโค้ดต่อไปนี้แสดงตัวอย่างง่ายๆ ของวิธีเรียกใช้ Pose Landmarker ในโหมดการทํางานต่างๆ ต่อไปนี้
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];
ตัวอย่างโค้ดของจุดสังเกตของท่าทางแสดงการใช้งานแต่ละโหมดเหล่านี้โดยละเอียด detect(image:), detect(videoFrame:timestampInMilliseconds:) และ detectAsync(image:timestampInMilliseconds:) ตัวอย่างโค้ดนี้ช่วยให้ผู้ใช้สลับระหว่างโหมดการประมวลผลได้ ซึ่งอาจไม่จำเป็นสำหรับกรณีการใช้งานของคุณ
โปรดทราบดังต่อไปนี้
- เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุการประทับเวลาของเฟรมอินพุตให้กับงานตัวระบุจุดสังเกตของท่าทางด้วย 
- เมื่อทำงานในโหมดรูปภาพหรือวิดีโอ งานตัวระบุจุดสังเกตของท่าทางจะบล็อกเธรดปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จ หากต้องการหลีกเลี่ยงการบล็อกเธรดปัจจุบัน ให้ดำเนินการประมวลผลในเธรดเบื้องหลังโดยใช้เฟรมเวิร์ก Dispatch หรือ NSOperation ของ iOS 
- เมื่อทำงานในโหมดสตรีมแบบสด งานตัวระบุจุดสังเกตของท่าทางจะแสดงผลทันทีและไม่บล็อกเธรดปัจจุบัน โดยจะเรียกใช้วิธี - poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:)ด้วยผลลัพธ์ของจุดสังเกตท่าทางหลังจากประมวลผลเฟรมอินพุตแต่ละเฟรม โปรแกรมระบุจุดสังเกตของท่าทางจะเรียกใช้เมธอดนี้แบบไม่พร้อมกันในคิวการจัดเตรียมแบบอนุกรมโดยเฉพาะ หากต้องการแสดงผลลัพธ์ในอินเทอร์เฟซผู้ใช้ ให้ส่งผลลัพธ์ไปยังคิวหลักหลังจากประมวลผลผลลัพธ์แล้ว หากมีการเรียกใช้ฟังก์ชัน- detectAsyncเมื่องานเครื่องหมายจุดสังเกตของท่าทางกำลังประมวลผลเฟรมอื่นอยู่ เครื่องหมายจุดสังเกตของท่าทางจะละเว้นเฟรมอินพุตใหม่
จัดการและแสดงผลลัพธ์
เมื่อทำการอนุมาน งานที่ระบุจุดสังเกตของท่าทางจะแสดงผล 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: พิกัด 3 มิติในชีวิตจริงเป็นเมตร โดยจุดกึ่งกลางของสะโพกเป็นจุดเริ่มต้น
- visibility: ความเป็นไปได้ที่จุดสังเกตจะปรากฏในรูปภาพ
รูปภาพต่อไปนี้แสดงภาพเอาต์พุตของงาน
 
 
หน้ากากการแบ่งกลุ่ม (ไม่บังคับ) แสดงถึงความเป็นไปได้ที่แต่ละพิกเซลเป็นของบุคคลที่ตรวจพบ รูปภาพต่อไปนี้คือมาสก์การแบ่งกลุ่มของเอาต์พุตของงาน
 
 
โค้ดตัวอย่างของ Pose Landmarker แสดงวิธีแสดงผลลัพธ์ของ Pose Landmarker