Thêm Đề xuất vào ứng dụng của bạn với TensorFlow Lite và Firebase - iOS Codelab

1. Khái quát chung

Chào mừng bạn đến với Đề xuất của lớp học lập trình TensorFlow Lite và Firebase. Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng TensorFlow Lite và Firebase để triển khai mô hình đề xuất cho ứng dụng của mình. Lớp học lập trình này dựa trên ví dụ TensorFlow Lite này.

Các đề xuất cho phép ứng dụng sử dụng công nghệ máy học để cung cấp nội dung phù hợp nhất cho từng người dùng một cách thông minh. Chúng tính đến hành vi trong quá khứ của người dùng để đề xuất nội dung của ứng dụng mà người dùng có thể muốn tương tác trong tương lai bằng cách sử dụng mô hình được đào tạo về hành vi tổng hợp của một số lượng lớn người dùng khác.

Hướng dẫn này cho biết cách lấy dữ liệu từ người dùng ứng dụng của bạn bằng Firebase Analytics, xây dựng mô hình máy học cho các đề xuất từ ​​dữ liệu đó, sau đó sử dụng mô hình đó trong ứng dụng iOS để chạy suy luận và nhận đề xuất. Đặc biệt, đề xuất của chúng tôi sẽ đề xuất những bộ phim mà người dùng có nhiều khả năng sẽ xem nhất dựa trên danh sách phim mà người dùng đã thích trước đó.

Bạn sẽ học được gì

  • Tích hợp Firebase Analytics vào ứng dụng Android để thu thập dữ liệu hành vi người dùng
  • Xuất dữ liệu đó vào Google Big Query
  • Xử lý trước dữ liệu và huấn luyện mô hình đề xuất TF Lite
  • Triển khai mô hình TF Lite cho Firebase ML và truy cập mô hình đó từ ứng dụng của bạn
  • Chạy suy luận trên thiết bị bằng mô hình để đề xuất đề xuất cho người dùng

Những gì bạn cần

  • Xcode 11 (hoặc cao hơn)
  • CocoaPods 1.9.1 (hoặc cao hơn)

Bạn sẽ sử dụng hướng dẫn này như thế nào?

Chỉ đọc qua Đọc và hoàn thành bài tập

Bạn đánh giá trải nghiệm của bạn khi xây dựng ứng dụng iOS như thế nào?

Người mới Trung cấp thành thạo

2. Tạo dự án bảng điều khiển Firebase

Thêm Firebase vào dự án

  1. Chuyển đến bảng điều khiển Firebase .
  2. Chọn Tạo dự án mới và đặt tên cho dự án của bạn là "Firebase ML iOS Codelab".

3. Lấy dự án mẫu

Tải xuống mã

Bắt đầu bằng cách sao chép dự án mẫu và chạy pod update trong thư mục dự án:

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

Nếu chưa cài đặt git, bạn cũng có thể tải xuống dự án mẫu từ trang GitHub hoặc bằng cách nhấp vào liên kết này . Sau khi bạn đã tải xuống dự án, hãy chạy dự án đó trong Xcode và xem xét đề xuất để hiểu cách hoạt động của dự án.

Thiết lập căn cứ hỏa lực

Làm theo tài liệu để tạo dự án Firebase mới. Khi bạn đã có dự án của mình, hãy tải xuống tệp GoogleService-Info.plist của dự án từ bảng điều khiển Firebase và kéo nó vào thư mục gốc của dự án Xcode.

4a923d5c7ae0d8f3.png

Thêm Firebase vào Podfile của bạn và chạy pod install.

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

Trong phương thức didFinishLaunchingWithOptions của AppDelegate , hãy nhập Firebase ở đầu tệp

import FirebaseCore

Và thêm cuộc gọi để định cấu hình Firebase.

FirebaseApp.configure()

Chạy lại dự án để đảm bảo ứng dụng được định cấu hình chính xác và không gặp sự cố khi khởi chạy.

  1. Đảm bảo rằng "Bật Google Analytics cho dự án này" được bật.
  2. Làm theo các bước thiết lập còn lại trong bảng điều khiển Firebase, sau đó nhấp vào Tạo dự án (hoặc Thêm Firebase, nếu bạn đang sử dụng dự án hiện có của Google).

4. Thêm Firebase Analytics vào ứng dụng

Trong bước này, bạn sẽ thêm Firebase Analytics vào ứng dụng để ghi lại dữ liệu hành vi của người dùng (trong trường hợp này là bộ phim mà người dùng thích). Dữ liệu này sẽ được sử dụng tổng hợp trong các bước tương lai để đào tạo mô hình đề xuất.

Thiết lập Firebase Analytics trong ứng dụng

LikedMoviesViewModel chứa các chức năng lưu trữ phim mà người dùng thích. Mỗi khi người dùng thích một bộ phim mới, chúng tôi cũng muốn gửi một sự kiện trong nhật ký phân tích để ghi lại lượt thích đó.

