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 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.

    Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.

    1. Di Xcode, dengan project aplikasi Anda dalam keadaan terbuka, buka File > Add Packages.
    2. Saat diminta, tambahkan repositori SDK platform Apple Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Pilih library Firebase ML.
    5. Tambahkan flag -ObjC ke bagian Other Linker Flags pada setelan build target Anda.
    6. Setelah selesai, Xcode akan otomatis mulai me-resolve dan mendownload dependensi Anda di latar belakang.

    Berikutnya, lakukan beberapa penyiapan dalam aplikasi:

    1. Di aplikasi Anda, impor Firebase:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

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

    1. Buka halaman API di bagian Firebase ML di Firebase console.
    2. 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.

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

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

  1. Dapatkan instance VisionTextRecognizer dengan memanggil cloudTextRecognizer:

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


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

  1. Dapatkan instance VisionDocumentTextRecognizer dengan memanggil cloudDocumentTextRecognizer:

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