TensorFlow Lite ve Firebase ile uygulamanıza Öneriler ekleyin - iOS Codelab

1. Genel Bakış

TensorFlow Lite ve Firebase codelab ile Önerilere hoş geldiniz. Bu kod laboratuvarında, uygulamanıza bir öneri modeli dağıtmak için TensorFlow Lite ve Firebase'i nasıl kullanacağınızı öğreneceksiniz. Bu codelab, bu TensorFlow Lite örneğini temel alır.

Öneriler, uygulamaların her kullanıcı için en alakalı içeriği akıllı bir şekilde sunmak için makine öğrenimini kullanmasına olanak tanır. Çok sayıda başka kullanıcının toplu davranışı üzerine eğitilmiş bir model kullanarak, kullanıcının gelecekte etkileşimde bulunmak isteyebileceği uygulama içeriğini önermek için geçmiş kullanıcı davranışlarını dikkate alırlar.

Bu eğitici, Firebase Analytics ile uygulamanızın kullanıcılarından nasıl veri elde edileceğini, bu verilerden öneriler için bir makine öğrenimi modelinin nasıl oluşturulacağını ve ardından bu modeli bir iOS uygulamasında çıkarım yapmak ve öneriler almak için nasıl kullanacağınızı gösterir. Özellikle önerilerimiz, kullanıcının daha önce beğendiği filmlerin listesi göz önüne alındığında, kullanıcının büyük olasılıkla hangi filmleri izleyeceğini önerecektir.

ne öğreneceksin

  • Kullanıcı davranışı verilerini toplamak için Firebase Analytics'i bir android uygulamasına entegre edin
  • Bu verileri Google Big Query'ye aktarın
  • Verileri önceden işleyin ve bir TF Lite öneri modeli eğitin
  • TF Lite modelini Firebase ML'ye dağıtın ve uygulamanızdan ona erişin
  • Kullanıcılara öneriler önermek için modeli kullanarak cihaz çıkarsamasında çalıştırın

Neye ihtiyacın olacak

  • Xcode 11 (veya üstü)
  • CocoaPods 1.9.1 (veya üstü)

Bu öğreticiyi nasıl kullanacaksınız?

Sadece baştan sona oku Okuyun ve alıştırmaları tamamlayın

iOS uygulamaları oluşturma deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta düzey Yetkin

2. Firebase konsol projesi oluşturun

Projeye Firebase ekleyin

  1. Firebase konsoluna gidin.
  2. Yeni Proje Oluştur'u seçin ve projenize "Firebase ML iOS Codelab" adını verin.

3. Örnek Projeyi Alın

Kodu İndir

Örnek projeyi klonlayarak ve proje dizininde pod update çalıştırarak başlayın:

git clone https://github.com/FirebaseExtended/codelab-contentrecommendations-ios.git
cd codelab-contentrecommendations-ios/start
pod install --repo-update

Git kurulu değilse, örnek projeyi GitHub sayfasından veya bu bağlantıya tıklayarak da indirebilirsiniz. Projeyi indirdikten sonra, Xcode'da çalıştırın ve nasıl çalıştığına dair bir fikir edinmek için öneriyle oynayın.

Firebase'i kurun

Yeni bir Firebase projesi oluşturmak için belgeleri izleyin. Projenizi aldıktan sonra, projenizin GoogleService-Info.plist dosyasını Firebase konsolundan indirin ve Xcode projesinin kök dizinine sürükleyin.

4a923d5c7ae0d8f3.png

Pod dosyanıza Firebase ekleyin ve pod kurulumunu çalıştırın.

pod 'Firebase/Analytics'
pod 'Firebase/MLCommon'
pod 'Firebase/MLModelInterpreter'

AppDelegate didFinishLaunchingWithOptions yönteminde, dosyanın en üstüne Firebase'i içe aktarın

import Firebase

Ve Firebase'i yapılandırmak için bir çağrı ekleyin.

FirebaseApp.configure()