Thêm mã bên dưới để đăng ký sự kiện phân tích khi người dùng nhấp vào thích một bộ phim.

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. Kiểm tra tích hợp Analytics của bạn

Trong bước này, chúng tôi sẽ tạo các sự kiện Analytics trong ứng dụng và xác minh rằng chúng đang được gửi đến Bảng điều khiển Firebase.

Bật ghi nhật ký gỡ lỗi Analytics

Nói chung, các sự kiện do ứng dụng của bạn ghi lại sẽ được nhóm lại với nhau trong khoảng thời gian khoảng một giờ và được tải lên cùng nhau. Cách tiếp cận này giúp tiết kiệm pin trên thiết bị của người dùng cuối và giảm mức sử dụng dữ liệu mạng. Tuy nhiên, với mục đích xác thực việc triển khai phân tích của bạn (và để xem phân tích của bạn trong báo cáo DebugView), bạn có thể bật chế độ Gỡ lỗi trên thiết bị phát triển của mình để tải lên các sự kiện với độ trễ tối thiểu.

Để bật chế độ Gỡ lỗi Analytics trên thiết bị phát triển của bạn, hãy chỉ định đối số dòng lệnh sau trong Xcode:

-FIRDebugEnabled

Tại thời điểm này, bạn đã tích hợp thành công Firebase Analytics vào ứng dụng của mình. Khi người dùng sử dụng ứng dụng của bạn và thích phim, lượt thích của họ sẽ được ghi lại tổng hợp. Chúng tôi sẽ sử dụng dữ liệu tổng hợp này trong phần còn lại của lớp học lập trình này để huấn luyện mô hình đề xuất của mình. Sau đây là bước tùy chọn để xem các sự kiện Analytics tương tự mà bạn đã thấy trong Logcat cũng phát trực tiếp vào bảng điều khiển Firebase. Vui lòng chuyển sang trang tiếp theo.

Tùy chọn: Xác nhận sự kiện Analytics trong Bảng điều khiển Firebase

  1. Chuyển đến bảng điều khiển Firebase .
  2. Chọn DebugView trong Analytics
  3. Trong Xcode, chọn Chạy để khởi chạy ứng dụng và thêm một số phim vào danh sách Đã thích của bạn.
  4. Trong DebugView của bảng điều khiển Firebase, hãy xác minh rằng những sự kiện này đang được ghi lại khi bạn thêm phim vào ứng dụng.

6. Xuất dữ liệu Analytics sang Big Query

Big Query là sản phẩm của Google Cloud cho phép bạn kiểm tra và xử lý lượng lớn dữ liệu. Trong bước này, bạn sẽ kết nối dự án Firebase Console với Big Query để dữ liệu Analytics do ứng dụng của bạn tạo sẽ tự động được xuất sang Big Query.

Bật tính năng xuất Big Query

  1. Chuyển đến bảng điều khiển Firebase .
  2. Chọn biểu tượng bánh răng Cài đặt bên cạnh Tổng quan về dự án , sau đó chọn Cài đặt dự án
  3. Chọn tab Tích hợp .
  4. Chọn Liên kết (hoặc Quản lý ) bên trong khối BigQuery .
  5. Chọn Tiếp theo trong bước Giới thiệu về việc liên kết Firebase với BigQuery .
  6. Trong phần Định cấu hình tích hợp , hãy nhấp vào nút chuyển để bật gửi dữ liệu Google Analytics và chọn Liên kết tới BigQuery .

Hiện bạn đã bật dự án bảng điều khiển Firebase của mình để tự động gửi dữ liệu sự kiện Firebase Analytics tới Big Query. Quá trình này tự động diễn ra mà không cần có bất kỳ tương tác nào nữa. Tuy nhiên, lần xuất đầu tiên tạo tập dữ liệu phân tích trong BigQuery có thể không diễn ra trong 24 giờ. Sau khi tập dữ liệu được tạo, Firebase liên tục xuất các sự kiện Analytics mới sang Big Query vào bảng trong ngày và nhóm các sự kiện từ những ngày trước vào bảng sự kiện.

Đào tạo một mô hình khuyến nghị đòi hỏi rất nhiều dữ liệu. Vì chúng tôi chưa có ứng dụng tạo ra lượng lớn dữ liệu nên trong bước tiếp theo, chúng tôi sẽ nhập tập dữ liệu mẫu vào BigQuery để sử dụng cho phần còn lại của hướng dẫn này.

7. Sử dụng BigQuery để lấy dữ liệu đào tạo mô hình

