Catch up on everything we announced at this year's Firebase Summit. Learn more

Rotular imagens com Firebase ML em plataformas Apple

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

Antes de você começar

    Se você ainda não tiver adicionado Firebase ao seu aplicativo, fazê-lo seguindo os passos do guia de introdução .

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

    1. No Xcode, com o seu projeto aplicativo aberto, navegue até Arquivo> Pacotes Swift> Adicionar pacote de dependência.
    2. Quando solicitado, adicione o repositório SDK de plataformas Firebase Apple:
    3.   https://github.com/firebase/firebase-ios-sdk
        
    4. Escolha a biblioteca Firebase ML.
    5. 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. Em seu aplicativo, importe o Firebase:

      Rápido

      import Firebase

      Objective-C

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

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

      Apenas projetos em nível de Blaze podem usar APIs baseadas em nuvem.

    3. Se APIs baseados em nuvem não estiverem ativados, clique em Ativar APIs baseados em nuvem.

Agora você está pronto para rotular imagens.

1. Prepare a imagem de entrada

Criar um VisionImage objeto usando uma UIImage ou um CMSampleBufferRef .

Para usar um UIImage :

  1. Se necessário, gire a imagem para que sua imageOrientation propriedade é .up .
  2. Criar um VisionImage objeto usando o corretamente-girado UIImage . Não especifique qualquer rotação metadados o valor padrão, .topLeft , deve ser utilizado.

    Rápido

    let image = VisionImage(image: uiImage)

    Objective-C

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

Para usar um CMSampleBufferRef :

  1. Criar uma VisionImageMetadata objecto que especifica a orientação dos dados de imagem contidos no CMSampleBufferRef tampão.

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

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

    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
    )

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

    Rápido

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

    Objective-C

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

2. Configure e execute o rotulador de imagem

Para etiqueta de objectos numa imagem, passar a VisionImage objecto para o VisionImageLabeler 's processImage() método.

  1. Em primeiro lugar, obter 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)
    

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

    Rápido

    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. Obtenha informações sobre objetos rotulados

Se rotulagem imagem sucede, uma matriz de VisionImageLabel objectos serão passados para o processador de conclusão. De cada objeto, você pode obter informações sobre um recurso reconhecido na imagem.

Por exemplo:

Rápido

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

Próximos passos