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.
- Öffnen Sie Ihr App-Projekt und gehen Sie in Xcode zu File > Add Packages (Datei > Pakete hinzufügen).
- Fügen Sie bei entsprechender Aufforderung das Firebase Apple Platforms SDK-Repository hinzu:
- Wählen Sie die Bibliothek Firebase ML aus.
- Fügen Sie das Flag
-ObjC
dem Abschnitt Other Linker Flags (Weitere Verknüpfungsmerker) in den Build-Einstellungen des Ziels hinzu. - Wenn Sie fertig, beginnt Xcode automatisch, Ihre Abhängigkeiten im Hintergrund aufzulösen und herunterzuladen.
- Importieren Sie Firebase in Ihre App:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Wenn Sie cloudbasierte APIs für Ihr Projekt noch nicht aktiviert haben, tun Sie dies jetzt:
- Öffnen Sie in der Firebase-Konsole die Seite Firebase MLAPIs.
-
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.
- Wenn cloudbasierte APIs noch nicht aktiviert sind, klicken Sie auf Cloudbasierte APIs aktivieren.
Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.
https://github.com/firebase/firebase-ios-sdk.git
Führe als Nächstes einige In-App-Einrichtungen durch:
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 alsUIImage
oder CMSampleBufferRef
an die process(_:completion:)
-Methode von VisionTextRecognizer
:
- Rufen Sie
cloudTextRecognizer
auf, um eine Instanz vonVisionTextRecognizer
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];
-
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];
-
Ü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 einVisionText
-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
- Bevor Sie eine App, die eine Cloud API verwendet, in der Produktionsumgebung bereitstellen, sollten Sie einige zusätzliche Schritte ausführen, um unbefugten API-Zugriff zu verhindern und die Auswirkungen zu minimieren.
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 alsUIImage
oder CMSampleBufferRef
an die process(_:completion:)
-Methode von VisionDocumentTextRecognizer
:
- Rufen Sie
cloudDocumentTextRecognizer
auf, um eine Instanz vonVisionDocumentTextRecognizer
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];
-
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];
-
Ü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 einVisionDocumentText
-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
- Bevor Sie eine App, die eine Cloud API verwendet, in der Produktionsumgebung bereitstellen, sollten Sie einige zusätzliche Schritte ausführen, um unbefugten API-Zugriff zu verhindern und die Auswirkungen zu minimieren.