Bây giờ chúng tôi đã kết nối Bảng điều khiển Firebase để xuất sang BigQuery, dữ liệu sự kiện phân tích ứng dụng của chúng tôi sẽ tự động hiển thị trong bảng điều khiển BigQuery sau một thời gian. Để có được một số dữ liệu ban đầu cho mục đích của hướng dẫn này, trong bước này, chúng tôi sẽ nhập tập dữ liệu mẫu hiện có vào bảng điều khiển BigQuery để sử dụng nhằm đào tạo mô hình đề xuất của chúng tôi.

Nhập tập dữ liệu mẫu vào BigQuery

  1. Đi tới trang tổng quan BigQuery trong bảng điều khiển đám mây của Google.
  2. Chọn tên dự án của bạn trong menu.
  3. Chọn tên dự án của bạn ở cuối điều hướng bên trái BigQuery để xem chi tiết.
  4. Chọn Tạo tập dữ liệu để mở bảng tạo tập dữ liệu.
  5. Nhập 'firebase_recommendations_dataset' cho ID tập dữ liệu và chọn Tạo tập dữ liệu .
  6. Tập dữ liệu mới sẽ hiển thị trong menu bên trái dưới tên dự án. Nhấp vào nó.
  7. Chọn Tạo bảng để mở bảng tạo bảng.
  8. Để Tạo bảng từ hãy chọn 'Google Cloud Storage'.
  9. Trong trường Chọn tệp từ nhóm GCS , hãy nhập 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
  10. Chọn 'JSONL' trong trình đơn thả xuống Định dạng tệp .
  11. Nhập “recommendations_table” cho tên Bảng .
  12. Chọn hộp trong Lược đồ > Tự động phát hiện > Lược đồ và tham số đầu vào
  13. Chọn Tạo bảng

Khám phá tập dữ liệu mẫu

Tại thời điểm này, bạn có thể tùy ý khám phá lược đồ và xem trước tập dữ liệu này.

  1. Chọn firebase-recommendations-dataset trong menu bên trái để mở rộng các bảng chứa trong đó.
  2. Chọn bảng bảng đề xuất để xem sơ đồ bảng.
  3. Chọn Xem trước để xem dữ liệu sự kiện Analytics thực tế mà bảng này chứa.

Tạo thông tin đăng nhập tài khoản dịch vụ

Bây giờ, chúng ta sẽ tạo thông tin xác thực tài khoản dịch vụ trong dự án bảng điều khiển Google Cloud mà chúng ta có thể sử dụng trong môi trường Colab ở bước sau để truy cập và tải dữ liệu BigQuery của mình.

  1. Đảm bảo rằng tính năng thanh toán được bật cho dự án Google Cloud của bạn.
  2. Kích hoạt API BigQuery và API lưu trữ BigQuery. < bấm vào đây >
  3. Chuyển đến trang Tạo khóa tài khoản dịch vụ .
  4. Từ danh sách Tài khoản dịch vụ , chọn Tài khoản dịch vụ mới .
  5. Trong trường Tên tài khoản dịch vụ , nhập tên.
  6. Từ danh sách Vai trò , chọn Dự án > Chủ sở hữu .
  7. Nhấp vào Tạo . Tệp JSON chứa các tệp tải xuống chính của bạn vào máy tính.

Trong bước tiếp theo, chúng tôi sẽ sử dụng Google Colab để xử lý trước dữ liệu này và đào tạo mô hình đề xuất của chúng tôi.

8. Tiền xử lý dữ liệu và mô hình đề xuất huấn luyện

Trong bước này, chúng ta sẽ sử dụng sổ ghi chép Colab để thực hiện các bước sau:

  1. nhập dữ liệu BigQuery vào sổ ghi chép Colab
  2. tiền xử lý dữ liệu để chuẩn bị cho việc đào tạo mô hình
  3. đào tạo mô hình đề xuất trên dữ liệu phân tích
  4. xuất mô hình dưới dạng mô hình TF lite
  5. triển khai mô hình lên Bảng điều khiển Firebase để chúng tôi có thể sử dụng mô hình đó trong ứng dụng của mình

Trước khi ra mắt sổ tay đào tạo Colab, trước tiên chúng tôi sẽ kích hoạt API quản lý mô hình Firebase để Colab có thể triển khai mô hình đã đào tạo vào bảng điều khiển Firebase của chúng tôi.

Kích hoạt API quản lý mô hình Firebase

Tạo một nhóm để lưu trữ các mô hình ML của bạn

Trong Bảng điều khiển Firebase của bạn, đi tới Bộ nhớ và nhấp vào Bắt đầu. fbbea78f0eb3dc9f.png

Thực hiện theo đoạn hội thoại để thiết lập nhóm của bạn.

19517c0d6d2aa14d.png

Kích hoạt API ML Firebase

Truy cập trang API Firebase ML trên Google Cloud Console và nhấp vào Bật.

Sử dụng sổ ghi chép Colab để đào tạo và triển khai mô hình

