Erkennen Sie Text in Bildern mit Firebase ML unter iOS

Sie können Firebase ML verwenden, um Text in Bildern zu erkennen. Firebase ML verfügt sowohl über eine Allzweck-API, die zum Erkennen von Text in Bildern geeignet ist, z. B. den Text eines Straßenschilds, als auch über eine API, die für die Erkennung des Texts von Dokumenten optimiert ist.

Bevor Sie beginnen

    Wenn Sie Firebase noch nicht zu Ihrer App hinzugefügt haben, befolgen Sie dazu die Schritte im Leitfaden „Erste Schritte“ .

    Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.

    1. Navigieren Sie in Xcode bei geöffnetem App-Projekt zu File > Add Packages .
    2. Wenn Sie dazu aufgefordert werden, fügen Sie das Firebase Apple Platforms SDK-Repository hinzu:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Wählen Sie die Firebase ML-Bibliothek.
    5. Fügen Sie das Flag -ObjC zum Abschnitt „Andere Linker-Flags“ der Build-Einstellungen Ihres Ziels hinzu.
    6. Wenn Sie fertig sind, beginnt Xcode automatisch mit der Auflösung und dem Herunterladen Ihrer Abhängigkeiten im Hintergrund.

    Führen Sie als Nächstes einige In-App-Einrichtungen durch:

    1. Importieren Sie Firebase in Ihre App:

      Schnell

      import FirebaseMLModelDownloader

      Ziel c

      @import FirebaseMLModelDownloader;
  1. Wenn Sie cloudbasierte APIs für Ihr Projekt noch nicht aktiviert haben, tun Sie dies jetzt:

    1. Öffnen Sie die Seite „Firebase ML APIs“ der Firebase-Konsole.
    2. Wenn Sie Ihr Projekt noch nicht auf den Blaze-Preisplan aktualisiert haben, klicken Sie dazu auf „Upgrade“ . (Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht im Blaze-Plan enthalten ist.)

      Nur Projekte auf Blaze-Ebene können cloudbasierte APIs verwenden.

    3. Wenn Cloud-basierte APIs noch nicht aktiviert sind, klicken Sie auf Cloud-basierte APIs aktivieren .

Jetzt können Sie mit der Texterkennung in Bildern beginnen.

Geben Sie Bildrichtlinien ein

  • Damit Firebase ML Text genau erkennt, müssen Eingabebilder Text enthalten, der durch ausreichend Pixeldaten dargestellt wird. Idealerweise sollte bei lateinischem Text jedes Zeichen mindestens 16 x 16 Pixel groß sein. Bei chinesischem, japanischem und koreanischem Text sollte jedes Zeichen 24 x 24 Pixel groß sein. Für alle Sprachen gibt es im Allgemeinen keinen Genauigkeitsvorteil, wenn Zeichen größer als 24 x 24 Pixel sind.

    So könnte sich beispielsweise ein 640x480-Bild gut zum Scannen einer Visitenkarte eignen, die die gesamte Bildbreite einnimmt. Um ein auf Papier im Letter-Format gedrucktes Dokument zu scannen, ist möglicherweise ein Bild mit 720 x 1280 Pixeln erforderlich.

  • Eine schlechte Bildschärfe kann die Genauigkeit der Texterkennung beeinträchtigen. Wenn Sie keine akzeptablen Ergebnisse erhalten, bitten Sie den Benutzer, das Bild erneut aufzunehmen.


Text in Bildern erkennen

Um Text in einem Bild zu erkennen, führen Sie die Texterkennung wie unten beschrieben aus.

1. Führen Sie die Texterkennung aus

Übergeben Sie das Bild als UIImage oder CMSampleBufferRef an die Methode process(_:completion:) von VisionTextRecognizer :

  1. Rufen Sie eine Instanz von VisionTextRecognizer ab, indem Sie cloudTextRecognizer aufrufen:

    Schnell

    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)
    

    Ziel 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. Um Cloud Vision aufzurufen, muss das Bild als Base64-codierte Zeichenfolge formatiert werden. So verarbeiten Sie ein UIImage :

    Schnell

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

    Ziel c

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Übergeben Sie dann das Bild an die Methode process(_:completion:) :

    Schnell

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

    Ziel c

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

2. Extrahieren Sie Text aus erkannten Textblöcken

Wenn die Texterkennung erfolgreich ist, wird ein VisionText Objekt zurückgegeben. Ein VisionText Objekt enthält den im Bild erkannten Volltext und null oder mehr VisionTextBlock Objekte.

Jeder VisionTextBlock stellt einen rechteckigen Textblock dar, der null oder mehr VisionTextLine Objekte enthält. Jedes VisionTextLine Objekt enthält null oder mehr VisionTextElement Objekte, die Wörter und wortähnliche Entitäten (Datumsangaben, Zahlen usw.) darstellen.

Für jedes VisionTextBlock , VisionTextLine und VisionTextElement Objekt können Sie den in der Region erkannten Text und die Begrenzungskoordinaten der Region abrufen.

Zum Beispiel:

Schnell

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

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

Nächste Schritte


Erkennen Sie Text in Bildern von Dokumenten

Um den Text eines Dokuments zu erkennen, konfigurieren Sie die Dokumenttexterkennung wie unten beschrieben und führen Sie sie aus.

Die unten beschriebene Dokumenttexterkennungs-API stellt eine Schnittstelle bereit, die die Arbeit mit Dokumentenbildern komfortabler machen soll. Wenn Sie jedoch die von der Sparse-Text-API bereitgestellte Schnittstelle bevorzugen, können Sie diese stattdessen zum Scannen von Dokumenten verwenden, indem Sie die Cloud-Texterkennung für die Verwendung des Dense-Text-Modells konfigurieren.

So verwenden Sie die Dokumenttexterkennungs-API:

1. Führen Sie die Texterkennung aus

Übergeben Sie das Bild als UIImage oder CMSampleBufferRef an die Methode process(_:completion:) von VisionDocumentTextRecognizer :

  1. Rufen Sie cloudDocumentTextRecognizer auf, um eine Instanz von VisionDocumentTextRecognizer zu erhalten:

    Schnell

    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)
    

    Ziel 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. Um Cloud Vision aufzurufen, muss das Bild als Base64-codierte Zeichenfolge formatiert werden. So verarbeiten Sie ein UIImage :

    Schnell

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

    Ziel c

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Übergeben Sie dann das Bild an die Methode process(_:completion:) :

    Schnell

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

    Ziel c

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

2. Extrahieren Sie Text aus erkannten Textblöcken

Wenn der Texterkennungsvorgang erfolgreich ist, wird ein VisionDocumentText Objekt zurückgegeben. Ein VisionDocumentText Objekt enthält den im Bild erkannten vollständigen Text und eine Hierarchie von Objekten, die die Struktur des erkannten Dokuments widerspiegeln:

Für jedes VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWord und VisionDocumentTextSymbol Objekt können Sie den in der Region erkannten Text und die Begrenzungskoordinaten der Region abrufen.

Zum Beispiel:

Schnell

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

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

Nächste Schritte