Ir a la consola

Etiqueta imágenes con el Kit del 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/Core'
    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 mediante una UIImage o una 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 que especifique la orientación de la información de la imagen contenida en el búfer CMSampleBufferRef.

    Por ejemplo, si usas los datos de imagen capturados desde la cámara trasera del dispositivo:

    Swift

    let metadata = VisionImageMetadata()
    
    // Using back-facing camera
    let devicePosition: AVCaptureDevice.Position = .back
    
    let deviceOrientation = UIDevice.current.orientation
    switch deviceOrientation {
    case .portrait:
      metadata.orientation = devicePosition == .front ? .leftTop : .rightTop
    case .landscapeLeft:
      metadata.orientation = devicePosition == .front ? .bottomLeft : .topLeft
    case .portraitUpsideDown:
      metadata.orientation = devicePosition == .front ? .rightBottom : .leftBottom
    case .landscapeRight:
      metadata.orientation = devicePosition == .front ? .topRight : .bottomRight
    case .faceDown, .faceUp, .unknown:
      metadata.orientation = .leftTop
    }
    

    Objective-C

    // Calculate the image orientation
    FIRVisionDetectorImageOrientation orientation;
    
    // Using front-facing camera
    AVCaptureDevicePosition devicePosition = AVCaptureDevicePositionFront;
    
    UIDeviceOrientation deviceOrientation = UIDevice.currentDevice.orientation;
    switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationLeftTop;
            } else {
                orientation = FIRVisionDetectorImageOrientationRightTop;
            }
            break;
        case UIDeviceOrientationLandscapeLeft:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationBottomLeft;
            } else {
                orientation = FIRVisionDetectorImageOrientationTopLeft;
            }
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationRightBottom;
            } else {
                orientation = FIRVisionDetectorImageOrientationLeftBottom;
            }
            break;
        case UIDeviceOrientationLandscapeRight:
            if (devicePosition == AVCaptureDevicePositionFront) {
                orientation = FIRVisionDetectorImageOrientationTopRight;
            } else {
                orientation = FIRVisionDetectorImageOrientationBottomRight;
            }
            break;
        default:
            orientation = FIRVisionDetectorImageOrientationTopLeft;
            break;
    }
    
    FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
    metadata.orientation = orientation;
    
  2. Crea un objeto VisionImage a través del objeto CMSampleBufferRef y los metadatos de rotación:

    Swift

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

    Objective-C

    FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:buffer];
    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 aplicación que usa una API de Cloud, debes realizar algunos pasos adicionales para prevenir y mitigar el efecto del acceso no autorizado a la API.