Mở sổ tay colab bằng liên kết sau và hoàn thành các bước bên trong. Sau khi hoàn tất các bước trong sổ tay Colab, bạn sẽ triển khai tệp mô hình TF lite vào bảng điều khiển Firebase mà chúng tôi có thể đồng bộ hóa với ứng dụng của mình.

Mở trong Colab

9. Tải mô hình xuống ứng dụng của bạn

Trong bước này, chúng tôi sẽ sửa đổi ứng dụng của mình để tải xuống mô hình mà chúng tôi vừa đào tạo từ Firebase Machine Learning.

Thêm phần phụ thuộc Firebase ML

Cần có phần phụ thuộc sau để sử dụng các mô hình Học máy của Firebase trong ứng dụng của bạn. Nó đã được thêm vào (xác minh).

tập tin podcast

import FirebaseCore
import FirebaseMLModelDownloader

Tải xuống mô hình bằng API Trình quản lý mô hình Firebase

Sao chép mã bên dưới vào ModelLoader.swift để thiết lập các điều kiện theo đó quá trình tải xuống mô hình xảy ra và tạo tác vụ tải xuống để đồng bộ hóa mô hình từ xa với ứng dụng của chúng tôi.

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. Tích hợp mô hình đề xuất Tensorflow Lite trong ứng dụng của bạn

Thời gian chạy Tensorflow Lite sẽ cho phép bạn sử dụng mô hình của mình trong ứng dụng để tạo đề xuất. Ở bước trước, chúng tôi đã khởi tạo trình thông dịch TFlite bằng tệp mô hình mà chúng tôi đã tải xuống. Trong bước này, trước tiên chúng tôi sẽ tải từ điển và nhãn đi kèm với mô hình của chúng tôi trong bước suy luận, sau đó chúng tôi sẽ thêm tiền xử lý để tạo đầu vào cho mô hình của mình và xử lý hậu kỳ nơi chúng tôi sẽ trích xuất kết quả từ suy luận của mình .

Tải từ điển và nhãn

Các nhãn được sử dụng để tạo các ứng cử viên đề xuất theo mô hình đề xuất được liệt kê trong tệp được sắp xếp_movie_vocab.json trong thư mục nội dung. Sao chép đoạn mã sau để tải những ứng viên này.

Đề xuấtViewController.swift

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

Thực hiện tiền xử lý

Ở bước tiền xử lý, chúng tôi thay đổi dạng dữ liệu đầu vào để phù hợp với những gì mô hình của chúng tôi mong đợi. Ở đây, chúng tôi đệm độ dài đầu vào bằng giá trị giữ chỗ nếu chúng tôi chưa tạo được nhiều lượt thích của người dùng. Sao chép mã dưới đây:

Đề xuấtViewController.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
  }

Chạy trình thông dịch để tạo đề xuất

Ở đây, chúng tôi sử dụng mô hình mà chúng tôi đã tải xuống ở bước trước để chạy suy luận trên đầu vào được xử lý trước. Chúng tôi đặt loại đầu vào và đầu ra cho mô hình của mình và chạy suy luận để tạo đề xuất phim. Sao chép mã sau vào ứng dụng của bạn.

Đề xuấtViewController.swift

import TensorFlowLite

Đề xuấtViewController.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)")
    }
  }

Thực hiện xử lý hậu kỳ

Cuối cùng, trong bước này, chúng tôi xử lý hậu kỳ đầu ra từ mô hình của mình, chọn kết quả có độ tin cậy cao nhất và xóa các giá trị có trong (phim mà người dùng đã thích). Sao chép mã sau vào ứng dụng của bạn.

Đề xuấtViewController.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]))
    }
  }

Kiểm tra ứng dụng của bạn!

Chạy lại ứng dụng của bạn. Khi bạn chọn một vài phim, nó sẽ tự động tải xuống mô hình mới và bắt đầu tạo đề xuất!

11. Xin chúc mừng!

Bạn đã tích hợp tính năng đề xuất vào ứng dụng của mình bằng TensorFlow Lite và Firebase. Xin lưu ý rằng các kỹ thuật và quy trình trình bày trong lớp học lập trình này cũng có thể được khái quát hóa và sử dụng để phục vụ các loại đề xuất khác.

Những gì chúng tôi đã đề cập

  • Firebase ML
  • Phân tích căn cứ hỏa lực
  • Xuất sự kiện phân tích sang BigQuery
  • Sự kiện phân tích tiền xử lý
  • Đề xuất đào tạo mô hình TensorFlow
  • Xuất mô hình và triển khai lên Bảng điều khiển Firebase
  • Cung cấp đề xuất phim trong ứng dụng

Bước tiếp theo

  • Triển khai các đề xuất ML của Firebase trong ứng dụng của bạn.

Tìm hiểu thêm

Có một câu hỏi?

Báo cáo vấn đề