iOS'te Makine Öğrenimi Kiti ile Nesneleri Tespit Etme ve İzleme

Video karelerindeki nesneleri tespit edip takip etmek için ML Kit'i kullanabilirsiniz.

Makine Öğrenimi Kiti görüntülerini ilettiğinizde, Makine Öğrenimi Kiti her görüntü için en fazla beş algılanan nesne ve bunların resimdeki konumları. Algılarken her nesnenin bir kimliği vardır. Bunları izlemek için nesnelere takılmayın. İsterseniz genel nesneyi de etkinleştirebilirsiniz. geniş kategori tanımlarına sahip nesneleri etiketleyen bir modeldir.

Başlamadan önce

  1. Firebase'i uygulamanıza henüz eklemediyseniz başlangıç kılavuzundaki adımlara bakın.
  2. ML Kit kitaplıklarını Podfile'ınıza ekleyin:
    pod 'Firebase/MLVision', '6.25.0'
    pod 'Firebase/MLVisionObjectDetection', '6.25.0'
    
    . Projenizin kapsüllerini yükledikten veya güncelledikten sonra Xcode projenin yaşam döngüsünü yürütmeniz gerekir..xcworkspace
  3. Uygulamanızda Firebase'i içe aktarın:

    Swift

    import Firebase

    Objective-C

    @import Firebase;

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

Nesneleri tespit edip izlemeye başlamak için önce VisionObjectDetector (isteğe bağlı olarak istediğiniz algılayıcı ayarlarını belirtin) varsayılan değeri değiştirin.

  1. Kullanım alanınıza göre nesne algılayıcıyı VisionObjectDetectorOptions 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 gerekir.

    Tekli görüntü modunda, nesne dedektörü bir algılanana kadar bekler nesnenin sınırlayıcı kutusu ve (sınıflandırmayı etkinleştirdiyseniz) kategorisi kullanılabilir. Sonuç olarak, algılama gecikmesi potansiyel olarak daha yüksektir. Ayrıca, tek bir resimde izleme kimlikleri atanmadığından emin olun. Gecikme varsa bu modu kullanın kritik öneme sahip değildir ve reklamların yalnızca bir kısmını sonuç.

    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, bitkiler ve bilinmeyenler.

    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 resimde 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 = VisionObjectDetectorOptions()
    options.detectorMode = .stream
    options.shouldEnableMultipleObjects = false
    options.shouldEnableClassification = true  // Optional
    
    // Multiple object detection in static images
    let options = VisionObjectDetectorOptions()
    options.detectorMode = .singleImage
    options.shouldEnableMultipleObjects = true
    options.shouldEnableClassification = true  // Optional
    

    Objective-C

    // Live detection and tracking
    FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init];
    options.detectorMode = FIRVisionObjectDetectorModeStream;
    options.shouldEnableMultipleObjects = NO;
    options.shouldEnableClassification = YES;  // Optional
    
    // Multiple object detection in static images
    FIRVisionObjectDetectorOptions *options = [[FIRVisionObjectDetectorOptions alloc] init];
    options.detectorMode = FIRVisionObjectDetectorModeSingleImage;
    options.shouldEnableMultipleObjects = YES;
    options.shouldEnableClassification = YES;  // Optional
    
  2. FirebaseVisionObjectDetector örneği alın:

    Swift

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

    Objective-C

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

