Ajoutez Firebase à votre application Android basée sur TFLite

1. Vue d'ensemble

cd824ecfd05a2822.png

Firebase ML vous permet de déployer votre modèle en direct. Cela vous permet de conserver une petite taille d'application et de télécharger le modèle ML uniquement lorsque cela est nécessaire, d'expérimenter plusieurs modèles ou de mettre à jour votre modèle ML sans avoir à republier l'intégralité de l'application.

Dans cet atelier de programmation, vous allez convertir une application Android utilisant un modèle TFLite statique en une application utilisant un modèle servi dynamiquement depuis Firebase.

Ce que vous apprendrez

  • Déployez des modèles TFLite sur Firebase ML et accédez-y depuis votre application
  • Suivez les commentaires des utilisateurs pour mesurer la précision du modèle avec Firebase Analytics
  • Performances du modèle de profil via Firebase Performance
  • Sélectionnez lequel des multiples modèles déployés est chargé via Remote Config
  • Expérimentez avec différents modèles via Firebase A/B Testing

Ce dont vous aurez besoin

  • Dernière version d'Android Studio .
  • Exemple de code.
  • Un appareil de test avec Android 5.0+ et les services Google Play 9.8 ou version ultérieure, ou un émulateur avec les services Google Play 9.8 ou version ultérieure
  • Si vous utilisez un appareil, un câble de connexion.

Comment allez-vous utiliser ce tutoriel ?

Lisez-le uniquement Lisez-le et complétez les exercices

Comment évalueriez-vous votre expérience dans la création d’applications Android ?

Novice Intermédiaire Compétent

2. Obtenez l'exemple de code

Clonez le référentiel GitHub à partir de la ligne de commande.

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

Si git n'est pas installé, vous pouvez également télécharger l'exemple de projet à partir de sa page GitHub ou en cliquant sur ce lien .

3. Importez l'application de démarrage

Depuis Android Studio, sélectionnez le répertoire codelab-digitclassifier-android ( android_studio_folder.png ) à partir du téléchargement de l'exemple de code ( Fichier > Ouvrir > .../codelab-digitclassifier-android/start).

Le projet de démarrage devrait maintenant être ouvert dans Android Studio.

4. Exécutez l'application de démarrage

Maintenant que vous avez importé le projet dans Android Studio, vous êtes prêt à exécuter l'application pour la première fois. Connectez votre appareil Android et cliquez sur Exécuter ( exécuter.png )dans la barre d'outils Android Studio.

L'application devrait se lancer sur votre appareil. À ce stade, si vous essayez de dessiner un chiffre, l’application devrait pouvoir le reconnaître.

6e36e1b947b395f2.png

5. Créer un projet de console Firebase

Ajouter Firebase au projet

  1. Accédez à la console Firebase .
  2. Sélectionnez Ajouter un projet .
  3. Sélectionnez ou entrez un nom de projet.
  4. Suivez les étapes de configuration restantes dans la console Firebase, puis cliquez sur Créer un projet (ou Ajouter Firebase, si vous utilisez un projet Google existant).

6. Ajouter Firebase

  1. Depuis l'écran de présentation de votre nouveau projet, cliquez sur l'icône Android pour lancer le workflow de configuration.
  2. Saisissez le nom du package de l'atelier de programmation : org.tensorflow.lite.examples.digitclassifier

Ajoutez le fichier google-services.json à votre application

Après avoir enregistré le nom du package et sélectionné Suivant, cliquez sur Télécharger google-services.json pour obtenir votre fichier de configuration Firebase Android, puis copiez le fichier google-services.json dans le répertoire app de votre projet. Une fois le fichier téléchargé, vous pouvez ignorer les étapes suivantes affichées dans la console (elles ont déjà été effectuées pour vous dans le projet build-android-start).

Ajoutez le plug-in des services Google à votre application

Le plugin google-services utilise le fichier google-services.json pour configurer votre application afin qu'elle utilise Firebase. Ajoutez la ligne suivante au bloc plugins en haut du fichier build.gradle.kts dans le répertoire app de votre projet :

