أضف توصيات إلى تطبيقك باستخدام TensorFlow Lite وFirebase - iOS Codelab

1. نظرة عامة

مرحبًا بك في التوصيات باستخدام TensorFlow Lite وFirebase codelab. ستتعلم في هذا الدرس التطبيقي حول التعليمات البرمجية كيفية استخدام TensorFlow Lite وFirebase لنشر نموذج توصية في تطبيقك. يستند هذا الدرس التطبيقي حول التعليمات البرمجية إلى مثال TensorFlow Lite هذا.

تسمح التوصيات للتطبيقات باستخدام التعلم الآلي لتقديم المحتوى الأكثر صلة بكل مستخدم بذكاء. إنهم يأخذون في الاعتبار سلوك المستخدم السابق لاقتراح محتوى التطبيق الذي قد يرغب المستخدم في التفاعل معه في المستقبل باستخدام نموذج تم تدريبه على السلوك الإجمالي لعدد كبير من المستخدمين الآخرين.

يوضح هذا البرنامج التعليمي كيفية الحصول على البيانات من مستخدمي تطبيقك باستخدام Firebase Analytics، وإنشاء نموذج تعلم آلي للحصول على توصيات من تلك البيانات، ثم استخدام هذا النموذج في تطبيق iOS لتشغيل الاستدلال والحصول على التوصيات. على وجه الخصوص، ستقترح توصياتنا الأفلام التي من المرجح أن يشاهدها المستخدم في ضوء قائمة الأفلام التي أعجبها المستخدم سابقًا.

ما ستتعلمه

  • قم بدمج Firebase Analytics في تطبيق Android لجمع بيانات سلوك المستخدم
  • قم بتصدير تلك البيانات إلى Google Big Query
  • قم بالمعالجة المسبقة للبيانات وتدريب نموذج توصيات TF Lite
  • انشر نموذج TF Lite على Firebase ML وقم بالوصول إليه من تطبيقك
  • قم بالتشغيل على استنتاج الجهاز باستخدام النموذج لاقتراح توصيات للمستخدمين

ماذا ستحتاج

  • Xcode 11 (أو أعلى)
  • CocoaPods 1.9.1 (أو أعلى)

كيف ستستخدم هذا البرنامج التعليمي؟

اقرأها من خلال فقط اقرأها وأكمل التمارين

كيف تقيم تجربتك في بناء تطبيقات iOS؟

مبتدئ متوسط بارع

2. إنشاء مشروع وحدة تحكم Firebase

أضف Firebase إلى المشروع

  1. انتقل إلى وحدة تحكم Firebase .
  2. حدد إنشاء مشروع جديد وقم بتسمية مشروعك "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. تأكد من تمكين "تمكين Google Analytics لهذا المشروع".
  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 في التطبيق والتحقق من إرسالها إلى وحدة تحكم Firebase.

تمكين تسجيل تصحيح الأخطاء في التحليلات

بشكل عام، يتم تجميع الأحداث التي يسجلها تطبيقك معًا خلال فترة ساعة تقريبًا ويتم تحميلها معًا. يحافظ هذا الأسلوب على بطارية أجهزة المستخدمين النهائيين ويقلل من استخدام بيانات الشبكة. ومع ذلك، لأغراض التحقق من صحة تنفيذ التحليلات (ولعرض التحليلات الخاصة بك في تقرير DebugView)، يمكنك تمكين وضع التصحيح على جهاز التطوير الخاص بك لتحميل الأحداث بأقل قدر من التأخير.

لتمكين وضع Analytics Debug على جهاز التطوير الخاص بك، حدد وسيطة سطر الأوامر التالية في Xcode:

-FIRDebugEnabled

في هذه المرحلة، لقد نجحت في دمج Firebase Analytics في تطبيقك. عندما يستخدم المستخدمون تطبيقك ويعجبون بالأفلام، سيتم تسجيل إعجاباتهم بشكل إجمالي. سنستخدم هذه البيانات المجمعة في بقية هذا الدرس التطبيقي حول الترميز لتدريب نموذج التوصيات الخاص بنا. ما يلي هو خطوة اختيارية لرؤية نفس أحداث Analytics التي شاهدتها في Logcat تتدفق أيضًا إلى وحدة تحكم Firebase. لا تتردد في الانتقال إلى الصفحة التالية.