2. Nesne algılayıcıyı çalıştırma

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: CMSampleBufferRef sn.

  1. UIImage veya UIImage kullanarak bir VisionImage nesnesi oluşturun CMSampleBufferRef.

    UIImage kullanmak için:

    1. Gerekirse resmi, imageOrientation özellik değeri .up.
    2. Doğru şekilde döndürülen öğeyi kullanarak bir VisionImage nesnesi oluşturun UIImage. Herhangi bir rotasyon meta verisi belirtme (varsayılan) değeri (.topLeft) kullanılmalıdır.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    CMSampleBufferRef kullanmak için:

    1. Aşağıdakini belirten bir VisionImageMetadata nesnesi oluşturun: içindeki resim verilerinin yönünü CMSampleBufferRef arabellek.

      Resmin yönünü öğrenmek için:

      Swift

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Objective-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Ardından meta veri nesnesini oluşturun:

      Swift

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Objective-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Şunu kullanarak bir VisionImage nesnesi oluşturun: CMSampleBufferRef nesnesi ve rotasyon meta verileri:

      Swift

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  2. 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) { detectedObjects, error in
      guard error == nil else {
        // Error.
        return
      }
      guard let detectedObjects = detectedObjects, !detectedObjects.isEmpty else {
        // No objects detected.
        return
      }
    
      // Success. Get object info here.
      // ...
    }
    

    Objective-C

    [objectDetector processImage:image
                      completion:^(NSArray<FIRVisionObject *> * _Nullable objects,
                                   NSError * _Nullable error) {
                        if (error == nil) {
                          return;
                        }
                        if (objects == nil | objects.count == 0) {
                          // No objects detected.
                          return;
                        }
    
                        // Success. Get object info here.
                        // ...
                      }];
    

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

    Swift

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

    Objective-C

    NSError *error;
    NSArray<FIRVisionObject *> *objects = [objectDetector resultsInImage:image
                                                                   error:&error];
    if (error == nil) {
      return;
    }
    if (objects == nil | objects.count == 0) {
      // No objects detected.
      return;
    }
    
    // Success. Get object info here.
    // ...
    
  3. Görüntü işlemciye yapılan çağrı başarılı olursa Şuna bağlı olarak tamamlama işleyiciye VisionObject 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 VisionObject aşağıdaki özellikleri içerir:

    frame NesneninCGRect görüntüsüdür.
    trackingID Nesneyi resimler arasında tanımlayan bir tam sayı. Tek kişilik Nil resim moduna girer.
    classificationCategory Nesnenin genel kategorisi. Nesne algılayıcı sınıflandırma etkin olduğunda bu her zaman .unknown olur.
    confidence Nesne sınıflandırmasının güven değeri. Nesne algılayıcının sınıflandırması etkinleştirilmemiş veya nesne bilinmiyor olarak sınıflandırıldı. Bu saat: nil.

    Swift

    // detectedObjects contains one item if multiple object detection wasn't enabled.
    for obj in detectedObjects {
      let bounds = obj.frame
      let id = obj.trackingID
    
      // If classification was enabled:
      let category = obj.classificationCategory
      let confidence = obj.confidence
    }
    

    Objective-C

    // The list of detected objects contains one item if multiple
    // object detection wasn't enabled.
    for (FIRVisionObject *obj in objects) {
      CGRect bounds = obj.frame;
      if (obj.trackingID) {
        NSInteger id = obj.trackingID.integerValue;
      }
    
      // If classification was enabled:
      FIRVisionObjectCategory category = obj.classificationCategory;
      float confidence = obj.confidence.floatValue;
    }
    

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. Nesneler az sayıda görsel özellikle birlikte kullanılması, resim olarak algılanır. Kullanıcılara, içeriklerinizin yakalanması için iyi çalışan bir girişe sahip olması gerekir.
  • Sınıflandırma kullanırken, düşmeyen nesneleri tespit etmek isterseniz desteklenen kategorilere ayırarak, bilinmeyen kullanıcılar için nesneler'i tıklayın.

Ayrıca, [ML Kit Material Design vitrin uygulaması][showcase-link]{: .external } ve Materyal Tasarım Makine öğrenimi destekli özellikleri içeren kalıplar koleksiyonu.

Gerçek zamanlı bir uygulamada akış modunu kullanırken şu yönergeleri izleyin: en iyi kare hızlarına ulaşın:

  • Çoğu cihaz çalışmayacağından akış modunda çoklu nesne algılamayı kullanmayın. üretebilmesidir.

  • İhtiyacınız yoksa sınıflandırmayı devre dışı bırakın.

  • Algılayıcıya yapılan çağrıları hızlandırın. Yeni bir video karesi kullanılabilir durumdaysa çerçeveyi bırakın.
  • Algılayıcının çıkışını üzerine grafik yerleştirmek için kullanıyorsanız giriş görüntüsünü kullanın, önce ML Kit'ten sonucu alın ve ardından görüntüyü oluşturun tek bir adımda yapabilirsiniz. Bu şekilde, öğeleri ekran yüzeyinde her giriş karesi için yalnızca bir kez. Bkz. previewOverlayView ve FIRDetectionOverlayView sınıfları inceleyelim.