Beri Label Gambar dengan Aman dengan Cloud Vision menggunakan Firebase Auth dan Functions di platform Apple

Untuk memanggil Google Cloud API dari aplikasi Anda, 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 ditagihkan ke 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 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 > Swift Packages > Add Package Dependency .
  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 Firebase console.
    2. 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.

    3. Jika Cloud-based APIs belum diaktifkan, klik Enable Cloud-based APIs .
  2. Konfigurasikan kunci Firebase API yang ada untuk melarang akses ke Cloud Vision API:
    1. Buka halaman Kredensial di Cloud Console.
    2. Untuk setiap kunci API dalam daftar, buka tampilan pengeditan, dan di bagian Pembatasan Kunci, tambahkan semua API yang tersedia kecuali Cloud Vision API ke daftar.

Terapkan fungsi yang dapat dipanggil

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

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

Untuk menerapkan fungsi:

  1. Kloning atau unduh fungsi-sampel repo dan ubah ke direktori vision-annotate-image :
    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, instal .
  4. Inisialisasi proyek Firebase di direktori vision-annotate-image . Saat diminta, pilih proyek Anda dalam daftar.
    firebase init
  5. Terapkan 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 perlu menambahkan Firebase Auth ke aplikasi Anda.

Tambahkan dependensi yang diperlukan ke aplikasi Anda

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

Sekarang Anda siap untuk memberi label pada 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 memberi label pada gambar

Untuk melabeli objek dalam gambar, aktifkan fungsi yang dapat dipanggil dengan meneruskan 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 dengan Jenis disetel ke LABEL_DETECTION :

    Cepat

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["maxResults": 5, "type": "LABEL_DETECTION"]
    ]
    

    Objective-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"}
    };
    
  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. Dapatkan informasi tentang objek berlabel

Jika operasi pelabelan gambar berhasil, respons JSON dari BatchAnnotateImagesResponse akan dikembalikan dalam hasil tugas. Setiap objek dalam larik labelAnnotations mewakili sesuatu yang diberi label dalam gambar. Untuk setiap label, Anda bisa mendapatkan deskripsi teks label, ID entitas Grafik Pengetahuannya (jika tersedia), dan skor kepercayaan kecocokan. Sebagai contoh:

Cepat

if let labelArray = (result?.data as? [String: Any])?["labelAnnotations"] as? [[String:Any]] {
  for labelObj in labelArray {
    let text = labelObj["description"]
    let entityId = labelObj["mid"]
    let confidence = labelObj["score"]
  }
}

Objective-C

NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
  NSString *text = labelObj[@"description"];
  NSString *entityId = labelObj[@"mid"];
  NSNumber *confidence = labelObj[@"score"];
}