Uygulamanın doğru yapılandırıldığından ve başlatıldığında çökmediğinden emin olmak için projeyi yeniden çalıştırın.

  1. "Bu proje için Google Analytics'i etkinleştir"in etkinleştirildiğinden emin olun.
  2. Firebase konsolunda kalan kurulum adımlarını izleyin, ardından Proje oluştur'u (veya mevcut bir Google projesini kullanıyorsanız Firebase Ekle'yi) tıklayın.

4. Uygulamaya Firebase Analytics'i ekleyin

Bu adımda, kullanıcı davranışı verilerini (bu durumda, bir kullanıcının hangi filmleri sevdiğini) günlüğe kaydetmek için uygulamaya Firebase Analytics'i ekleyeceksiniz. Bu veriler, öneriler modelini eğitmek için gelecekteki adımlarda toplu olarak kullanılacaktır.

Uygulamada Firebase Analytics'i kurun

LikedMoviesViewModel , kullanıcının beğendiği filmleri depolamak için işlevler içerir. Kullanıcı yeni bir filmi her beğendiğinde, bu beğeniyi kaydetmek için bir analiz günlüğü olayı da göndermek istiyoruz.

Kullanıcı bir filmi beğen'i tıkladığında bir analiz olayı kaydetmek için aşağıdaki kodu ekleyin.

AllMoviesCollectionViewController.Swift

import Firebase
//


override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
//

if movie.liked == nil {
      movie.liked = true
      Analytics.logEvent(AnalyticsEventSelectItem, parameters: [AnalyticsParameterItemID: movie.id])
    } else {
      movie.liked?.toggle()
    }
       
}

5. Analytics entegrasyonunuzu test edin

Bu adımda, uygulamada Analytics etkinlikleri oluşturacağız ve bunların Firebase Konsoluna gönderildiklerini doğrulayacağız.

Analytics Hata Ayıklama Günlüğünü Etkinleştir

Genel olarak, uygulamanız tarafından günlüğe kaydedilen olaylar, yaklaşık bir saatlik bir süre içinde gruplandırılır ve birlikte yüklenir. Bu yaklaşım, pili son kullanıcıların cihazlarında korur ve ağ veri kullanımını azaltır. Ancak, analitik uygulamanızı doğrulama amacıyla (ve analitiklerinizi DebugView raporunda görüntülemek için), olayları minimum gecikmeyle yüklemek için geliştirme cihazınızda Hata Ayıklama modunu etkinleştirebilirsiniz.

Geliştirme cihazınızda Analitik Hata Ayıklama modunu etkinleştirmek için Xcode'da aşağıdaki komut satırı bağımsız değişkenini belirtin:

-FIRDebugEnabled

Bu noktada, Firebase Analytics'i uygulamanıza başarıyla entegre ettiniz. Kullanıcılar uygulamanızı kullandıkça ve filmleri beğendikçe beğenileri toplu olarak kaydedilir. Öneri modelimizi eğitmek için bu kod laboratuvarının geri kalanında bu toplu verileri kullanacağız. Aşağıdaki, Logcat'te gördüğünüz aynı Analytics olaylarının Firebase konsoluna akışını da görmek için isteğe bağlı bir adımdır. Bir sonraki sayfaya geçmekten çekinmeyin.

İsteğe bağlı: Firebase Konsolunda Analytics etkinliklerini onaylayın

  1. Firebase konsoluna gidin.
  2. Analytics altında DebugView'ı seçin
  3. Xcode'da, uygulamayı başlatmak ve Beğenilenler listenize bazı filmler eklemek için Çalıştır'ı seçin.
  4. Firebase konsolunun DebugView'ında, uygulamaya film eklerken bu olayların günlüğe kaydedildiğini doğrulayın.

6. Analytics verilerini Big Query'ye aktarın

Big Query, büyük miktarda veriyi incelemenize ve işlemenize olanak tanıyan bir Google Cloud ürünüdür. Bu adımda, uygulamanız tarafından oluşturulan Analytics verilerinin otomatik olarak Big Query'ye aktarılması için Firebase Console projenizi Big Query'ye bağlayacaksınız.

