با TensorFlow Lite و Firebase - iOS Codelab توصیه هایی را به برنامه خود اضافه کنید

1. بررسی اجمالی

به توصیه‌های مربوط به TensorFlow Lite و Codelab Firebase خوش آمدید. در این کد لبه یاد خواهید گرفت که چگونه از TensorFlow Lite و Firebase برای استقرار یک مدل توصیه در برنامه خود استفاده کنید. این Codelab بر اساس این مثال TensorFlow Lite است.

توصیه‌ها به برنامه‌ها اجازه می‌دهند تا از یادگیری ماشینی برای ارائه هوشمندانه‌ترین محتوا برای هر کاربر استفاده کنند. آنها رفتار کاربر گذشته را در نظر می گیرند تا محتوای برنامه ای را که کاربر ممکن است بخواهد در آینده با آن تعامل داشته باشد، با استفاده از مدلی که بر روی رفتار جمعی تعداد زیادی از کاربران دیگر آموزش دیده است، پیشنهاد می کنند.

این آموزش نشان می‌دهد که چگونه می‌توانید با Firebase Analytics داده‌هایی را از کاربران برنامه خود به‌دست آورید، یک مدل یادگیری ماشین برای توصیه‌هایی از آن داده‌ها بسازید، و سپس از آن مدل در یک برنامه iOS برای اجرای استنتاج و دریافت توصیه‌ها استفاده کنید. به ویژه، توصیه‌های ما نشان می‌دهد که کاربر با توجه به فهرست فیلم‌هایی که قبلاً دوست داشته است، به احتمال زیاد کدام فیلم‌ها را تماشا می‌کند.

چیزی که یاد خواهید گرفت

  • Firebase Analytics را در یک برنامه اندرویدی ادغام کنید تا داده های رفتار کاربر را جمع آوری کنید
  • آن داده ها را به Google Big Query صادر کنید
  • داده ها را از قبل پردازش کنید و مدل توصیه های TF Lite را آموزش دهید
  • مدل TF Lite را در Firebase ML مستقر کرده و از برنامه خود به آن دسترسی داشته باشید
  • استنتاج دستگاه را با استفاده از مدل اجرا کنید تا توصیه هایی به کاربران ارائه دهید

آنچه شما نیاز دارید

  • Xcode 11 (یا بالاتر)
  • CocoaPods 1.9.1 (یا بالاتر)

چگونه از این آموزش استفاده خواهید کرد؟

فقط از طریق آن را بخوانید آن را بخوانید و تمرینات را کامل کنید

تجربه خود را از ساخت اپلیکیشن های iOS چگونه ارزیابی می کنید؟

تازه کار حد واسط مسلط

2. پروژه کنسول Firebase را ایجاد کنید

Firebase را به پروژه اضافه کنید

  1. به کنسول Firebase بروید.
  2. Create New Project را انتخاب کنید و نام پروژه خود را "Firebase ML iOS Codelab" بگذارید.

3. نمونه پروژه را دریافت کنید

کد را دانلود کنید

با شبیه سازی پروژه نمونه و اجرای pod update در فهرست پروژه شروع کنید:

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

اگر git را نصب نکرده‌اید، می‌توانید پروژه نمونه را از صفحه GitHub آن یا با کلیک بر روی این لینک دانلود کنید. هنگامی که پروژه را دانلود کردید، آن را در Xcode اجرا کنید و با توصیه ها بازی کنید تا از نحوه عملکرد آن احساس کنید.

Firebase را راه اندازی کنید

برای ایجاد یک پروژه Firebase جدید ، مستندات را دنبال کنید. هنگامی که پروژه خود را دریافت کردید، فایل GoogleService-Info.plist پروژه خود را از کنسول Firebase دانلود کنید و آن را به ریشه پروژه Xcode بکشید.

4a923d5c7ae0d8f3.png

Firebase را به Podfile خود اضافه کنید و نصب pod را اجرا کنید.

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

