Rotular imagens com Firebase ML em plataformas Apple

Você pode usar o Firebase ML para rotular objetos reconhecidos em uma imagem. Consulte a visão geral para obter informações sobre os recursos desta API.

Antes de você começar

    Se você ainda não adicionou o Firebase ao seu aplicativo, faça isso seguindo as etapas do guia de primeiros passos .

    Use o Swift Package Manager para instalar e gerenciar dependências do Firebase.

    1. No Xcode, com o projeto do seu aplicativo aberto, navegue até File > Add Packages .
    2. Quando solicitado, adicione o repositório SDK das plataformas Apple do Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Escolha a biblioteca Firebase ML.
    5. Adicione o sinalizador -ObjC à seção Outros sinalizadores de vinculador das configurações de compilação do seu destino.
    6. Quando terminar, o Xcode começará automaticamente a resolver e baixar suas dependências em segundo plano.

    Em seguida, execute algumas configurações no aplicativo:

    1. No seu aplicativo, importe o Firebase:

      Rápido

      import FirebaseMLModelDownloader

      Objetivo-C

      @import FirebaseMLModelDownloader;
  1. Se você ainda não habilitou APIs baseadas em nuvem para seu projeto, faça-o agora:

    1. Abra a página APIs do Firebase ML do console do Firebase.
    2. Se você ainda não atualizou seu projeto para o plano de preços Blaze, clique em Atualizar para fazer isso. (Você será solicitado a atualizar somente se o seu projeto não estiver no plano Blaze.)

      Somente projetos no nível Blaze podem usar APIs baseadas em nuvem.

    3. Se as APIs baseadas em nuvem ainda não estiverem habilitadas, clique em Habilitar APIs baseadas em nuvem .

Agora você está pronto para rotular imagens.

1. Prepare a imagem de entrada

Crie um objeto VisionImage usando UIImage ou CMSampleBufferRef .

Para usar uma UIImage :

  1. Se necessário, gire a imagem para que sua propriedade imageOrientation seja .up .
  2. Crie um objeto VisionImage usando o UIImage girado corretamente. Não especifique nenhum metadado de rotação — o valor padrão, .topLeft , deve ser usado.

    Rápido

    let image = VisionImage(image: uiImage)

    Objetivo-C

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

Para usar um CMSampleBufferRef :

  1. Crie um objeto VisionImageMetadata que especifique a orientação dos dados de imagem contidos no buffer CMSampleBufferRef .

    Para obter a orientação da imagem:

    Rápido

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

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

    Em seguida, crie o objeto de metadados:

    Rápido

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

    Objetivo-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. Crie um objeto VisionImage usando o objeto CMSampleBufferRef e os metadados de rotação:

    Rápido

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

    Objetivo-C

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

2. Configure e execute o rotulador de imagens

Para rotular objetos em uma imagem, passe o objeto VisionImage para o método processImage() do VisionImageLabeler .

  1. Primeiro, obtenha uma instância de VisionImageLabeler :

    Rápido

    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)
    

    Objetivo-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. Em seguida, passe a imagem para o método processImage() :

    Rápido

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

    Objetivo-C

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

3. Obtenha informações sobre objetos rotulados

Se a rotulagem da imagem for bem-sucedida, uma matriz de objetos VisionImageLabel será passada para o manipulador de conclusão. De cada objeto você pode obter informações sobre uma característica reconhecida na imagem.

Por exemplo:

Rápido

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

Objetivo-C

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

Próximos passos