Маркируйте изображения с помощью Firebase ML на платформах Apple

Вы можете использовать Firebase ML для маркировки объектов, распознанных на изображении. См. обзор для получения информации о функциях этого API.

Прежде чем начать

    Если вы еще не добавили Firebase в свое приложение, сделайте это, выполнив действия, описанные в руководстве по началу работы .

    Используйте Swift Package Manager для установки зависимостей Firebase и управления ими.

    1. В Xcode, открыв проект приложения, выберите «Файл» > «Добавить пакеты» .
    2. При появлении запроса добавьте репозиторий Firebase SDK для платформ Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Выберите библиотеку Firebase ML .
    5. Добавьте флаг -ObjC в раздел «Другие флаги компоновщика» настроек сборки вашей цели.
    6. По завершении Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.

    Затем выполните некоторые настройки в приложении:

    1. Импортируйте Firebase в свое приложение:

      Быстрый

      import FirebaseMLModelDownloader

      Цель-C

      @import FirebaseMLModelDownloader;
  1. Если вы еще не включили облачные API для своего проекта, сделайте это сейчас:

    1. Откройте страницу API Firebase ML в консоли Firebase .
    2. Если вы еще не обновили свой проект до тарифного плана Blaze, нажмите «Обновить» , чтобы сделать это. (Вам будет предложено выполнить обновление, только если ваш проект не входит в план Blaze.)

      Только проекты уровня Blaze могут использовать облачные API.

    3. Если облачные API еще не включены, нажмите «Включить облачные API» .

Теперь вы готовы маркировать изображения.

1. Подготовьте входное изображение

Создайте объект VisionImage с помощью UIImage или CMSampleBufferRef .

Чтобы использовать UIImage :

  1. При необходимости поверните изображение так, чтобы его свойство imageOrientation было .up .
  2. Создайте объект VisionImage используя правильно повернутый UIImage . Не указывайте метаданные вращения — необходимо использовать значение по умолчанию .topLeft .

    Быстрый

    let image = VisionImage(image: uiImage)

    Цель-C

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

Чтобы использовать CMSampleBufferRef :

  1. Создайте объект VisionImageMetadata , который задает ориентацию данных изображения, содержащихся в буфере CMSampleBufferRef .

    Чтобы получить ориентацию изображения:

    Быстрый

    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
        }
    }

    Цель-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;
      }
    }

    Затем создайте объект метаданных:

    Быстрый

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

    Цель-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. Создайте объект VisionImage используя объект CMSampleBufferRef и метаданные вращения:

    Быстрый

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

    Цель-C

    FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
    image.metadata = metadata;

2. Настройте и запустите средство разметки изображений.

Чтобы пометить объекты на изображении, передайте объект VisionImage processImage() класса VisionImageLabeler .

  1. Сначала получите экземпляр VisionImageLabeler :

    Быстрый

    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)
    

    Цель-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. Затем передайте изображение processImage() :

    Быстрый

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

    Цель-C

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

3. Получить информацию о помеченных объектах

Если маркировка изображения прошла успешно, обработчику завершения будет передан массив объектов VisionImageLabel . От каждого объекта можно получить информацию о признаке, распознанном на изображении.

Например:

Быстрый

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

Цель-C

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

Следующие шаги