Mise en route du kit Firebase ML pour Android

Grâce à TensorFlow Mobile et à TensorFlow Lite, l'intégration et l'utilisation de modèles profonds au sein d'applications Android est devenue très simple. Cependant, la conception et la formation des modèles nécessitent toujours beaucoup de compétences, de temps et d’efforts, sans parler de la puissance de calcul. Pour cette raison, la plupart des développeurs occasionnels ne sont pas enthousiastes à l'idée d'ajouter des fonctionnalités d'apprentissage automatique à leurs applications. Avec Firebase ML Kit, Google espère changer cela.

Firebase ML Kit est une bibliothèque qui vous permet d’utiliser sans effort et avec un minimum de code une variété de modèles profonds extrêmement précis et pré-formés dans vos applications Android. La plupart des modèles proposés sont disponibles localement et sur Google Cloud..

Actuellement, les modèles sont limités aux tâches liées à la vision par ordinateur, telles que la reconnaissance optique de caractères, la numérisation de codes à barres et la détection d'objets..

Dans ce tutoriel, je vais vous montrer comment ajouter Firebase ML Kit à un projet Android Studio et utiliser certaines de ses API de base..

Conditions préalables

Avant de poursuivre, assurez-vous d’avoir accès aux éléments suivants:

  • la dernière version d'Android Studio
  • un périphérique ou un émulateur exécutant l'API Android de niveau 21 ou supérieur
  • un compte Firebase
  • un compte Google Cloud

1. Créer un projet Firebase

Pour activer les services Firebase pour votre application, vous devez créer un projet Firebase pour celle-ci. Alors connectez-vous à la console Firebase et, sur l’écran de bienvenue, appuyez sur le bouton Ajouter un projet bouton.


Dans la boîte de dialogue qui s’ouvre, attribuez un nom facile à retenir au projet, puis appuyez sur le bouton Créer un projet bouton.


Après quelques secondes, vous devriez voir une notification vous indiquant que le nouveau projet est prêt. appuyez sur la Continuer bouton pour continuer.

Dans l'écran suivant, allez à la Développer section et cliquez sur le Kit ML lien pour voir tous les services proposés par ML Kit.

Dans ce didacticiel, nous utiliserons trois services: la reconnaissance de texte, la détection de visage et l'étiquetage d'images. Vous n'avez pas besoin de prendre des mesures pour les activer explicitement si vous avez l'intention de travailler uniquement avec les modèles locaux fournis avec ML Kit. Dans ce didacticiel, nous utiliserons à la fois des modèles locaux et basés sur le cloud. Alors cliquez sur le Utilisation de l'API cloud lien suivant.

Vous allez maintenant accéder à la console Google Cloud, où vous pouvez simplement appuyer sur le bouton Activer bouton affiché dans la section API Cloud Vision pour activer les modèles basés sur un nuage. Notez toutefois que cela ne fonctionnera que si la facturation est activée pour votre compte Google Cloud..

2. Configurez votre projet Android Studio

Avant de commencer à utiliser les API du kit ML Firebase, vous devez établir une connexion entre votre projet Android Studio et le projet Firebase que vous avez créé à l'étape précédente. Pour ce faire, ouvrez le panneau Firebase Assistant en allant à Outils> Firebase.

L'assistant Firebase ne prend pas en charge ML Kit pour le moment. Néanmoins, en l’utilisant pour ajouter Firebase Analytics, vous pouvez toujours éviter d’établir la connexion manuellement. Par conséquent, développez le Analytique section, cliquez sur le Enregistrer un événement Analytics lien et appuyez sur le Se connecter à Firebase bouton.

Dans la boîte de dialogue qui s’ouvre, assurez-vous de sélectionner le Choisissez un projet Firebase ou Google existant option et choisissez le projet Firebase que vous avez créé.

appuyez sur la Se connecter à Firebase bouton suivant. À ce stade, l’assistant télécharge automatiquement un fichier google-services.json fichier contenant les clés d’API et les ID de projet et ajoutez-le à la app module.

Une fois la connexion établie, assurez-vous d’appuyer sur le bouton Ajouter des analyses à votre application bouton pour ajouter diverses dépendances principales de Firebase à votre app modules build.gradle fichier.

Ensuite, pour ajouter la bibliothèque ML Kit, ouvrez le build.gradle fichier et tapez ce qui suit la mise en oeuvre dépendances:

implémentation 'com.google.firebase: firebase-ml-vision: 16.0.0' implémentation 'com.google.firebase: firebase-ml-vision-image-label-model: 15.0.0'

Pour simplifier le processus de téléchargement d'images depuis Internet et de les afficher dans votre application, je vous suggère également d'ajouter une dépendance pour la bibliothèque Picasso..

implémentation 'com.squareup.picasso: picasso: 2.5.2'

De plus, ajoutez Anko comme dépendance pour vous assurer que votre code Kotlin est à la fois concis et intuitif..

implémentation 'org.jetbrains.anko: anko-commons: 0.10.5'

