Bạn có thể sử dụng Firebase ML để nhận dạng văn bản trong hình ảnh. Firebase ML có cả API đa năng phù hợp để nhận dạng văn bản trong hình ảnh, chẳng hạn như văn bản của biển báo đường phố và API được tối ưu hóa để nhận dạng văn bản của tài liệu.
Trước khi bắt đầu
- Nếu bạn chưa thêm Firebase vào ứng dụng của mình, hãy làm như vậy bằng cách làm theo các bước trong hướng dẫn bắt đầu .
- Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy điều hướng đến File > Add Packages .
- Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Firebase của Apple:
- Chọn thư viện Firebase ML.
- Thêm cờ
-ObjC
vào phần Cờ liên kết khác trong cài đặt bản dựng của mục tiêu của bạn. - Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải xuống các phần phụ thuộc của bạn ở chế độ nền.
- Trong ứng dụng của bạn, hãy nhập Firebase:
Nhanh
import FirebaseMLModelDownloader
Mục tiêu-C
@import FirebaseMLModelDownloader;
Nếu bạn chưa kích hoạt API dựa trên đám mây cho dự án của mình, hãy thực hiện ngay bây giờ:
- Mở trang API Firebase ML của bảng điều khiển Firebase.
Nếu bạn chưa nâng cấp dự án của mình lên gói giá Blaze, hãy nhấp vào Nâng cấp để thực hiện. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không nằm trong gói Blaze.)
Chỉ các dự án cấp Blaze mới có thể sử dụng API dựa trên Đám mây.
- Nếu API dựa trên đám mây chưa được bật, hãy nhấp vào Bật API dựa trên đám mây .
Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc của Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Tiếp theo, thực hiện một số thiết lập trong ứng dụng:
Bây giờ bạn đã sẵn sàng bắt đầu nhận dạng văn bản trong hình ảnh.
Hướng dẫn nhập hình ảnh
Để Firebase ML nhận dạng chính xác văn bản, hình ảnh đầu vào phải chứa văn bản được biểu thị bằng đủ dữ liệu pixel. Lý tưởng nhất là đối với văn bản Latinh, mỗi ký tự phải có kích thước tối thiểu là 16x16 pixel. Đối với văn bản tiếng Trung, tiếng Nhật và tiếng Hàn, mỗi ký tự phải có kích thước 24x24 pixel. Đối với tất cả các ngôn ngữ, nhìn chung không có lợi ích về độ chính xác đối với các ký tự lớn hơn 24x24 pixel.
Vì vậy, ví dụ: hình ảnh 640x480 có thể hoạt động tốt để quét danh thiếp chiếm toàn bộ chiều rộng của hình ảnh. Để quét tài liệu được in trên giấy cỡ letter, có thể cần phải có hình ảnh 720x1280 pixel.
Lấy nét hình ảnh kém có thể ảnh hưởng đến độ chính xác của nhận dạng văn bản. Nếu bạn không nhận được kết quả chấp nhận được, hãy thử yêu cầu người dùng chụp lại hình ảnh.
Nhận dạng văn bản trong hình ảnh
Để nhận dạng văn bản trong hình ảnh, hãy chạy trình nhận dạng văn bản như mô tả bên dưới.
1. Chạy trình nhận dạng văn bản
Truyền hình ảnh dưới dạngUIImage
hoặc CMSampleBufferRef
cho phương thức process(_:completion:)
của VisionTextRecognizer
:- Nhận một phiên bản của
VisionTextRecognizer
bằng cách gọicloudTextRecognizer
:Nhanh
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)
Mục tiêu-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];
- Để gọi Cloud Vision, hình ảnh phải được định dạng dưới dạng chuỗi được mã hóa base64. Để xử lý
UIImage
:Nhanh
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Mục tiêu-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Sau đó, chuyển hình ảnh tới phương thức
process(_:completion:)
:Nhanh
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Mục tiêu-C
[textRecognizer processImage:image completion:^(FIRVisionText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Trích xuất văn bản từ khối văn bản được nhận dạng
Nếu thao tác nhận dạng văn bản thành công, nó sẽ trả về đối tượngVisionText
. Đối tượng VisionText
chứa toàn bộ văn bản được nhận dạng trong hình ảnh và không có hoặc nhiều đối tượng VisionTextBlock
. Mỗi VisionTextBlock
đại diện cho một khối văn bản hình chữ nhật, chứa 0 hoặc nhiều đối tượng VisionTextLine
. Mỗi đối tượng VisionTextLine
chứa không hoặc nhiều đối tượng VisionTextElement
, đại diện cho các từ và các thực thể giống từ (ngày, số, v.v.).
Đối với mỗi đối tượng VisionTextBlock
, VisionTextLine
và VisionTextElement
, bạn có thể nhận dạng văn bản trong vùng và tọa độ giới hạn của vùng.
Ví dụ:
Nhanh
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 } } }
Mục tiêu-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; } } }
Bước tiếp theo
- Trước khi triển khai để sản xuất một ứng dụng sử dụng API đám mây, bạn nên thực hiện một số bước bổ sung để ngăn chặn và giảm thiểu tác động của việc truy cập API trái phép .
Nhận dạng văn bản trong hình ảnh của tài liệu
Để nhận dạng văn bản của tài liệu, hãy định cấu hình và chạy trình nhận dạng văn bản tài liệu như mô tả bên dưới.
API nhận dạng văn bản tài liệu, được mô tả bên dưới, cung cấp giao diện nhằm mục đích thuận tiện hơn khi làm việc với hình ảnh của tài liệu. Tuy nhiên, nếu thích giao diện do API văn bản thưa thớt cung cấp, bạn có thể sử dụng giao diện này để quét tài liệu bằng cách định cấu hình trình nhận dạng văn bản trên đám mây để sử dụng mô hình văn bản dày đặc .
Để sử dụng API nhận dạng văn bản tài liệu:
1. Chạy trình nhận dạng văn bản
Truyền hình ảnh dưới dạngUIImage
hoặc CMSampleBufferRef
cho phương thức process(_:completion:)
của VisionDocumentTextRecognizer
:- Nhận một phiên bản của
VisionDocumentTextRecognizer
bằng cách gọicloudDocumentTextRecognizer
:Nhanh
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)
Mục tiêu-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];
- Để gọi Cloud Vision, hình ảnh phải được định dạng dưới dạng chuỗi được mã hóa base64. Để xử lý
UIImage
:Nhanh
guard let imageData = uiImage.jpegData(compressionQuality: 1.0) else { return } let base64encodedImage = imageData.base64EncodedString()
Mục tiêu-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Sau đó, chuyển hình ảnh tới phương thức
process(_:completion:)
:Nhanh
textRecognizer.process(visionImage) { result, error in guard error == nil, let result = result else { // ... return } // Recognized text }
Mục tiêu-C
[textRecognizer processImage:image completion:^(FIRVisionDocumentText *_Nullable result, NSError *_Nullable error) { if (error != nil || result == nil) { // ... return; } // Recognized text }];
2. Trích xuất văn bản từ khối văn bản được nhận dạng
Nếu thao tác nhận dạng văn bản thành công, nó sẽ trả về đối tượngVisionDocumentText
. Đối tượng VisionDocumentText
chứa toàn bộ văn bản được nhận dạng trong hình ảnh và hệ thống phân cấp của các đối tượng phản ánh cấu trúc của tài liệu được nhận dạng: Đối với mỗi đối tượng VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
và VisionDocumentTextSymbol
, bạn có thể nhận dạng văn bản trong vùng và tọa độ giới hạn của vùng.
Ví dụ:
Nhanh
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 } } } }
Mục tiêu-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; } } } }
Bước tiếp theo
- Trước khi triển khai để sản xuất một ứng dụng sử dụng API đám mây, bạn nên thực hiện một số bước bổ sung để ngăn chặn và giảm thiểu tác động của việc truy cập API trái phép .