Agrega recomendaciones a tu aplicación con TensorFlow Lite y Firebase - iOS Codelab

1. Información general

Bienvenido al codelab de Recomendaciones con TensorFlow Lite y Firebase. En este codelab, aprenderá cómo usar TensorFlow Lite y Firebase para implementar un modelo de recomendación en su aplicación. Este codelab se basa en este ejemplo de TensorFlow Lite.

Las recomendaciones permiten que las aplicaciones utilicen el aprendizaje automático para ofrecer de forma inteligente el contenido más relevante para cada usuario. Tienen en cuenta el comportamiento pasado del usuario para sugerir el contenido de la aplicación con el que el usuario podría querer interactuar en el futuro mediante el uso de un modelo entrenado en el comportamiento agregado de una gran cantidad de otros usuarios.

Este tutorial muestra cómo obtener datos de los usuarios de su aplicación con Firebase Analytics, crear un modelo de aprendizaje automático para recomendaciones a partir de esos datos y luego usar ese modelo en una aplicación de iOS para ejecutar inferencias y obtener recomendaciones. En particular, nuestras recomendaciones sugerirán qué películas es más probable que vea un usuario dada la lista de películas que le han gustado anteriormente.

lo que aprenderás

  • Integre Firebase Analytics en una aplicación de Android para recopilar datos de comportamiento del usuario
  • Exporta esos datos a Google Big Query
  • Preprocesar los datos y entrenar un modelo de recomendaciones TF Lite
  • Implemente el modelo TF Lite en Firebase ML y acceda a él desde su aplicación
  • Ejecute la inferencia del dispositivo utilizando el modelo para sugerir recomendaciones a los usuarios.

Lo que necesitarás

  • Xcode 11 (o superior)
  • CocoaPods 1.9.1 (o superior)

¿Cómo utilizarás este tutorial?

Léelo solo completo Léelo y completa los ejercicios.

¿Cómo calificaría su experiencia con la creación de aplicaciones para iOS?

Principiante Intermedio Competente

2. Crear proyecto de consola Firebase

Agregar Firebase al proyecto

  1. Vaya a la consola de Firebase .
  2. Seleccione Crear nuevo proyecto y nombre su proyecto "Firebase ML iOS Codelab".

3. Obtenga el proyecto de muestra

Descargar el código

Comience clonando el proyecto de muestra y ejecutando pod update en el directorio del proyecto:

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

Si no tiene git instalado, también puede descargar el proyecto de muestra desde su página de GitHub o haciendo clic en este enlace . Una vez que hayas descargado el proyecto, ejecútalo en Xcode y prueba con la recomendación para tener una idea de cómo funciona.

Configurar base de fuego

Siga la documentación para crear un nuevo proyecto de Firebase. Una vez que tenga su proyecto, descargue el archivo GoogleService-Info.plist de su proyecto desde Firebase console y arrástrelo a la raíz del proyecto Xcode.

4a923d5c7ae0d8f3.png

Agregue Firebase a su Podfile y ejecute la instalación del pod.

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

En el método didFinishLaunchingWithOptions de tu AppDelegate , importa Firebase en la parte superior del archivo

import FirebaseCore

Y agregue una llamada para configurar Firebase.

FirebaseApp.configure()

Ejecute el proyecto nuevamente para asegurarse de que la aplicación esté configurada correctamente y no falle al iniciarse.

  1. Asegúrese de que "Habilitar Google Analytics para este proyecto" esté habilitado.
  2. Siga los pasos de configuración restantes en Firebase console, luego haga clic en Crear proyecto (o Agregar Firebase, si está utilizando un proyecto de Google existente).

4. Agregue Firebase Analytics a la aplicación

En este paso, agregará Firebase Analytics a la aplicación para registrar datos de comportamiento del usuario (en este caso, qué películas le gustan a un usuario). Estos datos se utilizarán en conjunto en pasos futuros para entrenar el modelo de recomendaciones.