در روش didFinishLaunchingWithOptions در AppDelegate ، Firebase را در بالای فایل وارد کنید

import FirebaseCore

و یک تماس برای پیکربندی Firebase اضافه کنید.

FirebaseApp.configure()

پروژه را دوباره اجرا کنید تا مطمئن شوید که برنامه به درستی پیکربندی شده است و در هنگام راه اندازی خراب نمی شود.

  1. مطمئن شوید که "Enable Google Analytics for this project" فعال باشد.
  2. مراحل راه‌اندازی باقی‌مانده را در کنسول Firebase دنبال کنید، سپس روی ایجاد پروژه (یا افزودن Firebase، اگر از یک پروژه Google موجود استفاده می‌کنید) کلیک کنید.

4. Firebase Analytics را به برنامه اضافه کنید

در این مرحله، Firebase Analytics را برای ثبت داده‌های رفتار کاربر (در این مورد، فیلم‌هایی که کاربر دوست دارد) به برنامه اضافه می‌کنید. این داده‌ها در مراحل آتی برای آموزش مدل توصیه‌ها به صورت مجموع استفاده خواهند شد.

Firebase Analytics را در برنامه تنظیم کنید

LikedMoviesViewModel شامل توابعی برای ذخیره فیلم هایی است که کاربر دوست دارد. هر بار که کاربر یک فیلم جدید را دوست دارد، ما می خواهیم یک رویداد گزارش تحلیلی را نیز برای ثبت آن لایک ارسال کنیم.

برای ثبت یک رویداد تجزیه و تحلیل زمانی که کاربر مانند یک فیلم کلیک می کند، کد زیر را اضافه کنید.

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 خود را آزمایش کنید

در این مرحله، رویدادهای Analytics را در برنامه تولید می‌کنیم و تأیید می‌کنیم که آنها به کنسول Firebase ارسال می‌شوند.

فعال کردن گزارش اشکال زدایی Analytics

به طور کلی، رویدادهای ثبت‌شده توسط برنامه شما در مدت تقریباً یک ساعت با هم جمع می‌شوند و با هم آپلود می‌شوند. این رویکرد باعث صرفه جویی در باتری دستگاه های کاربران نهایی و کاهش مصرف داده های شبکه می شود. با این حال، به منظور تأیید اجرای تجزیه و تحلیل خود (و برای مشاهده تجزیه و تحلیل خود در گزارش DebugView)، می توانید حالت Debug را در دستگاه توسعه خود فعال کنید تا رویدادها را با حداقل تاخیر بارگذاری کند.

برای فعال کردن حالت Analytics Debug در دستگاه توسعه خود، آرگومان خط فرمان زیر را در Xcode مشخص کنید:

-FIRDebugEnabled

در این مرحله، شما با موفقیت Firebase Analytics را در برنامه خود ادغام کرده اید. همانطور که کاربران از برنامه شما استفاده می کنند و فیلم ها را می پسندند، لایک های آنها در مجموع ثبت می شود. ما از این داده‌های انبوه در بقیه قسمت‌های این کد برای آموزش مدل توصیه‌هایمان استفاده خواهیم کرد. در زیر یک مرحله اختیاری است تا رویدادهای Analytics مشابهی را که در Logcat مشاهده کردید، در کنسول Firebase نیز مشاهده کنید. با خیال راحت به صفحه بعدی بروید.

اختیاری: رویدادهای Analytics را در Firebase Console تأیید کنید

  1. به کنسول Firebase بروید.
  2. DebugView را در بخش Analytics انتخاب کنید
  3. در Xcode، Run را انتخاب کنید تا برنامه راه‌اندازی شود و چند فیلم به لیست دوست‌داشتنی‌هایتان اضافه شود.
  4. در DebugView کنسول Firebase، بررسی کنید که با افزودن فیلم‌ها به برنامه، این رویدادها ثبت می‌شوند.

6. داده های Analytics را به Big Query صادر کنید