Par défaut, les modèles locaux de Firebase ML Kit sont automatiquement téléchargés sur les périphériques de vos utilisateurs uniquement lorsque cela est nécessaire. Toutefois, si vous souhaitez les télécharger dès que votre application est installée, ajoutez le code suivant à la AndroidManifest.xml fichier:

3. Définir une mise en page

Dans ce didacticiel, nous allons créer une application permettant aux utilisateurs de saisir des URL d’images et d’effectuer des opérations de reconnaissance de texte, de détection des visages et d’étiquetage des images. Par conséquent, la mise en page de l'application doit avoir un Éditer le texte widget, où les utilisateurs peuvent taper les URL, et trois Bouton widgets, qui leur permettent de choisir quelle opération ils veulent effectuer. 

Facultativement, vous pouvez inclure un ImageView widget pour afficher les images.

Si vous positionnez tous les widgets ci-dessus à l'aide d'un Disposition relative widget, votre fichier XML de présentation devrait ressembler à ceci:

     

Voici une représentation plus visuelle de la mise en page:

Dans le XML ci-dessus, vous avez peut-être remarqué que chaque bouton a un sur clic attribut pointant vers une méthode de gestionnaire d’événements sur clic. Ces méthodes n'existent pas encore, alors créez-les dans votre activité maintenant.

fun RecognText (v: View) // À faire fun detectFaces (v: View) // À faire fun generateLabels (v: View) // À faire

4. Charger une image

Lorsque l'utilisateur appuie sur le Terminé clé après avoir tapé l'URL d'une image dans le Éditer le texte widget, notre application doit télécharger l'image et l'afficher à l'intérieur du ImageView widget.

Pour détecter les actions effectuées sur le clavier virtuel de l'utilisateur, associez un OnEditorActionListener objet avec le Éditer le texte widget. À l’intérieur de l’auditeur, après avoir confirmé que le IME_ACTION_DONE l'action a été effectuée, vous pouvez simplement appeler Picasso charge() et dans() méthodes pour charger et afficher l'image respectivement.

En conséquence, ajoutez le code suivant dans le répertoire onCreate () méthode de votre activité:

image_url_field.setOnEditorActionListener _, action, _ -> if (action == EditorInfo.IME_ACTION_DONE) Picasso.with (ctx) .load (image_url_field.text.toString ()) .into (image_holder) true false

5. Reconnaître le texte

Le kit Firebase ML comprend des classes de détecteurs distinctes pour toutes les opérations de reconnaissance d’image qu’il propose. Pour reconnaître le texte, vous devez soit utiliser le FirebaseVisionTextDetector classe, qui dépend d’un modèle local, ou utilise le FirebaseVisionCloudTextDetector classe, qui dépend d'un modèle basé sur le cloud. Pour l'instant, utilisons l'ancien. C'est beaucoup plus rapide, mais il peut gérer du texte écrit en alphabet latin uniquement.

Un détecteur de kit ML s'attend à ce que son entrée se présente sous la forme d'un FirebaseVisionImage objet. Pour créer un tel objet, il suffit d’appeler le fromBitmap () méthode d'utilité du FirebaseVisionImage classe et passez un bitmap à elle. Le code suivant, qui doit être ajouté à la reconnaîtreTexte () gestionnaire d'événement que nous avons créé plus tôt, vous montre comment convertir l'image affichée dans la mise en page. ImageView widget dans un bitmap, puis créer un FirebaseVisionImage objet hors de celui-ci:

val textImage = FirebaseVisionImage.fromBitmap ((image_holder.drawable en tant que BitmapDrawable) .bitmap)

Ensuite, pour obtenir une référence à un FirebaseVisionTextDetector objet, vous devez utiliser un FirebaseVision exemple.

détecteur de val = FirebaseVision.getInstance (). visionTextDetector

Vous pouvez maintenant démarrer le processus de reconnaissance de texte en appelant le detectInImage () méthode et en passant le FirebaseVisionImage objecter à cela. Comme la méthode s’exécute de manière asynchrone, elle renvoie un Tâche objet. Par conséquent, pour pouvoir traiter le résultat quand il est disponible, vous devez joindre un OnCompleteListener par exemple à elle. Voici comment:

detect.detectInImage (textImage) .addOnCompleteListener // Plus de code ici

À l'intérieur de l'auditeur, vous aurez accès à une liste de Bloc objets. En général, chaque bloc peut être considéré comme un paragraphe distinct détecté dans l'image. En regardant le texte propriétés de tous les Bloc objets, vous pouvez déterminer tout le texte qui a été détecté. Le code suivant vous montre comment procéder:

var detectText = "" it.result.blocks.forEach detectText + = it.text + "\ n"

Comment vous utilisez le texte détecté est bien sûr à vous. Pour l'instant, affichons-le simplement à l'aide d'une boîte de dialogue d'alerte. Merci à Anko alerte() fonction, cela prend très peu de code.

runOnUiThread alert (installedText, "Text"). show ()

Dans le code ci-dessus, le runOnUiThread () méthode assure que le alerte() la fonction est exécutée sur le thread principal de l'application.

Enfin, une fois que vous avez fini d’utiliser le détecteur, vous devez vous rappeler de l’appeler. Fermer() méthode pour libérer toutes les ressources qu'il détient.

