Agrega recomendaciones a tu app con TensorFlow Lite y Firebase: Codelab de iOS

1. Descripción general

Te damos la bienvenida al codelab Recomendaciones con TensorFlow Lite y Firebase. En este codelab, aprenderás a usar TensorFlow Lite y Firebase para implementar un modelo de recomendación en tu app. Este codelab se basa en este ejemplo de TensorFlow Lite.

Las recomendaciones permiten que las apps usen el aprendizaje automático para publicar de manera inteligente el contenido más relevante para cada usuario. Tiene en cuenta el comportamiento anterior de los usuarios para sugerir el contenido de la app con el que el usuario podría querer interactuar en el futuro a través de un modelo entrenado en el comportamiento global de una gran cantidad de otros usuarios.

En este instructivo, se muestra cómo obtener datos de los usuarios de tu app con Firebase Analytics, compilar un modelo de aprendizaje automático para obtener recomendaciones a partir de esos datos y, luego, usar ese modelo en una app para iOS para ejecutar inferencias y obtener recomendaciones. En particular, nuestras recomendaciones sugerirán las películas que es más probable que mire un usuario dada la lista de películas que le gustaron al usuario anteriormente.

Qué aprenderás

  • Integra Firebase Analytics en una app para Android a fin de recopilar datos sobre el comportamiento de los usuarios
  • Exportar esos datos a Google BigQuery
  • Procesa previamente los datos y entrena un modelo de recomendaciones de TF Lite
  • Implementa el modelo de TF Lite en el AA de Firebase y accede a él desde tu app
  • Ejecuta la inferencia en el dispositivo con el modelo para sugerir recomendaciones a los usuarios

Requisitos

  • Xcode 11 (o versiones posteriores)
  • CocoaPods 1.9.1 (o una versión posterior)

¿Cómo usarás este instructivo?

Leer Leer y completar los ejercicios

¿Cómo calificarías tu experiencia con la compilación de apps para iOS?

Principiante Intermedio Avanzado
.

2. Crea un proyecto de Firebase console

Agrega Firebase al proyecto

  1. Dirígete a Firebase console.
  2. Selecciona Create New Project y asígnale el nombre “Firebase ML iOS Codelab”.

3. Obtén el proyecto de muestra

Descargue el código

Primero, clona el proyecto de muestra y ejecuta 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 tienes Git instalado, también puedes descargar el proyecto de muestra desde su página de GitHub o haciendo clic en este vínculo. Cuando hayas descargado el proyecto, ejecútalo en Xcode y prueba la recomendación para descubrir cómo funciona.

Configura Firebase

Sigue la documentación para crear un nuevo proyecto de Firebase. Cuando tengas tu proyecto, descarga el archivo GoogleService-Info.plist correspondiente de Firebase console y arrástralo a la raíz del proyecto Xcode.

4a923d5c7ae0d8f3.png

Agrega Firebase al Podfile y ejecuta 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 agrega una llamada para configurar Firebase.

FirebaseApp.configure()

Vuelve a ejecutar el proyecto para asegurarte de que la app esté configurada correctamente y no falle durante el inicio.

  1. Asegúrate de que la opción “Habilitar Google Analytics para este proyecto” esté habilitado.
  2. Sigue los pasos de configuración restantes en Firebase console y, luego, haz clic en Crear proyecto (o Agregar Firebase, si usas un proyecto de Google existente).

4. Agrega Firebase Analytics a la app

En este paso, agregarás Firebase Analytics a la app para registrar datos de comportamiento del usuario (en este caso, qué películas le gustan). Estos datos se usarán de forma agregada en los próximos pasos para entrenar el modelo de recomendaciones.

Configura Firebase Analytics en la app

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

Agrega el siguiente código para registrar un evento de Analytics cuando el usuario haga clic 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. Prueba tu integración de Analytics

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

Habilita el registro de depuración de Analytics

Por lo general, los eventos que registra tu app se agrupan en lotes durante un período de aproximadamente una hora y se suben juntos. Con este enfoque, se ahorra batería de las cargas de trabajo de los usuarios finales y reduce el uso de datos de la red. Sin embargo, para validar tu implementación de estadísticas (y para ver tus estadísticas en el informe de DebugView), puedes habilitar el modo de depuración en tu dispositivo de desarrollo para subir eventos con un retraso mínimo.

Para habilitar el modo de depuración de Analytics en tu dispositivo de desarrollo, especifica el siguiente argumento de línea de comandos en Xcode:

-FIRDebugEnabled

