iOS'te Makine Öğrenimi Kiti ile Görüntüleri Etiketleme

Görüntüde tanınan nesneleri etiketlemek için ML Kit'i kullanabilirsiniz: cihaz üzerinde model veya bulut modeli. Bkz. genel bakış ile ele alacağız.

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'

    # If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'

    Projenizin kapsüllerini yükledikten veya güncelledikten sonra Xcode .xcworkspace kullanarak projenize dahil olabilir.
  3. Uygulamanızda Firebase'i içe aktarın:

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  4. Bulut tabanlı modeli kullanmak istiyorsanız ve henüz etkinleştirmediyseniz bulut tabanlı API'ler kullanmak için aşağıdaki adımları uygulayın:

    1. ML Kit'i açın Firebase konsolunun API'ler sayfasında gösterilir.
    2. Projenizi daha önce Blaze fiyatlandırma planına yükseltmediyseniz Bunun için yeni sürüme geçin. (Yalnızca emin olun.)

      Bulut tabanlı API'ler yalnızca Blaze düzeyindeki projelerde kullanılabilir.

    3. Cloud tabanlı API'ler henüz etkinleştirilmemişse Bulut tabanlı API'leri etkinleştir'i tıklayın. API'ler.
    ziyaret edin.

    Yalnızca cihaz üzerindeki modeli kullanmak istiyorsanız bu adımı atlayabilirsiniz.

Artık cihaz üzerindeki bir modeli veya daha fazla.

1. Giriş resmini hazırlama

Bir VisionImage nesnesi oluşturmak için UIImage veya 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çerdiği resim verilerinin yö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. Görüntü etiketleyiciyi yapılandırma ve çalıştırma

Bir görüntüdeki nesneleri etiketlemek için VisionImage nesnesini VisionImageLabeler ürününün processImage() yöntemi.

  1. İlk olarak VisionImageLabeler öğesinin bir örneğini alın.

    Cihaz üzerinde görüntü etiketleyiciyi kullanmak istiyorsanız:

    Swift

    let labeler = Vision.vision().onDeviceImageLabeler()
    
    // Or, to set the minimum confidence required:
    // let options = VisionOnDeviceImageLabelerOptions()
    // options.confidenceThreshold = 0.7
    // let labeler = Vision.vision().onDeviceImageLabeler(options: options)
    

    Objective-C

    FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionOnDeviceImageLabelerOptions *options =
    //         [[FIRVisionOnDeviceImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
    

    Bulut görüntüsü etiketleyiciyi kullanmak istiyorsanız:

    Swift

    let labeler = Vision.vision().cloudImageLabeler()
    
    // Or, to set the minimum confidence required:
    // let options = VisionCloudImageLabelerOptions()
    // options.confidenceThreshold = 0.7
    // let labeler = Vision.vision().cloudImageLabeler(options: options)
    

    Objective-C

    FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionCloudImageLabelerOptions *options =
    //         [[FIRVisionCloudImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] cloudImageLabelerWithOptions:options];
    
  2. Ardından resmi processImage() yöntemine iletin:

    Swift

    labeler.process(image) { labels, error in
        guard error == nil, let labels = labels else { return }
    
        // Task succeeded.
        // ...
    }
    

    Objective-C

    [labeler processImage:image
               completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels,
                            NSError *_Nullable error) {
                   if (error != nil) { return; }
    
                   // Task succeeded.
                   // ...
               }];
    

3. Etiketli nesneler hakkında bilgi edinme

Görüntü etiketleme başarılı olursa VisionImageLabel dizisi nesneler tamamlama işleyiciye aktarılır. Her nesneden bu şekilde resimde tanınan bir özellikle ilgili bilgi verir.

Örneğin:

Swift

for label in labels {
    let labelText = label.text
    let entityId = label.entityID
    let confidence = label.confidence
}

Objective-C

for (FIRVisionImageLabel *label in labels) {
   NSString *labelText = label.text;
   NSString *entityId = label.entityID;
   NSNumber *confidence = label.confidence;
}

Gerçek zamanlı performansı iyileştirmeye yönelik ipuçları

Görüntüleri gerçek zamanlı bir uygulamada etiketlemek isterseniz şu talimatları uygulayın:

  • Görüntü etiketleyiciye yapılan çağrıları kısıtlayın. Yeni bir video karesi resim etiketleyici çalışırken kullanılabilir, çerçeveyi bırakın.
  • Grafikleri üzerine bindirmek için görüntü etiketleyicinin çıkışını 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.

Sonraki adımlar