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

1. Información general

cd824ecfd05a2822.png

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

En este laboratorio de código, convertirá una aplicación de Android usando un modelo TFLite estático en una aplicación usando 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 a través de 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 usa un dispositivo, un cable de conexión.

¿Cómo utilizará este tutorial?

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

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

Principiante Intermedio Competente

2. Obtenga el código de muestra

Clone el repositorio de GitHub desde la línea de comandos.

$ 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. Importa la aplicación de inicio

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

Ahora debería 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 intenta dibujar un dígito, la aplicación debería poder reconocerlo.

6e36e1b947b395f2.png

5. Crear proyecto de consola de Firebase

Agregar Firebase al proyecto

  1. Ve 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 la consola de Firebase, luego haga clic en Crear proyecto (o Agregar Firebase, si está usando 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 icono 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 han realizado en el proyecto build-android-start).

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

El complemento de google-services usa el archivo google-services.json para configurar su aplicación para usar Firebase. Agregue la siguiente línea al bloque plugins en la parte superior del archivo build.gradle.kts en el directorio de la 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/construir.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 archivos gradle en este punto. Seleccione Archivo > Proyecto de sincronización con archivos Gradle en la barra de herramientas de Android Studio.

7. Ejecute la aplicación con Firebase

Ahora que configuró 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

La implementación de 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 regularmente 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 de Firebase, debemos implementarlo en Firebase ML. El modelo se puede implementar a través de la consola o mediante programación, usando el SDK de administración de Firebase. En este paso, 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 esta 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 de 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 de 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. Idealmente, queremos 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 solo buscar modelos cuando está conectado a wifi. Si desea asegurarse de que el modelo esté disponible incluso sin conexión a la 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, al ejecutar 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.

MainActivity.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 finalizada la descarga, debería ver un mensaje Toast que indica que se descargó el modelo remoto y un registro que indica que se está utilizando su nuevo modelo.

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

Google Analytics para Firebase le permite 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 retroceden. 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 rastrear la precisión de nuestro modelo. Primero, debemos agregar Analytics a la dependencia antes de que pueda usarse 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")

Eventos de registro

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

MainActivity.kt (onCreate)

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

Vuelva a ejecutar la aplicación 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

Por lo general, 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, con el fin de 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

Vuelva a ejecutar la aplicación 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 la consola de Firebase. 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 lo ayuda a obtener información sobre las características de rendimiento de sus aplicaciones iOS, Android y web.

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

Aquí agregamos trazas de rendimiento alrededor de 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 estamos tratando de encontrar el equilibrio adecuado entre precisión y velocidad.

Agregar dependencia de rendimiento de Firebase

proyecto/construir.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. A continuación, agregue un oyente onsuccess 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 onsuccess.

MainActivity.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. Verifique sus mensajes de registro para ver si hay mensajes de error.
  2. Performance Monitoring etiqueta sus mensajes de registro con FirebasePerformance . Con 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. Verifique los siguientes tipos de registros que indican que Performance Monitoring está registrando eventos de rendimiento:
  • Logging TraceMetric
  • Logging NetworkRequestMetric

12. Implemente un segundo modelo en Firebase ML

Cuando creamos 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 administración de modelos de Firebase para implementar una nueva versión de nuestro modelo TensorFlow Lite mediante el código de Python.

Cree un depósito para almacenar sus modelos ML

En su Firebase Console, vaya a Almacenamiento y haga clic en Comenzar. fbbea78f0eb3dc9f.png

Siga el diálogo para configurar su balde.

19517c0d6d2aa14d.png

Habilitar la API de aprendizaje automático de Firebase

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 administración de Firebase.

Descargar la clave privada para la cuenta de servicio

Antes de que podamos usar el SDK de administración de Firebase, debemos crear una cuenta de servicio. Abra el panel Cuentas de servicio de la consola Firebase 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. Abre este cuaderno de colaboración y haz una copia en tu propio Drive.
  2. Ejecute la primera celda "Entrenar un modelo TensorFlow Lite mejorado" haciendo clic en el botón de reproducción a la izquierda. Esto entrenará un nuevo modelo y puede llevar algún tiempo.
  3. Ejecutar la segunda celda 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 colaboración, debería ver un segundo modelo en la consola de 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 recibe el cliente determinará qué modelo descarga el cliente.

Agregar reglas de configuración en la consola de Firebase

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".

Nombre el 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 queremos 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

MainActivity.kt

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

Solicitud y uso de 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.

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

Prueba de 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. Eficacia del modelo de prueba A/B

Firebase A/B Testing lo ayuda a optimizar su experiencia con la 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 la consola de Firebase. Si se muestra el evento correct_inference , márquelo como un "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 colocar correct_inference.

Ahora vaya a "Configuración remota en la consola de Firebase, seleccione el botón "Prueba A/B" en el menú de más opciones en el parámetro "nombre_del_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 quiere esperar a que aparezca el evento en Analytics, puede agregar correct_inference manually .

1ac9c94fb3159271.png

Finalmente, en la pantalla Variantes, configure su variante de 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 las pruebas A/B .

15. ¡Felicitaciones!

En este laboratorio de código, aprendió a reemplazar un activo tflite empaquetado estáticamente en su aplicación con un modelo TFLite cargado dinámicamente de Firebase. Para obtener más información sobre TFLite y Firebase, eche un vistazo a otras muestras de TFLite y las guías de inicio de Firebase.

Lo que hemos cubierto

  • TensorFlow Lite
  • Base de fuego ML
  • Análisis de base de fuego
  • Supervisión 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