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

Reconnaître le texte dans les images avec Firebase ML sur iOS

Vous pouvez utiliser Firebase ML pour reconnaître le texte dans les images. Firebase ML possède à la fois une API à usage général adaptée à la reconnaissance de texte dans des images, comme le texte d'un panneau de signalisation, et une API optimisée pour reconnaître le texte de documents.

Avant que tu commences

  1. Si vous ne l' avez pas déjà ajouté Firebase à votre application, faites - en suivant les étapes du guide de démarrage .
  2. Inclure dans votre Firebase PODFILE:
    pod 'Firebase/MLVision'
    
    Après avoir installé ou mis à jour votre projet de les pods, assurez - vous d'ouvrir votre projet Xcode en utilisant son .xcworkspace .
  3. Dans votre application, importez Firebase :

    Rapide

    import Firebase

    Objectif c

    @import Firebase;
  4. Si vous n'avez pas encore activé les API basées sur le cloud pour votre projet, faites-le maintenant :

    1. Ouvrez la page par API Firebase ML de la console Firebase.
    2. Si vous ne l' avez pas déjà mis à jour votre projet au plan de tarification Blaze, cliquez sur Mise à jour pour le faire. (Vous serez invité à mettre à niveau uniquement si votre projet ne fait pas partie du plan Blaze.)

      Seuls les projets de niveau Blaze peuvent utiliser des API basées sur le cloud.

    3. Si API cloud computing ne sont pas déjà activé, cliquez sur Activer les API cloud computing.

Vous êtes maintenant prêt à commencer à reconnaître le texte dans les images.

Instructions relatives aux images d'entrée

  • Pour que Firebase ML reconnaisse avec précision le texte, les images d'entrée doivent contenir du texte représenté par suffisamment de données de pixels. Idéalement, pour le texte latin, chaque caractère doit faire au moins 16x16 pixels. Pour le texte chinois, japonais et coréen, chaque caractère doit être de 24x24 pixels. Pour toutes les langues, il n'y a généralement aucun avantage de précision pour les caractères d'une taille supérieure à 24x24 pixels.

    Ainsi, par exemple, une image de 640 x 480 peut bien fonctionner pour numériser une carte de visite qui occupe toute la largeur de l'image. Pour numériser un document imprimé sur du papier de format lettre, une image de 720x1280 pixels peut être requise.

  • Une mauvaise mise au point de l'image peut nuire à la précision de la reconnaissance de texte. Si vous n'obtenez pas de résultats acceptables, essayez de demander à l'utilisateur de recapturer l'image.


Reconnaître le texte dans les images

Pour reconnaître du texte dans une image, exécutez la reconnaissance de texte comme décrit ci-dessous.

1. Exécutez la reconnaissance de texte

Transmettre l'image comme un UIImage ou un CMSampleBufferRef au VisionTextRecognizer de » process(_:completion:) méthode:

  1. Obtenez une instance de VisionTextRecognizer en appelant cloudTextRecognizer :

    Rapide

    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)
    

    Objectif c

    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. Pour appeler Cloud Vision, l'image doit être formatée en tant que chaîne encodée en base64. Pour traiter un UIImage :

    Rapide

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

    Objectif c

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Ensuite, transmettre l'image vers le process(_:completion:) méthode:

    Rapide

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

    Objectif c

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

2. Extraire du texte à partir de blocs de texte reconnus

Si l'opération de reconnaissance de texte réussit, il retournera un VisionText objet. Un VisionText objet contient le texte intégral reconnu à l'image et zéro ou plusieurs VisionTextBlock objets.

Chaque VisionTextBlock représente un bloc rectangulaire de texte, qui contient zéro ou plusieurs VisionTextLine objets. Chaque VisionTextLine objet contient zéro ou plusieurs VisionTextElement objets, qui représentent des mots et des mots comme des entités (dates, numéros, etc.).

Pour chaque VisionTextBlock , VisionTextLine et VisionTextElement objet, vous pouvez obtenir le texte reconnu dans la région et les coordonnées de délimitation de la région.

Par exemple:

Rapide

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

Objectif c

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

Prochaines étapes


Reconnaître le texte dans les images des documents

Pour reconnaître le texte d'un document, configurez et exécutez la reconnaissance de texte de document comme décrit ci-dessous.

L'API de reconnaissance de texte de document, décrite ci-dessous, fournit une interface conçue pour être plus pratique pour travailler avec des images de documents. Toutefois, si vous préférez l'interface fournie par l'API texte clairsemés, vous pouvez l' utiliser au lieu de numériser des documents en configurant le texte nuage reconnaisseur à utiliser le modèle de texte dense .

Pour utiliser l'API de reconnaissance de texte de document :

1. Exécutez la reconnaissance de texte

Transmettre l'image comme un UIImage ou un CMSampleBufferRef au VisionDocumentTextRecognizer de » process(_:completion:) méthode:

  1. Obtenez une instance de VisionDocumentTextRecognizer en appelant cloudDocumentTextRecognizer :

    Rapide

    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)
    

    Objectif c

    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. Pour appeler Cloud Vision, l'image doit être formatée en tant que chaîne encodée en base64. Pour traiter un UIImage :

    Rapide

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

    Objectif c

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Ensuite, transmettre l'image vers le process(_:completion:) méthode:

    Rapide

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

    Objectif c

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

2. Extraire du texte à partir de blocs de texte reconnus

Si l'opération de reconnaissance de texte réussit, il retournera un VisionDocumentText objet. Un VisionDocumentText objet contient le texte intégral reconnu à l'image et une hiérarchie d'objets qui reflètent la structure du document reconnu:

Pour chaque VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord et VisionDocumentTextSymbol objet, vous pouvez obtenir le texte reconnu dans la région et les coordonnées de délimitation de la région.

Par exemple:

Rapide

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

Objectif c

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

Prochaines étapes