Comment utiliser l'API Google Cloud Vision dans les applications Android

La vision par ordinateur est considérée comme un problème d'IA complet. En d'autres termes, le résoudre équivaudrait à créer un programme aussi intelligent que l'homme. Inutile de dire qu'un tel programme n'a pas encore été créé. Toutefois, si vous avez déjà utilisé des applications telles que Google Goggles ou Google Photos (ou visionné le segment sur Google Lens dans le discours liminaire de Google I / O 2017), vous réalisez probablement que la vision par ordinateur est devenue très puissante..

Grâce à une API basée sur REST appelée Cloud Vision API, Google partage ses technologies révolutionnaires liées à la vision avec tous les développeurs. En utilisant l'API, vous pouvez facilement ajouter des fonctionnalités impressionnantes telles que la détection des visages, la détection des émotions et la reconnaissance optique des caractères à vos applications Android. Dans ce tutoriel, je vais vous montrer comment.

Conditions préalables

Pour pouvoir suivre ce tutoriel, vous devez avoir:

  • un compte Google Cloud Platform
  • un projet sur la console Google Cloud
  • la dernière version d'Android Studio
  • et un appareil fonctionnant sous Android 4.4 ou supérieur

Si certaines des conditions ci-dessus ne vous semblent pas familières, je vous suggère de lire le didacticiel d'introduction suivant sur la plateforme Google Cloud Machine Learning:

1. Activer l'API Cloud Vision

Vous ne pouvez utiliser l'API Cloud Vision dans votre application Android qu'après l'avoir activée dans la console Google Cloud et acquis une clé d'API valide. Commencez donc par vous connecter à la console et accédez à Gestionnaire d'API> Bibliothèque> API Vision. Dans la page qui s'ouvre, appuyez simplement sur le bouton Activer bouton.

Si vous avez déjà généré une clé API pour votre projet de console Cloud, vous pouvez passer à l'étape suivante car vous pourrez la réutiliser avec l'API Cloud Vision. Sinon, ouvrez le Lettres de créance onglet et sélectionnez Créer des informations d'identification> clé API.

Dans la boîte de dialogue qui apparaît, vous verrez votre clé API.

2. Ajouter des dépendances

Comme la plupart des autres API proposées par Google, il est possible d'accéder à l'API Cloud Vision à l'aide de la bibliothèque Google API Client. Pour utiliser la bibliothèque dans votre projet Android Studio, ajoutez les éléments suivants: compiler dépendances dans le app modules build.gradle fichier:

compiler 'com.google.api-client: google-api-client-android: 1.22.0' compiler 'com.google.apis: google-api-services-vision: v1-rev357-1.22.0' compiler 'com. google.code.findbugs: jsr305: 2.0.1 '

De plus, pour simplifier les opérations d’E / S sur les fichiers, je vous suggère également d’ajouter un compiler dépendance pour la bibliothèque Apache Commons IO.

compiler 'commons-io: commons-io: 2.5'

Parce que Google API Client ne peut fonctionner que si votre application dispose du L'INTERNET permission, assurez-vous que la ligne suivante est présente dans le fichier manifeste de votre projet:

3. Configuration du client API

Vous devez configurer le client de l'API Google avant de l'utiliser pour interagir avec l'API Cloud Vision. Cela implique principalement la spécification de la clé API, du transport HTTP et de la fabrique JSON à utiliser. Comme vous vous en doutez, le transport HTTP sera responsable de la communication avec les serveurs de Google et la fabrique JSON sera notamment chargée de la conversion des résultats JSON générés par l'API en objets Java.. 

Pour les applications Android modernes, Google vous recommande d'utiliser le NetHttpTransport classe comme le transport HTTP et la AndroidJsonFactory classe comme l'usine JSON.

le Vision La classe représente le client API Google pour Cloud Vision. Bien qu’il soit possible de créer une instance de la classe à l’aide de son constructeur, utilisez le Vision.Builder classe à la place est plus facile et plus flexible.

En utilisant le Vision.Builder classe, vous devez vous rappeler d'appeler le setVisionRequestInitializer () méthode pour spécifier votre clé API. Le code suivant vous montre comment:

Vision.Builder visionBuilder = new Vision.Builder (new NetHttpTransport (), new AndroidJsonFactory (), null); visionBuilder.setVisionRequestInitializer (nouveau VisionRequestInitializer ("YOUR_API_KEY"));