Big Query dışa aktarımını etkinleştir

  1. Firebase konsoluna gidin.
  2. Projeye Genel Bakış'ın yanındaki Ayarlar dişli simgesini seçin ve ardından Proje ayarları'nı seçin.
  3. Entegrasyonlar sekmesini seçin.
  4. BigQuery bloğunun içinde Bağla'yı (veya Yönet ) seçin.
  5. Firebase'i BigQuery'ye Bağlama hakkında adımında İleri'yi seçin.
  6. Entegrasyonu yapılandır bölümünün altında, Google Analytics verilerinin gönderilmesini etkinleştirmek için anahtarı tıklayın ve BigQuery'ye Bağla 'yı seçin.

Artık Firebase konsol projenizi, Firebase Analytics etkinlik verilerini otomatik olarak Big Query'ye gönderecek şekilde etkinleştirdiniz. Bu, başka bir etkileşim olmadan otomatik olarak gerçekleşir, ancak BigQuery'de analiz veri kümesini oluşturan ilk dışa aktarma 24 saat boyunca gerçekleşmeyebilir. Veri kümesi oluşturulduktan sonra, Firebase sürekli olarak yeni Analytics etkinliklerini gün içi tablosuna Big Query'ye aktarır ve olaylar tablosunda geçmiş günlere ait etkinlikleri gruplandırır.

Bir öneri modelini eğitmek çok fazla veri gerektirir. Halihazırda büyük miktarda veri üreten bir uygulamamız olmadığı için bir sonraki adımda, bu eğiticinin geri kalanında kullanmak üzere örnek bir veri kümesini BigQuery'ye aktaracağız.

7. Model eğitim verilerini elde etmek için BigQuery'yi kullanın

BigQuery'ye dışa aktarmak için Firebase Konsolumuzu bağladığımıza göre, uygulama analizi olay verilerimiz bir süre sonra otomatik olarak BigQuery konsolunda görünecektir. Bu eğiticinin amaçları doğrultusunda bazı ilk verileri almak için bu adımda, öneriler modelimizi eğitmek için kullanmak üzere mevcut bir örnek veri kümesini BigQuery konsolunuza aktaracağız.

Örnek veri kümesini BigQuery'ye aktarın

  1. Google bulut konsolundaki BigQuery kontrol paneline gidin.
  2. Menüden projenizin adını seçin.
  3. Ayrıntıları görmek için BigQuery sol gezinme bölümünün alt kısmında proje adınızı seçin.
  4. Veri kümesi oluşturma panelini açmak için Veri kümesi oluştur'u seçin.
  5. Veri Kümesi Kimliği için 'firebase_recommendations_dataset' girin ve Veri kümesi oluştur öğesini seçin.
  6. Yeni veri seti, proje adının altındaki sol menüde görünecektir. Tıkla.
  7. Tablo oluşturma panelini açmak için Tablo oluştur'u seçin.
  8. Tablo oluştur için 'Google Bulut Depolama'yı seçin.
  9. GCS paketinden dosya seç alanına "gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt" yazın.
  10. Dosya biçimi açılır menüsünden 'JSONL' öğesini seçin.
  11. Tablo adı için 'recommendations_table' girin.
  12. Şema > Otomatik algıla > Şema ve giriş parametreleri altındaki kutuyu işaretleyin
  13. Tablo oluştur'u seçin

Örnek veri kümesini keşfedin

Bu noktada isteğe bağlı olarak şemayı keşfedebilir ve bu veri kümesini önizleyebilirsiniz.

  1. İçerdiği tabloları genişletmek için sol menüden firebase-recommendations-dataset'i seçin.
  2. Tablo şemasını görüntülemek için öneriler tablosu tablosunu seçin.
  3. Bu tablonun içerdiği gerçek Analytics olay verilerini görmek için Önizleme'yi seçin.

Hizmet hesabı kimlik bilgileri oluşturun

