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 rambu jalan, dan API yang dioptimalkan untuk mengenali teks dokumen.
Sebelum memulai
-
Jika Anda belum menambahkan Firebase ke aplikasi, lakukan dengan mengikuti langkah-langkahnya di panduan memulai.
- Di Xcode, dengan project aplikasi Anda dalam keadaan terbuka, buka File > Add Packages.
- Saat diminta, tambahkan repositori SDK platform Apple Firebase:
- Pilih library Firebase ML.
- Tambahkan flag
-ObjC
ke bagian Other Linker Flags pada setelan build target Anda. - Setelah selesai, Xcode akan otomatis mulai me-resolve dan mendownload dependensi Anda di latar belakang.
- Di aplikasi Anda, impor Firebase:
Swift
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
-
Jika Anda belum mengaktifkan API berbasis Cloud untuk project Anda, lakukan sekarang:
- Buka halaman API di bagian Firebase ML di Firebase console.
-
Jika Anda belum mengupgrade project ke paket harga Blaze, klik Upgrade untuk melakukannya. (Anda akan diminta untuk mengupgrade hanya jika project tersebut tidak menggunakan paket Blaze.)
Hanya project tingkat Blaze yang dapat menggunakan API berbasis Cloud.
- Jika API berbasis Cloud belum diaktifkan, klik Enable Cloud-based APIs.
Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.
https://github.com/firebase/firebase-ios-sdk.git
Berikutnya, lakukan beberapa penyiapan dalam aplikasi:
Kini Anda siap untuk mulai mengenali teks dalam gambar.
Pedoman gambar input
-
Agar Firebase ML dapat mengenali teks secara akurat, gambar input harus berisi teks yang direpresentasikan oleh data piksel yang memadai. Idealnya, untuk teks aksara Latin, setiap karakter harus berukuran minimal 16x16 piksel. Untuk teks aksara China, Jepang, dan Korea, setiap karakter harus berukuran 24x24 piksel. Untuk semua bahasa, umumnya ukuran karakter yang lebih besar dari 24x24 piksel tidak meningkatkan akurasi.
Jadi, misalnya, gambar 640x480 piksel mungkin sudah cukup untuk memindai kartu nama yang menempati lebar penuh gambar. Untuk memindai dokumen yang dicetak pada kertas berukuran letter, gambar 720x1280 piksel mungkin diperlukan.
-
Fokus gambar yang buruk dapat menurunkan akurasi pengenalan teks. Jika tidak mendapatkan hasil yang diharapkan, coba minta pengguna untuk mengambil ulang gambar.
Mengenali teks dalam gambar
Untuk mengenali teks dalam gambar, jalankan pengenal teks seperti yang dijelaskan di bawah.
1. Jalankan pengenal teks
Teruskan gambar sebagaiUIImage
atau CMSampleBufferRef
ke metode
process(_:completion:)
VisionTextRecognizer
:
- Dapatkan instance
VisionTextRecognizer
dengan memanggilcloudTextRecognizer
: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];
-
Untuk memanggil Cloud Vision, gambar harus diformat sebagai string berenkode base64. Untuk memproses
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];
-
Lalu, teruskan gambar ke metode
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. Mengekstrak teks dari blok teks yang dikenali
Jika operasi pengenalan teks berhasil, objekVisionText
akan ditampilkan. Objek VisionText
berisi teks lengkap yang dikenali dalam gambar, serta berisi nol objek VisionTextBlock
atau lebih.
Setiap VisionTextBlock
mewakili blok teks persegi panjang yang berisi nol objek VisionTextLine
atau lebih. Setiap objek VisionTextLine
berisi nol objek VisionTextElement
atau lebih,
yang mewakili kata dan entitas seperti kata (tanggal, angka, dan sebagainya).
Untuk setiap objek VisionTextBlock
, VisionTextLine
, dan VisionTextElement
,
Anda bisa mendapatkan teks yang dikenali di area dan koordinat pembatas
area tersebut.
Contoh:
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; } } }
Langkah berikutnya
- Sebelum men-deploy aplikasi yang menggunakan Cloud API ke fase produksi, Anda harus mengambil beberapa langkah tambahan untuk mencegah dan mengurangi dampak akses API tanpa izin.
Mengenali teks dalam gambar dokumen
Untuk mengenali teks dokumen, konfigurasikan dan jalankan pengenal teks dokumen seperti yang dijelaskan di bawah.
API pengenalan teks dokumen, yang dijelaskan di bawah, memberikan antarmuka yang ditujukan untuk memudahkan Anda menggunakan gambar dokumen. Namun, jika lebih menyukai antarmuka yang disediakan oleh API teks jarang, Anda dapat menggunakannya untuk memindai dokumen dengan mengonfigurasi pengenal teks cloud untuk menggunakan model teks padat.
Untuk menggunakan API pengenalan teks dokumen, jalankan langkah-langkah berikut.
1. Jalankan pengenal teks
Teruskan gambar sebagaiUIImage
atau CMSampleBufferRef
ke metode
process(_:completion:)
VisionDocumentTextRecognizer
:
- Dapatkan instance
VisionDocumentTextRecognizer
dengan memanggilcloudDocumentTextRecognizer
: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];
-
Untuk memanggil Cloud Vision, gambar harus diformat sebagai string berenkode base64. Untuk memproses
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];
-
Lalu, teruskan gambar ke metode
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. Mengekstrak teks dari blok teks yang dikenali
Jika operasi pengenalan teks berhasil, objekVisionDocumentText
akan ditampilkan. Objek VisionDocumentText
berisi teks lengkap yang dikenali dalam gambar, dan hierarki objek yang mencerminkan struktur dokumen yang dikenali:
Untuk setiap objek VisionDocumentTextBlock
, VisionDocumentTextParagraph
, VisionDocumentTextWord
, dan VisionDocumentTextSymbol
, Anda bisa mendapatkan teks yang dikenali di area dan koordinat pembatas area tersebut.
Contoh:
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; } } } }
Langkah berikutnya
- Sebelum men-deploy aplikasi yang menggunakan Cloud API ke lingkungan production, Anda harus mengambil beberapa langkah tambahan untuk mencegah dan mengurangi edampak akses API tanpa izin.