En este punto, has integrado con éxito Firebase Analytics en tu app. A medida que los usuarios utilicen tu app y marquen “me gusta” en 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 viste en Logcat también se transmiten en Firebase console. No dudes en pasar a la página siguiente.

Opcional: Confirma los eventos de Analytics en Firebase console.

  1. Dirígete a Firebase console.
  2. Selecciona DebugView en Analytics.
  3. En Xcode, selecciona Ejecutar para iniciar la app y agregar algunas películas a la lista de videos que te gustaron.
  4. En DebugView de Firebase console, verifica que se registren estos eventos cuando agregas películas a la app.

6. Exporta datos de Analytics a BigQuery

BigQuery es un producto de Google Cloud que te permite examinar y procesar grandes cantidades de datos. En este paso, conectarás tu proyecto de Firebase console a BigQuery para que los datos de Analytics que genere tu app se exporten automáticamente a BigQuery.

Habilitar la exportación de BigQuery

  1. Dirígete a Firebase console.
  2. Selecciona el ícono de ajustes de configuración junto a Descripción general del proyecto y, luego, selecciona Configuración del proyecto.
  3. Selecciona la pestaña Integraciones.
  4. Selecciona Vincular (o Administrar) dentro del bloque BigQuery.
  5. Selecciona Siguiente en el paso Acerca de la vinculación de Firebase a BigQuery.
  6. En la sección Configurar la integración, haz clic en el interruptor para habilitar el envío de datos de Google Analytics y selecciona Vincular a BigQuery.

Ya habilitaste tu proyecto de Firebase console para enviar automáticamente datos de eventos de Firebase Analytics a BigQuery. Esto sucede automáticamente sin ninguna interacción adicional. Sin embargo, es posible que la primera exportación que cree el conjunto de datos de análisis en BigQuery no ocurra durante 24 horas. Después de crear el conjunto de datos, Firebase exporta continuamente nuevos eventos de Analytics a BigQuery en la tabla intradía y agrupa los eventos de días anteriores en la tabla de eventos.

Entrenar un modelo de recomendaciones requiere muchos datos. Como todavía no tenemos una app 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 instructivo.

7. Usar BigQuery para obtener datos de entrenamiento de modelos

Ahora que conectamos Firebase console para exportar a BigQuery, nuestros datos de eventos de estadísticas de aplicaciones aparecerán automáticamente en la consola de BigQuery después de un tiempo. Para obtener algunos datos iniciales en este instructivo, en este paso importaremos un conjunto de datos de muestra existente a tu consola de BigQuery para usarlo en el entrenamiento de nuestro modelo de recomendaciones.

Importa un conjunto de datos de muestra a BigQuery

  1. Ve al panel de BigQuery en la consola de Google Cloud.
  2. Selecciona el nombre de tu proyecto en el menú.
  3. Selecciona el nombre de tu proyecto en la parte inferior del panel de navegación izquierdo de BigQuery para ver los detalles.
  4. Selecciona Crear conjunto de datos para abrir el panel de creación del conjunto de datos.
  5. Ingresa “firebase_recommendations_dataset” Para el ID de conjunto de datos, selecciona Crear conjunto de datos.
  6. El nuevo conjunto de datos aparecerá en el menú izquierdo debajo del nombre del proyecto. Haz clic en él.
  7. Selecciona Crear tabla para abrir el panel de creación de tablas.
  8. En Crear tabla desde, selecciona “Google Cloud Storage”.
  9. En el campo Seleccionar archivo del bucket de GCS, ingresa “gs://firebase-recommendations/recommendations-test/formatted_data_filtered.txt”.
  10. Selecciona "JSONL". en el menú desplegable Formato de archivo.
  11. Ingresa “recommendations_table” para el Nombre de la tabla.
  12. Marca la casilla debajo de Esquema > Detección automática > Esquema y parámetros de entrada
  13. Selecciona Crear tabla.

Explora un conjunto de datos de muestra

En este punto, tienes la opción de explorar el esquema y obtener una vista previa de este conjunto de datos.

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

Crea credenciales de cuenta de servicio

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

  1. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
  2. Habilita las APIs de BigQuery y la API de BigQuery Storage. < haz clic aquí>
  3. Ve a la página Crear clave de la cuenta de servicio.
  4. En la lista Cuenta de servicio, selecciona Cuenta de servicio nueva.
  5. Escribe un nombre en el campo Nombre de cuenta de servicio.
  6. En la lista Función, selecciona Proyecto > Propietario.
  7. Haz clic en Crear. Se descargará a tu computadora un archivo JSON con la clave.

En el siguiente paso, usaremos Google Colab para procesar previamente estos datos y entrenar nuestro modelo de recomendaciones.

