Du kannst Firebase ML verwenden, um Text in Bildern zu erkennen. Firebase ML hat sowohl eine universelle API, die sich zum Erkennen von Text in Bildern eignet, z. B. den Text eines Straßenschilds und eine API, die für die Erkennung des Textes Dokumente.
Hinweis
-
Wenn Sie Ihrer App noch nicht Firebase hinzugefügt haben, folgen Sie der
im Startleitfaden.
- Gehen Sie in Xcode bei geöffnetem App-Projekt zu File > Pakete hinzufügen.
- Fügen Sie bei entsprechender Aufforderung das Firebase Apple Platforms SDK-Repository hinzu:
- Wählen Sie die Firebase ML-Bibliothek aus.
- Fügen Sie in den Build-Einstellungen des Ziels im Bereich Other Linker Flags das Flag
-ObjC
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;
-
Falls Sie cloudbasierte APIs für Ihr Projekt noch nicht aktiviert haben, tun Sie dies jetzt:
- Öffnen Sie das Firebase ML APIs-Seite der Firebase-Konsole.
-
Wenn Sie Ihr Projekt noch nicht auf den Blaze-Tarif umgestellt haben, klicken Sie auf Upgrade. Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht den Blaze-Tarif hat.
Nur Projekte auf Blaze-Ebene können cloudbasierte APIs verwenden.
- Wenn cloudbasierte APIs noch nicht aktiviert sind, klicken Sie auf Cloudbasiertes Erstellen aktivieren APIs
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 der Texterkennung in Bildern beginnen.
Richtlinien für Eingabebilder
-
Damit Firebase ML Text richtig erkennt, müssen die eingegebenen Bilder folgende Zeichen enthalten: Text, der durch ausreichende Pixeldaten dargestellt wird. Ideal für Latein Text eingeben, muss jedes Zeichen mindestens 16 x 16 Pixel groß sein. Bei Text auf Chinesisch, Japanisch und Koreanisch sollte jedes Zeichen 24 × 24 Pixel groß sein. In der Regel gibt es für alle Sprachen Verbesserung der Genauigkeit bei Zeichen, die größer als 24 x 24 Pixel sind.
Ein Bild im Format 640 x 480 eignet sich also gut zum Scannen einer Visitenkarte. das die volle Breite des Bilds ausfüllt. So scannen Sie ein aufgedrucktes Dokument: im Schriftformat erforderlich ist, ist möglicherweise ein Bild mit 720 x 1280 Pixeln erforderlich.
-
Ein zu niedriger Bildfokus kann die Genauigkeit der Texterkennung beeinträchtigen. Wenn nicht akzeptable Ergebnisse erzielen, versuchen Sie, das Bild erneut aufzunehmen.
Erkennt Text in Bildern
Wenn Sie Text in einem Bild erkennen möchten, führen Sie die Texterkennung wie beschrieben aus weiter unten.
1. Texterkennung ausführen
Übergeben Sie das Bild alsUIImage
oder CMSampleBufferRef
an den
process(_:completion:)
von VisionTextRecognizer
:
- Rufen Sie eine
VisionTextRecognizer
-Instanz mit dem folgenden Befehl ab: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];
-
Damit Cloud Vision aufgerufen werden kann, muss das Bild als base64-codierter String formatiert sein. So verarbeiten Sie ein
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 Methode
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. 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 Text
im Bild erkannt und null oder mehr VisionTextBlock
Objekte.
Jedes VisionTextBlock
-Element stellt einen rechteckigen Textblock dar, der Folgendes enthält:
Null oder mehr VisionTextLine
-Objekte 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
Um den Text eines Dokuments zu erkennen, konfigurieren Sie den Befehl die Dokumenttexterkennung, wie unten beschrieben.
Die unten beschriebene API zur Texterkennung in Dokumenten bietet eine Oberfläche, die die Arbeit mit Bildern von Dokumenten vereinfachen soll. Sie können jedoch Wenn Sie die von der Sparse-Text-API bereitgestellte Schnittstelle bevorzugen, können Sie diese verwenden, stattdessen Dokumente scannen, indem Sie die Cloud-Texterkennung so konfigurieren, das Modell mit dichtem Text verwenden.
So verwenden Sie die API zur Dokumenttexterkennung:
1. Texterkennung ausführen
Übergeben Sie das Bild alsUIImage
oder CMSampleBufferRef
an den
process(_:completion:)
von VisionDocumentTextRecognizer
:
- Rufen Sie eine
VisionDocumentTextRecognizer
-Instanz mit dem folgenden Befehl ab: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];
-
Damit Cloud Vision aufgerufen werden kann, muss das Bild als base64-codierter String formatiert sein. So verarbeiten Sie ein
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 Methode
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. Text aus erkannten Textblöcken 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
müssen die Struktur des anerkannten 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 Anwendung, die eine Cloud API verwendet, für die Produktion bereitstellen, sollten Sie einige zusätzliche Schritte zur Verhinderung bzw. Schadensbehebung Auswirkungen von nicht autorisiertem API-Zugriff.