détecteur.close ()

Si vous exécutez l'application maintenant, tapez l'URL d'une image contenant beaucoup de texte, puis appuyez sur la touche Texte bouton, vous devriez pouvoir voir le service de reconnaissance de texte de ML Kit en action.

Le modèle local de reconnaissance de texte de ML Kit est raisonnablement précis pour la plupart des types de texte imprimé.

6. Détecter les visages

Même s'ils ne partagent aucune interface de haut niveau commune, la plupart des classes de détecteurs utilisent des méthodes identiques. Cela signifie que la détection de visages dans une image n’est pas très différente de la reconnaissance de texte. Cependant, notez que ML Kit n’offre actuellement qu’un modèle local de détection des visages accessible à l’aide du FirebaseVisionFaceDetector classe. Vous pouvez obtenir une référence à une instance de celle-ci en utilisant le FirebaseVision classe.

Ajoutez le code suivant au detectFaces () méthode:

val detect = FirebaseVision.getInstance (). visionFaceDetector

En appelant le detectInImage () méthode à nouveau et en lui passant un bitmap, vous pouvez démarrer le processus de détection de visage de manière asynchrone. En utilisant un OnCompleteListener instance attachée à la Tâche objet il retourne, vous pouvez facilement savoir quand le processus est terminé.

detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable en tant que BitmapDrawable) .bitmap)). addOnCompleteListener // Plus de code ici

À l'intérieur de l'auditeur, vous aurez accès à une liste de FireBaseVisionFace objets, qui contiennent les coordonnées des rectangles qui circonscrivent les visages détectés. Alors, dessinons maintenant ces rectangles sur une copie de l'image originale traitée.

Pour créer une copie du bitmap de l’image originale, vous devez utiliser son copie() méthode comme indiqué ci-dessous:

var marquéeBitmap = (image_holder.drawable en tant que BitmapDrawable) .bitmap .copy (Bitmap.Config.ARGB_8888, true)

Ensuite, pour pouvoir dessiner sur le nouveau bitmap, vous devez créer Toile et Peindre objets pour cela. Utiliser une couleur légèrement transparente pour les rectangles serait idéal.

val canvas = toile (marquéeBitmap) val paint = peinture (paint.ANTI_ALIAS_FLAG) paint.color = color.parseColor ("# 99003399") // bleu semi-transparent

À ce stade, vous pouvez simplement parcourir la liste des FireBaseVisionFace objets et utilisent leur boundingBox propriétés pour dessiner des rectangles sur les visages détectés.

it.result.forEach canvas.drawRect (it.boundingBox, paint)

Enfin, n'oubliez pas de transmettre le nouveau bitmap au ImageView widget une fois qu'il est prêt.

runOnUiThread image_holder.setImageBitmap (marquéeBitmap)

Si vous exécutez l'application maintenant, vous devriez pouvoir effectuer la détection des visages sur toutes les images contenant des personnes..

Je suis sûr que vous serez impressionné par la rapidité et la précision des opérations de détection du visage de ML Kit..

7. Générer des étiquettes

Pour générer des étiquettes pour une image, vous devez utiliser le modèle local FirebaseVisionLabelDetector classe ou le modèle basé sur le nuage FirebaseVisionCloudLabelDetector classe. Comme nous n’utilisons que des modèles locaux tout au long de ce didacticiel, utilisons maintenant le modèle cloud. Pour obtenir une référence à une instance du FirebaseVisionCloudLabelDetector classe, vous devez à nouveau utiliser le FirebaseVision classe.

Ajoutez le code suivant au generateLabels () méthode:

val detect = FirebaseVision.getInstance (). visionCloudLabelDetector

Ensuite, comme d'habitude, appelez le detectInImage () méthode et attribuer un OnCompleteListener instance à sa valeur de retour.

detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable en tant que BitmapDrawable) .bitmap)). addOnCompleteListener // Plus de code ici

Cette fois, dans l’auditeur, vous aurez accès à une liste de FirebaseVisionCloudLabel objets, chacun ayant un étiquette propriété contenant une étiquette potentielle pour l'image. Chaque étiquette a aussi un confiance propriété qui lui est associée, spécifiant le niveau de certitude de ML Kit concernant l'étiquette.

Le code suivant vous montre comment parcourir la liste des étiquettes et générer une boîte de dialogue d'alerte affichant uniquement les étiquettes dont l'indice de confiance est supérieur à 70%..

var output = "" it.result.forEach if (it.confidence> 0.7) output + = it.label + "\ n" runOnUiThread alert (sortie, "Labels"). show ()

Lancez de nouveau l'application pour voir les étiquettes que votre application génère pour les images que vous lui envoyez..

Conclusion

Avec le kit Firebase ML, Google souhaite rendre l’apprentissage automatique accessible et intégrer les tâches plus simples telles que l’analyse et le compte rendu des incidents. Dans ce didacticiel d'introduction, vous avez appris à utiliser certaines de ses API de base dans les applications Android. Vous avez également appris à utiliser les modèles cloud et locaux proposés.

Pour en savoir plus, consultez la documentation officielle.