Configura Firebase Analytics en la aplicación

LikedMoviesViewModel contiene funciones para almacenar las películas que le gustan al usuario. Cada vez que al usuario le gusta una nueva película, también queremos enviar un evento de registro de análisis para registrar ese me gusta.

Agregue el código a continuación para registrar un evento de análisis cuando el usuario hace clic como en una película.

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. Pruebe su integración de Analytics

En este paso, generaremos eventos de Analytics en la aplicación y verificaremos que se envíen a Firebase Console.

Habilitar el registro de depuración de Analytics

Generalmente, los eventos registrados por su aplicación se agrupan durante un período de aproximadamente una hora y se cargan juntos. Este enfoque conserva la batería de los dispositivos de los usuarios finales y reduce el uso de datos de la red. Sin embargo, para validar su implementación de análisis (y para ver sus análisis en el informe DebugView), puede habilitar el modo de depuración en su dispositivo de desarrollo para cargar eventos con un retraso mínimo.

Para habilitar el modo de depuración de Analytics en su dispositivo de desarrollo, especifique el siguiente argumento de línea de comando en Xcode:

-FIRDebugEnabled

En este punto, ha integrado exitosamente Firebase Analytics en su aplicación. A medida que los usuarios usen su aplicación y les gusten las películas, sus Me gusta se registrarán en conjunto. Usaremos estos datos agregados en el resto de este codelab para entrenar nuestro modelo de recomendaciones. El siguiente es un paso opcional para ver los mismos eventos de Analytics que vio en Logcat también transmitidos a Firebase console. No dude en pasar a la página siguiente.

Opcional: confirmar eventos de Analytics en Firebase Console

  1. Vaya a la consola de Firebase .
  2. Seleccione DebugView en Analytics
  3. En Xcode, seleccione Ejecutar para iniciar la aplicación y agregar algunas películas a su lista de Me gusta.
  4. En DebugView de Firebase console, verifica que estos eventos se registren a medida que agregas películas en la aplicación.

6. Exportar datos de Analytics a Big Query

Big Query es un producto de Google Cloud que le permite examinar y procesar grandes cantidades de datos. En este paso, conectará su proyecto de Firebase Console a Big Query para que los datos de Analytics generados por su aplicación se exporten automáticamente a Big Query.

Habilitar exportación de Big Query

  1. Vaya a la consola de Firebase .
  2. Seleccione el ícono de ajustes Configuración junto a Descripción general del proyecto y luego seleccione Configuración del proyecto.
  3. Seleccione la pestaña Integraciones .
  4. Seleccione Vincular (o Administrar ) dentro del bloque de BigQuery .
  5. Seleccione Siguiente en el paso Acerca de vincular Firebase a BigQuery .
  6. En la sección Configurar integración , haga clic en el interruptor para habilitar el envío de datos de Google Analytics y seleccione Vincular a BigQuery .

Ahora ha habilitado su proyecto de Firebase console para enviar automáticamente datos de eventos de Firebase Analytics a Big Query. Esto sucede automáticamente sin ninguna interacción adicional; sin embargo, es posible que la primera exportación que crea el conjunto de datos analíticos en BigQuery no se realice durante 24 horas. Una vez creado el conjunto de datos, Firebase exporta continuamente nuevos eventos de Analytics a Big Query en la tabla intradiaria y agrupa eventos de días anteriores en la tabla de eventos.

Entrenar un modelo de recomendaciones requiere muchos datos. Como aún no tenemos una aplicación que genere grandes cantidades de datos, en el siguiente paso importaremos un conjunto de datos de muestra a BigQuery para usarlo en el resto de este tutorial.

7. Utilice BigQuery para obtener datos de entrenamiento del modelo.

