ML Kiti, poz algılama için optimize edilmiş iki SDK sunar.
| 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ı için öğeler, 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ı deneyin.
Başlamadan önce
Podfile'ınıza aşağıdaki ML Kiti 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 pod'larını yükledikten veya güncelledikten sonra
xcworkspacekullanarak Xcode projenizi açın. ML Kiti, Xcode 13.2.1 veya sonraki sürümlerde desteklenir.
1. PoseDetector örneği oluşturma
Bir resimdeki 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)- Duruş algılayıcı, önce resimdeki en belirgin kişiyi algılar, ardından duruş algılama işlemini çalıştırır. Sonraki karelerde, kişi gizlenmediği veya yüksek güvenle algılanmaya devam ettiği sürece kişi algılama adımı gerçekleştirilmez. Duruş algılayıcı, en belirgin kişiyi takip etmeye ve her çıkarımda bu kişinin duruşunu döndürmeye çalışır. Bu sayede gecikme süresi azalır ve algılama daha sorunsuz hale gelir. Bu modu, bir video akışında duruş algılamak istediğinizde kullanın.
singleImage- Duruş algılayıcı, bir kişiyi algılar ve ardından duruş algılama işlemini çalıştırır. Kişi algılama adımı her görüntü için çalıştırılacağından gecikme daha yüksek olur ve kişi takibi yapılmaz. Statik görüntülerde duruş algılama özelliğini kullanırken veya izlemenin istenmediği durumlarda 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ş görüntüsünü hazırlama
Pozları algılamak için her resim veya video karesinde aşağıdaki adımları uygulayı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 aşağıdaki adımları uygulayın:
UIImageile birVisionImagenesnesi oluşturun. Doğru.orientationdeğ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 aşağıdaki adımları uygulayın:
-
CMSampleBufferiçinde bulunan resim verilerinin yönünü belirtin.Resim 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; } }
CMSampleBuffernesnesini ve yönü kullanarak birVisionImagenesnesi 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 nesnesini, duruş 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 edinme
Görüntüde bir kişi algılanırsa poz algılama API'si, eşzamansız veya eşzamanlı yöntemi çağırıp çağırmadığınıza bağlı olarak tamamlama işleyicisine bir Pose nesnesi dizisi iletir ya da diziyi döndürür.
Kişi tamamen resmin içinde değilse model, eksik referans noktası koordinatlarını çerçevenin dışına atar ve bunlara düşük InFrameConfidence değerleri verir.
Kişi 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:
- ML Kit'in pozu doğru şekilde algılaması için resimdeki kişi yeterli piksel verisiyle temsil edilmelidir. En iyi performans için özne en az 256x256 piksel olmalıdır.
- Gerçek zamanlı bir uygulamada poz algılıyorsanız giriş resimlerinin genel boyutlarını da göz önünde bulundurmanız gerekebilir. Daha 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ı kapladığından emin olun.
- Resim odağının kötü olması da doğruluğu etkileyebilir. Kabul edilebilir sonuçlar alamazsanız kullanıcıdan görüntüyü yeniden yakalamasını isteyin.
Duruş algılama özelliğini 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
streamalgılama modunu kullanın. - Görüntüleri daha düşük çözünürlükte yakalamayı deneyin. Ancak bu API'nin resim boyutu koşulları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ç almak için bu yöntemi AVCaptureVideoDataOutputSampleBufferDelegate'in captureOutput(_, didOutput:from:) işlevinden çağırın. Dedektöre yapılan çağrıları kısıtlamak için AVCaptureVideoDataOutput'un alwaysDiscardsLateVideoFrames değerini doğru olarak ayarlayın. Algılayıcı çalışırken yeni bir video karesi kullanılabilir hale gelirse bu kare silinir. - Algılayıcının çıkışını, giriş resminin üzerine grafik yerleştirmek için kullanıyorsanız önce ML Kit'ten sonucu alın, ardından resmi ve yerleşimi tek bir adımda oluşturun. Böylece, işlenen her giriş karesi için görüntüleme yüzeyine yalnızca bir kez oluşturma işlemi yaparsınız. Örnek için tanıtım amaçlı örnek uygulamadaki previewOverlayView ve MLKDetectionOverlayView sınıflarına bakın.
Sonraki adımlar
- Duruşları sınıflandırmak için duruş işaretlerini nasıl kullanacağınızı öğrenmek istiyorsanız Duruş Sınıflandırma İpuçları başlıklı makaleyi inceleyin.
- Bu API'nin kullanımına dair bir örnek için GitHub'daki ML Kiti hızlı başlangıç örneğine bakın.