Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Reconocer texto en imágenes con Firebase ML en iOS

Puedes usar Firebase ML para reconocer texto en imágenes. Firebase ML tiene una API de uso general adecuada para reconocer texto en imágenes, como el texto de un letrero de la calle, y una API optimizada para reconocer el texto de documentos.

Antes de que empieces

  1. Si aún no lo ha añadido Firebase a su aplicación, hacerlo siguiendo los pasos de la guía de instalación inicial .
  2. Incluir en su Firebase PODFILE:
    pod 'Firebase/MLVision'
    
    Después de instalar o actualizar las vainas de su proyecto, asegúrese de abrir su proyecto Xcode utilizando su .xcworkspace .
  3. En su aplicación, importe Firebase:

    Rápido

    import Firebase

    C objetivo

    @import Firebase;
  4. Si aún no ha habilitado las API basadas en la nube para su proyecto, hágalo ahora:

    1. Abra la página Firebase ML API de la consola Firebase.
    2. Si todavía no ha actualizado su proyecto para el plan de precios Blaze, haga clic en Actualizar para hacerlo. (Se le pedirá que actualice solo si su proyecto no está en el plan Blaze).

      Solo los proyectos de nivel Blaze pueden usar API basadas en la nube.

    3. Si las API basadas en la nube ya no están habilitados, haga clic en Habilitar APIs basadas en la nube.

Ahora está listo para comenzar a reconocer texto en imágenes.

Directrices de imagen de entrada

  • Para que Firebase ML reconozca el texto con precisión, las imágenes de entrada deben contener texto representado por suficientes datos de píxeles. Idealmente, para el texto latino, cada carácter debe tener al menos 16x16 píxeles. Para texto en chino, japonés y coreano, cada carácter debe tener 24 x 24 píxeles. Para todos los idiomas, generalmente no hay un beneficio de precisión para los caracteres que tienen un tamaño superior a 24x24 píxeles.

    Entonces, por ejemplo, una imagen de 640x480 podría funcionar bien para escanear una tarjeta de presentación que ocupa todo el ancho de la imagen. Para escanear un documento impreso en papel de tamaño carta, es posible que se requiera una imagen de 720x1280 píxeles.

  • Un enfoque deficiente de la imagen puede dañar la precisión del reconocimiento de texto. Si no obtiene resultados aceptables, intente pedirle al usuario que vuelva a capturar la imagen.


Reconocer texto en imágenes

Para reconocer texto en una imagen, ejecute el reconocedor de texto como se describe a continuación.

1. Ejecute el reconocedor de texto

