iOS'te ML Kit ile duruşları tespit edin

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

ML Kit, poz algılama için iki optimize SDK sağlar.

SDK AdıPoz AlgılamaPoz Algılama Doğruluğu
UygulamaTemel algılayıcının öğeleri, oluşturma sırasında uygulamanıza statik olarak bağlanır.Doğru algılayıcının öğeleri, oluşturma sırasında uygulamanıza statik olarak bağlanır.
Uygulama boyutuEn fazla 29,6 MBEn fazla 33,2 MB
PerformansiPhone X: ~45FPSiPhone X: ~29FPS

Deneyin

Başlamadan önce

  1. Aşağıdaki ML Kit kapsüllerini Podfile dosyanı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'
    
  2. Projenizin kapsüllerini yükledikten veya güncelledikten sonra, xcworkspace kodunu kullanarak Xcode projenizi açın. ML Kit, Xcode'un 13.2.1 veya sonraki sürümlerinde desteklenir.

1. PoseDetector örneği oluşturun

Bir resimdeki pozu algılamak için önce bir PoseDetector örneği oluşturun ve isteğe bağlı olarak algılayıcı ayarlarını belirtin.

PoseDetector seçeneği

Algılama Modu

PoseDetector iki algılama modunda çalışır. Kullanım alanınıza uygun olanı seçin.

stream (varsayılan)
Poz dedektörü öncelikle resimdeki en belirgin kişiyi ve ardından poz algılama özelliğini çalıştırır. Sonraki çerçevelerde kişi algılama adımı, kişi belirsizleştirilmediğinde veya artık yüksek bir güven seviyesiyle algılanmadığı sürece yürütülmez. Poz dedektörü en belirgin kişiyi takip etmeye ve her çıkarımda duruşunu döndürmeye çalışır. Böylece gecikmeyi azaltır ve algılamayı akıcı hale getirir. Video akışında poz algılamak istediğinizde bu modu kullanın.
singleImage
Poz algılama algılayıcı 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ıştırılır. Böylece gecikme daha yüksek olur ve kişi izleme gerekmez. Bu modu, statik resimlerde poz algılama özelliğini kullanırken veya izlemeye izin verilmeyen yerlerde kullanın.

Poz dedektörü 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ırlayın

Poz algılamak için her görüntü veya video çerçevesi için aşağıdakileri yapın. Yayın modunu etkinleştirdiyseniz CMSampleBuffer bölümünden VisionImage nesne oluşturmanız gerekir.

UIImage veya CMSampleBuffer kullanarak bir VisionImage nesnesi oluşturun.

UIImage kullanıyorsanız şu adımları uygulayın:

  • UIImage ile bir VisionImage nesnesi oluşturun. Doğru .orientation'u 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ü ayarlamak 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 VisionImage 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 değerini poz dedektörü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 duruş hakkında bilgi alın

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şleyicisine Pose nesnesinin bir dizisini iletir veya diziyi döndürür.

Kullanıcı tam olarak resmin içinde değilse model, eksik önemli noktalar koordinatlarını karenin dışına atar ve düşük InFrameConfidence değerlerini verir.

Hiç kimse 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ı artırmayla ilgili 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 verileriyle temsil edilmelidir; en iyi performans için özne en az 256x256 piksel olmalıdır.
  • Gerçek zamanlı bir uygulamada poz algılarsanız giriş görüntülerinin genel boyutlarını da dikkate almak isteyebilirsiniz. Küçük resimler daha hızlı işlenebilir. Bu nedenle gecikmeyi azaltmak için resimleri daha düşük çözünürlükte çekin ancak yukarıdaki çözünürlük gereksinimlerini göz önünde bulundurun ve öznenin mümkün olduğunca fazla resim kapladığından emin olun.
  • Düşük resim odağı da doğruluğu etkileyebilir. Kabul edilebilir sonuçlar elde edemiyorsanız kullanıcıdan resmi tekrar yakalamasını isteyin.

Poz algılama özelliğini 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'yı ve stream algılama modunu kullanın.
  • Resimleri daha düşük çözünürlükte çekmeyi düşünebilirsiniz. Ancak bu API'nin resim boyutu gereksinimlerini de unutmayın.
  • Video çerçevelerini işlemek için algılayıcının results(in:) eşzamanlı API'sini kullanın. Belirtilen video çerçevesinden eşzamanlı olarak sonuç almak için bu yöntemi AVCaptureVideoDataExitSampleBufferconv'ın captureoutput(_, Didoutput:from:) işlevinden çağırın. Algılayıcıya yapılan çağrıları kısıtlamak için AVCaptureVideoDataExit'in her zaman lakaplı VideoÇerçevelerini doğru tutun. Algılayıcı çalışırken yeni bir video çerçevesi kullanılabilir hale gelirse atlanır.
  • Algılayıcının çıkışını giriş resmine yer paylaşımlı olarak yerleştirmek için önce sonuçları ML Kit'ten alın, ardından resmi ve yer paylaşımını tek bir adımda oluşturun. Bu şekilde, işlenen her giriş çerçevesi için ekranı yalnızca bir kez oluşturursunuz. Örnek için vitrin örnek uygulamasındaki previewOverlayView ve MLKDetectionOverlayView sınıflarını inceleyin.

Sonraki adımlar