اختياري: قم بتأكيد أحداث Analytics في Firebase Console

  1. انتقل إلى وحدة تحكم Firebase .
  2. حدد DebugView ضمن التحليلات
  3. في Xcode، حدد تشغيل لتشغيل التطبيق وإضافة بعض الأفلام إلى قائمة الإعجابات الخاصة بك.
  4. في DebugView بوحدة تحكم Firebase، تأكد من تسجيل هذه الأحداث أثناء إضافة أفلام في التطبيق.

6. تصدير بيانات التحليلات إلى Big Query

Big Query هو أحد منتجات Google Cloud الذي يسمح لك بفحص ومعالجة كميات كبيرة من البيانات. في هذه الخطوة، ستقوم بربط مشروع Firebase Console بـ Big Query بحيث يتم تصدير بيانات Analytics التي أنشأها تطبيقك تلقائيًا إلى Big Query.

تمكين تصدير الاستعلام الكبير

  1. انتقل إلى وحدة تحكم Firebase .
  2. حدد رمز ترس الإعدادات بجوار نظرة عامة على المشروع ، ثم حدد إعدادات المشروع
  3. حدد علامة التبويب عمليات التكامل .
  4. حدد الارتباط (أو الإدارة ) داخل كتلة BigQuery .
  5. حدد التالي في خطوة حول ربط Firebase بـ BigQuery .
  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. حدد إنشاء جدول لفتح لوحة إنشاء الجدول.
  8. لإنشاء جدول من حدد "Google Cloud Storage".
  9. في حقل تحديد ملف من مجموعة GCS ، أدخل "gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt".
  10. حدد "JSONL" في القائمة المنسدلة لتنسيق الملف .
  11. أدخل "recommendations_table" لاسم الجدول .
  12. حدد المربع الموجود ضمن المخطط > الكشف التلقائي > معلمات المخطط والإدخال
  13. حدد إنشاء جدول

استكشاف مجموعة البيانات النموذجية

في هذه المرحلة، يمكنك اختياريًا استكشاف المخطط ومعاينة مجموعة البيانات هذه.

  1. حدد firebase-recommendations-dataset في القائمة اليسرى لتوسيع الجداول التي تحتوي عليها.
  2. حدد جدول جدول التوصيات لعرض مخطط الجدول.
  3. حدد معاينة للاطلاع على بيانات أحداث Analytics الفعلية التي يحتوي عليها هذا الجدول.

إنشاء بيانات اعتماد حساب الخدمة

الآن، سنقوم بإنشاء بيانات اعتماد حساب الخدمة في مشروع Google Cloud Console الخاص بنا والذي يمكننا استخدامه في بيئة Colab في الخطوة التالية للوصول إلى بيانات BigQuery وتحميلها.

  1. تأكد من تمكين الفوترة لمشروع Google Cloud الخاص بك.
  2. تفعيل واجهات برمجة التطبيقات BigQuery وBigQuery Storage API. < اضغط هنا >
  3. انتقل إلى صفحة إنشاء مفتاح حساب الخدمة .
  4. من قائمة حسابات الخدمة ، حدد حساب خدمة جديد .
  5. في الحقل اسم حساب الخدمة ، أدخل اسمًا.
  6. من قائمة الدور ، حدد المشروع > المالك .
  7. انقر فوق إنشاء . ملف JSON يحتوي على التنزيلات الرئيسية لجهاز الكمبيوتر الخاص بك.

في الخطوة التالية، سنستخدم Google Colab لمعالجة هذه البيانات مسبقًا وتدريب نموذج التوصيات الخاص بنا.

8. معالجة البيانات ونموذج توصيات التدريب

