Вы можете использовать Firebase ML для распознавания текста на изображениях. Firebase ML имеет как API общего назначения, подходящий для распознавания текста на изображениях, например текста уличного знака, так и API, оптимизированный для распознавания текста документов.
Прежде чем начать
- Если вы еще не добавили Firebase в свое приложение, сделайте это, выполнив действия, описанные в руководстве по началу работы .
- В Xcode, открыв проект приложения, выберите «Файл» > «Добавить пакеты» .
- При появлении запроса добавьте репозиторий Firebase SDK для платформ Apple:
- Выберите библиотеку Firebase ML .
- Добавьте флаг
-ObjC
в раздел «Другие флаги компоновщика» настроек сборки вашей цели. - По завершении Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.
- Импортируйте Firebase в свое приложение:
Быстрый
import FirebaseMLModelDownloader
Цель-C
@import FirebaseMLModelDownloader;
Если вы еще не включили облачные API для своего проекта, сделайте это сейчас:
- Откройте страницу API Firebase ML в консоли Firebase .
Если вы еще не обновили свой проект до тарифного плана Blaze, нажмите «Обновить» , чтобы сделать это. (Вам будет предложено выполнить обновление, только если ваш проект не входит в план Blaze.)
Только проекты уровня Blaze могут использовать облачные API.
- Если облачные API еще не включены, нажмите «Включить облачные API» .
Используйте Swift Package Manager для установки зависимостей Firebase и управления ими.
https://github.com/firebase/firebase-ios-sdk.git
Затем выполните некоторые настройки в приложении:
Теперь вы готовы начать распознавать текст на изображениях.
Рекомендации по входному изображению
Чтобы Firebase ML мог точно распознавать текст, входные изображения должны содержать текст, представленный достаточным количеством пиксельных данных. В идеале для текста на латинице размер каждого символа должен быть не менее 16х16 пикселей. В тексте на китайском, японском и корейском языках размер каждого символа должен составлять 24 x 24 пикселя. Для всех языков, как правило, нет никакого преимущества в точности, если символы размером более 24x24 пикселей.
Так, например, изображение размером 640x480 может хорошо подойти для сканирования визитной карточки, занимающей всю ширину изображения. Для сканирования документа, напечатанного на бумаге формата Letter, может потребоваться изображение размером 720x1280 пикселей.
Плохая фокусировка изображения может снизить точность распознавания текста. Если вы не получили приемлемых результатов, попробуйте попросить пользователя повторно сделать снимок.
Распознавание текста на изображениях
Чтобы распознать текст на изображении, запустите распознаватель текста, как описано ниже.
1. Запустите распознаватель текста
Передайте изображение какUIImage
или CMSampleBufferRef
в метод процесса VisionTextRecognizer
process(_:completion:)
:- Получите экземпляр
VisionTextRecognizer
, вызвавcloudTextRecognizer
:Быстрый
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)
Цель-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];
- Чтобы вызвать Cloud Vision, изображение должно быть отформатировано как строка в кодировке Base64. Чтобы обработать
UIImage
:Быстрый
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Цель-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Затем передайте изображение в
process(_:completion:)
:Быстрый
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Цель-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Извлечение текста из блоков распознанного текста.
Если операция распознавания текста завершится успешно, она вернет объектVisionText
. Объект VisionText
содержит полный текст, распознанный в изображении, а также ноль или более объектов VisionTextBlock
. Каждый VisionTextBlock
представляет собой прямоугольный блок текста, который содержит ноль или более объектов VisionTextLine
. Каждый объект VisionTextLine
содержит ноль или более объектов VisionTextElement
, которые представляют слова и словесные объекты (даты, числа и т. д.).
Для каждого объекта VisionTextBlock
, VisionTextLine
и VisionTextElement
вы можете получить текст, распознанный в регионе, и ограничивающие координаты региона.
Например:
Быстрый
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 } } }
Цель-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; } } }
Следующие шаги
- Прежде чем развернуть в рабочей среде приложение, использующее Cloud API, вам следует предпринять некоторые дополнительные действия, чтобы предотвратить и смягчить последствия несанкционированного доступа к API .
Распознавание текста на изображениях документов
Чтобы распознать текст документа, настройте и запустите распознаватель текста документа, как описано ниже.
API распознавания текста документа, описанный ниже, предоставляет интерфейс, который призван быть более удобным для работы с изображениями документов. Однако если вы предпочитаете интерфейс, предоставляемый API разреженного текста, вы можете использовать его для сканирования документов, настроив облачный распознаватель текста на использование модели плотного текста .
Чтобы использовать API распознавания текста документа:
1. Запустите распознаватель текста
Передайте изображение какUIImage
или CMSampleBufferRef
в process(_:completion:)
VisionDocumentTextRecognizer
:- Получите экземпляр
VisionDocumentTextRecognizer
, вызвавcloudDocumentTextRecognizer
:Быстрый
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)
Цель-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];
- Чтобы вызвать Cloud Vision, изображение должно быть отформатировано как строка в кодировке Base64. Чтобы обработать
UIImage
:Быстрый
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Цель-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Затем передайте изображение в
process(_:completion:)
:Быстрый
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Цель-C
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Извлечение текста из блоков распознанного текста.
Если операция распознавания текста завершится успешно, она вернет объектVisionDocumentText
. Объект VisionDocumentText
содержит полный текст, распознанный на изображении, и иерархию объектов, отражающих структуру распознанного документа: Для каждого объекта VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
и VisionDocumentTextSymbol
вы можете получить текст, распознанный в регионе, и ограничивающие координаты региона.
Например:
Быстрый
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 } } } }
Цель-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; } } } }
Следующие шаги
- Прежде чем развернуть в рабочей среде приложение, использующее Cloud API, вам следует предпринять некоторые дополнительные действия, чтобы предотвратить и смягчить последствия несанкционированного доступа к API .