app/build.gradle.kts

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

Ajoutez ensuite la ligne suivante au bloc plugins de votre fichier build.gradle.kts dans le projet :

projet/build.gradle.kts

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

Synchronisez votre projet avec les fichiers Gradle

Pour être sûr que toutes les dépendances sont disponibles pour votre application, vous devez à ce stade synchroniser votre projet avec les fichiers Gradle. Sélectionnez Fichier > Synchroniser le projet avec les fichiers Gradle dans la barre d'outils Android Studio.

7. Exécutez l'application avec Firebase

Maintenant que vous avez configuré le plugin google-services avec votre fichier JSON, vous êtes prêt à exécuter l'application avec Firebase. Connectez votre appareil Android et cliquez sur Exécuter ( exécuter.png )dans la barre d'outils Android Studio.

L'application devrait se lancer sur votre appareil. À ce stade, votre application devrait toujours être créée avec succès.

8. Déployer un modèle sur Firebase ML

Le déploiement d'un modèle sur Firebase ML est utile pour deux raisons principales :

  1. Nous pouvons garder la taille d'installation de l'application petite et télécharger le modèle uniquement si nécessaire
  2. Le modèle peut être mis à jour régulièrement et avec un cycle de publication différent de celui de l'ensemble de l'application

Avant de pouvoir remplacer le modèle statique de notre application par un modèle téléchargé dynamiquement depuis Firebase, nous devons le déployer sur Firebase ML. Le modèle peut être déployé via la console ou par programme, à l'aide du SDK d'administration Firebase. Dans cette étape, nous allons déployer via la console.

Pour simplifier les choses, nous utiliserons le modèle TensorFlow Lite déjà présent dans notre application. Tout d’abord, ouvrez la console Firebase et cliquez sur Machine Learning dans le panneau de navigation de gauche. Cliquez sur « Commencer » si vous ouvrez cette première fois. Accédez ensuite à « Personnalisé » et cliquez sur le bouton « Ajouter un modèle personnalisé ».

Lorsque vous y êtes invité, attribuez au modèle un nom descriptif tel que mnist_v1 et téléchargez le fichier à partir du répertoire du projet de l'atelier de programmation sous start/app/src/main/assets/mnist.tflite . Ensuite, vous pouvez supprimer ce fichier de modèle TF Lite du projet Android.

3c3c50e6ef12b3b.png

9. Télécharger le modèle depuis Firebase ML

Choisir quand télécharger le modèle distant de Firebase dans votre application peut être délicat car les modèles TFLite peuvent devenir relativement volumineux. Idéalement, nous voulons éviter de charger le modèle immédiatement au lancement de l'application, car si notre modèle est utilisé pour une seule fonctionnalité et que l'utilisateur n'utilise jamais cette fonctionnalité, nous aurons téléchargé une quantité importante de données sans raison. Nous pouvons également définir des options de téléchargement telles que la récupération des modèles uniquement lorsque vous êtes connecté au wifi. Si vous voulez vous assurer que le modèle est disponible même sans connexion réseau, il est important de le regrouper également sans l'application en tant que sauvegarde.

Par souci de simplicité, nous supprimerons le modèle fourni par défaut et téléchargerons toujours un modèle depuis Firebase au démarrage de l'application. De cette façon, lors de l'exécution de la reconnaissance numérique, vous pouvez être sûr que l'inférence s'exécute avec le modèle fourni par Firebase.

Dans le fichier app/build.gradle.kts, ajoutez la dépendance Firebase Machine Learning

app/build.gradle.kts

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

Ajoutez ensuite une logique pour télécharger le modèle depuis Firebase.

Nous allons remplacer digitClassifier.initialize(loadModelFile()) par downloadModel("mnist_v1") et implémenter cette méthode.

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

Réexécutez votre application et dessinez un chiffre dans le classificateur de chiffres. Une fois le téléchargement terminé, vous devriez voir un message Toast indiquant que le modèle distant est téléchargé et un journal indiquant que votre nouveau modèle est utilisé.

