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“ .
- Navigieren Sie in Xcode bei geöffnetem App-Projekt zu File > Add Packages .
- Wenn Sie dazu aufgefordert werden, fügen Sie das Firebase Apple Platforms SDK-Repository hinzu:
- Wählen Sie die Firebase ML-Bibliothek.
- Fügen Sie das Flag
-ObjC
zum Abschnitt „Andere Linker-Flags“ der Build-Einstellungen Ihres Ziels hinzu. - Wenn Sie fertig sind, beginnt Xcode automatisch mit der Auflösung und dem Herunterladen Ihrer Abhängigkeiten im Hintergrund.
- Importieren Sie Firebase in Ihre App:
Schnell
import FirebaseMLModelDownloader
Ziel c
@import FirebaseMLModelDownloader;
Wenn Sie cloudbasierte APIs für Ihr Projekt noch nicht aktiviert haben, tun Sie dies jetzt:
- Öffnen Sie die Seite „Firebase ML APIs“ der Firebase-Konsole.
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.
- Wenn Cloud-basierte APIs noch nicht aktiviert sind, klicken Sie auf Cloud-basierte 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ühren Sie als Nächstes einige In-App-Einrichtungen durch:
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 alsUIImage
oder CMSampleBufferRef
an die Methode process(_:completion:)
von VisionTextRecognizer
:- Rufen Sie eine Instanz von
VisionTextRecognizer
ab, indem SiecloudTextRecognizer
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];
- 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.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Ziel c
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Ü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 einVisionText
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
- Bevor Sie eine App, die eine Cloud-API verwendet, für die Produktion bereitstellen, sollten Sie einige zusätzliche Schritte unternehmen, um die Auswirkungen eines unbefugten API-Zugriffs zu verhindern und abzuschwächen .
Erkennen Sie Text in Dokumentenbildern
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 alsUIImage
oder CMSampleBufferRef
an die Methode process(_:completion:)
von VisionDocumentTextRecognizer
:- Rufen Sie
cloudDocumentTextRecognizer
auf, um eine Instanz vonVisionDocumentTextRecognizer
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];
- 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.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Ziel c
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Ü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 einVisionDocumentText
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
- Bevor Sie eine App, die eine Cloud-API verwendet, für die Produktion bereitstellen, sollten Sie einige zusätzliche Schritte unternehmen, um die Auswirkungen eines unbefugten API-Zugriffs zu verhindern und abzuschwächen .