Riconosci il testo nelle immagini con Firebase ML su iOS

Puoi utilizzare Firebase ML per riconoscere il testo nelle immagini. Firebase ML ha sia un'API per uso generico adatta al riconoscimento del testo nelle immagini, come il testo di un cartello stradale e un'API ottimizzata per il riconoscimento del testo documenti.

Prima di iniziare

    Se non hai già aggiunto Firebase alla tua app, puoi farlo seguendo le istruzioni riportate in passaggi nella Guida introduttiva.

    Utilizza Swift Package Manager per installare e gestire le dipendenze di Firebase.

    1. In Xcode, con il progetto dell'app aperto, vai a File > Aggiungi pacchetti.
    2. Quando richiesto, aggiungi il repository dell'SDK delle piattaforme Apple Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Scegli la raccolta Firebase ML.
    5. Aggiungi il flag -ObjC alla sezione Altri flag linker delle impostazioni di build del target.
    6. Al termine, Xcode inizierà automaticamente a risolvere e scaricare il le dipendenze in background.

    A questo punto, esegui la configurazione in-app:

    1. Nell'app, importa Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Se non hai già abilitato le API basate su cloud per il tuo progetto, procedi nel seguente modo: ora:

    1. Apri la Firebase ML pagina API della console Firebase.
    2. Se non hai già eseguito l'upgrade del progetto al piano tariffario Blaze, fai clic su Per farlo, esegui l'upgrade. Ti verrà chiesto di eseguire l'upgrade solo se non è incluso nel piano Blaze.)

      Solo i progetti a livello di Blaze possono utilizzare le API basate su cloud.

    3. Se le API basate su cloud non sono già abilitate, fai clic su Abilita API basate su cloud.

Ora puoi iniziare a riconoscere il testo nelle immagini.

Linee guida per l'immagine di input

  • Affinché Firebase ML riconosca in modo preciso il testo, le immagini di input devono contenere di testo rappresentato da un numero sufficiente di dati di pixel. Idealmente, per la lingua latina di testo, ogni carattere deve essere di almeno 16 x 16 pixel. Per il testo in cinese, giapponese e coreano, ogni carattere deve avere dimensioni di 24 x 24 pixel. Per tutte le lingue, in genere non c'è alcun vantaggio in termini di accuratezza se i caratteri sono più grandi di 24 x 24 pixel.

    Ad esempio, un'immagine di 640 x 480 potrebbe essere adatta per la scansione di un biglietto da visita che occupa l'intera larghezza dell'immagine. Per scansionare un documento stampato su potrebbe essere necessaria un'immagine di 720 x 1280 pixel.

  • Una messa a fuoco scadente dell'immagine può influire sulla precisione del riconoscimento del testo. In caso contrario ottenere risultati accettabili, prova a chiedere all'utente di recuperare l'immagine.


Riconosce il testo nelle immagini

Per riconoscere il testo in un'immagine, esegui il riconoscimento del testo come descritto di seguito.

1. Esegui il riconoscimento del testo

Trasmetti l'immagine come UIImage o CMSampleBufferRef al process(_:completion:) di VisionTextRecognizer :

  1. Ricevi un'istanza di VisionTextRecognizer chiamando 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. Per chiamare Cloud Vision, l'immagine deve essere formattata con codifica Base64 stringa. Per elaborare un 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. Quindi, passa l'immagine al metodo 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. Estrarre il testo da blocchi di testo riconosciuto

Se l'operazione di riconoscimento del testo va a buon fine, viene restituito un oggetto VisionText. Un oggetto VisionText contiene il testo completo riconosciuti nell'immagine e zero o più VisionTextBlock di oggetti strutturati.

Ogni VisionTextBlock rappresenta un blocco di testo rettangolare che contiene zero o più oggetti VisionTextLine. Ogni oggetto VisionTextLine contiene zero o più oggetti VisionTextElement, che rappresentano parole ed entità simili a parole (date, numeri e così via).

Per ogni oggetto VisionTextBlock, VisionTextLine e VisionTextElement, puoi ottenere il testo riconosciuto nella regione e le coordinate di delimitazione della regione.

Ad esempio:

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

Passaggi successivi


Riconoscere il testo nelle immagini dei documenti

Per riconoscere il testo di un documento, configura ed esegui il rilettore di testo dei documenti come descritto di seguito.

L'API di riconoscimento del testo dei documenti, descritta di seguito, fornisce un'interfaccia che è pensato per essere più comodo per lavorare con le immagini di documenti. Tuttavia, Se preferisci l'interfaccia fornita dall'API sparse text, puoi utilizzarla anziché scansionare i documenti configurando il riconoscimento del testo nel cloud utilizza il modello di testo denso.

Per utilizzare l'API per il riconoscimento del testo dei documenti:

1. Esegui il riconoscimento del testo

Trasmetti l'immagine come UIImage o CMSampleBufferRef al process(_:completion:) di VisionDocumentTextRecognizer :

  1. Ricevi un'istanza di VisionDocumentTextRecognizer chiamando 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. Per chiamare Cloud Vision, l'immagine deve essere formattata con codifica Base64 stringa. Per elaborare un 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. Quindi, passa l'immagine al metodo 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. Estrai testo da blocchi di testo riconosciuto

Se il riconoscimento del testo viene eseguito correttamente, viene restituito VisionDocumentText. Un oggetto VisionDocumentText contiene il testo completo riconosciuto nell'immagine e una gerarchia di oggetti che riflettono la struttura del documento riconosciuto:

Per ogni VisionDocumentTextBlock, VisionDocumentTextParagraph, VisionDocumentTextWord e VisionDocumentTextSymbol, puoi ottenere testo riconosciuto nella regione e le coordinate di delimitazione della regione.

Ad esempio:

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

Passaggi successivi