Bộ công cụ học máy cung cấp 2 SDK được tối ưu hoá để phát hiện tư thế.
Tên SDK | PoseDetection | PoseDetectionAccurate |
---|---|---|
Triển khai | Các tài sản cho trình phát hiện cơ sở được liên kết tĩnh với ứng dụng của bạn trong thời gian xây dựng. | Các nội dung cho trình phát hiện chính xác được liên kết tĩnh với ứng dụng của bạn trong thời gian xây dựng. |
Kích thước ứng dụng | Tối đa 29,6 MB | Tối đa 33,2 MB |
Hiệu suất | iPhone X: ~45 khung hình/giây | iPhone X: ~29 khung hình/giây |
Dùng thử
- Hãy khám phá ứng dụng mẫu để xem ví dụ về cách sử dụng API này.
Trước khi bắt đầu
Đưa các nhóm Bộ công cụ học máy sau đây vào Podfile:
# If you want to use the base implementation: pod 'GoogleMLKit/PoseDetection', '3.2.0' # If you want to use the accurate implementation: pod 'GoogleMLKit/PoseDetectionAccurate', '3.2.0'
Sau khi bạn cài đặt hoặc cập nhật các nhóm của dự án, hãy mở dự án Xcode của bạn bằng
xcworkspace
của dự án. Bộ công cụ học máy được hỗ trợ trong Xcode phiên bản 13.2.1 trở lên.
1. Tạo một thực thể của PoseDetector
Để phát hiện tư thế trong hình ảnh, trước tiên, hãy tạo một thực thể của PoseDetector
và tuỳ ý chỉ định các chế độ cài đặt trình phát hiện.
PoseDetector
lựa chọn
Chế độ phát hiện
PoseDetector
hoạt động ở 2 chế độ phát hiện. Hãy nhớ chọn một cách phù hợp với trường hợp sử dụng của bạn.
stream
(mặc định)- Trước tiên, trình phát hiện tư thế sẽ phát hiện người nổi bật nhất trong hình ảnh, sau đó chạy tính năng phát hiện tư thế. Trong các khung tiếp theo, bước phát hiện người sẽ không được thực hiện trừ phi người đó bị che khuất hoặc không còn có độ tin cậy cao được phát hiện. Trình phát hiện tư thế sẽ cố gắng theo dõi người nổi bật nhất và trả về tư thế của họ trong mỗi dự đoán. Điều này làm giảm độ trễ và tạo mượt mà việc phát hiện. Hãy dùng chế độ này khi bạn muốn phát hiện tư thế trong luồng video.
singleImage
- Trình phát hiện tư thế sẽ phát hiện một người, sau đó chạy tính năng phát hiện tư thế. Bước phát hiện người sẽ chạy trên mọi hình ảnh, vì vậy, độ trễ sẽ cao hơn và không có hoạt động theo dõi người. Hãy dùng chế độ này khi sử dụng tính năng phát hiện tư thế trên ảnh tĩnh hoặc khi không muốn theo dõi.
Chỉ định các tuỳ chọn của trình phát hiện tư thế:
Swift
// Base pose detector with streaming, when depending on the PoseDetection SDK let options = PoseDetectorOptions() options.detectorMode = .stream // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK let options = AccuratePoseDetectorOptions() options.detectorMode = .singleImage
Objective-C
// Base pose detector with streaming, when depending on the PoseDetection SDK MLKPoseDetectorOptions *options = [[MLKPoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeStream; // Accurate pose detector on static images, when depending on the // PoseDetectionAccurate SDK MLKAccuratePoseDetectorOptions *options = [[MLKAccuratePoseDetectorOptions alloc] init]; options.detectorMode = MLKPoseDetectorModeSingleImage;
Cuối cùng, hãy tạo một thực thể của PoseDetector
. Chuyển các tuỳ chọn mà bạn đã chỉ định:
Swift
let poseDetector = PoseDetector.poseDetector(options: options)
Objective-C
MLKPoseDetector *poseDetector = [MLKPoseDetector poseDetectorWithOptions:options];
2. Chuẩn bị hình ảnh đầu vào
Để phát hiện tư thế, hãy làm như sau với mỗi hình ảnh hoặc khung video.
Nếu đã bật chế độ phát trực tuyến, bạn phải tạo các đối tượng VisionImage
từ CMSampleBuffer
.
Tạo một đối tượng VisionImage
bằng UIImage
hoặc CMSampleBuffer
.
Nếu bạn sử dụng UIImage
, hãy làm theo các bước sau:
- Tạo một đối tượng
VisionImage
bằngUIImage
. Hãy nhớ chỉ định đúng.orientation
.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Nếu bạn sử dụng CMSampleBuffer
, hãy làm theo các bước sau:
-
Chỉ định hướng của dữ liệu hình ảnh có trong
CMSampleBuffer
.Cách lấy hướng của hình ảnh:
Swift
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> UIImage.Orientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftMirrored : .right case .landscapeLeft: return cameraPosition == .front ? .downMirrored : .up case .portraitUpsideDown: return cameraPosition == .front ? .rightMirrored : .left case .landscapeRight: return cameraPosition == .front ? .upMirrored : .down case .faceDown, .faceUp, .unknown: return .up } }
Objective-C
- (UIImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationLeftMirrored : UIImageOrientationRight; case UIDeviceOrientationLandscapeLeft: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationDownMirrored : UIImageOrientationUp; case UIDeviceOrientationPortraitUpsideDown: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationRightMirrored : UIImageOrientationLeft; case UIDeviceOrientationLandscapeRight: return cameraPosition == AVCaptureDevicePositionFront ? UIImageOrientationUpMirrored : UIImageOrientationDown; case UIDeviceOrientationUnknown: case UIDeviceOrientationFaceUp: case UIDeviceOrientationFaceDown: return UIImageOrientationUp; } }
- Tạo một đối tượng
VisionImage
bằng cách sử dụng đối tượng và hướngCMSampleBuffer
:Swift
let image = VisionImage(buffer: sampleBuffer) image.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition)
Objective-C
MLKVisionImage *image = [[MLKVisionImage alloc] initWithBuffer:sampleBuffer]; image.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
3. Xử lý hình ảnh
Truyền VisionImage
sang một trong các phương thức xử lý hình ảnh của trình phát hiện tư thế. Bạn có thể sử dụng phương thức process(image:)
không đồng bộ hoặc phương thức results()
đồng bộ.
Cách phát hiện đối tượng một cách đồng bộ:
Swift
var results: [Pose] do { results = try poseDetector.results(in: image) } catch let error { print("Failed to detect pose with error: \(error.localizedDescription).") return } guard let detectedPoses = results, !detectedPoses.isEmpty else { print("Pose detector returned no results.") return } // Success. Get pose landmarks here.
Objective-C
NSError *error; NSArray*poses = [poseDetector resultsInImage:image error:&error]; if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here.
Cách phát hiện đối tượng theo cách không đồng bộ:
Swift
poseDetector.process(image) { detectedPoses, error in guard error == nil else { // Error. return } guard !detectedPoses.isEmpty else { // No pose detected. return } // Success. Get pose landmarks here. }
Objective-C
[poseDetector processImage:image completion:^(NSArray* _Nullable poses, NSError * _Nullable error) { if (error != nil) { // Error. return; } if (poses.count == 0) { // No pose detected. return; } // Success. Get pose landmarks here. }];
4. Xem thông tin về tư thế đã phát hiện
Nếu phát hiện thấy một người trong hình ảnh, API phát hiện tư thế sẽ truyền một mảng các đối tượng Pose
đến trình xử lý hoàn thành hoặc trả về mảng, tuỳ thuộc vào việc bạn đã gọi phương thức không đồng bộ hay đồng bộ.
Nếu người đó không nằm hoàn toàn bên trong hình ảnh, mô hình sẽ chỉ định toạ độ của các điểm mốc bị thiếu bên ngoài khung và cung cấp cho họ các giá trị InFrameDuration thấp.
Nếu không phát hiện người nào thì mảng sẽ trống.
Swift
for pose in detectedPoses { let leftAnkleLandmark = pose.landmark(ofType: .leftAnkle) if leftAnkleLandmark.inFrameLikelihood > 0.5 { let position = leftAnkleLandmark.position } }
Objective-C
for (MLKPose *pose in detectedPoses) { MLKPoseLandmark *leftAnkleLandmark = [pose landmarkOfType:MLKPoseLandmarkTypeLeftAnkle]; if (leftAnkleLandmark.inFrameLikelihood > 0.5) { MLKVision3DPoint *position = leftAnkleLandmark.position; } }
Mẹo cải thiện hiệu suất
Chất lượng kết quả phụ thuộc vào chất lượng của hình ảnh đầu vào:
- Để Bộ công cụ học máy phát hiện chính xác tư thế, người trong hình ảnh phải được biểu thị bằng đủ dữ liệu pixel; để có hiệu suất tốt nhất, chủ thể phải có kích thước ít nhất là 256x256 pixel.
- Nếu phát hiện tư thế trong ứng dụng theo thời gian thực, bạn cũng nên xem xét kích thước tổng thể của hình ảnh đầu vào. Hình ảnh nhỏ hơn có thể được xử lý nhanh hơn. Vì vậy, để giảm độ trễ, hãy chụp ảnh ở độ phân giải thấp hơn, nhưng hãy lưu ý đến các yêu cầu về độ phân giải trên và đảm bảo rằng đối tượng chiếm nhiều hình ảnh nhất có thể.
- Hình ảnh lấy nét kém cũng có thể ảnh hưởng đến độ chính xác. Nếu bạn không nhận được kết quả có thể chấp nhận được, hãy yêu cầu người dùng chụp lại hình ảnh.
Nếu bạn muốn dùng tính năng phát hiện tư thế trong ứng dụng theo thời gian thực, hãy làm theo các nguyên tắc sau để đạt được tốc độ khung hình tốt nhất:
- Sử dụng SDK PoseDetection cơ sở và chế độ phát hiện
stream
. - Hãy cân nhắc chụp ảnh ở độ phân giải thấp hơn. Tuy nhiên, hãy lưu ý các yêu cầu về kích thước hình ảnh của API này.
- Để xử lý khung video, hãy sử dụng API đồng bộ
results(in:)
của trình phát hiện. Gọi phương thức này từ hàm captureOutput(_, didOutput:from:) của AVCaptureVideoDataOutputSampleBufferDelegate để nhận kết quả đồng bộ từ khung hình video nhất định. Giữ giá trị của alwaysDiscardsLateVideoFrames của AVCaptureVideoDataOutput ở trạng thái true để điều tiết lệnh gọi đến trình phát hiện. Nếu có khung video mới trong khi trình phát hiện đang chạy, thì khung hình đó sẽ bị bỏ qua. - Nếu bạn sử dụng đầu ra của trình phát hiện để phủ hình ảnh đồ hoạ lên hình ảnh đầu vào, trước tiên, hãy lấy kết quả từ Bộ công cụ học máy, sau đó kết xuất hình ảnh và lớp phủ chỉ bằng một bước. Bằng cách này, bạn chỉ kết xuất trên giao diện màn hình một lần cho mỗi khung đầu vào được xử lý. Hãy xem các lớp previewOverlayView và MLKDetectionOverlayView trong ứng dụng mẫu quảng cáo để biết ví dụ.
Các bước tiếp theo
- Để tìm hiểu cách sử dụng các điểm mốc tạo tư thế để phân loại các tư thế, hãy xem Mẹo phân loại tư thế.
- Hãy xem mẫu bắt đầu nhanh Bộ công cụ học máy trên GitHub để biết ví dụ về cách sử dụng API này.