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

1. Genel Bakış

TensorFlow Lite ve Firebase ile Öneriler codelab'ine hoş geldiniz. Bu codelab'de, uygulamanıza öneri modeli dağıtmak için TensorFlow Lite ve Firebase'i nasıl kullanacağınızı öğreneceksiniz. Bu codelab, bu TensorFlow Lite örneğine dayanmaktadır.

Öneriler, uygulamaların her kullanıcıya en alakalı içerikleri akıllıca sunmak için makine öğrenimini kullanmasına olanak tanır. Bunlar, çok sayıda başka kullanıcının toplu davranışlarına göre eğitilmiş bir model kullanarak gelecekte kullanıcının etkileşimde bulunmak isteyebileceği uygulama içeriklerini önermek için geçmişteki kullanıcı davranışlarını dikkate alır.

Bu eğitimde, Firebase Analytics ile uygulamanızın kullanıcılarından nasıl veri elde edileceği, bu verilerden öneriler almak için makine öğrenimi modeli oluşturma ve daha sonra bu modeli bir iOS uygulamasında kullanarak çıkarımda bulunup öneriler alma hakkında bilgi verilmektedir. Özellikle, kullanıcının daha önce beğendiği filmlerin listesine bakıldığında, önerilerimiz kullanıcının izleme olasılığının en yüksek olduğu filmlere öneride bulunur.

Neler öğreneceksiniz?

  • Kullanıcı davranışı verilerini toplamak için Firebase Analytics'i Android uygulamasına entegre etme
  • Bu verileri Google BigQuery'ye aktarın
  • Verileri önceden işleyin ve TF Lite öneri modeli eğitin
  • TF Lite modelini Firebase ML'ye dağıtıp uygulamanızdan bu modele erişin
  • Kullanıcılara öneriler önermek için modeli kullanarak cihaz çıkarımı üzerinde çalıştır

Gerekenler

  • Xcode 11 (veya üzeri)
  • CocoaPods 1.9.1 veya sonraki sürümler

Bu eğiticiden nasıl yararlanacaksınız?

Yalnızca okuma Okuyun ve alıştırmaları tamamlayın

iOS uygulaması geliştirme deneyiminizi nasıl değerlendirirsiniz?

Acemi Orta Yeterli

2. Firebase konsol projesi oluşturun

Firebase'i projeye ekleyin

  1. Firebase konsoluna gidin.
  2. Create New Project'i (Yeni Proje Oluştur) seçin ve projenize "Firebase ML iOS Codelab" adını verin.

3. Örnek Projeyi Alma

Kodu İndirin

Örnek projeyi klonlayıp proje dizininde pod update komutunu çalıştırarak başlayın:

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

Git yüklü değilse örnek projeyi GitHub sayfasından veya bu bağlantıyı tıklayarak da indirebilirsiniz. Projeyi indirdikten sonra Xcode'da çalıştırın ve nasıl çalıştığına dair fikir edinmek için öneriler üzerinde denemeler yapın.

Firebase'i ayarlayın

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

4a923d5c7ae0d8f3.png

Firebase'i Podfile dosyanıza ekleyin ve kapsül yüklemesini çalıştırın.

pod 'FirebaseAnalytics'
pod 'FirebaseMLModelDownloader', '9.3.0-beta'
pod 'TensorFlowLiteSwift'

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

import FirebaseCore

Ardından, Firebase'i yapılandırmak için bir çağrı ekleyin.

FirebaseApp.configure()

Uygulamanın doğru şekilde yapılandırıldığından ve başlatma sırasında kilitlenmediğinden emin olmak için projeyi tekrar çalıştırın.

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

4. Firebase Analytics'i uygulamaya ekleyin

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

Uygulamada Firebase Analytics'i ayarlayın

LikedMoviesViewModel, kullanıcının beğendiği filmleri depolamak için işlevler içerir. Kullanıcı yeni bir filmi beğendiğinde bunun gibi bir kaydı kaydetmek için bir analiz günlüğü etkinliği de göndermek istiyoruz.

