Etiqueta imágenes con el AA de Firebase en plataformas de Apple

Puedes usar Firebase ML para etiquetar los objetos reconocidos en una imagen. Consulta la descripción general para obtener información sobre las funciones de esta API.

Antes de comenzar

    Si aún no agregaste Firebase a tu app, sigue los pasos en la guía de introducción para hacerlo.

    Usa Swift Package Manager para instalar y administrar las dependencias de Firebase.

    1. En Xcode, con tu proyecto de app abierto, navega a File > Add Packages.
    2. Cuando se te solicite, agrega el repositorio del SDK de Firebase para plataformas de Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Elige la biblioteca de Firebase ML.
    5. Agrega la marca -ObjC a la sección Other Linker Flags de la configuración de compilación de tu destino.
    6. Cuando termines, Xcode comenzará a resolver y descargar automáticamente tus dependencias en segundo plano.

    A continuación, realiza la configuración en la app:

    1. En tu app, importa Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Si aún no habilitaste las APIs de Cloud en tu proyecto, hazlo de la siguiente manera:

    1. Abre la Firebase ML Página de APIs de Firebase console.
    2. Si todavía no actualizaste tu proyecto a un plan de precios Blaze, haz clic en Actualizar para hacerlo (se te pedirá que realices la actualización únicamente si tu proyecto no está en el plan Blaze).

      Solo los proyectos con un plan Blaze pueden usar las APIs de Cloud.

    3. Si las APIs de Cloud no están habilitadas, haz clic en Habilitar las APIs de Cloud.

Ahora todo está listo para etiquetar imágenes.

1. Prepara la imagen de entrada

Crea un objeto VisionImage mediante una UIImage o CMSampleBufferRef.

Para usar una UIImage, debes hacer lo siguiente:

  1. Si es necesario, rota la imagen para que la propiedad imageOrientation sea .up.
  2. Crea un objeto VisionImage mediante una UIImage que se haya rotado adecuadamente. No especifiques los metadatos de rotación. Se debe usar el valor predeterminado .topLeft.

    Swift

    let image = VisionImage(image: uiImage)

    Objective-C

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

Para usar una CMSampleBufferRef, debes hacer lo siguiente:

  1. Crea un objeto VisionImageMetadata que especifique la orientación de los datos de la imagen contenidos en el búfer CMSampleBufferRef.

    Para obtener la orientación de la imagen, haz lo siguiente:

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

    Luego crea el objeto de metadatos de esta manera:

    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. Crea un objeto VisionImage a través del objeto CMSampleBufferRef y los metadatos de rotación:

    Swift

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

    Objective-C

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

2. Configura y ejecuta el etiquetador de imágenes

Para etiquetar objetos de una imagen, pasa el objeto VisionImage al método processImage() de VisionImageLabeler.

  1. Primero, obtén una instancia de VisionImageLabeler:

    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. Por último, pasa la imagen al método processImage():

    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. Obtén información sobre los objetos etiquetados

Si el etiquetado de imágenes se ejecuta correctamente, se pasará un arreglo de objetos VisionImageLabel al controlador de finalización. De cada objeto puedes obtener información sobre una característica reconocida en la imagen.

Por ejemplo:

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

Próximos pasos