Możesz użyć Firebase ML, aby rozpoznać tekst na obrazach. Firebase ML ma zarówno interfejs API ogólnego przeznaczenia, który nadaje się do rozpoznawania tekstu na obrazach, np. tekstu na znaku drogowym, jak i interfejs API zoptymalizowany pod kątem rozpoznawania tekstu w dokumentach.
Zanim zaczniesz
-
Jeśli nie masz jeszcze Firebase w swojej aplikacji, dodaj ją, wykonując czynności opisane w przewodniku dla początkujących.
- Po otwarciu projektu aplikacji wybierz w Xcode opcję File > Add Packages (Plik > Dodaj pakiety).
- Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
- Wybierz bibliotekę Firebase ML.
- Dodaj flagę
-ObjC
do sekcji Other Linker Flags (Inne flagi linkera) w ustawieniach kompilacji projektu. - Gdy skończysz, Xcode zacznie automatycznie wyszukiwać i pobierać zależności w tle.
- Zaimportuj Firebase w aplikacji:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Jeśli nie masz jeszcze włączonych interfejsów API w chmurze w swoim projekcie, zrób to teraz:
- Otwórz Firebase ML stronę Interfejsy API w konsoli Firebase.
-
Jeśli nie masz jeszcze projektu z abonamentem Blaze z płatnością za wykorzystanie, kliknij Uaktualnij. (Prośba o uaktualnienie pojawi się tylko wtedy, gdy Twój projekt nie korzysta z abonamentu Blaze).
Tylko projekty w ramach abonamentu Blaze mogą korzystać z interfejsów API opartych na chmurze.
- Jeśli interfejsy API oparte na chmurze nie są jeszcze włączone, kliknij Włącz interfejsy API oparte na chmurze.
Do instalacji zależności Firebase i do zarządzania nimi możesz używać menedżera pakietów Swift.
https://github.com/firebase/firebase-ios-sdk.git
Następnie przeprowadź konfigurację w aplikacji:
Możesz teraz rozpocząć rozpoznawanie tekstu na obrazach.
Wytyczne dotyczące obrazu wejściowego
-
Aby usługa Firebase ML mogła dokładnie rozpoznawać tekst, obrazy wejściowe muszą zawierać tekst reprezentowany przez wystarczającą ilość danych pikseli. W przypadku tekstu w alfabecie łacińskim każdy znak powinien mieć co najmniej 16 x 16 pikseli. W przypadku tekstu w języku chińskim, japońskim i koreańskim każdy znak powinien mieć wymiary 24 x 24 piksele. W przypadku wszystkich języków znaki o rozmiarze większym niż 24 x 24 piksele nie zwiększają dokładności.
Obraz o wymiarach 640 x 480 może się sprawdzić w przypadku skanowania wizytówki, która zajmuje całą szerokość obrazu. Aby zeskanować dokument wydrukowany na papierze w formacie Letter, może być wymagany obraz o rozmiarze 720 × 1280 pikseli.
-
Słaba ostrość obrazu może obniżyć dokładność rozpoznawania tekstu. Jeśli wyniki nie są zadowalające, poproś użytkownika o ponowne zrobienie zdjęcia.
Rozpoznawanie tekstu w obrazach
Aby rozpoznać tekst na obrazie, uruchom narzędzie do rozpoznawania tekstu w sposób opisany poniżej.
1. Uruchom rozpoznawanie tekstu
Przekaż obraz jakoUIImage
lub CMSampleBufferRef
do metody process(_:completion:)
obiektu VisionTextRecognizer
:
- Uzyskaj instancję
VisionTextRecognizer
, wywołując funkcję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];
-
Aby wywołać Cloud Vision, obraz musi mieć format ciągu tekstowego z kodowaniem Base64. Aby przetworzyć
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];
-
Następnie przekaż obraz do metody
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. Wyodrębnianie tekstu z bloków rozpoznanego tekstu
Jeśli operacja rozpoznawania tekstu się powiedzie, zwróci obiektVisionText
. Obiekt VisionText
zawiera pełny tekst rozpoznany na obrazie oraz co najmniej 1 obiekt VisionTextBlock
.
Każdy znak VisionTextBlock
reprezentuje prostokątny blok tekstu, który zawiera zero lub więcej obiektów VisionTextLine
. Każdy VisionTextLine
obiekt zawiera 0 lub więcej obiektów VisionTextElement
, które reprezentują słowa i podobieństwa do słów (daty, liczby itp.).
Dla każdego obiektu VisionTextBlock
, VisionTextLine
i VisionTextElement
możesz uzyskać tekst rozpoznany w regionie i współrzędne ograniczające region.
Przykład:
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; } } }
Dalsze kroki
- Zanim wdrożysz w środowisku produkcyjnym aplikację korzystającą z interfejsu Cloud API, podejmij dodatkowe działania, aby zapobiec nieautoryzowanemu dostępowi do interfejsu API i zminimalizować jego skutki.
Rozpoznawanie tekstu na obrazach dokumentów
Aby rozpoznać tekst dokumentu, skonfiguruj i uruchom narzędzie do rozpoznawania tekstu w dokumencie zgodnie z opisem poniżej.
Opisany poniżej interfejs API do rozpoznawania tekstu w dokumentach udostępnia interfejs, który ma ułatwiać pracę z obrazami dokumentów. Jeśli jednak wolisz interfejs udostępniany przez interfejs Sparse Text API, możesz go używać do skanowania dokumentów, konfigurując rozpoznawanie tekstu w chmurze tak, aby korzystało z modelu tekstu gęstego.
Aby użyć interfejsu API do rozpoznawania tekstu w dokumentach:
1. Uruchom rozpoznawanie tekstu
Przekaż obraz jakoUIImage
lub CMSampleBufferRef
do metody process(_:completion:)
obiektu VisionDocumentTextRecognizer
:
- Uzyskaj instancję
VisionDocumentTextRecognizer
, wywołując funkcję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];
-
Aby wywołać Cloud Vision, obraz musi mieć format ciągu tekstowego z kodowaniem Base64. Aby przetworzyć
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];
-
Następnie przekaż obraz do metody
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. Wyodrębnianie tekstu z bloków rozpoznanego tekstu
Jeśli operacja rozpoznawania tekstu się powiedzie, zwróci obiektVisionDocumentText
. Obiekt VisionDocumentText
zawiera pełny tekst rozpoznany na obrazie oraz hierarchię obiektów, które odzwierciedlają strukturę rozpoznanego dokumentu:
W przypadku każdego obiektu VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
i VisionDocumentTextSymbol
możesz uzyskać tekst rozpoznany w regionie oraz współrzędne ograniczające tego regionu.
Przykład:
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; } } } }
Dalsze kroki
- Zanim wdrożysz w środowisku produkcyjnym aplikację korzystającą z interfejsu Cloud API, podejmij dodatkowe działania, aby zapobiec nieautoryzowanemu dostępowi do interfejsu API i zminimalizować jego skutki.