Kullanıcı bir film gibi tıkladığında bir analiz etkinliği kaydetmek için aşağıdaki kodu ekleyin.

AllMoviesCollectionViewController.swift

import FirebaseAnalytics
//


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 etme

Bu adımda, uygulamada Analytics etkinlikleri oluşturacak ve bu etkinliklerin Firebase konsoluna gönderildiğini doğrulayacağız.

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

Genel olarak, uygulamanız tarafından günlüğe kaydedilen etkinlikler yaklaşık bir saatlik bir süre içinde gruplanır ve birlikte yüklenir. Bu yaklaşım, son kullanıcıların pilden tasarruf etmesini sağlar. ve ağ veri kullanımını azaltır. Bununla birlikte, analiz uygulamanızı doğrulamak (ve analizlerinizi DebugView raporunda görüntülemek) amacıyla, etkinlikleri minimum gecikmeyle yüklemek için geliştirme cihazınızda Hata Ayıklama modunu etkinleştirebilirsiniz.

Geliştirme cihazınızda Analytics 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 aşamada, Firebase Analytics'i uygulamanıza başarıyla entegre ettiniz. Kullanıcılar uygulamanızı kullanırken ve filmleri beğenirken beğenmeleri toplu olarak kaydedilir. Bu birleştirilmiş verileri, öneri modelimizi eğitmek için bu codelab'in geri kalanında kullanacağız. Aşağıda, Logcat'te gördüğünüz Analytics etkinliklerinin Firebase konsoluna da akışını görmek için isteğe bağlı bir adım sunulmuştur. Sonraki sayfaya geçmekten çekinmeyin.

İsteğe bağlı: Firebase konsolunda Analytics etkinliklerini onaylama

  1. Firebase konsoluna gidin.
  2. Analytics bölümünde DebugView'u seçin
  3. Xcode'da uygulamayı başlatmak için Çalıştır'ı seçin ve Beğendikleriniz listenize birkaç film ekleyin.
  4. Firebase konsolunun DebugView'da, uygulamaya film eklenirken bu etkinliklerin günlüğe kaydedildiğini doğrulayın.

6. Analytics verilerini BigQuery'ye aktarma

BigQuery, büyük miktarlarda veriyi inceleyip işlemenize olanak tanıyan bir Google Cloud ürünüdür. Bu adımda, uygulamanızın oluşturduğu Analytics verilerinin otomatik olarak BigQuery'ye aktarılması için Firebase konsolu projenizi BigQuery'ye bağlayacaksınız.

BigQuery dışa aktarımını etkinleştirme

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

Firebase konsol projenizi, Firebase Analytics etkinlik verilerinin BigQuery'ye otomatik olarak gönderilmesini sağlayacak şekilde etkinleştirdiniz. Bu işlem başka etkileşim olmadan otomatik olarak gerçekleştirilir. Ancak BigQuery'de analiz veri kümesini oluşturan ilk dışa aktarma işlemi 24 saat boyunca gerçekleşmeyebilir. Veri kümesi oluşturulduktan sonra Firebase, yeni Analytics etkinliklerini sürekli olarak BigQuery'ye aktarır ve gün içi tabloya aktarır ve geçmiş günlere ait etkinlikleri etkinlikler tablosunda gruplandırır.

Öneri modellerini eğitmek çok fazla veri gerektirir. Halihazırda büyük miktarda veri oluşturan bir uygulamamız olmadığından, bir sonraki adımda bu eğiticinin geri kalanında kullanmak üzere örnek bir veri kümesini BigQuery'ye aktaracağız.

7. Model eğitimi verilerini almak için BigQuery'yi kullanma

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

