ML Kit, poz algılama için optimize edilmiş iki SDK sunar.
SDK Adı | PoseDetection | PoseDetectionAccurate |
---|---|---|
Uygulama | Temel algılayıcı için öğeler, derleme sırasında uygulamanıza statik olarak bağlıdır. | Doğru algılayıcı için kullanılan öğeler, derleme sırasında uygulamanıza statik olarak bağlıdır. |
Uygulama boyutu | En fazla 29,6 MB | En fazla 33,2 MB |
Performans | iPhone X: ~45FPS | iPhone X: Yaklaşık 29 FPS |
Deneyin
- Bu API'nin örnek kullanımını görmek için örnek uygulamayı inceleyin.
Başlamadan önce
Aşağıdaki ML Kit kapsüllerini Podfile'ınıza ekleyin:
# 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'
Projenizin kapsüllerini yükledikten veya güncelledikten sonra
xcworkspace
öğesini kullanarak Xcode projenizi açın. Makine Öğrenimi Kiti, Xcode 13.2.1 veya üzeri sürümlerde desteklenir.
1. PoseDetector
örneği oluşturun
Bir görüntüdeki 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ıza uygun olanı
seçtiğinizden emin olun.
stream
(varsayılan)- Poz algılayıcı, önce resimdeki en belirgin kişiyi algılar ve ardından poz algılamayı çalıştırır. Sonraki karelerde, kişi bulanıklaştırılmadığı veya artık yüksek güvenilirlikle algılanmadığı sürece kişi algılama adımı gerçekleştirilmez. Poz dedektörü, en belirgin kişiyi takip etmeye ve her çıkarımda kendi duruşunu döndürmeye çalışır. Bu, gecikmeyi azaltır ve algılamayı sorunsuz hale getirir. Video akışında pozu algılamak istediğinizde bu modu kullanın.
singleImage
- Poz dedektörü bir kişiyi algılar ve ardından poz algılama özelliğini çalıştırır. Kişi algılama adımı her resim için çalışır. Bu nedenle gecikme daha yüksek olur ve kişi izleme yapılmaz. Statik resimlerde duruş algılamayı kullanırken veya izlemenin istenmediği durumlarda bu modu kullanın.
Poz algılayıcısı 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
öğesinin bir örneğini 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ı algılamak için her resim veya video karesinde aşağıdakileri yapın.
Akış modunu etkinleştirdiyseniz CMSampleBuffer
saniyelerinden VisionImage
nesne oluşturmanız gerekir.
UIImage
veya CMSampleBuffer
kullanarak 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 yer alan resim verilerinin yönünü belirtin.Resmin yönünü öğrenmek 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şleyin
VisionImage
öğesini, poz algılayıcının görüntü 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 alma
Görüntüde bir kişi algılanırsa poz algılama API'si, eşzamansız veya eşzamanlı yöntemi çağırmanıza bağlı olarak tamamlama işleyiciye Pose
nesnelik bir dizi iletir veya diziyi döndürür.
Kişi tamamen resmin içinde değilse model, eksik önemli nokta koordinatlarını çerçevenin dışına atar ve onlara düşük InFrameConfidence değerleri verir.
Hiç kimse algılanmazsa 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ı artırmaya yönelik ipuçları
Sonuçlarınızın kalitesi, giriş resminin kalitesine bağlıdır:
- Makine Öğrenimi Kiti'nin durumu doğru bir şekilde algılayabilmesi için resimdeki kişi yeterli piksel verisiyle; en iyi performans için kişi en az 256x256 piksel boyutunda olmalıdır.
- Gerçek zamanlı bir uygulamada poz tespit ederseniz giriş görüntülerinin genel boyutlarını da göz önünde bulundurmak isteyebilirsiniz. Daha küçük resimler daha hızlı işlenebilir. Bu nedenle, gecikmeyi azaltmak için görüntüleri düşük çözünürlüklerde yakalayın. Ancak yukarıdaki çözünürlük gereksinimlerini göz önünde bulundurun ve objenin resmi mümkün olduğunca çok doldurduğundan emin olun.
- Kötü bir resim odağı, doğruluğu da etkileyebilir. Kabul edilebilir sonuçlar alamazsanız kullanıcıdan resmi yeniden çekmesini isteyin.
Poz algılamayı gerçek zamanlı bir uygulamada kullanmak istiyorsanız en iyi kare hızlarına ulaşmak için şu yönergeleri uygulayın:
- Temel PoseDetection SDK'sını ve
stream
algılama modunu kullanın. - Görüntüleri daha düşük çözünürlükte çekmeyi düşünün. Ancak bu API'nin resim boyutu şartlarını da göz önünde bulundurun.
- Video karelerini işlemek için algılayıcının
results(in:)
eşzamanlı API'sini kullanın. Belirli bir video karesinden eşzamanlı olarak sonuçlar almak için AVCaptureVideoDataOutputSampleBufferDelegate'in captureOutput(_, didOutput:from:) fonksiyonundan bu yöntemi çağırın. Algılayıcıya yapılan çağrıları kısmak için AVCaptureVideoDataOutput özelliğinin alwaysDiscardsLateVideoFrames değerini doğru olarak bırakın. Algılayıcı çalışırken yeni bir video karesi kullanılabilir hale gelirse bu kare atlanır. - Dedektörün çıkışını giriş görüntüsüne grafik yerleştirmek için kullanıyorsanız önce ML Kit'ten sonucu alın, ardından tek bir adımda görüntüyü oluşturun ve bindirme kullanın. Böylece, işlenen her giriş karesi için görüntü yüzeyinde yalnızca bir kez oluşturma yaparsınız. Ö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 önemli pozların nasıl kullanılacağını öğrenmek üzere Poz Sınıflandırma İpuçları'nı inceleyin.
- Bu API'nin kullanımda olan bir örneğini görmek için GitHub'da ML Kit hızlı başlangıç örneğine bakın.