Une fois la Vision.Builder instance est prête, vous pouvez appeler son construire() méthode pour générer un nouveau Vision par exemple, vous pouvez utiliser tout au long de votre application.

Vision vision = visionBuilder.build ();

À ce stade, vous avez tout ce dont vous avez besoin pour commencer à utiliser l'API Cloud Vision..

4. Détecter et analyser les visages

La détection de visages sur des photographies est une exigence très courante dans les applications liées à la vision par ordinateur. Avec l'API Cloud Vision, vous pouvez créer un détecteur de visage extrêmement précis, capable d'identifier les émotions, les conditions d'éclairage et les points de repère..

Pour des raisons de démonstration, nous allons lancer la détection de visage sur la photo suivante, qui montre l’équipage d’Apollo 9:

Je vous suggère de télécharger une version haute résolution de la photo depuis Wikimedia Commons et de la placer dans le projet. res / raw dossier.

Étape 1: Encoder la photo

L'API Cloud Vision s'attend à ce que son image d'entrée soit codée sous forme de chaîne Base64 placée dans un Image objet. Avant de générer un tel objet, vous devez toutefois convertir la photo que vous avez téléchargée, qui est actuellement une ressource image brute, en une image. octet tableau. Vous pouvez le faire rapidement en ouvrant son flux d’entrée à l’aide du bouton openRawResource () méthode du Ressources classe et en le passant à la toByteArray () méthode du IOUtils classe.

Les opérations d'E / S sur fichier ne devant pas être exécutées sur le thread d'interface utilisateur, assurez-vous de créer un nouveau thread avant d'ouvrir le flux d'entrée. Le code suivant vous montre comment:

// Crée un nouveau fil AsyncTask.execute (new Runnable () @Override public void run () // Convertit une photo en tableau d'octets InputStream inputStream = getResources (). OpenRawResource (R.raw.photo); byte [] photoData = IOUtils.toByteArray (inputStream); inputStream.close (); // Plus de code ici);

Vous pouvez maintenant créer un Image objet en appelant son constructeur par défaut. Pour ajouter le octet tableau comme une chaîne Base64, tout ce que vous avez à faire est de passer le tableau à son encodeContent () méthode.

Image inputImage = new Image (); inputImage.encodeContent (photoData);

Étape 2: Faites une demande

Étant donné que l'API Cloud Vision offre plusieurs fonctionnalités différentes, vous devez spécifier explicitement la fonctionnalité qui vous intéresse lorsque vous lui faites une demande. Pour ce faire, vous devez créer un Fonctionnalité objet et appeler son setType () méthode. Le code suivant vous montre comment créer un Fonctionnalité objet pour détection de visage uniquement:

Fonctionnalité désirée = nouvelle fonctionnalité (); désiréFeature.setType ("FACE_DETECTION");

En utilisant le Image et le Fonctionnalité objets, vous pouvez maintenant composer un AnnotateImageRequest exemple.

AnnotateImageRequest request = new AnnotateImageRequest (); request.setImage (inputImage); request.setFeatures (Arrays.asList (désiréFeature));

Notez qu'un AnnotateImageRequest objet doit toujours appartenir à un BatchAnnotateImagesRequest objet car l’API Cloud Vision est conçue pour traiter plusieurs images à la fois. Pour initialiser un BatchAnnotateImagesRequest instance contenant un seul AnnotateImageRequest objet, vous pouvez utiliser le Tableaux.asList () méthode d'utilité.

BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest (); batchRequest.setRequests (Arrays.asList (demande));

Pour effectuer la demande de détection de visage, vous devez appeler le exécuter() méthode d'un Annoter objet qui est initialisé en utilisant le BatchAnnotateImagesRequest objet que vous venez de créer. Pour générer un tel objet, vous devez appeler le annoter() méthode proposée par Google API Client pour Cloud Vision. Voici comment:

BatchAnnotateImagesResponse batchResponse = vision.images (). Annotate (batchRequest) .execute ();

Étape 3: utilisez la réponse

Une fois la demande traitée, vous obtenez un BatchAnnotateImagesResponse objet contenant la réponse de l'API. Pour une demande de détection de visage, la réponse contient un FaceAnnotation objet pour chaque visage détecté par l'API. Vous pouvez obtenir une liste de tous FaceAnnotation objets utilisant le getFaceAnnotations () méthode.

liste faces = batchResponse.getResponses () .get (0) .getFaceAnnotations ();

