Agregue Firebase a su aplicación de Android con tecnología TFLite

1. Información general

cd824ecfd05a2822.png

Firebase ML te permite implementar tu modelo de forma inalámbrica. Esto le permite mantener el tamaño de la aplicación pequeño y descargar el modelo ML solo cuando sea necesario, experimentar con varios modelos o actualizar su modelo ML sin tener que volver a publicar la aplicación completa.

En este codelab, convertirás una aplicación de Android que usa un modelo TFLite estático en una aplicación que usa un modelo servido dinámicamente desde Firebase.

lo que aprenderás

  • Implemente modelos TFLite en Firebase ML y acceda a ellos desde su aplicación
  • Realice un seguimiento de los comentarios de los usuarios para medir la precisión del modelo con Firebase Analytics
  • Rendimiento del modelo de perfil a través de Firebase Performance
  • Seleccione cuál de los múltiples modelos implementados se carga a través de Remote Config
  • Experimente con diferentes modelos mediante Firebase A/B Testing

Lo que necesitarás

  • Última versión de Android Studio .
  • Código de muestra.
  • Un dispositivo de prueba con Android 5.0+ y servicios de Google Play 9.8 o posterior, o un emulador con servicios de Google Play 9.8 o posterior
  • Si utiliza un dispositivo, un cable de conexión.

¿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 Android?

Principiante Intermedio Competente

2. Obtenga el código de muestra

Clona el repositorio de GitHub desde la línea de comando.

$ git clone https://github.com/FirebaseExtended/codelab-digitclassifier-android.git

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 .

3. Importe la aplicación de inicio

Desde Android Studio, seleccione el directorio codelab-digitclassifier-android ( android_studio_folder.png ) de la descarga del código de muestra ( Archivo > Abrir > .../codelab-digitclassifier-android/start).

Ahora deberías tener el proyecto de inicio abierto en Android Studio.

4. Ejecute la aplicación de inicio

Ahora que ha importado el proyecto a Android Studio, está listo para ejecutar la aplicación por primera vez. Conecte su dispositivo Android y haga clic en Ejecutar ( ejecutar.png )en la barra de herramientas de Android Studio.

La aplicación debería iniciarse en su dispositivo. En este punto, si intentas dibujar un dígito, la aplicación debería poder reconocerlo.

6e36e1b947b395f2.png

5. Cree un proyecto de consola de Firebase

Agregar Firebase al proyecto

  1. Vaya a la consola de Firebase .
  2. Seleccione Agregar proyecto .
  3. Seleccione o ingrese un nombre de proyecto.
  4. 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).

6. Agregar base de fuego

  1. Desde la pantalla de descripción general de su nuevo proyecto, haga clic en el ícono de Android para iniciar el flujo de trabajo de configuración.
  2. Ingrese el nombre del paquete del codelab: org.tensorflow.lite.examples.digitclassifier

Agregue el archivo google-services.json a su aplicación

Después de registrar el nombre del paquete y seleccionar Siguiente, haga clic en Descargar google-services.json para obtener su archivo de configuración de Firebase Android y luego copie el archivo google-services.json en el directorio de la app en su proyecto. Después de descargar el archivo, puede omitir los siguientes pasos que se muestran en la consola (ya se realizaron en el proyecto build-android-start).

Agregue el complemento de servicios de Google a su aplicación

El complemento de servicios de Google utiliza el archivo google-services.json para configurar su aplicación para que use Firebase. Agregue la siguiente línea al bloque plugins en la parte superior del archivo build.gradle.kts en el directorio app de su proyecto:

aplicación/build.gradle.kts

id("com.google.gms.google-services")

Luego agregue la siguiente línea al bloque plugins de su archivo build.gradle.kts en el proyecto:

proyecto/build.gradle.kts

id("com.google.gms.google-services") version "4.3.15" apply false

Sincroniza tu proyecto con archivos gradle

Para asegurarse de que todas las dependencias estén disponibles para su aplicación, debe sincronizar su proyecto con los archivos gradle en este punto. Seleccione Archivo > Sincronizar proyecto con archivos Gradle en la barra de herramientas de Android Studio.

7. Ejecute la aplicación con Firebase

Ahora que ha configurado el complemento google-services con su archivo JSON, está listo para ejecutar la aplicación con Firebase. Conecte su dispositivo Android y haga clic en Ejecutar ( ejecutar.png )en la barra de herramientas de Android Studio.

