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ả một API mục đích chung 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à một API được tối ưu hoá để 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 thực hiện bằng cách làm theo hướng dẫn
các bước trong hướng dẫn bắt đầu sử dụng.
- Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy chuyển đến Tệp > Thêm gói.
- Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Apple của Firebase:
- Chọn thư viện Firebase ML.
- Thêm cờ
-ObjC
vào mục Cờ trình liên kết khác trong chế độ cài đặt bản dựng của mục tiêu. - 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 trong nền.
- Trong ứng dụng của bạn, hãy nhập Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Nếu bạn chưa bật API trên đám mây cho dự án của mình, hãy bật bây giờ:
- Mở Firebase ML trang API 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á linh hoạt, hãy nhấp vào Hãy nâng cấp để làm điều này. (Bạn sẽ chỉ được nhắc nâng cấp nếu không có trong Kế hoạch linh hoạt.)
Chỉ các dự án cấp Blaze mới có thể sử dụng API trên đám mây.
- Nếu bạn chưa bật API trên đám mây, hãy nhấp vào Bật API dựa trên đám mây API.
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 Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Tiếp theo, hãy 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.
Nguyên tắc 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 được biểu thị bằng đủ dữ liệu pixel. Lý tưởng cho tiếng Latinh văn bản, mỗi ký tự phải tối thiểu 16x16 pixel. Đối với tiếng Trung, Văn bản tiếng Nhật và tiếng Hàn, mỗi loại ký tự phải là 24x24 pixel. Đối với tất cả các ngôn ngữ, thường không có tính chính xác cho các ký tự lớn hơn 24x24 pixel.
Vì vậy, ví dụ: hình ảnh 640x480 có thể phù hợp để 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ó kích thước chữ cái, có thể yêu cầu hình ảnh 720x1280 pixel.
-
Tiêu điểm 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ả có thể 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 biết văn bản trong hình ảnh
Để nhận dạng văn bản trong một hình ảnh, hãy chạy trình nhận dạng văn bản như được 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
vào
process(_:completion:)
của VisionTextRecognizer
phương thức:
- Nhận một thực thể của
VisionTextRecognizer
bằng cách gọicloudTextRecognizer
: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];
-
Để gọi Cloud Vision, hình ảnh phải được định dạng ở dạng được mã hoá base64
. Cách xử lý
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];
-
Sau đó, hãy truyền hình ảnh đó vào phương thức
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. Trích xuất văn bản từ các 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, thao tác sẽ trả về một Đối tượngVisionText
. Đối tượng VisionText
chứa toàn bộ văn bản
nhận ra trong hình ảnh và không hoặc có giá trị khác VisionTextBlock
.
Mỗi VisionTextBlock
đại diện cho một khối văn bản hình chữ nhật, trong đó có
không hoặc có nhiều đối tượng VisionTextLine
. Mỗi VisionTextLine
đối tượng không chứa hoặc chứa nhiều đối tượng VisionTextElement
,
đại diện cho các từ và những đối tượng 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 khu vực và toạ độ giới hạn của
khu vực.
Ví dụ:
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; } } }
Các bước tiếp theo
- Trước khi triển khai phát hành công khai một ứng dụng sử dụng Cloud API, bạn nên thực hiện một số bước bổ sung nhằm ngăn chặn và giảm thiểu ảnh hưởng của việc truy cập trái phép API.
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 lệnh trình nhận dạng văn bản tài liệu như được mô tả bên dưới.
API nhận dạng văn bản tài liệu, được mô tả dưới đây, cung cấp một giao diện nhằm 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 muốn giao diện do API văn bản thưa thớt cung cấp, bạn có thể sử dụng nó bạn có thể 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 thành 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
vào
process(_:completion:)
của VisionDocumentTextRecognizer
phương thức:
- Nhận một thực thể của
VisionDocumentTextRecognizer
bằng cách gọicloudDocumentTextRecognizer
: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];
-
Để gọi Cloud Vision, hình ảnh phải được định dạng ở dạng được mã hoá base64
. Cách xử lý
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];
-
Sau đó, hãy truyền hình ảnh đó vào phương thức
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. Trích xuất văn bản từ các 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, thao tác sẽ trả về một Đối tượngVisionDocumentText
. Đối tượng VisionDocumentText
chứa toàn bộ văn bản được ghi nhận trong hình ảnh và một hệ phân cấp các đối tượng
phản ánh cấu trúc của tài liệu được công nhận:
Đối với mỗi VisionDocumentTextBlock
, VisionDocumentTextParagraph
,
VisionDocumentTextWord
và VisionDocumentTextSymbol
, bạn có thể lấy phương thức
văn bản được nhận dạng ở khu vực và toạ độ giới hạn của khu vực.
Ví dụ:
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; } } } }
Các bước tiếp theo
- Trước khi triển khai phát hành công khai một ứng dụng sử dụng Cloud API, bạn nên thực hiện một số bước bổ sung nhằm ngăn chặn và giảm thiểu ảnh hưởng của việc truy cập trái phép API.