Big Query یک محصول Google Cloud است که به شما امکان می دهد حجم زیادی از داده ها را بررسی و پردازش کنید. در این مرحله، پروژه Firebase Console خود را به Big Query متصل می کنید تا داده های Analytics تولید شده توسط برنامه شما به طور خودکار به Big Query صادر شود.

صادرات Big Query را فعال کنید

  1. به کنسول Firebase بروید.
  2. نماد چرخ دنده تنظیمات را در کنار نمای کلی پروژه انتخاب کنید و سپس تنظیمات پروژه را انتخاب کنید
  3. تب Integrations را انتخاب کنید.
  4. پیوند (یا مدیریت ) را در بلوک BigQuery انتخاب کنید.
  5. در مرحله About Linking Firebase به BigQuery گزینه Next را انتخاب کنید.
  6. در بخش پیکربندی یکپارچه‌سازی ، روی سوئیچ کلیک کنید تا ارسال داده‌های Google Analytics فعال شود و پیوند به BigQuery را انتخاب کنید.

اکنون پروژه کنسول Firebase خود را فعال کرده اید تا به طور خودکار داده های رویداد Firebase Analytics را به Big Query ارسال کند. این به طور خودکار و بدون هیچ گونه تعامل بیشتر اتفاق می افتد، با این حال، اولین صادراتی که مجموعه داده های تجزیه و تحلیل را در BigQuery ایجاد می کند ممکن است تا 24 ساعت اتفاق نیفتد. پس از ایجاد مجموعه داده، Firebase به طور مداوم رویدادهای جدید Analytics را به Big Query در جدول روزانه صادر می کند و رویدادهای روزهای گذشته را در جدول رویدادها گروه بندی می کند.

آموزش مدل توصیه ها به داده های زیادی نیاز دارد. از آنجایی که ما در حال حاضر اپلیکیشنی نداریم که حجم زیادی از داده را تولید کند، در مرحله بعدی یک مجموعه داده نمونه را به BigQuery وارد می کنیم تا در ادامه این آموزش از آن استفاده کنیم.

7. از BigQuery برای به دست آوردن داده های آموزشی مدل استفاده کنید

اکنون که کنسول Firebase خود را برای صادرات به BigQuery متصل کرده‌ایم، داده‌های رویداد تجزیه و تحلیل برنامه ما پس از مدتی به‌طور خودکار در کنسول BigQuery نشان داده می‌شود. برای به دست آوردن برخی از داده های اولیه برای اهداف این آموزش، در این مرحله یک مجموعه داده نمونه موجود را به کنسول BigQuery شما وارد می کنیم تا از آن برای آموزش مدل توصیه های خود استفاده کنیم.

مجموعه داده نمونه را به BigQuery وارد کنید

  1. به داشبورد BigQuery در کنسول ابری Google بروید.
  2. نام پروژه خود را در منو انتخاب کنید.
  3. نام پروژه خود را در پایین ناوبری سمت چپ BigQuery انتخاب کنید تا جزئیات را ببینید.
  4. ایجاد مجموعه داده را انتخاب کنید تا پانل ایجاد مجموعه داده باز شود.
  5. «firebase_recommendations_dataset» را برای شناسه مجموعه داده وارد کنید و ایجاد مجموعه داده را انتخاب کنید.
  6. مجموعه داده جدید در منوی سمت چپ زیر نام پروژه نمایش داده می شود. روی آن کلیک کنید.
  7. برای باز کردن پنل ایجاد جدول ، Create table را انتخاب کنید.
  8. برای ایجاد جدول از «Google Cloud Storage» را انتخاب کنید.
  9. در قسمت انتخاب فایل از سطل GCS ، «gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt» را وارد کنید.
  10. "JSONL" را در قالب بازشوی File انتخاب کنید.
  11. 'recommendations_table' را برای نام جدول وارد کنید.
  12. کادر زیر Schema > Auto detect > Schema and input parameters را علامت بزنید
  13. ایجاد جدول را انتخاب کنید