La aplicación debería iniciarse en su dispositivo. En este punto, su aplicación aún debería compilarse correctamente.

8. Implementar un modelo en Firebase ML

Implementar un modelo en Firebase ML es útil por dos razones principales:

  1. Podemos mantener el tamaño de instalación de la aplicación pequeño y solo descargar el modelo si es necesario.
  2. El modelo se puede actualizar periódicamente y con un ciclo de lanzamiento diferente al de toda la aplicación.

Antes de que podamos reemplazar el modelo estático en nuestra aplicación con un modelo descargado dinámicamente desde Firebase, debemos implementarlo en Firebase ML. El modelo se puede implementar a través de la consola o mediante programación mediante el SDK de Firebase Admin. En este paso lo implementaremos a través de la consola.

Para simplificar las cosas, usaremos el modelo TensorFlow Lite que ya está en nuestra aplicación. Primero, abra Firebase Console y haga clic en Machine Learning en el panel de navegación izquierdo. Haga clic en "Comenzar" si está abriendo por primera vez. Luego navegue hasta "Personalizado" y haga clic en el botón "Agregar modelo personalizado".

Cuando se le solicite, asigne al modelo un nombre descriptivo como mnist_v1 y cargue el archivo desde el directorio del proyecto codelab en start/app/src/main/assets/mnist.tflite . Luego puede eliminar este archivo de modelo TF Lite del proyecto de Android.

3c3c50e6ef12b3b.png

9. Descargar modelo desde Firebase ML

Elegir cuándo descargar el modelo remoto de Firebase a su aplicación puede ser complicado ya que los modelos TFLite pueden crecer relativamente. Lo ideal es evitar cargar el modelo inmediatamente cuando se inicia la aplicación, ya que si nuestro modelo se usa solo para una función y el usuario nunca usa esa función, habremos descargado una cantidad significativa de datos sin ningún motivo. También podemos configurar opciones de descarga, como buscar solo modelos cuando estamos conectados a wifi. Si desea asegurarse de que el modelo esté disponible incluso sin una conexión de red, es importante incluirlo también sin la aplicación como respaldo.

En aras de la simplicidad, eliminaremos el modelo incluido predeterminado y siempre descargaremos un modelo de Firebase cuando se inicie la aplicación. De esta manera, cuando ejecute el reconocimiento de dígitos, puede estar seguro de que la inferencia se ejecuta con el modelo proporcionado por Firebase.

En el archivo app/build.gradle.kts, agregue la dependencia de Firebase Machine Learning

aplicación/build.gradle.kts

implementation("com.google.firebase:firebase-ml-modeldownloader:24.1.2")

Luego agregue lógica para descargar el modelo de Firebase.

Reemplazaremos digitClassifier.initialize(loadModelFile()) con downloadModel("mnist_v1") e implementaremos este método.

Actividad principal.kt

  private fun downloadModel(modelName: String): Task<CustomModel> {
    val conditions = CustomModelDownloadConditions.Builder()
    .requireWifi()
    .build()
    return FirebaseModelDownloader.getInstance()
        .getModel(modelName, DownloadType.LOCAL_MODEL, conditions)
        .addOnCompleteListener {
          val model = it.result
          if (model == null) {
            showToast("Failed to get model file.")
          } else {
            showToast("Downloaded remote model: $modelName")
            digitClassifier.initialize(model)
          }
        }
      .addOnFailureListener {
        showToast("Model download failed for $modelName, please check your connection.")
      }
  }

Vuelva a ejecutar su aplicación y dibuje un dígito en el clasificador de dígitos. Una vez que la descarga haya finalizado, debería ver un mensaje Toast indicando que el modelo remoto se descargó y un registro que indica que se está utilizando su nuevo modelo.

10. Realice un seguimiento de los comentarios y las conversiones de los usuarios para medir la precisión del modelo.

Google Analytics para Firebase le proporciona una manera de comprender la forma en que los usuarios se mueven a través de su aplicación, dónde tienen éxito y dónde se atascan y regresan. También se puede utilizar para comprender las partes más utilizadas de su aplicación.

Mediremos la precisión del modelo mediante el seguimiento de los comentarios de los usuarios sobre las predicciones del modelo. Si un usuario hace clic en "SÍ", indicará que la predicción fue precisa.

