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/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 quieres usar el modelo basado en la nube, pero no has actualizado tu proyecto a un plan Blaze, hazlo en Firebase console. Solo los proyectos con un plan Blaze pueden usar las API de Cloud Vision.
  5. Si quieres usar el modelo basado en la nube, habilita la API de Cloud Vision:
    1. Abre la API de Cloud Vision en la biblioteca de API de Cloud Console.
    2. Asegúrate de que tu proyecto de Firebase se encuentre seleccionado en el menú ubicado en la parte superior de la página.
    3. Si la API no está habilitada, haz clic en Habilitar.
    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.


Etiquetado de imágenes en el dispositivo

Para usar el modelo de etiquetado de imágenes en el dispositivo, configura y ejecuta el etiquetador de imágenes como se describe a continuación.

1. Cómo configurar el etiquetador de imágenes

En la configuración predeterminada, el etiquetador de imágenes en el dispositivo solo muestra etiquetas que tienen una puntuación de confianza de 0.5 o superior. Si quieres cambiar esta configuración, crea un objeto VisionLabelDetectorOptions como en el siguiente ejemplo:

Swift

let options = VisionLabelDetectorOptions(
  confidenceThreshold: Constants.labelConfidenceThreshold
)

Objective-C

FIRVisionLabelDetectorOptions *options =
    [[FIRVisionLabelDetectorOptions alloc] initWithConfidenceThreshold:0.6f];

2. Cómo ejecutar el etiquetador de imágenes

Para identificar y etiquetar entidades en una imagen, pasa la imagen como UIImage o CMSampleBufferRef al método detect(in:) de VisionLabelDetector:

  1. Obtén una instancia de VisionLabelDetector:

    Swift

    lazy var vision = Vision.vision()
    let labelDetector = vision.labelDetector(options: options)
    

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionLabelDetector *labelDetector = [vision labelDetector];
    // Or, to change the default settings:
    // FIRVisionLabelDetector *labelDetector =
    //     [vision labelDetectorWithOptions:options];
    
  2. Crea un objeto VisionImage a través 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 que especifique la orientación de los datos de la imagen contenidos en el búfer CMSampleBufferRef.

      Por ejemplo, si los datos de la imagen deben rotarse 90° hacia la derecha para que tengan una orientación vertical:

      Swift

      let metadata = VisionImageMetadata()
      metadata.orientation = .rightTop  // Row 0 is on the right and column 0 is on the top
      

      Objective-C

      // Row 0 is on the right and column 0 is on the top
      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
      
    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;
      
  3. Luego, pasa la imagen al método detect(in:):

    Swift

    labelDetector.detect(in: visionImage) { features, error in
      guard error == nil, let features = features, !features.isEmpty else {
        // ...
        return
      }
    
      // ...
    }

    Objective-C

    [labelDetector detectInImage:image
                      completion:^(NSArray<FIRVisionLabel *> *labels,
                                   NSError *error) {
      if (error != nil || labels.count == 0) {
        return;
      }
      // Got labels. Access label info via FIRVisionLabel.
    }];
    

3. Obtén información sobre los objetos etiquetados

Si el etiquetado de imágenes se ejecuta correctamente, una serie de objetos VisionLabel se pasará 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.label
  let entityId = label.entityID
  let confidence = label.confidence
}

Objective-C

for (FIRVisionLabel *label in labels) {
  NSString *labelText = label.label;
  NSString *entityId = label.entityID;
  float confidence = label.confidence;
}

Etiquetado de imágenes en Cloud

Para usar el modelo de etiquetado de imágenes basado en la nube, configura y ejecuta el etiquetador de imágenes como se muestra a continuación.

1. Cómo configurar el etiquetador de imágenes

Según la configuración predeterminada, el detector de Cloud usa la versión estable del modelo y muestra hasta 10 resultados. Si quieres cambiar alguna de estas opciones de configuración, especifícalas con un objeto VisionCloudDetectorOptions, como se muestra en el siguiente ejemplo:

Swift

let options = VisionCloudDetectorOptions()
options.modelType = .latest
options.maxResults = 20

Objective-C

FIRVisionCloudDetectorOptions *options =
    [[FIRVisionCloudDetectorOptions alloc] init];
options.modelType = FIRVisionCloudModelTypeLatest;
options.maxResults = 20;

En el siguiente paso, pasa el objeto VisionCloudDetectorOptions cuando crees el objeto detector de Cloud.

2. Cómo ejecutar el etiquetador de imágenes

Para reconocer entidades de etiquetas en una imagen, pasa la imagen como una UIImage o un CMSampleBufferRef al método detect(in:) de VisionCloudLabelDetector:

  1. Obtén una instancia de VisionCloudLabelDetector:

    Swift

    let labelDetector = vision.cloudLabelDetector()
    // Or, to change the default settings:
    // let labelDetector = Vision.vision().cloudLabelDetector(options: options)

    Objective-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLabelDetector *labelDetector = [vision cloudLabelDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLabelDetector *labelDetector =
    //     [vision cloudLabelDetectorWithOptions:options];
    
  2. Crea un objeto VisionImage a través 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 que especifique la orientación de los datos de la imagen contenidos en el búfer CMSampleBufferRef.

      Por ejemplo, si los datos de la imagen deben rotarse 90° hacia la derecha para que tengan una orientación vertical:

      Swift

      let metadata = VisionImageMetadata()
      metadata.orientation = .rightTop  // Row 0 is on the right and column 0 is on the top
      

      Objective-C

      // Row 0 is on the right and column 0 is on the top
      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      metadata.orientation = FIRVisionDetectorImageOrientationRightTop;
      
    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;
      
  3. Luego, pasa la imagen al método detect(in:):

    Swift

      labelDetector.detect(in: visionImage) { labels, error in
        guard error == nil, let labels = labels, !labels.isEmpty else {
          // ...
          return
        }
    
        // Labeled image
        // START_EXCLUDE
        self.resultsText = labels.map { label -> String in
          "Label: \(String(describing: label.label ?? "")), " +
            "Confidence: \(label.confidence ?? 0), " +
          "EntityID: \(label.entityId ?? "")"
          }.joined(separator: "\n")
        self.showResults()
      }
    }

    Objective-C

    [labelDetector detectInImage:image
                      completion:^(NSArray<FIRVisionCloudLabel *> *labels,
                                   NSError *error) {
      if (error != nil || labels.count == 0) {
        return;
      }
      // Got labels. Access label info via FIRVisionCloudLabel.
    }];
    

3. Obtén información sobre los objetos etiquetados

Si el etiquetado de imágenes se ejecuta correctamente, una serie de objetos VisionCloudLabel se pasará al controlador de finalización. Podrás obtener información sobre una entidad reconocida en la imagen en cada objeto.

Por ejemplo:

Swift

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

Objective-C

for (FIRVisionCloudLabel *label in labels) {
  NSString *labelText = label.label;
  NSString *entityId = label.entityId;
  float confidence = [label.confidence floatValue];
}

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.