โพสท่าการตรวจหาจุดสังเกตสำหรับ iOS

งานจุดสังเกตของท่าทางช่วยให้คุณตรวจหาจุดสังเกตของร่างกายมนุษย์ในรูปภาพหรือวิดีโอได้ คุณสามารถใช้งานนี้เพื่อระบุตำแหน่งสำคัญของร่างกาย วิเคราะห์ท่าทาง และจัดหมวดหมู่การเคลื่อนไหว งานนี้ใช้โมเดลแมชชีนเลิร์นนิง (ML) ที่ทำงานกับรูปภาพหรือวิดีโอเดี่ยว งานนี้จะแสดงผลจุดสังเกตท่าทางของร่างกายในพิกัดรูปภาพและพิกัดโลก 3 มิติ

วิธีการเหล่านี้แสดงวิธีใช้เครื่องหมายจุดสังเกตของท่าทางกับแอป iOS ตัวอย่างโค้ดที่อธิบายในวิธีการเหล่านี้มีอยู่ใน GitHub

คุณสามารถดูการทํางานของงานนี้ได้โดยดูการสาธิตบนเว็บนี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ โปรดดูที่ภาพรวม

ตัวอย่างโค้ด

โค้ดตัวอย่างของ MediaPipe Tasks คือการใช้งานพื้นฐานของแอปเครื่องหมายจุดสังเกตของท่าทางสำหรับ iOS ตัวอย่างนี้ใช้กล้องในอุปกรณ์ iOS จริงเพื่อตรวจจับท่าทางในสตรีมวิดีโอต่อเนื่อง นอกจากนี้ แอปยังตรวจจับท่าทางในรูปภาพและวิดีโอจากแกลเลอรีของอุปกรณ์ได้ด้วย

คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสําหรับแอป iOS ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างของ Pose Landmarker โฮสต์อยู่ใน GitHub

ดาวน์โหลดโค้ด

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. คุณอาจกำหนดค่าอินสแตนซ์ 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: ใช้ UI สําหรับโหมดอินพุตฟีดกล้องสดและแสดงภาพสถานที่สำคัญ
  • MediaLibraryViewController.swift: ใช้ UI สำหรับโหมดป้อนข้อมูลไฟล์ภาพนิ่งและวิดีโอ รวมถึงแสดงภาพจุดสังเกต

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์และโปรเจ็กต์โค้ดเพื่อใช้ Poseจุดสังเกต ดูข้อมูลทั่วไปเกี่ยวกับการตั้งค่าสภาพแวดล้อมการพัฒนาเพื่อใช้งาน MediaPipe รวมถึงข้อกำหนดเวอร์ชันแพลตฟอร์มได้ที่คู่มือการตั้งค่าสำหรับ iOS

การอ้างอิง

Pose Landmarker ใช้ไลบรารี MediaPipeTasksVision ซึ่งต้องติดตั้งโดยใช้ CocoaPods ไลบรารีนี้ใช้ได้กับทั้งแอป Swift และ Objective-C และไม่จําเป็นต้องตั้งค่าเฉพาะภาษาเพิ่มเติม

ดูวิธีการติดตั้ง CocoaPods ใน macOS ได้ที่คู่มือการติดตั้ง CocoaPods ดูวิธีการสร้าง Podfile ที่มีพ็อดที่จำเป็นสำหรับแอปได้ที่การใช้ CocoaPods

เพิ่มพ็อด MediaPipeTasksVision ใน Podfile โดยใช้โค้ดต่อไปนี้

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

หากแอปมีเป้าหมายการทดสอบ 1 หน่วย โปรดดูข้อมูลการตั้งค่า Podfile เพิ่มเติมในคู่มือการตั้งค่าสำหรับ iOS

รุ่น

งานเครื่องมือจุดสังเกตของ MediaPipe Pose ต้องใช้ Bundle ที่ผ่านการฝึกอบรมและเข้ากันได้กับงานนี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกอบรมแล้วสำหรับโปรแกรมระบุจุดสังเกตของท่าทางได้ที่ส่วนภาพรวมของงานโมเดล

ใช้download_models.sh สคริปต์เพื่อดาวน์โหลดโมเดลและเพิ่มลงในไดเรกทอรีโปรเจ็กต์โดยใช้ Xcode ดูวิธีการเพิ่มไฟล์ลงในโปรเจ็กต์ Xcode ได้ที่การจัดการไฟล์และโฟลเดอร์ในโปรเจ็กต์ Xcode

ใช้พร็อพเพอร์ตี้ BaseOptions.modelAssetPath เพื่อระบุเส้นทางไปยังโมเดลใน App Bundle ดูตัวอย่างโค้ดได้ที่ส่วนถัดไป

สร้างงาน

คุณสามารถสร้างงานตัวระบุจุดสังเกตของท่าทางโดยเรียกตัวสร้างค่าเริ่มต้นอย่างใดอย่างหนึ่ง ตัวเริ่มต้น PoseLandmarker(options:) จะยอมรับค่าสําหรับตัวเลือกการกําหนดค่า