Şimdi, BigQuery verilerimize erişmek ve yüklemek için aşağıdaki adımda Colab ortamında kullanabileceğimiz Google Cloud konsol projemizde hizmet hesabı kimlik bilgilerini oluşturacağız.

  1. Google Cloud projeniz için faturalandırmanın etkinleştirildiğinden emin olun.
  2. BigQuery ve BigQuery Storage API API'lerini etkinleştirin. < buraya tıklayın >
  3. Hizmet Hesabı Anahtarı Oluştur sayfasına gidin.
  4. Hizmet hesabı listesinden Yeni hizmet hesabı öğesini seçin.
  5. Hizmet hesabı adı alanına bir ad girin.
  6. Rol listesinden Proje > Sahip öğesini seçin.
  7. Oluştur'u tıklayın. Bilgisayarınıza indirdiğiniz anahtarları içeren bir JSON dosyası.

Bir sonraki adımda, bu verileri önceden işlemek ve öneriler modelimizi eğitmek için Google Colab'ı kullanacağız.

8. Verileri ön işleme ve eğitim önerileri modeli

Bu adımda, aşağıdaki adımları gerçekleştirmek için bir Colab not defteri kullanacağız:

  1. BigQuery verilerini Colab not defterine aktarın
  2. Model eğitimi için hazırlamak için verileri önceden işlemek
  3. öneriler modelini analitik veriler üzerinde eğitin
  4. modeli bir TF lite modeli olarak dışa aktarın
  5. modeli uygulamamızda kullanabilmemiz için Firebase Konsoluna dağıtın

Colab eğitim not defterini başlatmadan önce, Colab'ın eğitilmiş modeli Firebase konsolumuza dağıtabilmesi için ilk olarak Firebase Model Management API'sini etkinleştireceğiz.

Firebase Model Management API'yi Etkinleştir

ML modellerinizi depolamak için bir paket oluşturun

Firebase Konsolunuzda Depolama'ya gidin ve Başlayın'a tıklayın. fbbea78f0eb3dc9f.png

Kovanızı kurmak için diyaloğu takip edin.

19517c0d6d2aa14d.png

Firebase ML API'yi etkinleştirin

Google Cloud Console'da Firebase ML API sayfasına gidin ve Etkinleştir'i tıklayın.

Modeli eğitmek ve dağıtmak için Colab not defterini kullanın

Aşağıdaki bağlantıyı kullanarak ortak çalışma defterini açın ve içindeki adımları tamamlayın. Colab not defterindeki adımları tamamladıktan sonra, uygulamamızla senkronize edebileceğimiz Firebase konsoluna dağıtılmış bir TF lite model dosyanız olacak.

Colab'da aç

9. Modeli uygulamanıza indirin

Bu adımda, Firebase Machine Learning'den yeni eğittiğimiz modeli indirmek için uygulamamızı değiştireceğiz.

Firebase ML bağımlılığı ekleyin

Uygulamanızda Firebase Machine Learning modellerini kullanmak için aşağıdaki bağımlılık gereklidir. Zaten eklenmiş olmalıdır (doğrulayın).

pod dosyası

import Firebase

Modeli Firebase Model Manager API ile indirin

Aşağıdaki kodu ModelDownloader.swift'e kopyalayarak model indirmenin gerçekleştiği koşulları ayarlayın ve uzak modeli uygulamamızla senkronize etmek için bir indirme görevi oluşturun.

