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.
Pour pouvoir suivre ce tutoriel, vous devez avoir:
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:
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.
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:
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..
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.
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);
É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 ();
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.
listefaces = 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é
:
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; iVous 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 romanLes é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 surTEXT_DETECTION
ouDOCUMENT_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 legetFullTextAnnotation ()
méthode pour obtenir unTextAnnotation
objet contenant tout le texte extrait.textAnnotation final text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();Vous pouvez alors appeler le
getText ()
méthode duTextAnnotation
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.!