Catch up on everything we announced at this year's Firebase Summit. Learn more

Kenali Teks dalam Gambar Secara Aman dengan Cloud Vision menggunakan Firebase Auth dan Fungsi di platform Apple

Untuk memanggil Google Cloud API dari aplikasi, Anda perlu membuat REST API perantara yang menangani otorisasi dan melindungi nilai rahasia seperti kunci API. Anda kemudian perlu menulis kode di aplikasi seluler Anda untuk mengautentikasi dan berkomunikasi dengan layanan perantara ini.

Salah satu cara untuk membuat REST API ini adalah dengan menggunakan Firebase Authentication and Functions, yang memberi Anda gateway tanpa server terkelola ke Google Cloud API yang menangani autentikasi dan dapat dipanggil dari aplikasi seluler Anda dengan SDK bawaan.

Panduan ini menunjukkan cara menggunakan teknik ini untuk memanggil Cloud Vision API dari aplikasi Anda. Metode ini akan memungkinkan semua pengguna yang diautentikasi untuk mengakses layanan yang ditagih Cloud Vision melalui proyek Cloud Anda, jadi pertimbangkan apakah mekanisme autentikasi ini cukup untuk kasus penggunaan Anda sebelum melanjutkan.

Sebelum kamu memulai

Konfigurasikan proyek Anda

Jika Anda belum menambahkan Firebase untuk aplikasi Anda, melakukannya dengan mengikuti langkah-langkah dalam panduan untuk memulai .

Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.

  1. Dalam Xcode, dengan proyek aplikasi terbuka, menavigasi ke File> Paket Swift> Add Paket Ketergantungan.
  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 Firebase

    Objective-C

    @import Firebase;

Beberapa langkah konfigurasi lagi, dan kami siap untuk pergi:

  1. Jika Anda belum mengaktifkan API berbasis Cloud untuk proyek Anda, lakukan sekarang:

    1. Buka halaman Firebase ML API dari konsol Firebase.
    2. Jika Anda belum upgrade proyek Anda dengan rencana harga Blaze, klik Upgrade 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 API berbasis Cloud yang belum diaktifkan, klik Aktifkan API berbasis Cloud.
  2. Konfigurasikan kunci Firebase API yang ada untuk melarang akses ke Cloud Vision API:
    1. Buka Kredensial halaman konsol Cloud.
    2. Untuk setiap tombol API dalam daftar, buka tampilan mengedit, dan di bagian Pembatasan Key, menambahkan semua API yang tersedia kecuali API Cloud Visi ke dalam daftar.

Terapkan fungsi yang dapat dipanggil

Selanjutnya, terapkan Cloud Function yang akan Anda gunakan untuk menjembatani aplikasi Anda dan Cloud Vision API. The functions-samples repositori berisi contoh Anda dapat menggunakan.

Secara default, mengakses Cloud Vision API melalui fungsi ini hanya akan mengizinkan pengguna yang diautentikasi untuk mengakses aplikasi Anda ke Cloud Vision API. Anda dapat memodifikasi fungsi untuk kebutuhan yang berbeda.

Untuk menerapkan fungsi:

  1. Clone atau download fungsi-sampel repo dan perubahan ke vision-annotate-image direktori:
    git clone https://github.com/firebase/functions-samples
    cd vision-annotate-image
    
  2. Instal dependensi:
    cd functions
    npm install
    cd ..
    
  3. Jika Anda tidak memiliki Firebase CLI, menginstalnya .
  4. Menginisialisasi proyek Firebase di vision-annotate-image direktori. Saat diminta, pilih proyek Anda dalam daftar.
    firebase init
  5. Menyebarkan fungsi:
    firebase deploy --only functions:annotateImage

Tambahkan Firebase Auth ke aplikasi Anda

Fungsi yang dapat dipanggil yang diterapkan di atas akan menolak permintaan apa pun dari pengguna aplikasi Anda yang tidak diautentikasi. Jika Anda belum melakukannya, Anda akan perlu menambahkan Firebase Tupoksi untuk aplikasi Anda.

Tambahkan dependensi yang diperlukan ke aplikasi Anda

Gunakan Swift Package Manager untuk menginstal pustaka Cloud Functions for Firebase.

Sekarang Anda siap untuk mulai mengenali teks dalam gambar.

1. Siapkan gambar input

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];

2. Aktifkan fungsi yang dapat dipanggil untuk mengenali teks