Örnek veri kümesini BigQuery'ye aktarma

  1. Google Cloud konsolunda BigQuery kontrol paneline gidin.
  2. Menüden projenizin adını seçin.
  3. Ayrıntıları görmek için BigQuery'nin sol gezinme menüsünün en altında projenizin adını seçin.
  4. Veri kümesi oluşturma panelini açmak için Veri kümesi oluştur'u seçin.
  5. "firebase_recommendations_dataset" girin Veri Kümesi Kimliği'ni girin ve Veri kümesi oluştur'u seçin.
  6. Yeni veri kümesi, proje adının altında soldaki menüde gösterilir. Bu simgeyi tıklayın.
  7. Tablo oluşturma panelini açmak için Tablo oluştur'u seçin.
  8. Şu kaynaktan tablo oluştur için "Google Cloud Storage"ı seçin.
  9. GCS paketinden dosya seçin alanına "gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt" yazın.
  10. "JSONL"yi seçin Dosya biçimi açılır menüsünde bulabilirsiniz.
  11. "recommendations_table" yazın Tablo adı'nı seçin.
  12. Schema > (Şema >) altındaki kutuyu işaretleyin. Otomatik algıla > Şema ve giriş parametreleri
  13. Tablo oluştur'u seçin

Örnek veri kümesini keşfedin

Bu noktada isteğe bağlı olarak şemayı inceleyebilir 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 recommendations-table tablosunu seçin.
  3. Bu tablonun içerdiği gerçek Analytics etkinlik verilerini görmek için Önizleme'yi seçin.

Hizmet hesabı kimlik bilgileri oluşturma

Şimdi, Google Cloud Console projemizde hizmet hesabı kimlik bilgilerini oluşturacağız. Bu bilgileri, bir sonraki adımda BigQuery verilerimize erişip yüklemek için Colab ortamında kullanabileceğimiz şekilde kullanacağı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. < burayı tıklayın>
  3. Hizmet Hesabı Anahtarı Oluşturma sayfasına gidin.
  4. Service account (Hizmet hesabı) listesinden New service account'u (Yeni hizmet hesabı) seçin.
  5. Hizmet hesabı adı alanına bir ad girin.
  6. Role (Rol) listesinden Proje'yi seçin > Sahip.
  7. Oluştur'u tıklayın. Anahtarlarınızı içeren bir JSON dosyası, bilgisayarınıza indirilir.

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

8. Verileri ön işleme ve öneri modelini eğitme

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 aktarma
  2. model eğitimine hazırlamak için verileri ön işleme
  3. Öneri modelini analiz verileri üzerinde eğitmek
  4. modeli TF lite modeli olarak dışa aktar
  5. modeli Firebase Konsolu'na dağıtarak uygulamamızda kullanabiliriz.

Colab eğitim not defterini kullanıma sunmadan önce ilk olarak Firebase Model Management API'yi etkinleştireceğiz. Böylece Colab, eğitilen modeli Firebase konsoluna dağıtabilecek.

Firebase Model Management API'yi etkinleştir

ML modellerinizi depolamak için paket oluşturma

Firebase Konsolunuzda Storage'a gidip Başlayın'ı tıklayın. fbbea78f0eb3dc9f.png.

Paketinizi hazırlamak için diyaloğu takip edin.

19517c0d6d2aa14d.png

Firebase ML API'yi etkinleştirme

Google Cloud Console'da Firebase ML API sayfasına gidip 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 colab not defterini açın ve içindeki adımları tamamlayın. Colab not defterindeki adımları tamamladıktan sonra Firebase konsoluna dağıtılan bir TF lite model dosyanız olur. Bu dosyayı uygulamamıza senkronize edebiliriz.

Colab'de aç

9. Modeli uygulamanıza indirin

Bu adımda, uygulamamızı Firebase Makine Öğrenimi'nden eğittiğimiz modeli indirecek şekilde değiştireceğiz.

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

Uygulamanızda Firebase Makine Öğrenimi modellerini kullanmak için aşağıdaki bağımlılık gerekir. Daha önce eklenmiş olması gerekir (doğrulayın).

Pod dosyası

import FirebaseCore
import FirebaseMLModelDownloader

Modeli Firebase Model Manager API ile indirme