مجموعه داده نمونه را کاوش کنید

در این مرحله، می توانید به صورت اختیاری طرحواره را کاوش کرده و پیش نمایش این مجموعه داده را مشاهده کنید.

  1. برای گسترش جداول موجود در منوی سمت چپ ، firebase-recommendations-dataset را انتخاب کنید.
  2. برای مشاهده طرح جدول، جدول توصیه ها را انتخاب کنید.
  3. پیش‌نمایش را انتخاب کنید تا داده‌های رویداد Analytics واقعی این جدول را ببینید.

اعتبار حساب سرویس ایجاد کنید

اکنون، اعتبارنامه‌های حساب سرویس را در پروژه کنسول Google Cloud خود ایجاد می‌کنیم که می‌توانیم از آن در محیط Colab در مرحله زیر برای دسترسی و بارگیری داده‌های BigQuery خود استفاده کنیم.

  1. مطمئن شوید که صورتحساب برای پروژه Google Cloud شما فعال است.
  2. API های BigQuery و BigQuery Storage API را فعال کنید. < اینجا را کلیک کنید >
  3. به صفحه Create Service Account Key بروید.
  4. از لیست حساب سرویس ، حساب سرویس جدید را انتخاب کنید.
  5. در قسمت نام حساب سرویس ، یک نام وارد کنید.
  6. از فهرست نقش ، پروژه > مالک را انتخاب کنید.
  7. روی ایجاد کلیک کنید. یک فایل JSON که حاوی دانلودهای کلید شما در رایانه شما است.

در مرحله بعدی، از Google Colab برای پیش پردازش این داده ها و آموزش مدل توصیه های خود استفاده خواهیم کرد.

8. داده های پیش پردازش و مدل توصیه های قطار

در این مرحله از یک نوت بوک Colab برای انجام مراحل زیر استفاده می کنیم:

  1. داده های BigQuery را به نوت بوک Colab وارد کنید
  2. داده ها را پیش پردازش کنید تا برای آموزش مدل آماده شوند
  3. آموزش مدل توصیه‌ها بر روی داده‌های تحلیلی
  4. مدل را به عنوان یک مدل TF lite صادر کنید
  5. مدل را در کنسول Firebase قرار دهید تا بتوانیم از آن در برنامه خود استفاده کنیم

قبل از راه اندازی نوت بوک آموزشی Colab، ابتدا API مدیریت مدل Firebase را فعال می کنیم تا Colab بتواند مدل آموزش دیده را در کنسول Firebase ما مستقر کند.

Firebase Model Management API را فعال کنید

یک سطل برای ذخیره مدل های ML خود ایجاد کنید

در کنسول Firebase خود، به Storage بروید و روی شروع کار کلیک کنید. fbbea78f0eb3dc9f.png

گفتگو را دنبال کنید تا سطل خود را راه اندازی کنید.

19517c0d6d2aa14d.png

Firebase ML API را فعال کنید

به صفحه Firebase ML API در Google Cloud Console بروید و روی Enable کلیک کنید.

از نوت بوک کولب برای آموزش و استقرار مدل استفاده کنید

دفترچه یادداشت colab را با استفاده از لینک زیر باز کنید و مراحل داخل را تکمیل کنید. پس از اتمام مراحل در نوت بوک Colab، یک فایل مدل TF lite در کنسول Firebase مستقر شده است که می توانیم آن را با برنامه خود همگام سازی کنیم.

در کولب باز کنید

9. مدل را در برنامه خود دانلود کنید

در این مرحله، برنامه خود را تغییر می‌دهیم تا مدلی را که به تازگی آموزش داده‌ایم از Firebase Machine Learning بارگیری کند.

وابستگی Firebase ML را اضافه کنید

برای استفاده از مدل‌های یادگیری ماشین Firebase در برنامه خود، وابستگی زیر مورد نیاز است. قبلاً باید اضافه شود (تأیید شود).

پادفایل