Untuk mengenali landmark di gambar, memanggil fungsi callable melewati permintaan JSON Cloud Vision .

  1. Pertama, inisialisasi instance Cloud Functions:

    Cepat

    lazy var functions = Functions.functions()
    

    Objective-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. Buat permintaan. The Cloud Visi API mendukung dua Jenis deteksi teks: TEXT_DETECTION dan DOCUMENT_TEXT_DETECTION . Lihat Cloud Vision OCR Docs untuk perbedaan antara dua kasus penggunaan.

    Cepat

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["type": "TEXT_DETECTION"],
      "imageContext": ["languageHints": ["en"]]
    ]
    

    Objective-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"type": @"TEXT_DETECTION"},
      @"imageContext": @{@"languageHints": @[@"en"]}
    };
    
  3. Akhirnya, panggil fungsi:

    Cepat

    functions.httpsCallable("annotateImage").call(requestData) { (result, error) in
      if let error = error as NSError? {
        if error.domain == FunctionsErrorDomain {
          let code = FunctionsErrorCode(rawValue: error.code)
          let message = error.localizedDescription
          let details = error.userInfo[FunctionsErrorDetailsKey]
        }
        // ...
      }
      // Function completed succesfully
    }
    

    Objective-C

    [[_functions HTTPSCallableWithName:@"annotateImage"]
                              callWithObject:requestData
                                  completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
            if (error) {
              if (error.domain == FIRFunctionsErrorDomain) {
                FIRFunctionsErrorCode code = error.code;
                NSString *message = error.localizedDescription;
                NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
              }
              // ...
            }
            // Function completed succesfully
            // Get information about labeled objects
    
          }];
    

3. Ekstrak teks dari blok teks yang dikenali

Jika operasi pengakuan teks berhasil, respon JSON dari BatchAnnotateImagesResponse akan dikembalikan dalam hasil tugas ini. Anotasi teks dapat ditemukan di fullTextAnnotation objek.

Anda bisa mendapatkan teks diakui sebagai string dalam text lapangan. Sebagai contoh:

Cepat

guard let annotation = (result?.data as? [String: Any])?["fullTextAnnotation"] as? [String: Any] else { return }
print("%nComplete annotation:")
let text = annotation["text"] as? String ?? ""
print("%n\(text)")

Objective-C

NSDictionary *annotation = result.data[@"fullTextAnnotation"];
if (!annotation) { return; }
NSLog(@"\nComplete annotation:");
NSLog(@"\n%@", annotation[@"text"]);

Anda juga bisa mendapatkan informasi khusus untuk wilayah gambar. Untuk setiap block , paragraph , word , dan symbol , Anda bisa mendapatkan teks diakui di wilayah tersebut dan koordinat berlari daerah. Sebagai contoh:

Cepat

guard let pages = annotation["pages"] as? [[String: Any]] else { return }
for page in pages {
var pageText = ""
guard let blocks = page["blocks"] as? [[String: Any]] else { continue }
for block in blocks {
    var blockText = ""
    guard let paragraphs = block["paragraphs"] as? [[String: Any]] else { continue }
    for paragraph in paragraphs {
    var paragraphText = ""
    guard let words = paragraph["words"] as? [[String: Any]] else { continue }
    for word in words {
        var wordText = ""
        guard let symbols = word["symbols"] as? [[String: Any]] else { continue }
        for symbol in symbols {
        let text = symbol["text"] as? String ?? ""
        let confidence = symbol["confidence"] as? Float ?? 0.0
        wordText += text
        print("Symbol text: \(text) (confidence: \(confidence)%n")
        }
        let confidence = word["confidence"] as? Float ?? 0.0
        print("Word text: \(wordText) (confidence: \(confidence)%n%n")
        let boundingBox = word["boundingBox"] as? [Float] ?? [0.0, 0.0, 0.0, 0.0]
        print("Word bounding box: \(boundingBox.description)%n")
        paragraphText += wordText
    }
    print("%nParagraph: %n\(paragraphText)%n")
    let boundingBox = paragraph["boundingBox"] as? [Float] ?? [0.0, 0.0, 0.0, 0.0]
    print("Paragraph bounding box: \(boundingBox)%n")
    let confidence = paragraph["confidence"] as? Float ?? 0.0
    print("Paragraph Confidence: \(confidence)%n")
    blockText += paragraphText
    }
    pageText += blockText
}

Objective-C

for (NSDictionary *page in annotation[@"pages"]) {
  NSMutableString *pageText = [NSMutableString new];
  for (NSDictionary *block in page[@"blocks"]) {
    NSMutableString *blockText = [NSMutableString new];
    for (NSDictionary *paragraph in block[@"paragraphs"]) {
      NSMutableString *paragraphText = [NSMutableString new];
      for (NSDictionary *word in paragraph[@"words"]) {
        NSMutableString *wordText = [NSMutableString new];
        for (NSDictionary *symbol in word[@"symbols"]) {
          NSString *text = symbol[@"text"];
          [wordText appendString:text];
          NSLog(@"Symbol text: %@ (confidence: %@\n", text, symbol[@"confidence"]);
        }
        NSLog(@"Word text: %@ (confidence: %@\n\n", wordText, word[@"confidence"]);
        NSLog(@"Word bounding box: %@\n", word[@"boundingBox"]);
        [paragraphText appendString:wordText];
      }
      NSLog(@"\nParagraph: \n%@\n", paragraphText);
      NSLog(@"Paragraph bounding box: %@\n", paragraph[@"boundingBox"]);
      NSLog(@"Paragraph Confidence: %@\n", paragraph[@"confidence"]);
      [blockText appendString:paragraphText];
    }
    [pageText appendString:blockText];
  }
}