UNE FaceAnnotation objet contient de nombreuses informations utiles sur un visage, telles que son emplacement, son angle et l’émotion qu’il exprime. À partir de la version 1, l’API ne peut détecter que les émotions suivantes: joie, chagrin, colère et surprise..

Pour que ce tutoriel soit court, laissez-nous simplement afficher les informations suivantes dans un Pain grillé:

  • Le compte des visages
  • La probabilité qu'ils expriment la joie

Vous pouvez bien sûr connaître le nombre de visages en appelant le Taille() méthode du liste contenant le FaceAnnotation objets. Pour avoir la probabilité qu'un visage exprime de la joie, vous pouvez appeler le nom intuitif getJoyLikelihood () méthode du associé FaceAnnotation objet. 

Notez que parce qu'un simple Pain grillé ne peut afficher qu'une seule chaîne, vous devrez concaténer tous les détails ci-dessus. En outre, un Pain grillé ne peut être affiché qu'à partir du fil de l'interface utilisateur, assurez-vous de l'appeler après avoir appelé le runOnUiThread () méthode. Le code suivant vous montre comment:

// Compter les faces int numberOfFaces = faces.size (); // Obtenir la vraisemblance de joie pour chaque visage String vraisemblance = ""; pour (int i = 0; i

Vous pouvez maintenant aller de l'avant et exécuter l'application pour voir le résultat suivant:

5. Lecture de texte

Le processus d'extraction de chaînes de photos de texte est appelé reconnaissance optique de caractères, ou OCR. L'API Cloud Vision vous permet de créer facilement un lecteur optique de caractères pouvant gérer des photos de texte imprimé et manuscrit. De plus, le lecteur que vous créez n'aura aucune difficulté à lire du texte incliné ou superposé à une image colorée..

L'API offre deux fonctionnalités différentes pour l'OCR:

  • TEXT_DETECTION, pour lire de petites quantités de texte, telles que celles présentes sur des panneaux ou des couvertures de livres
  • et DOCUMENT_TEXT_DETECTION, pour lire de grandes quantités de texte, telles que celles présentes sur les pages d'un roman

Les étapes à suivre pour effectuer une demande d'OCR sont identiques à celles que vous avez suivies pour effectuer une demande de détection de visage, à l'exception de la procédure d'initialisation de la Fonctionnalité objet. Pour OCR, vous devez définir son type sur TEXT_DETECTION ou DOCUMENT_TEXT_DETECTION. Pour l'instant, allons avec l'ancien.

Fonctionnalité désirée = nouvelle fonctionnalité (); désiréFeature.setType ("TEXT_DETECTION");

Bien entendu, vous devrez également placer une photo contenant du texte à l'intérieur du projet. res / raw dossier. Si vous n'avez pas une telle photo, vous pouvez utiliser celle-ci, qui montre un panneau de signalisation:

Vous pouvez télécharger une version haute résolution de la photo ci-dessus à partir de Wikimedia Commons..

Pour commencer à traiter les résultats d’une opération d’OCR, après avoir obtenu le BatchAnnotateImagesResponse objet, vous devez appeler le getFullTextAnnotation () méthode pour obtenir un TextAnnotation objet contenant tout le texte extrait.

textAnnotation final text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();

Vous pouvez alors appeler le getText () méthode du TextAnnotation objet pour obtenir une référence à une chaîne contenant le texte extrait.

Le code suivant vous montre comment afficher le texte extrait à l’aide d’un bouton Pain grillé:

Toast.makeText (getApplicationContext (), text.getText (), Toast.LENGTH_LONG) .show ();

Si vous exécutez votre application maintenant, vous devriez voir quelque chose comme ceci:

Conclusion

Dans ce didacticiel, vous avez appris à utiliser l'API Cloud Vision pour ajouter des fonctionnalités de détection des visages, de détection des émotions et de reconnaissance optique des caractères à vos applications Android. Je suis sûr que vous serez d'accord avec moi pour dire que ces nouvelles fonctionnalités permettront à vos applications de proposer des interfaces utilisateur plus intuitives et plus intelligentes..

Il convient de mentionner qu'il manque une fonctionnalité importante dans l'API Cloud Vision: la reconnaissance faciale. Dans sa forme actuelle, l'API peut uniquement détecter les visages, pas les identifier.

Pour en savoir plus sur l'API, vous pouvez vous référer à la documentation officielle.

Et pendant ce temps, consultez certains de nos autres tutoriels sur l'ajout de l'apprentissage informatique à vos applications Android.!