ModelDownloader.swift

  static func downloadModel(named name: String,
                            completion: @escaping (RemoteModel?,         DownloadError?) -> Void) {
    guard FirebaseApp.app() != nil else {
      completion(nil, .firebaseNotInitialized)
      return
    }
    guard success == nil && failure == nil else {
      completion(nil, .downloadInProgress)
      return
    }

    let remoteModel = CustomRemoteModel(name: name)
    let conditions = ModelDownloadConditions(allowsCellularAccess: true,
                                             allowsBackgroundDownloading: true)

    success = NotificationCenter.default.addObserver(forName: .firebaseMLModelDownloadDidSucceed,
                                                     object: nil,
                                                     queue: nil) { (notification) in
      defer { success = nil; failure = nil }
      guard let userInfo = notification.userInfo,
          let model = userInfo[ModelDownloadUserInfoKey.remoteModel.rawValue] as? RemoteModel
      else {
        completion(nil, .downloadReturnedEmptyModel)
        return
      }
      guard model.name == name else {
        completion(nil, .downloadReturnedWrongModel)
        return
      }
      completion(model, nil)
    }
    failure = NotificationCenter.default.addObserver(forName: .firebaseMLModelDownloadDidFail,
                                                     object: nil,
                                                     queue: nil) { (notification) in
      defer { success = nil; failure = nil }
      guard let userInfo = notification.userInfo,
          let error = userInfo[ModelDownloadUserInfoKey.error.rawValue] as? Error
      else {
        completion(nil, .mlkitError(underlyingError: DownloadError.unknownError))
        return
      }
      completion(nil, .mlkitError(underlyingError: error))
    }
    ModelManager.modelManager().download(remoteModel, conditions: conditions)
  }

ModelDownloader.swift

  static func fetchModel(named name: String,
                         completion: @escaping (String?, DownloadError?) -> Void) {
    let remoteModel = CustomRemoteModel(name: name)
    if ModelManager.modelManager().isModelDownloaded(remoteModel) {
      ModelManager.modelManager().getLatestModelFilePath(remoteModel) { (path, error) in
        completion(path, error.map { DownloadError.mlkitError(underlyingError: $0) })
      }
    } else {
      downloadModel(named: name) { (model, error) in
        guard let model = model else {
          let underlyingError = error ?? DownloadError.unknownError
          let compositeError = DownloadError.mlkitError(underlyingError: underlyingError)
          completion(nil, compositeError)
          return
        }
        ModelManager.modelManager().getLatestModelFilePath(model) { (path, pathError) in
          completion(path, error.map { DownloadError.mlkitError(underlyingError: $0) })
        }
      }
    }
  }

10. Tensorflow Lite öneri modelini uygulamanıza entegre edin

Tensorflow Lite çalışma zamanı, öneriler oluşturmak için uygulamadaki modelinizi kullanmanıza izin verir. Bir önceki adımda indirdiğimiz model dosyasıyla bir TFlite yorumlayıcısını başlattık. Bu adımda, önce bir sözlük ve çıkarım adımında modelimize eşlik edecek etiketler yükleyeceğiz, ardından modelimize girdileri oluşturmak için ön işleme ekleyeceğiz ve sonuçları çıkarımdan çıkaracağımız son işleme ekleyeceğiz. .

Sözlük ve Etiketleri Yükle

Öneri modeline göre öneri adaylarını oluşturmak için kullanılan etiketler, varlıklar klasöründeki sort_movie_vocab.json dosyasında listelenir. Bu adayları yüklemek için aşağıdaki kodu kopyalayın.

ÖnerilerViewController.swift

  func getMovies() -> [MovieItem] {
    let barController = self.tabBarController as! TabBarController
    return barController.movies
  }

Ön İşlemi Uygula

Ön işleme adımında, modelimizin beklediğiyle eşleşmesi için girdi verilerinin biçimini değiştiririz. Burada, halihazırda çok sayıda kullanıcı beğenisi oluşturmadıysak, giriş uzunluğunu bir yer tutucu değeriyle doldururuz. Aşağıdaki kodu kopyalayın:

ÖnerilerViewController.swift

  // Given a list of selected items, preprocess to get tflite input.
  func preProcess() -> Data {
    let likedMovies = getLikedMovies().map { (MovieItem) -> Int32 in
      return MovieItem.id
    }
    var inputData = Data(copyingBufferOf: Array(likedMovies.prefix(10)))

    // Pad input data to have a minimum of 10 context items (4 bytes each)
    while inputData.count < 10*4 {
      inputData.append(0)
    }
    return inputData
  }

Öneriler oluşturmak için yorumlayıcıyı çalıştırın

