Anda dapat menggunakan Firebase ML untuk mengenali teks dalam gambar. Firebase ML memiliki API tujuan umum yang cocok untuk mengenali teks dalam gambar, seperti teks tanda jalan, dan API yang dioptimalkan untuk mengenali teks dokumen.
Sebelum kamu memulai
- Jika Anda belum menambahkan Firebase ke aplikasi Anda, lakukan dengan mengikuti langkah-langkah di panduan memulai .
- Di Xcode, dengan proyek aplikasi Anda terbuka, navigasikan ke File > Add Packages .
- Saat diminta, tambahkan repositori SDK platform Apple Firebase:
- Pilih pustaka Firebase ML.
- Setelah selesai, Xcode akan secara otomatis mulai menyelesaikan dan mengunduh dependensi Anda di latar belakang.
- Di aplikasi Anda, impor Firebase:
Cepat
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
Jika Anda belum mengaktifkan API berbasis Cloud untuk proyek Anda, lakukan sekarang:
- Buka halaman Firebase ML API dari Firebase console.
Jika Anda belum meningkatkan proyek Anda ke paket harga Blaze, klik Tingkatkan untuk melakukannya. (Anda akan diminta untuk memutakhirkan hanya jika proyek Anda tidak ada dalam paket Blaze.)
Hanya project level Blaze yang dapat menggunakan API berbasis Cloud.
- Jika Cloud-based APIs belum diaktifkan, klik Enable Cloud-based APIs .
Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.
https://github.com/firebase/firebase-ios-sdk
Selanjutnya, lakukan beberapa pengaturan dalam aplikasi:
Sekarang Anda siap untuk mulai mengenali teks dalam gambar.
Pedoman gambar masukan
Agar Firebase ML dapat mengenali teks secara akurat, gambar masukan harus berisi teks yang diwakili oleh data piksel yang memadai. Idealnya, untuk teks Latin, setiap karakter setidaknya berukuran 16x16 piksel. Untuk teks China, Jepang, dan Korea, setiap karakter harus berukuran 24x24 piksel. Untuk semua bahasa, umumnya tidak ada manfaat akurasi untuk karakter yang lebih besar dari 24x24 piksel.
Jadi, misalnya, gambar 640x480 mungkin berfungsi dengan baik untuk memindai kartu nama yang menempati seluruh lebar gambar. Untuk memindai dokumen yang dicetak pada kertas berukuran letter, gambar 720x1280 piksel mungkin diperlukan.
Fokus gambar yang buruk dapat merusak akurasi pengenalan teks. Jika Anda tidak mendapatkan hasil yang dapat diterima, coba minta pengguna untuk mengambil kembali gambar tersebut.
Kenali teks dalam gambar
Untuk mengenali teks dalam gambar, jalankan pengenal teks seperti yang dijelaskan di bawah ini.
1. Jalankan pengenal teks
Teruskan gambar sebagaiUIImage
atau CMSampleBufferRef
ke metode process(_:completion:)
VisionTextRecognizer
:- Dapatkan instance
VisionTextRecognizer
dengan memanggilcloudTextRecognizer
:Cepat
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];
- Untuk memanggil Cloud Vision, gambar harus diformat sebagai string berenkode base64. Untuk memproses
UIImage
:Cepat
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Kemudian, berikan gambar ke metode
process(_:completion:)
:Cepat
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. Ekstrak teks dari blok teks yang dikenali
Jika operasi pengenalan teks berhasil, itu akan mengembalikan objekVisionText
. Objek VisionText
berisi teks lengkap yang dikenali dalam gambar dan nol atau lebih objek VisionTextBlock
. Setiap VisionTextBlock
mewakili blok teks persegi panjang, yang berisi nol atau lebih objek VisionTextLine
. Setiap objek VisionTextLine
berisi nol atau lebih objek VisionTextElement
, yang mewakili kata dan entitas seperti kata (tanggal, angka, dan seterusnya).
Untuk setiap objek VisionTextBlock
, VisionTextLine
, dan VisionTextElement
, Anda bisa mendapatkan teks yang dikenali di wilayah dan koordinat pembatas wilayah.
Sebagai contoh:
Cepat
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; } } }
Langkah selanjutnya
- Sebelum menerapkan ke produksi aplikasi yang menggunakan Cloud API, Anda harus mengambil beberapa langkah tambahan untuk mencegah dan mengurangi efek akses API yang tidak sah .
Mengenali teks dalam gambar dokumen
Untuk mengenali teks dokumen, konfigurasikan dan jalankan pengenal teks dokumen seperti yang dijelaskan di bawah ini.
API pengenalan teks dokumen, yang dijelaskan di bawah, menyediakan antarmuka yang dimaksudkan agar lebih nyaman untuk bekerja dengan gambar dokumen. Namun, jika Anda lebih suka antarmuka yang disediakan oleh API teks jarang, Anda dapat menggunakannya untuk memindai dokumen dengan mengonfigurasi pengenal teks awan untuk menggunakan model teks padat .
Untuk menggunakan API pengenalan teks dokumen:
1. Jalankan pengenal teks
Teruskan gambar sebagaiUIImage
atau CMSampleBufferRef
ke metode process(_:completion:)
VisionDocumentTextRecognizer
:- Dapatkan instance
VisionDocumentTextRecognizer
dengan memanggilcloudDocumentTextRecognizer
:Cepat
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];
- Untuk memanggil Cloud Vision, gambar harus diformat sebagai string berenkode base64. Untuk memproses
UIImage
:Cepat
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
- Kemudian, berikan gambar ke metode
process(_:completion:)
:Cepat
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. Ekstrak teks dari blok teks yang dikenali
Jika operasi pengenalan teks berhasil, itu akan mengembalikan objekVisionDocumentText
. Objek VisionDocumentText
berisi teks lengkap yang dikenali dalam gambar dan hierarki objek yang mencerminkan struktur dokumen yang dikenali: Untuk setiap VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
, dan VisionDocumentTextSymbol
, Anda bisa mendapatkan teks yang dikenali di kawasan dan koordinat pembatas kawasan.
Sebagai contoh:
Cepat
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; } } } }
Langkah selanjutnya
- Sebelum menerapkan ke produksi aplikasi yang menggunakan Cloud API, Anda harus mengambil beberapa langkah tambahan untuk mencegah dan mengurangi efek akses API yang tidak sah .