10. Suivez les commentaires des utilisateurs et la conversion pour mesurer la précision du modèle

Google Analytics pour Firebase vous permet de comprendre la façon dont les utilisateurs se déplacent dans votre application, où ils réussissent et où ils restent bloqués et reviennent. Il peut également être utilisé pour comprendre les parties les plus utilisées de votre application.

Nous mesurerons la précision du modèle en suivant les commentaires des utilisateurs sur les prédictions du modèle. Si un utilisateur clique sur « OUI », cela indiquera que la prédiction était exacte.

Nous pouvons enregistrer un événement Analytics pour suivre l'exactitude de notre modèle. Tout d'abord, nous devons ajouter Analytics à la dépendance avant qu'elle puisse être utilisée dans le projet :

Ajouter une dépendance Firebase Analytics

app/build.gradle.kts

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

Journaliser les événements

Ensuite, au niveau de la fonction onCreate , nous définirons l'écouteur onclick pour qu'il enregistre l'événement correct_inference sur Firebase.

MainActivity.kt (onCreate)

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

Exécutez à nouveau l'application et dessinez un chiffre. Appuyez plusieurs fois sur le bouton « Oui » pour envoyer un retour indiquant que l'inférence était exacte.

Analyses de débogage

Généralement, les événements enregistrés par votre application sont regroupés sur une période d'environ une heure et téléchargés ensemble. Cette approche préserve la batterie des appareils des utilisateurs finaux et réduit l'utilisation des données du réseau. Cependant, dans le but de valider la mise en œuvre de votre analyse (et afin d'afficher vos analyses dans le rapport DebugView), vous pouvez activer le mode Débogage sur votre appareil de développement pour télécharger les événements dans un délai minimal.

Pour activer le mode Analytics Debug sur un appareil Android, exécutez les commandes suivantes :

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

Exécutez à nouveau l'application et dessinez un chiffre. Appuyez plusieurs fois sur le bouton « Oui » pour envoyer un retour indiquant que l'inférence était exacte. Vous pouvez désormais afficher les événements du journal en temps quasi réel via la vue de débogage de la console Firebase. Cliquez sur Analytics > DebugView dans la barre de navigation de gauche.

5276199a086721fd.png

11. Analyser les performances du modèle

Firebase Performance Monitoring est un service qui vous aide à mieux comprendre les caractéristiques de performances de vos applications iOS, Android et Web.

Vous utilisez le SDK de surveillance des performances pour collecter les données de performances de votre application, puis examinez et analysez ces données dans la console Firebase. La surveillance des performances vous aide à comprendre où et quand les performances de votre application peuvent être améliorées afin que vous puissiez utiliser ces informations pour résoudre les problèmes de performances.

Ici, nous ajoutons des traces de performances autour de l'inférence et du téléchargement

Ceci est important car les modèles plus grands utilisés dans le deep learning ont le potentiel d’être plus précis, mais ils peuvent également prendre plus de temps pour renvoyer une réponse. Dans notre expérience, nous essayons de trouver le bon équilibre entre précision et vitesse.

Ajouter une dépendance Firebase Performance

projet/build.gradle.kts

plugins {
  // ...

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

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

Ajouter des traces personnalisées

Dans la fonction setupDigitClassifier() , créez un nouveau downloadTrace et démarrez-le juste avant de télécharger le modèle. Ajoutez ensuite un écouteur onsuccess arrêtant la trace.

Dans la fonction classifyDrawing() , créez un nouveau classifyTrace et démarrez-le juste avant la classification. Arrêtez ensuite la trace dans l'écouteur de réussite.

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

Afficher les messages du journal pour les événements de performances

  1. Activez la journalisation du débogage pour la surveillance des performances au moment de la génération en ajoutant un élément <meta-data> au fichier AndroidManifest.xml de votre application, comme ceci :

AndroidManifest.xml

<application>
    <meta-data
      android:name="firebase_performance_logcat_enabled"
      android:value="true" />
</application>
  1. Vérifiez vos messages de journal pour tout message d'erreur.
  2. Performance Monitoring marque ses messages de journal avec FirebasePerformance . À l'aide du filtrage logcat, vous pouvez spécifiquement afficher la trace de durée et la journalisation des requêtes réseau HTTP/S en exécutant la commande suivante :
adb logcat -s FirebasePerformance
  1. Recherchez les types de journaux suivants qui indiquent que Performance Monitoring enregistre les événements de performances :
  • Logging TraceMetric
  • Logging NetworkRequestMetric

12. Déployer un deuxième modèle sur Firebase ML

Lorsque nous proposons une nouvelle version de votre modèle, par exemple une version avec une meilleure architecture de modèle ou une version formée sur un ensemble de données plus grand ou mis à jour, nous pouvons être tentés de remplacer notre modèle actuel par la nouvelle version. Cependant, un modèle performant lors des tests ne fonctionne pas nécessairement aussi bien en production. Faisons donc des tests A/B en production pour comparer notre modèle d'origine et le nouveau.

Activer l'API de gestion des modèles Firebase

Dans cette étape, nous allons permettre à l'API Firebase Model Management de déployer une nouvelle version de notre modèle TensorFlow Lite à l'aide du code Python.

Créez un bucket pour stocker vos modèles ML

Dans votre console Firebase, accédez à Stockage et cliquez sur Commencer. fbbea78f0eb3dc9f.png

Suivez la boîte de dialogue pour configurer votre bucket.

19517c0d6d2aa14d.png

Activer l'API Firebase ML

Accédez à la page API Firebase ML sur Google Cloud Console et cliquez sur Activer.

2414fd5cced6c984.png Sélectionnez l'application Digit Classifier lorsque vous y êtes invité.

Entraîner un nouveau modèle et publier sur Firebase ML

Nous allons maintenant former une nouvelle version du modèle en utilisant un ensemble de données plus grand, puis nous le déploierons par programmation directement à partir du bloc-notes de formation à l'aide du SDK Firebase Admin.

Téléchargez la clé privée du compte de service

Avant de pouvoir utiliser le SDK Firebase Admin, nous devrons créer un compte de service. Ouvrez le panneau Comptes de service de la console Firebase en cliquant sur ce lien et cliquez sur le bouton pour créer un nouveau compte de service pour le SDK d'administration Firebase. Lorsque vous y êtes invité, cliquez sur le bouton Générer une nouvelle clé privée. Nous utiliserons la clé du compte de service pour authentifier nos demandes à partir du notebook Colab.

c3b95de1e5508516.png

Nous pouvons désormais former et déployer le nouveau modèle.

  1. Ouvrez ce notebook Colab et faites-en une copie sous votre propre Drive.
  2. Exécutez la première cellule « Former un modèle TensorFlow Lite amélioré » en cliquant sur le bouton de lecture à gauche de celle-ci. Cela entraînera la formation d'un nouveau modèle et peut prendre un certain temps.
  3. L'exécution de la deuxième cellule créera une invite de téléchargement de fichier. Téléchargez le fichier json que vous avez téléchargé depuis la console Firebase lors de la création de votre compte de service.

71e847c6a85423b3.png

  1. Exécutez les deux dernières cellules.

Après avoir exécuté le notebook Colab, vous devriez voir un deuxième modèle dans la console Firebase. Assurez-vous que le deuxième modèle est nommé mnist_v2 .

c316683bb4d75d57.png

13. Sélectionnez un modèle via Remote Config

Maintenant que nous avons deux modèles distincts, nous allons ajouter un paramètre permettant de sélectionner le modèle à télécharger au moment de l'exécution. La valeur du paramètre que le client reçoit déterminera le modèle que le client téléchargera.

Ajouter des règles de configuration dans la console Firebase

Tout d’abord, ouvrez la console Firebase et cliquez sur le bouton Remote Config dans le menu de navigation de gauche. Cliquez ensuite sur le bouton "Ajouter un paramètre".

Nommez le nouveau paramètre model_name et donnez-lui une valeur par défaut de "mnist_v1" . En mettant le nom du modèle dans le paramètre de configuration distant, nous pouvons tester plusieurs modèles sans ajouter de nouveau paramètre pour chaque modèle que nous voulons tester. Cliquez sur Publier les modifications pour appliquer les mises à jour.

2949cb95c7214ca4.png

Ajouter une dépendance Firebase RemoteConfig

app/build.gradle.kts

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

Configurer la configuration à distance de Firebase

MainActivity.kt

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

Demander et utiliser la configuration

Créez une demande de récupération pour la configuration et ajoutez un gestionnaire d'achèvement pour récupérer et utiliser les paramètres de configuration.

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

Tester la configuration à distance

  1. Clique le 98205811bbed9d74.png Bouton Exécuter .
  2. Vérifiez que vous voyez le message Toast indiquant que le modèle mnist_v1 est téléchargé.
  3. Revenez à la console Firebase, modifiez la valeur par défaut en mnist_v2 et sélectionnez Publier les modifications pour appliquer les mises à jour.
  4. Redémarrez l'application et vérifiez le message Toast indiquant que le modèle mnist_v2 est téléchargé cette fois.

14. Efficacité du modèle de test A/B

Firebase A/B Testing vous aide à optimiser l'expérience de votre application en facilitant l'exécution, l'analyse et la mise à l'échelle des expériences de produits et de marketing. Enfin, nous pouvons utiliser le comportement de test A/B intégré de Firebase pour voir lequel de nos deux modèles est le plus performant.

Accédez à Analytics -> Événements dans la console Firebase. Si l'événement correct_inference s'affiche, marquez-le comme "Événement de conversion", sinon, vous pouvez accéder à Analytics -> Événements de conversion et cliquer sur "Créer un nouvel événement de conversion" et inscrire correct_inference.

Allez maintenant dans "Remote Config dans la console Firebase, sélectionnez le bouton "A/B test" dans le menu Plus d'options sur le paramètre "model_name" que nous venons d'ajouter.

fad5ea36969d2aeb.png

Dans le menu qui suit, acceptez le nom par défaut.

d7c006669ace6e40.png

Sélectionnez votre application dans la liste déroulante et modifiez les critères de ciblage sur 50 % d'utilisateurs actifs.

cb72dcc7d2666bd3.png

Si vous avez pu définir l'événement correct_inference comme conversion plus tôt, utilisez cet événement comme métrique principale à suivre. Sinon, si vous ne souhaitez pas attendre que l'événement apparaisse dans Analytics, vous pouvez ajouter correct_inference manually .

1ac9c94fb3159271.png

Enfin, sur l'écran Variantes, définissez la variante de votre groupe de contrôle pour utiliser mnist_v1 et votre groupe Variante A pour utiliser mnist_v2 .

e4510434f8da31b6.png

Cliquez sur le bouton Réviser dans le coin inférieur droit.

Félicitations, vous avez réussi à créer un test A/B pour vos deux modèles distincts ! Le test A/B est actuellement à l'état de brouillon et peut être démarré à tout moment en cliquant sur le bouton « Démarrer l'expérience ».

Pour un examen plus approfondi des tests A/B, consultez la documentation sur les tests A/B .

15. Félicitations !

Dans cet atelier de programmation, vous avez appris à remplacer un élément tflite regroupé de manière statique dans votre application par un modèle TFLite chargé dynamiquement à partir de Firebase. Pour en savoir plus sur TFLite et Firebase, consultez d'autres exemples TFLite et les guides de démarrage de Firebase.

Ce que nous avons couvert

  • TensorFlow Lite
  • Firebase ML
  • Analyse Firebase
  • Surveillance des performances de Firebase
  • Configuration à distance Firebase
  • Tests A/B Firebase

Prochaines étapes

  • Implémentez le déploiement Firebase ML dans votre application.

Apprendre encore plus

Avoir une question?

Signaler des problèmes