Model indirme işleminin gerçekleşeceği koşulları ayarlamak için aşağıdaki kodu ModelLoader.swift klasörüne kopyalayın ve uzak modeli uygulamamızla senkronize etmek için bir indirme görevi oluşturun.

ModelLoader.swift

static func downloadModel(named name: String,
                            completion: @escaping (CustomModel?, DownloadError?) -> Void) {
    guard FirebaseApp.app() != nil else {
      completion(nil, .firebaseNotInitialized)
      return
    }
    guard success == nil && failure == nil else {
      completion(nil, .downloadInProgress)
      return
    }
    let conditions = ModelDownloadConditions(allowsCellularAccess: false)
    ModelDownloader.modelDownloader().getModel(name: name, downloadType: .localModelUpdateInBackground, conditions: conditions) { result in
            switch (result) {
            case .success(let customModel):
                    // Download complete.
                    // The CustomModel object contains the local path of the model file,
                    // which you can use to instantiate a TensorFlow Lite classifier.
                    return completion(customModel, nil)
            case .failure(let error):
                // Download was unsuccessful. Notify error message.
              completion(nil, .downloadFailed(underlyingError: error))
            }
    }
  }

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

Tensorflow Lite çalışma zamanı, öneriler oluşturmak için uygulamada modelinizi kullanmanıza olanak tanır. Önceki adımda, indirdiğimiz model dosyasıyla bir TFlite çevirmeni başlattık. Bu adımda, ilk olarak çıkarım adımında modelimize eşlik edecek bir sözlük ve etiketler yükleyeceğiz. Ardından, modelimize girdi oluşturmak için ön işlemeyi ve çıkarımımızdan sonuçları çıkaracağımız işleme sonrası süreci ekleyeceğiz.

Sözlük ve Etiketleri Yükleme

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

RecommendationsViewController.swift

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

Ön işlemeyi uygulama

Ön işleme adımında, giriş verilerinin biçimini modelimizin beklediğiyle eşleşecek şekilde değiştiririz. Burada henüz çok sayıda kullanıcı beğenmesi oluşturmadıysak giriş uzunluğunu bir yer tutucu değerle doldururuz. Aşağıdaki kodu kopyalayın:

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

Öneri oluşturmak için çevirmen çalıştırma

Burada, önceden işlenmiş girdimiz üzerinde çıkarım yapmak için önceki adımda indirdiğimiz modeli kullanırız. Modelimizin giriş ve çıkış türünü belirleriz ve film önerilerimizi oluşturmak için çıkarım yaparız. Aşağıdaki kodu uygulamanıza kopyalayın.

RecommendationsViewController.swift

import TensorFlowLite

RecommendationsViewController.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)")
    }
  }

İşleme sonrası yaklaşımı uygulama

Son olarak, bu adımda modelimizden elde edilen çıkışı işleyerek en yüksek güven düzeyine sahip sonuçları seçer ve içerdiği değerleri (kullanıcının zaten beğendiği filmler) kaldırırız. Aşağıdaki kodu uygulamanıza kopyalayın.

RecommendationsViewController.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 model otomatik olarak indirilir ve öneriler oluşturmaya başlar.

11. Tebrikler!

TensorFlow Lite ve Firebase'i kullanarak uygulamanıza bir öneriler özelliği eklediniz. Bu codelab'de gösterilen tekniklerin ve ardışık düzenin genelleştirilebileceğini ve diğer öneri türlerini sunmak için kullanılabileceğini unutmayın.

İşlediğimiz konular

  • Firebase ML
  • Firebase Analytics
  • Analiz etkinliklerini BigQuery'ye aktarın
  • Ön işlem analiz etkinlikleri
  • Önerileri TensorFlow modeli eğitme
  • Modeli dışa aktarın ve Firebase konsoluna dağıtın
  • Uygulamada film önerileri sunun

Sonraki adımlar

  • Uygulamanızda Firebase makine öğrenimi önerilerini uygulayın.

Daha Fazla Bilgi

Sorunuz mu var?

Sorun Bildirin