Burada, önceden işlenmiş girdimiz üzerinde çıkarım yapmak için önceki adımda indirdiğimiz modeli kullanıyoruz. Modelimiz için girdi ve çıktı türünü belirledik ve film önerilerimizi oluşturmak için çıkarım yaptık. Aşağıdaki kodu uygulamanıza kopyalayın.

ÖnerilerViewController.swift

import TensorFlowLite

ÖnerilerViewController.swift

 private var interpreter: Interpreter?

 func loadModel() {
    // Download the model from Firebase
    print("Fetching recommendations model...")
    ModelDownloader.fetchModel(named: "recommendations") { (filePath, error) in
      guard let path = filePath else {
        if let error = error {
          print(error)
        }
        return
      }
      print("Recommendations model download complete")
      self.loadInterpreter(path: path)
    }
  }

 func loadInterpreter(path: String) {
    do {
      interpreter = try Interpreter(modelPath: path)

      // Allocate memory for the model's input `Tensor`s.
      try interpreter?.allocateTensors()

      let inputData = preProcess()

      // Copy the input data to the input `Tensor`.
      try self.interpreter?.copy(inputData, toInputAt: 0)

      // Run inference by invoking the `Interpreter`.
      try self.interpreter?.invoke()

      // Get the output `Tensor`
      let confidenceOutputTensor = try self.interpreter?.output(at: 0)
      let idOutputTensor = try self.interpreter?.output(at: 1)

      // Copy output to `Data` to process the inference results.
      let confidenceOutputSize = confidenceOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})

      let idOutputSize = idOutputTensor?.shape.dimensions.reduce(1, {x, y in x * y})

      let confidenceResults =
        UnsafeMutableBufferPointer<Float32>.allocate(capacity: confidenceOutputSize!)
      let idResults =
        UnsafeMutableBufferPointer<Int32>.allocate(capacity: idOutputSize!)
      _ = confidenceOutputTensor?.data.copyBytes(to: confidenceResults)
      _ = idOutputTensor?.data.copyBytes(to: idResults)

      postProcess(idResults, confidenceResults)

      print("Successfully ran inference")
      DispatchQueue.main.async {
        self.tableView.reloadData()
      }
    } catch {
      print("Error occurred creating model interpreter: \(error)")
    }
  }

İşlem Sonrası Uygula

Son olarak, bu adımda, en yüksek güvenle sonuçları seçerek ve içerdiği değerleri (kullanıcının zaten beğendiği filmler) kaldırarak, modelimizin çıktısını son işleme tabi tutarız. Aşağıdaki kodu uygulamanıza kopyalayın.

ÖnerilerViewController.swift

  // Postprocess to get results from tflite inference.
  func postProcess(_ idResults: UnsafeMutableBufferPointer<Int32>, _ confidenceResults: UnsafeMutableBufferPointer<Float32>) {
    for i in 0..<10 {
      let id = idResults[i]
      let movieIdx = getMovies().firstIndex { $0.id == id }
      let title = getMovies()[movieIdx!].title
      recommendations.append(Recommendation(title: title, confidence: confidenceResults[i]))
    }
  }

Uygulamanızı test edin!

Uygulamanızı yeniden çalıştırın. Birkaç film seçtiğinizde, yeni modeli otomatik olarak indirmeli ve öneriler üretmeye başlamalıdır!

11. Tebrikler!

TensorFlow Lite ve Firebase'i kullanarak uygulamanıza bir öneri özelliği eklediniz. Bu kod laboratuvarında gösterilen tekniklerin ve ardışık düzenin genelleştirilebileceğini ve diğer türde önerilere hizmet etmek için de kullanılabileceğini unutmayın.

Neyi kapsadık

  • Firebase ML
  • Firebase Analytics
  • Analiz olaylarını BigQuery'ye aktarın
  • Ön işleme analitik olayları
  • Tren önerileri TensorFlow modeli
  • Modeli dışa aktarın ve Firebase Konsoluna dağıtın
  • Bir uygulamada film önerileri sunun

Sonraki adımlar

  • Uygulamanızda Firebase ML önerilerini uygulayın.

Daha fazla bilgi edin

Sorunuz mu var?

Sorunları Bildir