Mengenali Teks dalam Gambar dengan Firebase ML di iOS

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 .

    Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.

    1. Di Xcode, dengan proyek aplikasi Anda terbuka, navigasikan ke File > Add Packages .
    2. Saat diminta, tambahkan repositori SDK platform Apple Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk
    4. Pilih pustaka Firebase ML.
    5. Setelah selesai, Xcode akan secara otomatis mulai menyelesaikan dan mengunduh dependensi Anda di latar belakang.

    Selanjutnya, lakukan beberapa pengaturan dalam aplikasi:

    1. Di aplikasi Anda, impor Firebase:

      Cepat

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Jika Anda belum mengaktifkan API berbasis Cloud untuk proyek Anda, lakukan sekarang:

    1. Buka halaman Firebase ML API dari Firebase console.
    2. Jika Anda belum memutakhirkan 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.

    3. Jika Cloud-based APIs belum diaktifkan, klik Enable Cloud-based APIs .

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 Cina, 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 lebar penuh 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 sebagai UIImage atau CMSampleBufferRef ke metode process(_:completion:) VisionTextRecognizer :

  1. Dapatkan instance VisionTextRecognizer dengan memanggil cloudTextRecognizer :

    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];
    
  2. 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];
  3. 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 objek VisionText . 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 sebagainya).

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


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 sebagai UIImage atau CMSampleBufferRef ke metode process(_:completion:) VisionDocumentTextRecognizer :

  1. Dapatkan instance VisionDocumentTextRecognizer dengan memanggil cloudDocumentTextRecognizer :

    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];
    
  2. 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];
  3. 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 objek VisionDocumentText . 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 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 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