ML Kit menyediakan dua SDK yang dioptimalkan untuk deteksi postur.
Nama SDK | PoseDetection | PoseDetectionAccurate |
---|---|---|
Penerapan | Aset untuk pendeteksi dasar ditautkan secara statis ke aplikasi Anda pada waktu build. | Aset untuk detektor akurat ditautkan secara statis ke aplikasi Anda pada waktu build. |
Ukuran aplikasi | Hingga 29,6 MB | Hingga 33,2 MB |
Performa | iPhone X: ~45FPS | iPhone X: ~29FPS |
Cobalah
- Coba aplikasi contoh untuk melihat contoh penggunaan API ini.
Sebelum memulai
Sertakan pod ML Kit berikut di Podfile Anda:
# If you want to use the base implementation: pod 'GoogleMLKit/PoseDetection', '8.0.0' # If you want to use the accurate implementation: pod 'GoogleMLKit/PoseDetectionAccurate', '8.0.0'
Setelah Anda menginstal atau mengupdate pod project, buka project Xcode menggunakan
xcworkspace
-nya. ML Kit didukung di Xcode versi 13.2.1 atau yang lebih tinggi.
1. Membuat instance PoseDetector
Untuk mendeteksi pose dalam gambar, buat instance PoseDetector
terlebih dahulu dan
tentukan setelan detektor secara opsional.
Opsi PoseDetector
Mode Deteksi
PoseDetector
beroperasi dalam dua mode deteksi. Pastikan Anda memilih yang sesuai dengan kasus penggunaan Anda.
stream
(default)- Detektor postur akan mendeteksi orang yang paling terlihat dalam gambar terlebih dahulu, lalu menjalankan deteksi postur. Dalam frame berikutnya, langkah deteksi orang tidak akan dilakukan kecuali jika orang tersebut tertutup atau tidak lagi terdeteksi dengan keyakinan tinggi. Detektor postur akan berupaya melacak orang yang paling terlihat dan menampilkan posturnya di setiap inferensi. Tindakan ini mengurangi latensi dan memperlancar deteksi. Gunakan mode ini saat Anda ingin mendeteksi pose dalam streaming video.
singleImage
- Detektor pose akan mendeteksi orang, lalu menjalankan deteksi pose. Langkah deteksi orang akan berjalan untuk setiap gambar, sehingga latensi akan lebih tinggi, dan tidak ada pelacakan orang. Gunakan mode ini saat menggunakan deteksi pose pada gambar statis atau saat pelacakan tidak diinginkan.
Tentukan opsi detektor postur:
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;
Terakhir, dapatkan instance PoseDetector
. Teruskan opsi yang Anda tentukan:
Swift
let poseDetector = PoseDetector.poseDetector(options: options)
Objective-C
MLKPoseDetector *poseDetector = [MLKPoseDetector poseDetectorWithOptions:options];
2. Menyiapkan gambar input
Untuk mendeteksi pose, lakukan hal berikut untuk setiap gambar atau frame video.
Jika mengaktifkan mode streaming, Anda harus membuat objek VisionImage
dari
CMSampleBuffer
.
Buat objek VisionImage
menggunakan UIImage
atau
CMSampleBuffer
.
Jika Anda menggunakan UIImage
, ikuti langkah-langkah berikut:
- Buat objek
VisionImage
denganUIImage
. Pastikan untuk menentukan.orientation
yang benar.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
Jika Anda menggunakan CMSampleBuffer
, ikuti langkah-langkah berikut:
-
Tentukan orientasi data gambar yang terdapat dalam
CMSampleBuffer
.Untuk mendapatkan orientasi gambar:
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; } }
- Buat objek
VisionImage
menggunakan objekCMSampleBuffer
dan orientasi: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. Memproses gambar
Teruskan VisionImage
ke salah satu metode pemrosesan gambar detektor postur. Anda dapat menggunakan metode process(image:)
yang asinkron atau metode results()
yang sinkron.
Untuk mendeteksi objek secara sinkron:
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.
Untuk mendeteksi objek secara asinkron:
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. Mendapatkan informasi tentang postur yang terdeteksi
Jika seseorang terdeteksi dalam gambar, API deteksi postur akan meneruskan array objek Pose
ke pengendali penyelesaian atau menampilkan array, bergantung pada apakah Anda memanggil metode asinkron atau sinkron.
Jika orang tersebut tidak sepenuhnya berada di dalam gambar, model akan menetapkan koordinat titik penanda yang hilang di luar frame dan memberikan nilai InFrameConfidence yang rendah.
Jika tidak ada orang yang terdeteksi, array akan kosong.
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; } }
Tips untuk meningkatkan performa
Kualitas hasil Anda bergantung pada kualitas gambar input:
- Agar ML Kit dapat mendeteksi pose secara akurat, orang dalam gambar harus direpresentasikan oleh data piksel yang memadai; untuk performa terbaik, subjek harus berukuran minimal 256x256 piksel.
- Jika mendeteksi postur dalam aplikasi real-time, Anda mungkin perlu mempertimbangkan dimensi gambar input secara keseluruhan. Gambar yang lebih kecil dapat diproses lebih cepat. Jadi, untuk mengurangi latensi, ambil gambar dengan resolusi yang lebih rendah, tetapi perhatikan persyaratan resolusi di atas dan pastikan subjek menempati gambar seluas mungkin.
- Fokus gambar yang buruk juga dapat memengaruhi akurasi. Jika Anda tidak mendapatkan hasil yang dapat diterima, minta pengguna untuk mengambil ulang gambar.
Jika Anda ingin menggunakan deteksi postur dalam aplikasi real-time, ikuti panduan ini untuk mencapai kecepatan frame terbaik:
- Gunakan PoseDetection SDK dasar dan mode deteksi
stream
. - Pertimbangkan untuk mengambil gambar dengan resolusi lebih rendah. Namun, perhatikan juga persyaratan dimensi gambar API ini.
- Untuk memproses frame video, gunakan
results(in:)
API sinkron detektor. Panggil metode ini dari fungsi captureOutput(_, didOutput:from:) AVCaptureVideoDataOutputSampleBufferDelegate untuk mendapatkan hasil secara sinkron dari frame video yang diberikan. Tetapkan alwaysDiscardsLateVideoFrames AVCaptureVideoDataOutput ke benar (true) untuk membatasi panggilan ke detektor. Jika frame video baru tersedia saat detektor sedang berjalan, frame tersebut akan dihapus. - Jika Anda menggunakan output detektor untuk menempatkan grafis pada gambar input, pertama-tama dapatkan hasilnya dari ML Kit, lalu render gambar dan tempatkan grafis dalam satu langkah. Dengan demikian, Anda hanya merender ke permukaan tampilan sekali untuk setiap frame input yang diproses. Lihat class previewOverlayView dan MLKDetectionOverlayView dalam aplikasi contoh showcase sebagai contoh.
Langkah berikutnya
- Untuk mempelajari cara menggunakan penanda postur untuk mengklasifikasikan postur, lihat Tips Klasifikasi Postur.
- Lihat sampel panduan memulai ML Kit di GitHub untuk mengetahui contoh penggunaan API ini.