في هذه الخطوة، سوف نستخدم دفتر Colab لإجراء الخطوات التالية:

  1. قم باستيراد بيانات BigQuery إلى دفتر ملاحظات Colab
  2. المعالجة المسبقة للبيانات لإعدادها للتدريب النموذجي
  3. تدريب نموذج التوصيات على البيانات التحليلية
  4. تصدير النموذج كنموذج TF لايت
  5. قم بنشر النموذج على Firebase Console حتى نتمكن من استخدامه في تطبيقنا

قبل إطلاق دفتر ملاحظات Colab التدريبي، سنقوم أولاً بتمكين Firebase Model Management API حتى تتمكن Colab من نشر النموذج المُدرب على وحدة تحكم Firebase الخاصة بنا.

تفعيل واجهة برمجة تطبيقات إدارة نماذج Firebase

قم بإنشاء دلو لتخزين نماذج ML الخاصة بك

في وحدة تحكم Firebase الخاصة بك، انتقل إلى التخزين وانقر على البدء. fbbea78f0eb3dc9f.png

اتبع الحوار لإعداد الدلو الخاص بك.

19517c0d6d2aa14d.png

تمكين Firebase ML API

انتقل إلى صفحة Firebase ML API على Google Cloud Console وانقر على "تمكين".

استخدم دفتر ملاحظات Colab لتدريب النموذج ونشره

افتح دفتر colab باستخدام الرابط التالي وأكمل الخطوات الموجودة فيه. بعد الانتهاء من الخطوات الواردة في دفتر ملاحظات Colab، سيكون لديك ملف نموذج TF lite تم نشره على وحدة تحكم Firebase والذي يمكننا مزامنته مع تطبيقنا.

فتح في كولاب

9. قم بتنزيل النموذج في تطبيقك

في هذه الخطوة، سنقوم بتعديل تطبيقنا لتنزيل النموذج الذي قمنا بتدريبه للتو من Firebase Machine Learning.

أضف تبعية Firebase ML

هناك حاجة إلى التبعية التالية لاستخدام نماذج Firebase Machine Learning في تطبيقك. يجب أن تتم إضافته بالفعل (التحقق).

ملف بودفي

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 في مجلد الأصول. انسخ الكود التالي لتحميل هؤلاء المرشحين.

توصياتViewController.swift

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

تنفيذ المعالجة المسبقة

في خطوة المعالجة المسبقة، نقوم بتغيير شكل البيانات المدخلة لتتناسب مع ما يتوقعه نموذجنا. هنا، نقوم بحشو طول الإدخال بقيمة عنصر نائب إذا لم نقم بإنشاء الكثير من إعجابات المستخدم بالفعل. انسخ الكود أدناه:

توصياتViewController.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
  }

تشغيل المترجم لتوليد التوصيات

نستخدم هنا النموذج الذي قمنا بتنزيله في خطوة سابقة لإجراء الاستدلال على مدخلاتنا المعالجة مسبقًا. لقد قمنا بتعيين نوع الإدخال والإخراج لنموذجنا وتشغيل الاستدلال لإنشاء توصيات الأفلام الخاصة بنا. انسخ الكود التالي في تطبيقك.

توصياتViewController.swift

import TensorFlowLite

توصياتViewController.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)")
    }
  }

تنفيذ مرحلة ما بعد المعالجة

أخيرًا، في هذه الخطوة، نقوم بالمعالجة اللاحقة للمخرجات من نموذجنا، واختيار النتائج بأعلى مستوى من الثقة وإزالة القيم المضمنة (الأفلام التي أعجب بها المستخدم بالفعل). انسخ الكود التالي في تطبيقك.

توصياتViewController.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
  • تصدير أحداث التحليلات إلى BigQuery
  • أحداث تحليلات ما قبل المعالجة
  • تدريب توصيات نموذج TensorFlow
  • تصدير النموذج ونشره إلى Firebase Console
  • تقديم توصيات الأفلام في التطبيق

الخطوات التالية

  • قم بتنفيذ توصيات Firebase ML في تطبيقك.

يتعلم أكثر

لدي سؤال؟

الإبلاغ عن المشكلات