Reconnaître du texte dans des images grâce à Firebase ML sur iOS

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

Avant de commencer

    Si vous n'avez pas encore ajouté Firebase à votre application, suivez les les étapes du guide de démarrage.

    Utilisez Swift Package Manager pour installer et gérer les dépendances Firebase.

    1. Dans Xcode, ouvrez le projet de votre application, puis accédez à File > Ajouter des packages.
    2. Lorsque vous y êtes invité, ajoutez le dépôt du SDK des plates-formes Firebase pour Apple :
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Sélectionnez la bibliothèque Firebase ML.
    5. Ajoutez l'indicateur -ObjC à la section Other Linker Flags (Autres indicateurs Linker) des paramètres de compilation de votre cible.
    6. Lorsque vous avez terminé, Xcode commence à résoudre et à télécharger automatiquement vos dépendances en arrière-plan.

    Ensuite, effectuez la configuration dans l'application:

    1. Dans votre application, importez Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Si vous n'avez pas encore activé les API dans le cloud pour votre projet, faites-le dès maintenant:

    1. Ouvrez le Firebase ML page des API de la console Firebase.
    2. Si vous n'avez pas encore fait passer votre projet au forfait Blaze, cliquez sur Pour ce faire, effectuez une mise à niveau. (Vous ne serez invité à effectuer la mise à niveau projet n'est pas inclus dans la formule Blaze.)

      Seuls les projets de niveau Blaze peuvent utiliser des API dans le cloud.

    3. Si les API dans le cloud ne sont pas déjà activées, cliquez sur Activer les services API.

Vous êtes maintenant prêt à commencer à reconnaître du texte dans des images.

Consignes pour les images d'entrée

  • Pour que Firebase ML reconnaisse le texte avec précision, les images d'entrée doivent contenir du texte représenté par suffisamment de données de pixels. Dans l'idéal, pour l'alphabet chaque caractère doit faire au moins 16 x 16 pixels. Pour le chinois, le japonais et le coréen, chacune doit mesurer 24 x 24 pixels. Pour toutes les langues, il n'y a généralement pas moins de précision pour les caractères supérieurs à 24 x 24 pixels.

    Par exemple, une image de 640 x 480 pixels peut convenir pour numériser une carte de visite. qui occupe toute la largeur de l'image. Pour numériser un document imprimé sur de papier au format lettre, une image de 720 x 1 280 pixels peut être nécessaire.

  • Une mise au point médiocre de l'image peut nuire à la précision de la reconnaissance du texte. Si vous n'êtes pas obtenir des résultats acceptables, essayez de demander à l'utilisateur de reprendre l'image.


Détectez du texte dans des images

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

1. Exécuter la reconnaissance de texte

Transmettez l'image en tant que UIImage ou CMSampleBufferRef à la process(_:completion:) de VisionTextRecognizer méthode:

  1. Obtenez une instance de VisionTextRecognizer en appelant cloudTextRecognizer:

    Swift

    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)

    Objective-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 que vous puissiez appeler Cloud Vision, l'image doit être encodée en base64 . Pour traiter une UIImage:

    Swift

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

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Transmettez ensuite l'image à la méthode process(_:completion:):

    Swift

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

    Objective-C

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

2. Extraire le texte de blocs de texte reconnu

Si l'opération de reconnaissance de texte réussit, elle renvoie une objet VisionText. Un objet VisionText contient le texte complet reconnue dans l'image et zéro, un ou plusieurs VisionTextBlock d'objets.

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

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

Exemple :

Swift

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

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

Étapes suivantes


Reconnaître du texte dans des images de documents

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

L'API de reconnaissance de document texte, décrite ci-dessous, fournit une interface qui est conçu pour être plus pratique pour travailler avec des images de documents. Toutefois, Si vous préférez l'interface fournie par l'API de texte creux, vous pouvez l'utiliser au lieu d'analyser des documents, configurez l'outil de reconnaissance de texte cloud utiliser le modèle de texte dense.

Pour utiliser l'API de reconnaissance de document texte:

1. Exécuter la reconnaissance de texte

Transmettez l'image en tant que UIImage ou CMSampleBufferRef à la process(_:completion:) de VisionDocumentTextRecognizer méthode:

  1. Obtenez une instance de VisionDocumentTextRecognizer en appelant cloudDocumentTextRecognizer:

    Swift

    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)

    Objective-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 que vous puissiez appeler Cloud Vision, l'image doit être encodée en base64 . Pour traiter une UIImage:

    Swift

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

    Objective-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Transmettez ensuite l'image à la méthode process(_:completion:):

    Swift

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

    Objective-C

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

2. Extraire le texte de blocs de texte reconnu

Si l'opération de reconnaissance de texte réussit, elle renvoie une objet VisionDocumentText. Un objet VisionDocumentText contient l'intégralité du texte reconnu dans l'image, ainsi qu'une hiérarchie d'objets qui reflètent la structure du document reconnu:

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

Exemple :

Swift

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

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

Étapes suivantes