Podemos registrar un evento de Analytics para realizar un seguimiento de la precisión de nuestro modelo. Primero, debemos agregar Analytics a la dependencia antes de poder usarlo en el proyecto:

Agregar dependencia de Firebase Analytics

aplicación/build.gradle.kts

implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
implementation("com.google.firebase:firebase-analytics-ktx")

Registrar eventos

Luego, en la función onCreate configuraremos el oyente onclick para registrar el evento correct_inference en Firebase.

MainActivity.kt (al crear)

// Setup YES button
yesButton?.setOnClickListener {
  Firebase.analytics.logEvent("correct_inference", null)
}

Ejecute la aplicación nuevamente y dibuje un dígito. Presione el botón "Sí" un par de veces para enviar comentarios de que la inferencia fue precisa.

Análisis de depuración

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 un dispositivo Android, ejecute los siguientes comandos:

adb shell setprop debug.firebase.analytics.app org.tensorflow.lite.examples.digitclassifier

Ejecute la aplicación nuevamente y dibuje un dígito. Presione el botón "Sí" un par de veces para enviar comentarios de que la inferencia fue precisa. Ahora puede ver los eventos de registro casi en tiempo real a través de la vista de depuración en Firebase console. Haga clic en Analytics > DebugView en la barra de navegación izquierda.

5276199a086721fd.png

11. Analizar el rendimiento del modelo.

Firebase Performance Monitoring es un servicio que le ayuda a obtener información sobre las características de rendimiento de sus aplicaciones web, iOS y Android.

Utiliza el SDK de Performance Monitoring para recopilar datos de rendimiento de tu aplicación y luego revisar y analizar esos datos en Firebase console. Performance Monitoring le ayuda a comprender dónde y cuándo se puede mejorar el rendimiento de su aplicación para que pueda utilizar esa información para solucionar problemas de rendimiento.

Aquí agregamos trazas de rendimiento en torno a la inferencia y la descarga.

Esto es importante porque los modelos más grandes utilizados en el aprendizaje profundo tienen el potencial de ser más precisos, pero también pueden tardar más en devolver una respuesta. En nuestro experimento intentamos encontrar el equilibrio adecuado entre precisión y velocidad.

Agregar dependencia de rendimiento de Firebase

proyecto/build.gradle.kts

plugins {
  // ...

  // Add the dependency for the Performance Monitoring plugin
  id("com.google.firebase.firebase-perf") version "1.4.2" apply false
}

aplicación/build.gradle.kts

plugins {
  // ...

  // Add the Performance Monitoring plugin
  id("com.google.firebase.firebase-perf")
}

// ...

dependencies {
  // ...

  // Add the dependency for the Performance Monitoring library
  implementation("com.google.firebase:firebase-perf")
}

Agregar seguimientos personalizados

En la función setupDigitClassifier() , cree un nuevo downloadTrace e inícielo justo antes de descargar el modelo. Luego agregue un oyente exitoso que detenga el seguimiento.

En la función classifyDrawing() cree un nuevo classifyTrace e inícielo justo antes de la clasificación. Luego detenga el seguimiento en el oyente exitoso.

Actividad principal.kt

class MainActivity : AppCompatActivity() {
  // ...
  
  private val firebasePerformance = FirebasePerformance.getInstance()
  
  // ...

  private fun setupDigitClassifier() {
    // Add these lines to create and start the trace
    val downloadTrace = firebasePerformance.newTrace("download_model")
    downloadTrace.start()
    downloadModel("mnist_v1")
      // Add these lines to stop the trace on success
      .addOnSuccessListener {
        downloadTrace.stop()
      }
  }

// ...

  private fun classifyDrawing() {
    val bitmap = drawView?.getBitmap()

    if ((bitmap != null) && (digitClassifier.isInitialized)) {
      // Add these lines to create and start the trace
      val classifyTrace = firebasePerformance.newTrace("classify")
      classifyTrace.start()
      digitClassifier
        .classifyAsync(bitmap)
        .addOnSuccessListener { resultText -> 
          // Add this line to stop the trace on success
          classifyTrace.stop()
          predictedTextView?.text = resultText
        }
        .addOnFailureListener { e ->
          predictedTextView?.text = getString(
            R.string.tfe_dc_classification_error_message,
            e.localizedMessage
          )
          Log.e(TAG, "Error classifying drawing.", e)
        }
    }
  }

Ver mensajes de registro para eventos de rendimiento

