إضافة الاقتراحات إلى تطبيقك باستخدام TensorFlow Lite وFirebase - درس تطبيقي حول الترميز في iOS

1- نظرة عامة

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

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

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

المعلومات التي ستطّلع عليها

  • دمج "إحصاءات Firebase" في تطبيق Android لجمع بيانات سلوك المستخدمين
  • تصدير تلك البيانات إلى Google Big Query
  • معالجة البيانات مسبقًا وتدريب نموذج توصيات TF Lite
  • تفعيل نموذج TF Lite في تكنولوجيا تعلُّم الآلة في Firebase والوصول إليه من تطبيقك
  • التنفيذ على الاستنتاج على الجهاز باستخدام النموذج لاقتراح توصيات للمستخدمين

المتطلبات

  • Xcode 11 (أو إصدار أعلى)
  • CocoaPods 1.9.1 (أو إصدار أحدث)

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

القراءة فقط اقرأها وأكمِل التمارين

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

حديث متوسط بارع

2- إنشاء مشروع على "وحدة تحكُّم Firebase"

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

  1. انتقِل إلى وحدة تحكُّم Firebase.
  2. اختَر إنشاء مشروع جديد وأدخِل اسمًا لمشروعك "الدرس التطبيقي حول الترميز في iOS لتعلُّم الآلة من Firebase".

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 'FirebaseAnalytics'
pod 'FirebaseMLModelDownloader', '9.3.0-beta'
pod 'TensorFlowLiteSwift'

في طريقة didFinishLaunchingWithOptions في AppDelegate، استورِد Firebase أعلى الملف.

import FirebaseCore

وعليك أيضًا إضافة طلب لإعداد Firebase.

FirebaseApp.configure()

شغِّل المشروع مرة أخرى للتأكّد من ضبط التطبيق بشكل صحيح وعدم تعطُّله عند تشغيله.

  1. تأكَّد من أنّ "تفعيل إحصاءات Google لهذا المشروع" مفعّلة.
  2. اتّبِع خطوات الإعداد المتبقية في "وحدة تحكُّم Firebase"، ثم انقر على "إنشاء مشروع" (أو "إضافة Firebase"، إذا كنت تستخدم مشروعًا حاليًا على Google).

4. إضافة "إحصاءات Firebase" إلى التطبيق

في هذه الخطوة، يجب إضافة Firebase Analytics إلى التطبيق لتسجيل بيانات سلوك المستخدم (في هذه الحالة، الأفلام التي تعجب المستخدم). وسيتم استخدام هذه البيانات بشكل مجمّع في الخطوات المستقبلية لتطبيق نموذج الاقتراحات.

إعداد "إحصاءات Firebase" في التطبيق

يحتوي LikeMoviesViewModel على وظائف لتخزين الأفلام التي تعجب المستخدم. وفي كل مرة يعجب المستخدم بفيلم جديد، نريد أيضًا إرسال حدث في سجل الإحصاءات لتسجيل ذلك مثل.

أضف الرمز أدناه لتسجيل حدث تحليلات عندما ينقر المستخدم على فيلم إعجاب.

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- اختبار دمج "إحصاءات Google"

في هذه الخطوة، سننشئ أحداث "إحصاءات Google" في التطبيق ونتحقّق من إرسالها إلى "وحدة تحكُّم Firebase".

تفعيل تسجيل تصحيح الأخطاء في "إحصاءات Google"

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

لتفعيل وضع تصحيح الأخطاء في "إحصاءات Google" على جهاز التطوير، حدِّد وسيطة سطر الأوامر التالية في Xcode:

-FIRDebugEnabled

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

اختياري: تأكيد أحداث "إحصاءات Google" في "وحدة تحكُّم Firebase"

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

6- تصدير بيانات "إحصاءات Google" إلى Big Query

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

تفعيل تصدير Big Query

  1. انتقِل إلى وحدة تحكُّم Firebase.
  2. اختَر رمز ترس "الإعدادات" بجانب نظرة عامة على المشروع، ثم اختَر إعدادات المشروع.
  3. انقر على علامة التبويب عمليات الدمج.
  4. اختَر ربط (أو إدارة) داخل مجموعة BigQuery.
  5. اختَر التالي في الخطوة لمحة عن ربط Firebase بأداة BigQuery.
  6. ضمن قسم إعداد الدمج، انقر على مفتاح التبديل لتفعيل إرسال بيانات "إحصاءات Google" واختيار الربط بأداة BigQuery.