8. Procesa previamente los datos y entrena el modelo de recomendaciones

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

  1. Importa los datos de BigQuery al notebook de Colab
  2. procesar previamente los datos a fin de prepararlos para el entrenamiento del modelo
  3. entrenar el modelo de recomendaciones con los datos de estadísticas
  4. exporta el modelo como un modelo de TF Lite
  5. implementar el modelo en Firebase console para que podamos usarlo en nuestra app

Antes de iniciar el notebook de entrenamiento de Colab, habilitaremos la API de Firebase Model Management para que Colab pueda implementar el modelo entrenado en Firebase console.

Habilita la API de Firebase Model Management

Crea un bucket para almacenar tus modelos de AA

En Firebase console, ve a Storage y haz clic en Comenzar. fbbea78f0eb3dc9f.png

Sigue el diálogo para configurar tu bucket.

19517c0d6d2aa14d.png

Habilitar la API de AA de Firebase

Ve a la página de la API de AA de Firebase en la consola de Google Cloud y haz clic en Habilitar.

Usa un notebook de Colab para entrenar y, luego, implementar el modelo

Abre el notebook de Colab con el siguiente vínculo y completa los pasos que se indican. Después de finalizar los pasos en el notebook de Colab, tendrás un archivo de modelo de TF Lite implementado en Firebase console que podemos sincronizar con nuestra app.

Abrir en Colab

9. Descarga el modelo en tu app

En este paso, modificaremos nuestra app para descargar el modelo que acabamos de entrenar desde el aprendizaje automático de Firebase.

Agregar dependencia del AA de Firebase

La siguiente dependencia es necesaria para usar los modelos de aprendizaje automático de Firebase en tu app. Ya debería estar agregado (verifícalo).

Podfile

import FirebaseCore
import FirebaseMLModelDownloader

Descarga el modelo con la API de Firebase Model Manager

Copia el siguiente código en ModelLoader.swift para establecer las condiciones en las que se produce la descarga del modelo y crea una tarea de descarga para sincronizar el modelo remoto con nuestra app.

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. Integra el modelo de recomendación de Tensorflow Lite en tu app

El entorno de ejecución de Tensorflow Lite te permitirá usar tu modelo en la app para generar recomendaciones. En el paso anterior, inicializamos un intérprete de TFlite con el archivo de modelo que descargamos. En este paso, primero cargaremos un diccionario y etiquetas para acompañar nuestro modelo en el paso de inferencia. Luego, agregaremos procesamiento previo para generar las entradas a nuestro modelo y el procesamiento posterior, donde extraeremos los resultados de nuestra inferencia.

Cargar diccionario y etiquetas

Las etiquetas que se usan para generar las recomendaciones candidatas por el modelo de recomendaciones se enumeran en el archivo sorted_movie_vocab.json de la carpeta de recursos. Copia el siguiente código para cargar estos candidatos.

RecommendationsViewController.swift

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

Implementar el procesamiento previo

En el paso de procesamiento previo, 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 generamos muchos “me gusta” del usuario. Copia el siguiente código:

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
  }

Ejecuta el intérprete para generar recomendaciones

Aquí usamos el modelo que descargamos en un paso anterior para ejecutar inferencias en nuestra entrada ya procesada. Configuramos el tipo de entrada y salida para nuestro modelo y ejecutamos la inferencia para generar nuestras recomendaciones de películas. Copia el siguiente código en tu app.

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

Implementar el procesamiento posterior

Por último, en este paso, procesamos posteriormente el resultado de nuestro modelo, seleccionamos los resultados con el mayor nivel de confianza y quitamos los valores contenidos (películas que ya le gustaron al usuario). Copia el siguiente código en tu app.

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

Prueba tu app

Vuelve a ejecutar la app. A medida que seleccionas algunas películas, el modelo nuevo debería descargarse automáticamente y comenzar a generar recomendaciones.

11. ¡Felicitaciones!

Creaste una función de recomendaciones en tu app con TensorFlow Lite y Firebase. Ten en cuenta que las técnicas y la canalización que se muestran en este codelab se pueden generalizar y usar para entregar otros tipos de recomendaciones.

Temas abordados

  • AA de Firebase
  • Firebase Analytics
  • Exporta eventos de estadísticas a BigQuery
  • Preprocesar eventos de análisis
  • Entrena el modelo de TensorFlow con recomendaciones
  • Exporta el modelo y, luego, impleméntalo en Firebase console
  • Cómo brindar recomendaciones de películas en una app

Próximos pasos

  • Implementar recomendaciones del AA de Firebase en tu app

Más información

¿Tienes alguna pregunta?

Informar problemas