Ir a la consola

Etiqueta imágenes con el Kit de AA en iOS

Puedes usar el Kit de AA para etiquetar objetos reconocidos en una imagen mediante un modelo en el dispositivo o un modelo en la nube. Consulta la descripción general para obtener más información sobre los beneficios de cada enfoque.

Consulta la muestra de inicio rápido del Kit de AA en GitHub para ver un ejemplo de esta API en uso.

Antes de comenzar

  1. Si aún no agregaste Firebase a tu app, sigue los pasos en la guía de introducción para hacerlo.
  2. Incluye las bibliotecas del Kit de AA en el Podfile:
    pod 'Firebase/Analytics'
    pod 'Firebase/MLVision'

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

    Después de instalar o actualizar los pods de tu proyecto, asegúrate de abrir el proyecto de Xcode a través de su .xcworkspace.
  3. En tu app, importa Firebase:

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  4. Si deseas usar el modelo basado en la nube, pero todavía no habilitaste las API basadas en la nube para el proyecto, hazlo ahora:

    1. Abre la página de API del Kit de AA de Firebase console.
    2. Si todavía no actualizaste tu proyecto a un plan 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 API de Cloud.

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

    Si solo quieres usar el modelo en el dispositivo, puedes omitir este paso.

Ahora estás listo para etiquetar imágenes con un modelo en el dispositivo o uno basado en la nube.

1. Prepara la imagen de entrada

Crea un objeto VisionImage a partir de una UIImage o CMSampleBufferRef.

Para usar una UIImage:

  1. Si es necesario, rota la imagen para que la propiedad imageOrientation sea .up.
  2. Usa una UIImage que se haya rotado correctamente para crear un objeto VisionImage. 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:

  1. Crea un objeto VisionImageMetadata en el que se especifique la orientación de los datos de la imagen contenidos en el búfer al que hace referencia 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 los objetos de una imagen, pasa el objeto VisionImage al método processImage() de VisionImageLabeler.

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

    Si quieres usar el etiquetador de imágenes en el dispositivo, hazlo de la siguiente manera:

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

    Si quieres usar el etiquetador de imágenes en la nube, hazlo de la siguiente manera:

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

Sugerencias para mejorar el rendimiento en tiempo real

Si quieres etiquetar imágenes en una aplicación en tiempo real, sigue estos lineamientos para lograr la mejor velocidad de fotogramas:

  • Regula las llamadas al etiquetador de imágenes. Si surge un fotograma de video nuevo mientras se ejecuta el etiquetador de imágenes, ignora ese fotograma.

Próximos pasos

Antes de implementar en producción una app que usa una API de Cloud, debes realizar algunos pasos adicionales para prevenir y mitigar el efecto del acceso no autorizado a la API.