  1. Habilite el registro de depuración para la supervisión del rendimiento en el momento de la compilación agregando un elemento <meta-data> al archivo AndroidManifest.xml de su aplicación, así:

AndroidManifest.xml

<application>
    <meta-data
      android:name="firebase_performance_logcat_enabled"
      android:value="true" />
</application>
  1. Revise sus mensajes de registro para ver si hay mensajes de error.
  2. Performance Monitoring etiqueta sus mensajes de registro con FirebasePerformance . Al utilizar el filtrado logcat, puede ver específicamente el seguimiento de la duración y el registro de solicitudes de red HTTP/S ejecutando el siguiente comando:
adb logcat -s FirebasePerformance
  1. Compruebe los siguientes tipos de registros que indican que Performance Monitoring está registrando eventos de rendimiento:
  • Logging TraceMetric
  • Logging NetworkRequestMetric

12. Implementar un segundo modelo en Firebase ML

Cuando se nos ocurre una nueva versión de su modelo, como una con una mejor arquitectura de modelo o una entrenada en un conjunto de datos más grande o actualizado, podemos sentirnos tentados a reemplazar nuestro modelo actual con la nueva versión. Sin embargo, un modelo que funciona bien en las pruebas no necesariamente funciona igual de bien en la producción. Por lo tanto, hagamos pruebas A/B en producción para comparar nuestro modelo original y el nuevo.

Habilitar la API de administración de modelos de Firebase

En este paso, habilitaremos la API de Firebase Model Management para implementar una nueva versión de nuestro modelo TensorFlow Lite usando código Python.

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.

2414fd5cced6c984.png Seleccione la aplicación Clasificador de dígitos cuando se le solicite.

Entrene un nuevo modelo y publíquelo en Firebase ML

Ahora entrenaremos una nueva versión del modelo usando un conjunto de datos más grande y luego lo implementaremos mediante programación directamente desde el cuaderno de entrenamiento usando el SDK de Firebase Admin.

Descargue la clave privada para la cuenta de servicio

Antes de poder usar el SDK de administrador de Firebase, necesitaremos crear una cuenta de servicio. Abra el panel Cuentas de servicio de Firebase console haciendo clic en este enlace y haga clic en el botón para crear una nueva cuenta de servicio para Firebase Admin SDK. Cuando se le solicite, haga clic en el botón Generar nueva clave privada. Usaremos la clave de la cuenta de servicio para autenticar nuestras solicitudes desde el cuaderno de colab.

c3b95de1e5508516.png

Ahora podemos entrenar e implementar el nuevo modelo.

  1. Abra este cuaderno de colaboración y haga una copia en su propio Drive.
  2. Ejecute la primera celda "Entrenar un modelo mejorado de TensorFlow Lite" haciendo clic en el botón de reproducción a la izquierda. Esto entrenará un nuevo modelo y puede llevar algún tiempo.
  3. Al ejecutar la segunda celda se creará un mensaje de carga de archivos. Cargue el archivo json que descargó de Firebase Console al crear su cuenta de servicio.

71e847c6a85423b3.png

  1. Ejecute las dos últimas celdas.

Después de ejecutar el cuaderno de colab, debería ver un segundo modelo en la consola Firebase. Asegúrese de que el segundo modelo se llame mnist_v2 .

c316683bb4d75d57.png

13. Seleccione un modelo a través de Remote Config

Ahora que tenemos dos modelos separados, agregaremos un parámetro para seleccionar qué modelo descargar en tiempo de ejecución. El valor del parámetro que reciba el cliente determinará qué modelo descarga el cliente.

Agregar reglas de configuración en Firebase console

Primero, abra la consola Firebase y haga clic en el botón Configuración remota en el menú de navegación izquierdo. Luego, haga clic en el botón "Agregar parámetro".

Asigne un nombre al nuevo parámetro model_name y asígnele un valor predeterminado de "mnist_v1" . Al poner el nombre del modelo en el parámetro de configuración remota, podemos probar varios modelos sin agregar un nuevo parámetro para cada modelo que queramos probar. Haga clic en Publicar cambios para aplicar las actualizaciones.

2949cb95c7214ca4.png

Agregar dependencia de Firebase RemoteConfig

aplicación/build.gradle.kts

implementation("com.google.firebase:firebase-config-ktx")

Configurar la configuración remota de Firebase

Actividad principal.kt