Ahora que hemos conectado nuestra Firebase Console para exportar a BigQuery, los datos de eventos de análisis de nuestra aplicación aparecerán automáticamente en la consola de BigQuery después de un tiempo. Para obtener algunos datos iniciales para los fines de este tutorial, en este paso importaremos un conjunto de datos de muestra existente a su consola de BigQuery para usarlo para entrenar nuestro modelo de recomendaciones.

Importar un conjunto de datos de muestra a BigQuery

  1. Vaya al panel de BigQuery en la consola en la nube de Google.
  2. Seleccione el nombre de su proyecto en el menú.
  3. Seleccione el nombre de su proyecto en la parte inferior de la navegación izquierda de BigQuery para ver los detalles.
  4. Seleccione Crear conjunto de datos para abrir el panel de creación del conjunto de datos.
  5. Ingrese 'firebase_recommendations_dataset' para el ID del conjunto de datos y seleccione Crear conjunto de datos .
  6. El nuevo conjunto de datos aparecerá en el menú de la izquierda debajo del nombre del proyecto. Pinchalo.
  7. Seleccione Crear tabla para abrir el panel de creación de tablas.
  8. Para Crear tabla desde, seleccione 'Google Cloud Storage'.
  9. En el campo Seleccionar archivo del depósito de GCS , ingrese 'gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt'.
  10. Seleccione 'JSONL' en el menú desplegable Formato de archivo .
  11. Ingrese 'recommendations_table' como nombre de la tabla .
  12. Marque la casilla en Esquema > Detección automática > Esquema y parámetros de entrada
  13. Seleccione Crear tabla

Explorar conjunto de datos de muestra

En este punto, opcionalmente puede explorar el esquema y obtener una vista previa de este conjunto de datos.

  1. Seleccione firebase-recommendations-dataset en el menú de la izquierda para expandir las tablas que contiene.
  2. Seleccione la tabla de recomendaciones para ver el esquema de la tabla.
  3. Seleccione Vista previa para ver los datos reales de eventos de Analytics que contiene esta tabla.

Crear credenciales de cuenta de servicio

Ahora, crearemos credenciales de cuenta de servicio en nuestro proyecto de consola de Google Cloud que podemos usar en el entorno de Colab en el siguiente paso para acceder y cargar nuestros datos de BigQuery.

  1. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
  2. Habilite las API de BigQuery y BigQuery Storage API. < haga clic aquí >
  3. Vaya a la página Crear clave de cuenta de servicio .
  4. En la lista de cuentas de servicio , seleccione Nueva cuenta de servicio .
  5. En el campo Nombre de la cuenta de servicio , ingrese un nombre.
  6. En la lista Función , seleccione Proyecto > Propietario .
  7. Haga clic en Crear . Un archivo JSON que contiene su clave se descarga en su computadora.

En el siguiente paso, utilizaremos Google Colab para preprocesar estos datos y entrenar nuestro modelo de recomendaciones.

8. Preprocesar datos y entrenar modelo de recomendaciones.

En este paso, usaremos un cuaderno Colab para realizar los siguientes pasos:

  1. importar los datos de BigQuery al cuaderno de Colab
  2. preprocesar los datos para prepararlos para el entrenamiento del modelo
  3. entrenar el modelo de recomendaciones en los datos analíticos
  4. exportar el modelo como modelo TF lite
  5. implementar el modelo en Firebase Console para que podamos usarlo en nuestra aplicación

Antes de iniciar el cuaderno de capacitación de Colab, primero habilitaremos la API de administración de modelos de Firebase para que Colab pueda implementar el modelo entrenado en nuestra consola de Firebase.

Habilitar la API de administración de modelos de Firebase

Crea un depósito para almacenar tus modelos de ML

En tu Firebase Console, ve a Almacenamiento y haz clic en Comenzar. fbbea78f0eb3dc9f.png

Siga el diálogo para configurar su depósito.

19517c0d6d2aa14d.png

Habilitar la API de Firebase ML

Vaya a la página de la API de Firebase ML en Google Cloud Console y haga clic en Habilitar.