لقد فعّلت الآن مشروع وحدة تحكُّم Firebase لإرسال بيانات حدث "إحصاءات Firebase" تلقائيًا إلى Big Query. ويحدث ذلك تلقائيًا بدون أي تفاعل إضافي، إلا أنّ عملية التصدير الأولى التي تنشئ مجموعة بيانات "إحصاءات Google" في BigQuery قد لا تحدث لمدة 24 ساعة. بعد إنشاء مجموعة البيانات، يصدِّر Firebase باستمرار أحداث "إحصاءات Google" الجديدة إلى Big Query في جدول اليوم الواحد، ويجمِّع الأحداث من الأيام السابقة في جدول الأحداث.

يتطلب تدريب نموذج توصية الكثير من البيانات. نظرًا لأنه ليس لدينا بالفعل تطبيق يُنشئ كميات كبيرة من البيانات، ففي الخطوة التالية سنقوم باستيراد نموذج مجموعة بيانات إلى BigQuery لاستخدامها في بقية هذا البرنامج التعليمي.

7- استخدام BigQuery للحصول على بيانات تدريب النماذج

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

استيراد نموذج مجموعة بيانات إلى BigQuery

  1. انتقِل إلى لوحة بيانات BigQuery في وحدة التحكّم في Google Cloud.
  2. اختَر اسم مشروعك من القائمة.
  3. حدد اسم مشروعك في الجزء السفلي من شريط التنقل الأيمن في BigQuery للاطلاع على التفاصيل.
  4. اختَر إنشاء مجموعة بيانات لفتح لوحة إنشاء مجموعة البيانات.
  5. أدخِل "firebase_recommendations_dataset" من أجل رقم تعريف مجموعة البيانات واختَر إنشاء مجموعة بيانات.
  6. ستظهر مجموعة البيانات الجديدة في القائمة اليمنى أسفل اسم المشروع. انقر عليه.
  7. اختَر إنشاء جدول لفتح لوحة إنشاء الجدول.
  8. بالنسبة إلى إنشاء جدول من، اختَر "Google Cloud Storage".
  9. في الحقل اختيار ملف من حزمة GCS، أدخِل "gs://firebase-recommendations/recommendations-test/format_data_filtered.txt".
  10. اختيار "JSONL" في القائمة المنسدلة تنسيق الملف.
  11. أدخِل "جدول_الاقتراحات" بالنسبة إلى اسم الجدول.
  12. حدد المربع أسفل المخطط > الكشف التلقائي > المخطّطات ومَعلمات الإدخال
  13. اختَر إنشاء جدول.

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

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

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

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

والآن، سننشئ بيانات اعتماد حساب الخدمة في مشروع 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 lite
  5. نشر النموذج على "وحدة تحكُّم Firebase" حتى نتمكّن من استخدامه في تطبيقنا.

قبل إطلاق ورقة ملاحظات Colab التدريبية، سنفعِّل أولاً واجهة برمجة التطبيقات لإدارة النماذج في Firebase لتتمكّن Colab من نشر النموذج المدرَّب في وحدة تحكُّم Firebase.

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

إنشاء حزمة لتخزين نماذج تعلُّم الآلة

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

اتّبِع مربّع الحوار لإعداد الحزمة.

19517c0d6d2aa14d.png

تفعيل واجهة برمجة تطبيقات تعلُّم الآلة في Firebase

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

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

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

الفتح في Colab

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

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

إضافة اعتمادية تعلُّم الآلة في Firebase

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

ملف Podfile

import FirebaseCore
import FirebaseMLModelDownloader

تنزيل النموذج باستخدام واجهة برمجة تطبيقات "مدير نماذج Firebase"

انسخ الرمز أدناه إلى 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 في مجلد مواد العرض. انسخ الرمز التالي لتحميل هذه العناصر المرشحة.

recommendedsViewController.swift

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

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

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

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

تشغيل ميزة "الترجمة الفورية" لإنشاء الاقتراحات

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

recommendedsViewController.swift

import TensorFlowLite

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

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

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

recommendedsViewController.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"
  • تصدير أحداث "إحصاءات Google" إلى BigQuery
  • أحداث الإحصاءات قبل المعالجة
  • نموذج TensorFlow لاقتراحات القطارات
  • تصدير النموذج ونشره على "وحدة تحكُّم Firebase"
  • عرض اقتراحات الأفلام في تطبيق

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

  • نفِّذ اقتراحات تعلُّم الآلة من Firebase في تطبيقك.

مزيد من المعلومات

هل لديك سؤال؟

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