Pasar la imagen como un UIImage o una CMSampleBufferRef a la VisionTextRecognizer 's process(_:completion:) método:

  1. Obtener una instancia de VisionTextRecognizer llamando cloudTextRecognizer :

    Rápido

    let vision = Vision.vision()
    let textRecognizer = vision.cloudTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)
    

    C objetivo

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudTextRecognizerOptions *options =
            [[FIRVisionCloudTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
    
  2. Para llamar a Cloud Vision, la imagen debe tener el formato de una cadena codificada en base64. Para procesar una UIImage :

    Rápido

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    C objetivo

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. A continuación, pasar la imagen al process(_:completion:) método:

    Rápido

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    C objetivo

    [textRecognizer processImage:image
                      completion:^(FIRVisionText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
      // Recognized text
    }];
    

2. Extraiga texto de bloques de texto reconocido

Si la operación tiene éxito el reconocimiento de texto, se devolverá un VisionText objeto. Un VisionText objeto contiene el texto completo reconocido en la imagen y cero o más VisionTextBlock objetos.

Cada VisionTextBlock representa un bloque rectangular de texto, que contiene cero o más VisionTextLine objetos. Cada VisionTextLine objeto contiene cero o más VisionTextElement objetos, que representan palabras y palabras como entidades (fechas, números, etc.).

Para cada VisionTextBlock , VisionTextLine y VisionTextElement objeto, se puede obtener el texto reconocido en la región y las coordenadas límite de la región.

Por ejemplo:

Rápido

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockLanguages = block.recognizedLanguages
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for line in block.lines {
        let lineText = line.text
        let lineConfidence = line.confidence
        let lineLanguages = line.recognizedLanguages
        let lineCornerPoints = line.cornerPoints
        let lineFrame = line.frame
        for element in line.elements {
            let elementText = element.text
            let elementConfidence = element.confidence
            let elementLanguages = element.recognizedLanguages
            let elementCornerPoints = element.cornerPoints
            let elementFrame = element.frame
        }
    }
}

C objetivo

NSString *resultText = result.text;
for (FIRVisionTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (FIRVisionTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSNumber *lineConfidence = line.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (FIRVisionTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSNumber *elementConfidence = element.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

Próximos pasos


Reconocer texto en imágenes de documentos

Para reconocer el texto de un documento, configure y ejecute el reconocedor de texto del documento como se describe a continuación.

La API de reconocimiento de texto de documentos, que se describe a continuación, proporciona una interfaz que está destinada a ser más conveniente para trabajar con imágenes de documentos. Sin embargo, si usted prefiere la interfaz proporcionada por la API de texto escasa, que se puede utilizar en lugar de escanear documentos mediante la configuración del reconocedor de nubes de texto a utilizar el modelo de texto denso .

Para utilizar la API de reconocimiento de texto de documentos:

1. Ejecute el reconocedor de texto

Pasar la imagen como un UIImage o una CMSampleBufferRef a la VisionDocumentTextRecognizer 's process(_:completion:) método:

  1. Obtener una instancia de VisionDocumentTextRecognizer llamando cloudDocumentTextRecognizer :

    Rápido

    let vision = Vision.vision()
    let textRecognizer = vision.cloudDocumentTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudDocumentTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)
    

    C objetivo

    FIRVision *vision = [FIRVision vision];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudDocumentTextRecognizerOptions *options =
            [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
    
  2. Para llamar a Cloud Vision, la imagen debe tener el formato de una cadena codificada en base64. Para procesar una UIImage :

    Rápido

    guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
    let base64encodedImage = imageData.base64EncodedString()

    C objetivo

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. A continuación, pasar la imagen al process(_:completion:) método:

    Rápido

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    C objetivo

    [textRecognizer processImage:image
                      completion:^(FIRVisionDocumentText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
        // Recognized text
    }];
    

2. Extraiga texto de bloques de texto reconocido

Si la operación tiene éxito el reconocimiento de texto, se devolverá un VisionDocumentText objeto. Un VisionDocumentText objeto contiene el texto completo reconocido en la imagen y una jerarquía de objetos que reflejan la estructura del documento reconocido:

Para cada VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord y VisionDocumentTextSymbol objeto, se puede obtener el texto reconocido en la región y las coordenadas límite de la región.

Por ejemplo:

Rápido

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockRecognizedLanguages = block.recognizedLanguages
    let blockBreak = block.recognizedBreak
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for paragraph in block.paragraphs {
        let paragraphText = paragraph.text
        let paragraphConfidence = paragraph.confidence
        let paragraphRecognizedLanguages = paragraph.recognizedLanguages
        let paragraphBreak = paragraph.recognizedBreak
        let paragraphCornerPoints = paragraph.cornerPoints
        let paragraphFrame = paragraph.frame
        for word in paragraph.words {
            let wordText = word.text
            let wordConfidence = word.confidence
            let wordRecognizedLanguages = word.recognizedLanguages
            let wordBreak = word.recognizedBreak
            let wordCornerPoints = word.cornerPoints
            let wordFrame = word.frame
            for symbol in word.symbols {
                let symbolText = symbol.text
                let symbolConfidence = symbol.confidence
                let symbolRecognizedLanguages = symbol.recognizedLanguages
                let symbolBreak = symbol.recognizedBreak
                let symbolCornerPoints = symbol.cornerPoints
                let symbolFrame = symbol.frame
            }
        }
    }
}

C objetivo

NSString *resultText = result.text;
for (FIRVisionDocumentTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages;
  FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak;
  CGRect blockFrame = block.frame;
  for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) {
    NSString *paragraphText = paragraph.text;
    NSNumber *paragraphConfidence = paragraph.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages;
    FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak;
    CGRect paragraphFrame = paragraph.frame;
    for (FIRVisionDocumentTextWord *word in paragraph.words) {
      NSString *wordText = word.text;
      NSNumber *wordConfidence = word.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages;
      FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak;
      CGRect wordFrame = word.frame;
      for (FIRVisionDocumentTextSymbol *symbol in word.symbols) {
        NSString *symbolText = symbol.text;
        NSNumber *symbolConfidence = symbol.confidence;
        NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages;
        FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak;
        CGRect symbolFrame = symbol.frame;
      }
    }
  }
}

Próximos pasos