Utilice el cuaderno Colab para entrenar e implementar el modelo.

Abra el cuaderno de colab utilizando el siguiente enlace y complete los pasos que contiene. Después de finalizar los pasos en el cuaderno de Colab, tendrá un archivo de modelo TF lite implementado en la consola Firebase que podemos sincronizar con nuestra aplicación.

Abrir en Colab

9. Descarga el modelo en tu aplicación

En este paso, modificaremos nuestra aplicación para descargar el modelo que acabamos de entrenar desde Firebase Machine Learning.

Agregar dependencia de Firebase ML

Se necesita la siguiente dependencia para utilizar los modelos de Firebase Machine Learning en su aplicación. Ya debería estar agregado (verificar).

archivo de pods

import FirebaseCore
import FirebaseMLModelDownloader

Descargue el modelo con la API de Firebase Model Manager

Copie el código siguiente en ModelLoader.swift para configurar las condiciones bajo las cuales se produce la descarga del modelo y crear una tarea de descarga para sincronizar el modelo remoto con nuestra aplicación.

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. Integre el modelo de recomendación de Tensorflow Lite en su aplicación

El tiempo de ejecución de Tensorflow Lite le permitirá usar su modelo en la aplicación para generar recomendaciones. En el paso anterior inicializamos un intérprete TFlite con el archivo modelo que descargamos. En este paso, primero cargaremos un diccionario y etiquetas para acompañar a nuestro modelo en el paso de inferencia, luego agregaremos preprocesamiento para generar las entradas a nuestro modelo y posprocesamiento donde extraeremos los resultados de nuestra inferencia. .

Cargar diccionario y etiquetas

Las etiquetas utilizadas para generar los candidatos de recomendación según el modelo de recomendaciones se enumeran en el archivo sorted_movie_vocab.json en la carpeta de activos. Copie el siguiente código para cargar estos candidatos.

RecomendacionesViewController.swift

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

Implementar preprocesamiento

En el paso de preprocesamiento, cambiamos la forma de los datos de entrada para que coincidan con lo que espera nuestro modelo. Aquí, rellenamos la longitud de entrada con un valor de marcador de posición si aún no hemos generado muchos Me gusta de los usuarios. Copie el código a continuación:

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

Ejecute el intérprete para generar recomendaciones.

Aquí usamos el modelo que descargamos en un paso anterior para ejecutar inferencia en nuestra entrada preprocesada. Configuramos el tipo de entrada y salida para nuestro modelo y ejecutamos inferencia para generar nuestras recomendaciones de películas. Copie el siguiente código en su aplicación.

RecomendacionesViewController.swift

import TensorFlowLite

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

Implementar posprocesamiento

Finalmente, en este paso posprocesamos el resultado de nuestro modelo, seleccionando los resultados con la mayor confianza y eliminando los valores contenidos (películas que al usuario ya le han gustado). Copie el siguiente código en su aplicación.

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

¡Prueba tu aplicación!

Vuelva a ejecutar su aplicación. Al seleccionar algunas películas, debería descargar automáticamente el nuevo modelo y comenzar a generar recomendaciones.

11. ¡Felicitaciones!

Ha creado una función de recomendaciones en su aplicación usando TensorFlow Lite y Firebase. Tenga en cuenta que las técnicas y la canalización que se muestran en este codelab se pueden generalizar y utilizar también para otros tipos de recomendaciones.

Lo que hemos cubierto

  • ML de base de fuego
  • Análisis de base de fuego
  • Exportar eventos de análisis a BigQuery
  • Eventos de análisis previo al proceso
  • Recomendaciones de entrenamiento del modelo TensorFlow
  • Exportar modelo e implementar en Firebase Console
  • Ofrecer recomendaciones de películas en una aplicación.

Próximos pasos

  • Implemente las recomendaciones de Firebase ML en su aplicación.

Aprende más

¿Tengo una pregunta?

Informar problemas