iOS'te ML Kiti ile nesneleri algılama ve izleme

Art arda gelen video karelerindeki nesneleri algılamak ve takip etmek için ML Kit'i kullanabilirsiniz.

Bir resmi ML Kit'e ilettiğinizde, resimdeki beşe kadar nesneyi algılar konumla birlikte resimdeki her bir nesnenin konumunu da içerir. Şu yolda nesneleri algılarken: her nesnenin, nesneyi izlemek için kullanabileceğiniz benzersiz bir kimliği vardır her kareden kareye geçelim. İsterseniz genel nesneyi de etkinleştirebilirsiniz. geniş kategori tanımlarına sahip nesneleri etiketleyen bir modeldir.

Deneyin

Başlamadan önce

  1. Aşağıdaki ML Kit kapsüllerini Podfile'ınıza ekleyin:
    pod 'GoogleMLKit/ObjectDetection', '3.2.0'
    
  2. Projenizin kapsüllerini yükledikten veya güncelledikten sonra .xcworkspace ML Kit, Xcode 12.4 veya sonraki sürümlerde desteklenir.

1. Nesne algılayıcıyı yapılandırma

Nesneleri algılamak ve izlemek için önce ObjectDetector ve isteğe bağlı olarak istediğiniz algılayıcı ayarlarını belirtin varsayılan değeri değiştirin.

  1. Nesne algılayıcıyı ObjectDetectorOptions nesne algılandı. Şunları değiştirebilirsiniz: Ayarlar:

    Nesne Algılayıcı Ayarları
    Algılama modu .stream (varsayılan) | .singleImage

    Akış modunda (varsayılan), nesne algılayıcısı çok düşük bir değerle çalışır gecikme olabilir, ancak eksik sonuçlar (belirtilmemiş sonuçlar gibi) sınırlayıcı kutu veya kategori) ekleyebilirsiniz. tıklayın. Ayrıca, akış modunda algılayıcı, izleme kodu Kareler genelinde nesneleri izlemek için kullanabileceğiniz nesne kimlikleri. Nesneleri izlemek istediğinizde veya düşük gecikme süresi olduğunda bu modu kullanın video akışları gerçek zamanlı şekilde işlenirken olduğu gibi, gerekir.

    Tekli görüntü modunda, nesne algılayıcı, sonucu döndürür nesnenin sınırlayıcı kutusu belirlendikten sonra. Ayrıca, sınıflandırmasında, sınırlayıcı kutudan sonra sonucu döndürür ve kategori etiketinin her ikisi de kullanılabilir. Sonuç olarak, tespit edilen daha yüksek olur. Ayrıca, tek resim modunda izleme Kimlikler atanmadı. Gecikme kritik değilse bu modu kullanın ve bazı sonuçlar vardır.

    Birden çok nesneyi algılama ve izleme false (varsayılan) | true

    Beş adede kadar veya yalnızca en fazla nesne algılayıp takip etme belirgin nesne (varsayılan).

    Nesneleri sınıflandırma false (varsayılan) | true

    Algılanan nesnelerin genel kategorilerde sınıflandırılıp sınıflandırılmayacağı. Etkinleştirildiğinde, nesne algılayıcı, nesneleri şu kategoriler var: moda ürünleri, gıda, ev eşyaları, yerler ve bitkiler.

    Nesne algılama ve izleme API'si, bu iki temel kullanım için optimize edilmiştir vakalar:

    • Kameradaki en belirgin nesnenin canlı algılanması ve takip edilmesi vizör.
    • Statik bir görüntüde birden fazla nesnenin algılanması.

    API'yi bu kullanım alanlarına göre yapılandırmak için:

Swift

// Live detection and tracking
let options = ObjectDetectorOptions()
options.shouldEnableClassification = true

// Multiple object detection in static images
let options = ObjectDetectorOptions()
options.detectorMode = .singleImage
options.shouldEnableMultipleObjects = true
options.shouldEnableClassification = true

Objective-C

// Live detection and tracking
MLKObjectDetectorOptions *options = [[MLKObjectDetectorOptions alloc] init];
options.shouldEnableClassification = YES;

// Multiple object detection in static images
MLKObjectDetectorOptions *options = [[MLKOptions alloc] init];
options.detectorMode = MLKObjectDetectorModeSingleImage;
options.shouldEnableMultipleObjects = YES;
options.shouldEnableClassification = YES;
  1. ObjectDetector örneği alın:

Swift

let objectDetector = ObjectDetector.objectDetector()

// Or, to change the default settings:
let objectDetector = ObjectDetector.objectDetector(options: options)

Objective-C

MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetector];