import FirebaseCore
import FirebaseMLModelDownloader

مدل را با Firebase Model Manager API دانلود کنید

کد زیر را در ModelLoader.swift کپی کنید تا شرایطی را که در آن دانلود مدل انجام می شود تنظیم کنید و یک کار دانلود برای همگام سازی مدل راه دور با برنامه ما ایجاد کنید.

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 را در برنامه خود ادغام کنید

زمان اجرا Tensorflow Lite به شما امکان می دهد از مدل خود در برنامه برای ایجاد توصیه ها استفاده کنید. در مرحله قبل، یک مفسر TFlite را با فایل مدلی که دانلود کردیم، مقداردهی کردیم. در این مرحله، ابتدا یک فرهنگ لغت و برچسب‌هایی را بارگذاری می‌کنیم تا مدل خود را در مرحله استنتاج همراهی کنند، سپس پیش پردازش را برای تولید ورودی‌ها به مدل خود اضافه می‌کنیم و پس پردازش را اضافه می‌کنیم که در آن نتایج را از استنتاج خود استخراج می‌کنیم. .

بارگذاری فرهنگ لغت و برچسب ها

برچسب‌های مورد استفاده برای تولید نامزدهای پیشنهادی توسط مدل توصیه‌ها در فایل sorted_movie_vocab.json در پوشه دارایی‌ها فهرست شده‌اند. کد زیر را برای بارگذاری این نامزدها کپی کنید.

RecommendationsViewController.swift

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

اجرای پیش پردازش

در مرحله پیش پردازش، شکل داده های ورودی را تغییر می دهیم تا با آنچه مدل ما انتظار دارد مطابقت داشته باشد. در اینجا، اگر قبلاً تعداد زیادی لایک کاربر ایجاد نکرده باشیم، طول ورودی را با یک مقدار مکان نگهدار اضافه می کنیم. کد زیر را کپی کنید:

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
  }

مترجم را برای تولید توصیه ها اجرا کنید

در اینجا ما از مدلی که در مرحله قبل دانلود کرده بودیم برای اجرای استنتاج در ورودی از پیش پردازش شده خود استفاده می کنیم. ما نوع ورودی و خروجی را برای مدل خود تنظیم می کنیم و استنتاج را برای تولید توصیه های فیلم خود اجرا می کنیم. کد زیر را در برنامه خود کپی کنید.

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

اجرای پس پردازش

در نهایت، در این مرحله، خروجی مدل خود را پس پردازش می کنیم، نتایج را با بالاترین اطمینان انتخاب می کنیم و مقادیر موجود را حذف می کنیم (فیلم هایی که کاربر قبلاً دوست داشته است). کد زیر را در برنامه خود کپی کنید.

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]))
    }
  }

برنامه خود را تست کنید!

برنامه خود را دوباره اجرا کنید. همانطور که چند فیلم را انتخاب می کنید، باید به طور خودکار مدل جدید را دانلود کرده و شروع به تولید توصیه کند!

11. تبریک می گویم!

شما با استفاده از TensorFlow Lite و Firebase یک ویژگی توصیه در برنامه خود ایجاد کرده اید. توجه داشته باشید که تکنیک ها و خط لوله نشان داده شده در این کد لبه را می توان تعمیم داد و برای ارائه انواع دیگر توصیه ها نیز استفاده کرد.

آنچه را پوشش داده ایم

  • Firebase ML
  • تجزیه و تحلیل Firebase
  • رویدادهای تجزیه و تحلیل را به BigQuery صادر کنید
  • رویدادهای تجزیه و تحلیل پیش پردازش
  • توصیه های قطار مدل TensorFlow
  • صادر کردن مدل و استقرار به کنسول Firebase
  • پیشنهادهای فیلم را در یک برنامه ارائه دهید

مراحل بعدی

  • توصیه های Firebase ML را در برنامه خود پیاده کنید.

بیشتر بدانید

سوالی دارید؟

گزارش مسائل