ML Kit, poz algılama için iki optimize edilmiş SDK sağlar.
SDK Adı | PoseDetection | PoseDetectionAccurate |
---|---|---|
Uygulama | Temel algılayıcı öğeleri, derleme sırasında uygulamanıza statik olarak bağlanır. | Doğru algılayıcının öğeleri, derleme sırasında uygulamanıza statik olarak bağlanır. |
Uygulama boyutu | En fazla 29,6 MB | En fazla 33,2 MB |
Performans | iPhone X: ~45FPS | iPhone X: ~29FPS |
Deneyin
- Bu API'nin örnek kullanımını görmek için örnek uygulamayı inceleyin.
Başlamadan önce
Podfile dosyanıza aşağıdaki ML Kit kapsüllerini ekleyin:
# 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'
Projenizin kapsüllerini yükledikten veya güncelledikten sonra
xcworkspace
kullanarak Xcode projenizi açın. ML Kit, Xcode 13.2.1 veya sonraki sürümlerde desteklenir.
1. PoseDetector
örneği oluşturma
Bir resimde pozu algılamak için önce PoseDetector
örneği oluşturun ve isteğe bağlı olarak algılayıcı ayarlarını belirtin.
PoseDetector
seçenek
Algılama Modu
PoseDetector
iki algılama modunda çalışır. Kullanım alanınızla eşleşeni seçtiğinizden emin olun.
stream
(varsayılan)- Duruş algılayıcı, önce resimdeki en belirgin kişiyi algılar ve ardından duruş algılama işlemini başlatır. Sonraki karelerde, kişi gizlenmediği veya artık yüksek güvenle algılanmadığından kişi algılama adımı uygulanmaz. Poz algılayıcı, en belirgin kişiyi izlemeye çalışır ve her çıkarım için kişinin pozunu döndürür. Bu, gecikmeyi azaltır ve algılamayı kolaylaştırır. Bir video akışındaki pozu algılamak istediğinizde bu modu kullanın.
singleImage
- Duruş algılayıcı, bir kişiyi algılar ve ardından duruş algılama işlemini başlatır. Kişi algılama adımı her resim için çalıştırılır. Bu nedenle gecikme süresi daha yüksek olur ve kişi takibi yapılmaz. Statik resimlerde veya izlemenin istenmediği durumlarda poz algılama özelliğini kullanırken bu modu kullanın.
Poz algılayıcı seçeneklerini belirtin:
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;
Son olarak, PoseDetector
örneği alın. Belirttiğiniz seçenekleri iletin:
Swift
let poseDetector = PoseDetector.poseDetector(options: options)
Objective-C
MLKPoseDetector *poseDetector = [MLKPoseDetector poseDetectorWithOptions:options];
2. Giriş resmini hazırlama
Pozları tespit etmek için her resim veya video karesi için aşağıdakileri yapın.
Akış modunu etkinleştirdiyseniz CMSampleBuffer
'lerden VisionImage
nesneleri oluşturmanız gerekir.
UIImage
veya CMSampleBuffer
kullanarak bir VisionImage
nesnesi oluşturun.
UIImage
kullanıyorsanız şu adımları uygulayın:
UIImage
ile birVisionImage
nesnesi oluşturun. Doğru.orientation
değerini belirttiğinizden emin olun.Swift
let image = VisionImage(image: UIImage) visionImage.orientation = image.imageOrientation
Objective-C
MLKVisionImage *visionImage = [[MLKVisionImage alloc] initWithImage:image]; visionImage.orientation = image.imageOrientation;
CMSampleBuffer
kullanıyorsanız şu adımları uygulayın:
-
CMSampleBuffer
içinde bulunan resim verilerinin yönünü belirtin.Resim yönünü almak için:
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; } }
CMSampleBuffer
nesnesini ve yönünü kullanarak birVisionImage
nesnesi oluşturun: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. Resmi işleme
VisionImage
değerini, poz algılayıcının resim işleme yöntemlerinden birine iletin. Eşzamansız process(image:)
yöntemini veya eşzamanlı results()
yöntemini kullanabilirsiniz.
Nesneleri eşzamanlı olarak algılamak için:
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.
Nesneleri eşzamansız olarak algılamak için:
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. Algılanan poz hakkında bilgi edinme
Resimde bir kişi algılanırsa duruş algılama API'si, tamamlama işleyicisine bir Pose
nesnesi dizisi iletir veya asynkron veya senkron yöntemi çağırıp çağırmadığınıza bağlı olarak diziyi döndürür.
Kişi görüntünün tamamen içinde değilse model, eksik yer işareti koordinatlarını çerçevenin dışına atar ve bunlara düşük InFrameConfidence değerleri verir.
Hiçbir kişi algılanmadıysa dizi boş olur.
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; } }
Performansı iyileştirmeye yönelik ipuçları
Sonuçlarınızın kalitesi, giriş resminin kalitesine bağlıdır:
- ML Kit'in pozu doğru şekilde algılayabilmesi için resimdeki kişinin yeterli piksel verisiyle temsil edilmesi gerekir. En iyi performans için özne en az 256x256 piksel olmalıdır.
- Gerçek zamanlı bir uygulamada pozu algılarsanız giriş resimlerinin genel boyutlarını da dikkate alabilirsiniz. Küçük resimler daha hızlı işlenebilir. Bu nedenle, gecikmeyi azaltmak için resimleri daha düşük çözünürlüklerde çekin ancak yukarıdaki çözünürlük şartlarını göz önünde bulundurun ve öznenin resmin mümkün olduğunca büyük bir kısmını kaplamasını sağlayın.
- Resmin odaklanmaması da doğruluğu etkileyebilir. Kabul edilebilir sonuçlar alamazsanız kullanıcıdan resmi yeniden çekmesini isteyin.
Poz tespitini gerçek zamanlı bir uygulamada kullanmak istiyorsanız en iyi kare hızlarını elde etmek için aşağıdaki yönergeleri uygulayın:
- Temel PoseDetection SDK'sını ve
stream
algılama modunu kullanın. - Resimleri daha düşük çözünürlükte çekmeyi deneyin. Ancak bu API'nin resim boyutu koşullarını da göz önünde bulundurun.
- Video karelerini işlemek için dedektörün
results(in:)
senkron API'sini kullanın. Belirtilen video karesinden eşzamanlı olarak sonuç almak için bu yöntemi AVCaptureVideoDataOutputSampleBufferDelegate'ın captureOutput(_, didOutput:from:) işlevinden çağırın. AVCaptureVideoDataOutput'un alwaysDiscardsLateVideoFrames özelliğini, dedektöre yapılan çağrıları azaltmak için true olarak tutun. Algılayıcı çalışırken yeni bir video karesi kullanılabilir hale gelirse bu kare atlanır. - Giriş resmine grafik yerleştirmek için algılayıcının çıkışını kullanıyorsanız önce ML Kit'ten sonucu alın, ardından resmi ve yer paylaşımını tek bir adımda oluşturun. Böylece, işlenen her giriş çerçevesi için ekran yüzeyinde yalnızca bir kez oluşturma işlemi gerçekleştirirsiniz. Örnek için vitrin örnek uygulamasındaki previewOverlayView ve MLKDetectionOverlayView sınıflarına bakın.
Sonraki adımlar
- Pozları sınıflandırmak için poz yer işaretlerini nasıl kullanacağınızı öğrenmek istiyorsanız Poz Sınıflandırmasıyla İlgili İpuçları başlıklı makaleyi inceleyin.
- Bu API'nin kullanım örneği için GitHub'daki ML Kit hızlı başlangıç örneğine bakın.