// Or, to change the default settings:
MLKObjectDetector *objectDetector = [MLKObjectDetector objectDetectorWithOptions:options];

2. Giriş resmini hazırlama

Nesneleri algılamak ve izlemek için her bir resim veya video karesi için aşağıdakileri yapın. Akış modunu etkinleştirdiyseniz şuradan VisionImage nesne oluşturmanız gerekir: CMSampleBuffer sn.

Bir VisionImage nesnesi oluşturmak için UIImage veya CMSampleBuffer.

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

  • UIImage ile bir VisionImage 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:

  • Belgenin CMSampleBuffer

    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;
      }
    }
          
  • Şu komutu kullanarak bir VisionImage nesnesi oluşturun: CMSampleBuffer nesne ve yön:

    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, nesne algılayıcının görüntü işleme araçlarından birine iletin yöntemlerine göz atın. Eşzamansız process(image:) yöntemini veya eşzamanlı results() yöntemi.

Nesneleri eşzamansız olarak algılamak için:

Swift

objectDetector.process(image) { objects, error in
  guard error == nil else {
    // Error.
    return
  }
  guard !objects.isEmpty else {
    // No objects detected.
    return
  }

  // Success. Get object info here.
  // ...
}

Objective-C

[objectDetector processImage:image
                  completion:^(NSArray * _Nullable objects,
                               NSError * _Nullable error) {
                    if (error == nil) {
                      return;
                    }
                    if (objects.count == 0) {
                      // No objects detected.
                      return;
                    }

                    // Success. Get object info here.
                  }];

Nesneleri eşzamanlı olarak algılamak için:

Swift

var objects: [Object]
do {
  objects = try objectDetector.results(in: image)
} catch let error {
  print("Failed to detect object with error: \(error.localizedDescription).")
  return
}
guard !objects.isEmpty else {
  print("Object detector returned no results.")
  return
}

// Success. Get object info here.

Objective-C

NSError *error;
NSArray *objects = [objectDetector resultsInImage:image error:&error];
if (error == nil) {
  return;
}
if (objects.count == 0) {
  // No objects detected.
  return;
}

// Success. Get object info here.

4. Algılanan nesneler hakkında bilgi alma

Görüntü işlemciye yapılan çağrı başarılı olursa Şuna bağlı olarak tamamlama işleyiciye Object ekler veya listeyi geri döndürür: eşzamansız yöntemi mi yoksa eşzamanlı yöntemi mi çağırdığınız.

Her Object aşağıdaki özellikleri içerir:

frame NesneninCGRect görüntüsüdür.
trackingID Nesneyi resimlerde tanımlayan bir tam sayı veya resimlerde "nil" tek resim modu.
labels Algılayıcı tarafından döndürülen nesneyi açıklayan bir etiket dizisi. Algılayıcı seçeneği ise özellik boştur shouldEnableClassification, false olarak ayarlandı.

Swift

// objects contains one item if multiple object detection wasn't enabled.
for object in objects {
  let frame = object.frame
  let trackingID = object.trackingID

  // If classification was enabled:
  let description = object.labels.enumerated().map { (index, label) in
    "Label \(index): \(label.text), \(label.confidence)"
    }.joined(separator:"\n")

}

Objective-C

// The list of detected objects contains one item if multiple
// object detection wasn't enabled.
for (MLKObject *object in objects) {
  CGRect frame = object.frame;
  NSNumber *trackingID = object.trackingID;
  for (MLKObjectLabel *label in object.labels) {
    NSString *labelString = [NSString stringWithFormat: @"%@, %f, %lu",
      label.text, label.confidence, (unsigned long)label.index];
    ...
  }
}

Kullanılabilirliği ve performansı iyileştirme

En iyi kullanıcı deneyimi için uygulamanızda aşağıdaki yönergelere uyun:

  • Nesne algılama işleminin başarılı olması, nesnenin görsel karmaşıklığına bağlıdır. İçinde az sayıda görsel özelliği olan nesnelerin algılanması için kaplamaya başlar. Kullanıcılara şu konularda yol göstermeniz gerekir: algılamak istediğiniz tür nesnelerde iyi çalışan bir giriş yakalamanızı sağlar.
  • Sınıflandırma kullanırken, düşmeyen nesneleri tespit etmek isterseniz desteklenen kategorilere ayırarak, bilinmeyen nesneler'i tıklayın.

Ayrıca, Materyal Tasarım'a Makine öğrenimi destekli özellikleri içeren kalıplar koleksiyonu.

Akış modunu gerçek zamanlı bir uygulamada kullanırken aşağıdaki kuralları uygulayarak en iyi kare hızlarına ulaşın: