Text in Bildern mit Firebase ML auf iOS-Geräten erkennen

Mit Firebase ML können Sie Text in Bildern erkennen. Firebase ML bietet sowohl eine allgemeine API zur Erkennung von Text in Bildern, z. B. den Text eines Straßenschilds, als auch eine API, die für die Erkennung von Text in Dokumenten optimiert ist.

Hinweis

    Wenn Sie Ihrer App noch nicht Firebase hinzugefügt haben, folgen Sie der Anleitung im Einstiegsleitfaden.

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

    1. Öffnen Sie Ihr App-Projekt und gehen Sie in Xcode zu File > Add Packages (Datei > Pakete hinzufügen).
    2. Fügen Sie bei entsprechender Aufforderung das Firebase Apple Platforms SDK-Repository hinzu:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Wählen Sie die Bibliothek Firebase ML aus.
    5. Fügen Sie das Flag -ObjC dem Abschnitt Other Linker Flags (Weitere Verknüpfungsmerker) in den Build-Einstellungen des Ziels hinzu.
    6. Wenn Sie fertig, beginnt Xcode automatisch, Ihre Abhängigkeiten im Hintergrund aufzulösen und herunterzuladen.

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

    1. Importieren Sie Firebase in Ihre App:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

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

    1. Öffnen Sie in der Firebase-Konsole die Seite Firebase MLAPIs.
    2. Wenn Sie Ihr Projekt noch nicht auf den Blaze-Tarif umgestellt haben, klicken Sie auf Upgrade. Sie werden nur dann zum Umstellen aufgefordert, wenn Ihr Projekt nicht den Blaze-Tarif hat.

      Cloud-basierte APIs können nur in Projekten auf Blaze-Ebene verwendet werden.

    3. Wenn cloudbasierte APIs noch nicht aktiviert sind, klicken Sie auf Cloudbasierte APIs aktivieren.

Jetzt können Sie mit dem Erkennen von Text in Bildern beginnen.

Richtlinien für Eingabebilder

  • Damit Firebase ML Text genau erkennen kann, müssen die Eingabebilder Text enthalten, der durch ausreichende Pixeldaten dargestellt wird. Idealerweise sollte jedes lateinische Zeichen mindestens 16 × 16 Pixel groß sein. Bei Text auf Chinesisch, Japanisch und Koreanisch sollte jedes Zeichen 24 × 24 Pixel groß sein. Bei allen Sprachen ist die Genauigkeit im Allgemeinen nicht höher, wenn die Zeichen größer als 24 × 24 Pixel sind.

    So eignet sich beispielsweise ein Bild mit einer Auflösung von 640 × 480 Pixeln gut zum Scannen einer Visitenkarte, die die gesamte Breite des Bildes einnimmt. Zum Scannen eines Dokuments, das auf Papier im Letter-Format gedruckt wurde, ist möglicherweise ein Bild mit 720 × 1.280 Pixeln erforderlich.

  • Ein unscharfer Bildfokus kann die Genauigkeit der Texterkennung beeinträchtigen. Wenn Sie keine zufriedenstellenden Ergebnisse erhalten, bitten Sie den Nutzer, das Bild noch einmal aufzunehmen.


Erkennt Text in Bildern

Wenn Sie Text in einem Bild erkennen möchten, führen Sie den Texterkennungsalgorithmus wie unten beschrieben aus.

1. Texterkennung ausführen

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

  1. Rufen Sie cloudTextRecognizer auf, um eine Instanz von VisionTextRecognizer abzurufen:

    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. Damit Cloud Vision aufgerufen werden kann, muss das Bild als base64-codierter String formatiert sein. So verarbeiten Sie eine 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. Übergeben Sie dann das Bild an die process(_:completion:)-Methode:

    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. Text aus Blöcken erkannten Texts extrahieren

Wenn der Vorgang zur Texterkennung erfolgreich war, wird ein VisionText-Objekt zurückgegeben. Ein VisionText-Objekt enthält den vollständigen im Bild erkannten Text und null oder mehr VisionTextBlock-Objekte.

Jede VisionTextBlock steht für einen rechteckigen Textblock, 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 im Bereich erkannten Text und die Begrenzungskoordinaten des Bereichs abrufen.

Beispiel:

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

Nächste Schritte


Text in Bildern von Dokumenten erkennen

Wenn Sie den Text eines Dokuments erkennen möchten, konfigurieren und führen Sie die Dokumenttexterkennung wie unten beschrieben aus.

Die unten beschriebene API zur Texterkennung in Dokumenten bietet eine Oberfläche, die die Arbeit mit Bildern von Dokumenten vereinfachen soll. Wenn Sie jedoch die von der Sparse Text API bereitgestellte Benutzeroberfläche bevorzugen, können Sie sie stattdessen zum Scannen von Dokumenten verwenden. Konfigurieren Sie dazu den Cloud-Texterkennungsdienst so, dass das Modell für dichten Text verwendet wird.

So verwenden Sie die API zur Texterkennung in Dokumenten:

1. Texterkennung ausführen

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

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

    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. Damit Cloud Vision aufgerufen werden kann, muss das Bild als base64-codierter String formatiert sein. So verarbeiten Sie eine 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. Übergeben Sie dann das Bild an die process(_:completion:)-Methode:

    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. Text aus Blöcken erkannten Texts extrahieren

Wenn der Vorgang zur Texterkennung erfolgreich war, wird ein VisionDocumentText-Objekt zurückgegeben. Ein VisionDocumentText-Objekt enthält den vollständigen im Bild erkannten 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.

Beispiel:

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

Nächste Schritte