  private fun configureRemoteConfig() {
    remoteConfig = Firebase.remoteConfig
    val configSettings = remoteConfigSettings {
      minimumFetchIntervalInSeconds = 3600
    }
    remoteConfig.setConfigSettingsAsync(configSettings)
  }

Solicitar y utilizar configuración

Cree una solicitud de recuperación para la configuración y agregue un controlador de finalización para recoger y usar los parámetros de configuración.

Actividad principal.kt

 private fun setupDigitClassifier() {
    configureRemoteConfig()
    remoteConfig.fetchAndActivate()
      .addOnCompleteListener { task ->
        if (task.isSuccessful) {
          val modelName = remoteConfig.getString("model_name")
          val downloadTrace = firebasePerformance.newTrace("download_model")
          downloadTrace.start()
          downloadModel(modelName)
            .addOnSuccessListener {
              downloadTrace.stop()
            }
        } else {
          showToast("Failed to fetch model name.")
        }
      }
  }

Probar la configuración remota

  1. Haga clic en el 98205811bbed9d74.png Botón ejecutar .
  2. Compruebe que ve el mensaje Toast de que se ha descargado el modelo mnist_v1.
  3. Vuelva a Firebase Console, cambie el valor predeterminado a mnist_v2 y seleccione Publicar cambios para aplicar las actualizaciones.
  4. Reinicie la aplicación y verifique el mensaje Toast de que el modelo mnist_v2 se descargó esta vez.

14. Efectividad del modelo de prueba A/B

Firebase A/B Testing te ayuda a optimizar la experiencia de tu aplicación al facilitar la ejecución, el análisis y la escala de experimentos de marketing y productos. Finalmente, podemos usar el comportamiento de prueba A/B integrado de Firebase para ver cuál de nuestros dos modelos funciona mejor.

Vaya a Analytics -> Eventos en Firebase console. Si se muestra el evento correct_inference , márquelo como "evento de conversión"; de lo contrario, puede ir a Analytics -> Eventos de conversión y hacer clic en "Crear un nuevo evento de conversión" y escribir correct_inference.

Ahora vaya a "Configuración remota en la consola Firebase, seleccione el botón "Prueba A/B" en el menú de más opciones en el parámetro "nombre_modelo" que acabamos de agregar.

fad5ea36969d2aeb.png

En el menú que sigue, acepte el nombre predeterminado.

d7c006669ace6e40.png

Seleccione su aplicación en el menú desplegable y cambie los criterios de orientación al 50% de los usuarios activos.

cb72dcc7d2666bd3.png

Si pudo configurar el evento correct_inference como una conversión anteriormente, use este evento como la métrica principal para realizar un seguimiento. De lo contrario, si no desea esperar a que el evento aparezca en Analytics, puede agregar correct_inference manually .

1ac9c94fb3159271.png

Finalmente, en la pantalla Variantes, configure la variante de su grupo de control para usar mnist_v1 y su grupo Variante A para usar mnist_v2 .

e4510434f8da31b6.png

Haga clic en el botón Revisar en la esquina inferior derecha.

¡Felicitaciones, ha creado con éxito una prueba A/B para sus dos modelos separados! La prueba A/B se encuentra actualmente en estado de borrador y se puede iniciar en cualquier momento haciendo clic en el botón "Iniciar experimento".

Para ver más de cerca las pruebas A/B, consulte la documentación de pruebas A/B .

15. ¡Felicitaciones!

En este codelab, aprendiste cómo reemplazar un activo tflite empaquetado estáticamente en tu aplicación con un modelo TFLite cargado dinámicamente desde Firebase. Para obtener más información sobre TFLite y Firebase, consulte otros ejemplos de TFLite y las guías de introducción de Firebase.

Lo que hemos cubierto

  • TensorFlow Lite
  • ML de base de fuego
  • Análisis de base de fuego
  • Monitoreo del rendimiento de Firebase
  • Configuración remota de Firebase
  • Pruebas A/B de Firebase

Próximos pasos

  • Implemente Firebase ML Deployment en su aplicación.

Aprende más

¿Tengo una pregunta?

Informar problemas