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

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

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

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

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

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

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

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

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

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

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

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. นอกจากนี้ คุณสามารถกำหนดค่าอินสแตนซ์ Git ให้ใช้จุดชำระเงินแบบกระจัดกระจายเพื่อให้คุณมี เฉพาะไฟล์สำหรับแอปตัวอย่างเครื่องมือทำจุดสังเกตเท่านั้น ได้แก่

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

หลังจากสร้างโค้ดตัวอย่างในเวอร์ชันในเครื่องแล้ว คุณสามารถติดตั้ง ไลบรารีงาน MediaPipe เปิดโปรเจ็กต์โดยใช้ Xcode และเรียกใช้แอป สำหรับ โปรดดูวิธีการในคู่มือการการตั้งค่าสำหรับ iOS

องค์ประกอบหลัก

ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับตัวอย่างเครื่องมือจุดสังเกตของท่าทาง แอปพลิเคชัน:

  • PoseLandmarkerService.swift: เริ่มต้นเครื่องมือสร้างจุดสังเกต จัดการการเลือกโมเดล และเรียกใช้การอนุมาน เกี่ยวกับข้อมูลอินพุต
  • CameraViewController: ใช้ UI สำหรับโหมดป้อนข้อมูลฟีดกล้องแบบสดและแสดงภาพ จุดสังเกต
  • MediaLibraryViewController.swift: ใช้ UI สำหรับโหมดป้อนข้อมูลไฟล์ภาพนิ่งและไฟล์วิดีโอ และ แสดงภาพจุดสังเกต

ตั้งค่า

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

การอ้างอิง

เครื่องมือจุดสังเกตของตำแหน่งใช้ไลบรารี MediaPipeTasksVision ซึ่งต้องติดตั้ง ด้วยการใช้ CocoaPods ไลบรารีใช้งานได้ทั้งกับแอป Swift และ Objective-C และไม่จำเป็นต้องมีการตั้งค่าเฉพาะภาษาใดๆ เพิ่มเติม

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

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

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

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

รุ่น

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

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

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

สร้างงาน

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

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

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

คุณต้องแปลงรูปภาพหรือเฟรมอินพุตเป็นวัตถุ MPImage ก่อน เพื่อส่งให้ผู้ส่งจุดสังเกตของ Pose 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 เครื่องมือจุดสังเกตท่าทางไม่รองรับการวางแนวแบบมิเรอร์ เช่น .upMirrored .downMirrored, .leftMirrored, .rightMirrored

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ UIImage โปรดดูที่ UIImage ของ Apple Developer เอกสารประกอบ

CVPixelBuffer

รูปแบบ CVPixelBuffer เหมาะกับแอปพลิเคชันที่สร้างเฟรม และใช้ CoreImage ของ iOS สำหรับการประมวลผลข้อมูล

รูปแบบ CVPixelBuffer เหมาะกับโหมดการวิ่งต่อไปนี้

  • รูปภาพ: แอปที่สร้างรูปภาพ CVPixelBuffer รูปหลังจากประมวลผล โดยใช้เฟรมเวิร์ก CoreImage ของ iOS ก็สามารถส่งไปยังเครื่องมือจุดสังเกตของท่าทางใน โหมดเรียกใช้รูปภาพ

  • วิดีโอ: แปลงเฟรมวิดีโอเป็นรูปแบบ 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 โดย 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 นักพัฒนาซอฟต์แวร์ เอกสารประกอบ

เรียกใช้งาน

หากต้องการเรียกใช้เครื่องมือจุดสังเกตสำหรับท่าทาง ให้ใช้เมธอด detect() เฉพาะสำหรับ โหมดทำงาน:

  • ภาพนิ่ง: detect(image:)
  • วิดีโอ: detect(videoFrame:timestampInMilliseconds:)
  • สตรีมสด: detectAsync(image:timestampInMilliseconds:)

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

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 ผู้มอบหมายหรือ NSOperation ของ Google

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

จัดการและแสดงผลลัพธ์

หลังจากเรียกใช้การอนุมาน งานเครื่องมือจุดสังเกตของ Pose แสดงผล 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: แนวโน้มที่จุดสังเกตจะปรากฏในรูปภาพ

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

มาสก์การแบ่งกลุ่มตัวเลือกจะแสดงแนวโน้มของพิกเซลแต่ละพิกเซลที่อยู่ใน แก่บุคคลที่ตรวจจับได้ รูปภาพต่อไปนี้คือมาสก์การแบ่งกลุ่มของ เอาต์พุตของงาน:

โค้ดตัวอย่างเครื่องมือจุดสังเกตของโพสสาธิตวิธีแสดงเครื่องมือจุดสังเกตของท่าทาง รายการ