หากคุณไม่ต้องการเครื่องมือจุดสังเกตของ Pose ซึ่งเริ่มต้นโดยใช้ตัวเลือกการกำหนดค่าที่กำหนดเอง ให้ใช้เครื่องมือเริ่มต้น PoseLandmarker(modelPath:) เพื่อสร้างเครื่องมือจุดสังเกตของโพสที่มีตัวเลือกเริ่มต้น ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกการกำหนดค่าได้ที่ภาพรวมการกําหนดค่า

งานเครื่องมือจุดสังเกตสำหรับท่าทางรองรับอินพุต 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 ตั้งค่า Listener ผลลัพธ์ให้รับผลการค้นหาจุดสังเกตแบบไม่พร้อมกันเมื่อเครื่องมือจุดสังเกตท่าทางอยู่ในโหมดสตรีมแบบสด ใช้ได้เฉพาะเมื่อตั้งค่าโหมดการทํางานเป็น LIVE_STREAM ResultListener N/A

การกําหนดค่าสตรีมแบบสด

เมื่อตั้งค่าโหมดการทํางานเป็น "สตรีมแบบสด" ตัวระบุจุดสังเกตของท่าทางต้องใช้ตัวเลือกการกําหนดค่า poseLandmarkerLiveStreamDelegate เพิ่มเติม ซึ่งจะช่วยให้ตัวระบุจุดสังเกตของท่าทางแสดงผลลัพธ์การตรวจหาจุดสังเกตของท่าทางแบบไม่พร้อมกันได้ โดยผู้รับมอบสิทธิ์ต้องใช้เมธอด poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) ซึ่ง Pose Landmarker จะเรียกใช้หลังจากประมวลผลผลลัพธ์ของการตรวจหาจุดสังเกตของท่าทางในแต่ละเฟรม

ชื่อตัวเลือก คำอธิบาย ช่วงของค่า ค่าเริ่มต้น
poseLandmarkerLiveStreamDelegate เปิดใช้เครื่องมือจุดสังเกตสำหรับท่าทางเพื่อรับผลลัพธ์ของการตรวจหาจุดสังเกตแบบไม่พร้อมกันในโหมดสตรีมแบบสด คลาสที่มีการตั้งค่าอินสแตนซ์เป็นพร็อพเพอร์ตี้นี้ต้องติดตั้งใช้งานเมธอด poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) ไม่เกี่ยวข้อง ไม่ได้ตั้งค่า

เตรียมข้อมูล

คุณต้องแปลงรูปภาพหรือเฟรมอินพุตเป็นออบเจ็กต์ MPImage ก่อนส่งไปยังโปรแกรมระบุจุดสังเกตของท่าทาง 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:) ตัวอย่างโค้ดนี้ช่วยให้ผู้ใช้สลับระหว่างโหมดการประมวลผลได้ ซึ่งอาจไม่จำเป็นสำหรับกรณีการใช้งานของคุณ

โปรดทราบดังต่อไปนี้

  • เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุการประทับเวลาของเฟรมอินพุตในงานเครื่องมือทำเครื่องหมายตำแหน่งด้วย

  • เมื่อทำงานในโหมดรูปภาพหรือวิดีโอ งานตัวระบุจุดสังเกตของท่าทางจะบล็อกเธรดปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จ หากต้องการหลีกเลี่ยงการบล็อกเทรดปัจจุบัน ให้เรียกใช้การประมวลผลในชุดข้อความเบื้องหลังโดยใช้เฟรมเวิร์ก iOS Dispatch หรือ NSOperation

  • เมื่อทำงานในโหมดสตรีมแบบสด งานตัวระบุจุดสังเกตของท่าทางจะแสดงผลทันทีและไม่บล็อกเธรดปัจจุบัน โดยจะเรียกใช้วิธี poseLandmarker(_:didFinishDetection:timestampInMilliseconds:error:) ด้วยผลลัพธ์ของจุดสังเกตท่าทางหลังจากประมวลผลเฟรมอินพุตแต่ละเฟรม โปรแกรมระบุจุดสังเกตของท่าทางจะเรียกใช้เมธอดนี้แบบไม่พร้อมกันในคิวการจัดเตรียมแบบอนุกรมโดยเฉพาะ หากต้องการแสดงผลลัพธ์ในอินเทอร์เฟซผู้ใช้ ให้ส่งผลลัพธ์ไปยังคิวหลักหลังจากประมวลผลผลลัพธ์แล้ว หากมีการเรียกใช้ฟังก์ชัน 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: พิกัด 3 มิติในชีวิตจริงเป็นเมตร โดยจุดกึ่งกลางของสะโพกเป็นจุดเริ่มต้น

  • visibility: ความเป็นไปได้ที่จุดสังเกตจะปรากฏในรูปภาพ

รูปภาพต่อไปนี้แสดงภาพเอาต์พุตของงาน

หน้ากากการแบ่งกลุ่ม (ไม่บังคับ) แสดงถึงความเป็นไปได้ที่แต่ละพิกเซลเป็นของบุคคลที่ตรวจพบ รูปภาพต่อไปนี้คือมาสก์การแบ่งกลุ่มของเอาต์พุตงาน

โค้ดตัวอย่างของ Pose Landmarker แสดงวิธีแสดงผลลัพธ์ของ Pose Landmarker