Comment utiliser les services d'apprentissage Google Cloud Machine pour Android

L'actualité regorge de mots à la mode tels que l'automatisation, l'intelligence artificielle et l'apprentissage automatique. C'est probablement pourquoi de plus en plus d'utilisateurs de smartphones commencent à rechercher des applications plus intelligentes. En tant que développeur d'applications Android classique, vous ne disposez probablement pas des ressources nécessaires pour créer de telles applications à partir de rien..

Heureusement, Google a récemment lancé une plate-forme Cloud Machine Learning, qui propose des réseaux de neurones pré-formés pour effectuer diverses tâches. La plupart de ses modèles sont non seulement très précis, mais également en amélioration constante. Et devine quoi? Vous pouvez les utiliser en effectuant simplement quelques appels d'API REST.!

Dans ce didacticiel, je vais vous présenter la plate-forme Cloud Machine Learning et vous montrer comment l'utiliser pour créer une application Android intelligente capable de reconnaître des objets du monde réel et de les nommer dans plusieurs langues..

Conditions préalables

Pour tirer le meilleur parti de ce didacticiel, il vous suffit de:

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

1. Acquisition d'une clé API

Pour pouvoir utiliser les services d'apprentissage automatique de Google dans votre application Android, vous avez besoin d'une clé API. Vous pouvez en obtenir un en créant un nouveau projet dans la console Google Cloud Platform..

Commencez par vous connecter à la console et appuyez sur le bouton Créer un nouveau projet bouton. Dans la boîte de dialogue qui apparaît, attribuez un nom significatif au projet..

Une fois le projet créé, allez à Gestionnaire d'API> Tableau de bord et appuyez sur le Activer l'API bouton.

Dans l'écran suivant, sous le Apprentissage de Google Cloud Machine rubrique, vous pourrez voir toutes les différentes API d’apprentissage automatique à votre disposition. Dans ce didacticiel, nous utiliserons uniquement les API Vision et traduction..

Pour activer l'API Vision, cliquez sur son lien et appuyez sur le bouton Activer bouton.

De même, pour activer l’API de traduction, cliquez sur son lien et appuyez sur le bouton Activer bouton.

Vous aurez besoin d'une seule clé pour utiliser les deux API. Pour l'obtenir, allez au Lettres de créance onglet, appuyez sur le Créer des identifiants bouton et sélectionnez Clé API.

Vous devriez maintenant voir un popup contenant votre clé API secrète.

2. Créer un nouveau projet Android

Lancez Android Studio et créez un nouveau projet avec une activité vide. Je vous suggère de choisir au moins le niveau 19 de l'API pour le SDK minimum pris en charge..

Bien que cela ne soit pas obligatoire, il est toujours judicieux d'utiliser une bibliothèque réseau robuste pour communiquer avec la plateforme Google Cloud Machine Learning. Dans ce didacticiel, nous utiliserons une telle bibliothèque appelée Fuel. Ajouter comme un compiler dépendance dans le app modules build.gradle fichier:

compiler 'com.github.kittinunf.fuel: fuel-android: 1.5.0'

presse Synchroniser maintenant mettre à jour votre projet.

Ensuite, notre application aura besoin de la L'INTERNET autorisation de communiquer avec les serveurs de Google. Par conséquent, ajoutez la ligne suivante dans le fichier manifeste du projet:

Enfin, ajoutez votre clé API à la values ​​/ strings.xml fichier:

ABCDEF12345-abcdef12345-123

3. Utilisation de l'API Vision

L'API Vision vous aide à créer des applications capables de voir et de comprendre l'environnement de l'utilisateur. La détection des visages, la détection des émotions, la reconnaissance optique des caractères et l'annotation d'images en font partie. Pour le moment, nous nous concentrerons uniquement sur la puissante fonction d'annotation d'image, également appelée détection d'étiquette, qui, à mon avis, est très utile..

Comme on pouvait s'y attendre, l'API attend une image comme l'une de ses entrées. Par conséquent, laissez-nous maintenant créer un écran où l'utilisateur peut prendre des photos en utilisant l'appareil photo de l'appareil.

Étape 1: créer une mise en page

La disposition de notre écran doit avoir Bouton vous pouvez appuyer sur un widget pour prendre une photo, un ImageView widget pour afficher l'image, et un Affichage widget pour afficher les étiquettes ou les annotations générées par l’API. En conséquence, ajoutez le code suivant au fichier XML de présentation de votre activité:

Notez que nous avons associé un sur clic gestionnaire avec le bouton. Nous allons le définir dans la prochaine étape.

Étape 2: créer une intention

En créant une nouvelle intention avec le ACTION_IMAGE_CAPTURE l'action et en le passant à la startActivityForResult () méthode, vous pouvez demander à l’application par défaut de la caméra de l’appareil de l’utilisateur de prendre des photos et de les transmettre à votre application. Par conséquent, ajoutez le code suivant à votre Activité classe:

public final static int MY_REQUEST_CODE = 1; public void takePicture (Afficher la vue) Intention Intention = nouvelle intention (MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult (intent, MY_REQUEST_CODE); 

Afin de recevoir les images capturées par l'application appareil photo par défaut, vous devez remplacer le onActivityResult () méthode de votre Activité classe. Dans la méthode, vous aurez accès à un Paquet objet contenant toutes les données de l'image. Vous pouvez rendre les données d'image en les convertissant simplement en un Bitmap et en le passant à la ImageView widget.

@Override protected void onActivityResult (int requestCode, int resultCode, données d'intention) if (requestCode == MY_REQUEST_CODE && resultCode == RESULT_OK) // Convertir les données d'image en bitmap Image bitmap = (Bitmap) data.getExtras (). Get ( "Les données"); // Définit le bitmap en tant que source de ImageView ((ImageView) findViewById (R.id.previewImage)) .setImageBitmap (picture); // Plus de code va ici

Si vous exécutez l'application maintenant et prenez une photo, vous verrez que la taille de la photo est assez petite. Tout va bien, cependant, l'API Cloud Vision est très précise, même avec les vignettes d'images..

Étape 3: Encoder l'image

L'API Vision ne peut pas utiliser Bitmap objets directement. Au lieu de cela, il attend une chaîne codée en Base64 de données d'image compressées.

Pour compresser les données d'image, vous pouvez utiliser le compresse() méthode du Bitmap classe. En tant qu’arguments, la méthode attend le format de compression à utiliser, la qualité de sortie souhaitée et un ByteArrayOutputStream objet. Le code suivant compresse le bitmap en utilisant le format JPEG et garantit également que la qualité de l'image résultante est suffisamment élevée:

ByteArrayOutputStream byteStream = nouveau ByteArrayOutputStream (); picture.compress (Bitmap.CompressFormat.JPEG, 90, byteStream);

Vous pouvez maintenant générer la chaîne Base64 en utilisant le encodeToString () méthode du Base64 classe.

String base64Data = Base64.encodeToString (byteStream.toByteArray (), Base64.URL_SAFE);

Étape 4: traiter l'image

Après tous ces efforts, vous avez tout ce dont vous avez besoin pour interagir avec l’API Vision. Commencez par créer une chaîne contenant à la fois l'URL de l'API et votre clé d'API:

String requestURL = "https://vision.googleapis.com/v1/images:annotate?key=" + getResources (). GetString (R.string.mykey);

Pour envoyer des données à l'API, vous devez créer une demande HTTP POST. Le corps de la demande doit être un document JSON contenant les données d'image codées en Base64. Pour la détection des étiquettes, le document doit également avoir un fonctionnalités tableau contenant la valeur LABEL_DETECTION. Voici le format du document JSON:

"demandes": ["image": "contenu":  , "features": ["type": "LABEL_DETECTION"]]

Bien qu'il soit possible de coder manuellement le document JSON, sa création par programme est moins sujette aux erreurs. Le code suivant vous montre comment procéder en utilisant le JSONObject et JSONArray Des classes:

// Crée un tableau contenant // la fonctionnalité LABEL_DETECTION. JSONArray features = new JSONArray (); JSONObject feature = new JSONObject (); feature.put ("type", "LABEL_DETECTION"); features.put (fonctionnalité); // Créer un objet contenant // les données d'image codées en Base64 JSONObject imageContent = new JSONObject (); imageContent.put ("contenu", base64Data); // Place le tableau et l'objet dans une requête unique // puis place la requête dans un tableau de requêtes JSONArray request = new JSONArray (); JSONObject request = new JSONObject (); request.put ("image", imageContent); request.put ("fonctionnalités", fonctionnalités); requests.put (request); JSONObject postData = new JSONObject (); postData.put ("requêtes", requêtes); // Convertit le JSON en une chaîne // String body = postData.toString ();

À ce stade, nous pouvons utiliser le poster() méthode du Carburant classe pour effectuer la requête HTTP POST. En tant que seul argument, la méthode attend l'URL de l'API. Vous devez également inclure le contenu-longueur et type de contenu en-têtes dans la demande. Pour ce faire, utilisez le entête() méthode. De même, pour ajouter le document JSON au corps de la demande POST, utilisez la commande poster() méthode.

Enfin, en appelant le responseString () méthode et en passant une nouvelle instance du Gestionnaire classe, vous pouvez obtenir de manière asynchrone la réponse de la requête sous forme de chaîne. En conséquence, ajoutez le code suivant:

Fuel.post (requestURL) .header (nouvelle paire)("content-length", body.length ()), nouvelle paire("content-type", "application / json")) .body (body.getBytes ()) .responseString (nouveau gestionnaire() Succès public vide de @Override (demande de requête @NotNull, réponse de réponse @NotNull, données de chaîne) // Plus de code va ici Défaillance de la void publique @Override (requête de requête @NotNull, @NotNull FuelError fuelError ) );

Lorsque vous utilisez la fonctionnalité de détection d'étiquettes, Vision API renvoie un document JSON contenant des étiquettes. Avec chaque étiquette, vous obtenez également un score spécifiant la précision de l'étiquette. Le document ressemble à ceci:

"réponses": ["labelAnnotations": ["mid": "/ m / id1", "description": "label1", "score": 0.91, "mid": "/ m / id2" , "description": "label2", "partition": 0,90,…]

Pour le moment, passons simplement en revue tous les objets du labelAnnotations tableau et ajouter la valeur de chaque la description clé de la Affichage widget de notre mise en page. Voici comment vous pouvez le faire à l’intérieur du Succès() méthode du Gestionnaire classe:

// Accès aux tableaux labelAnnotations JSONArray labels = new JSONObject (data) .getJSONArray ("answers") .getJSONObject (0) .getJSONArray ("labelAnnotations"); String results = ""; // Boucle dans le tableau et extrait la clé de description // pour chaque élément de (int i = 0; i

Vous pouvez maintenant exécuter l'application, prendre une photo de tout objet à proximité et voir les étiquettes générées par Vision API..

4. Utilisation de l'API de traduction

Comme son nom l'indique, l'API de traduction en nuage peut traduire du texte vers plus de 100 langues. En l'utilisant efficacement, vous pouvez créer des applications intelligentes pouvant communiquer avec vos utilisateurs dans leur propre langue..

Dans l'étape précédente, vous avez vu que les étiquettes générées par notre application sont en anglais. Ajoutons maintenant un bouton pour traduire ces étiquettes en allemand..

Étape 1: mettre à jour la mise en page

Ajouter un Bouton vers la fin de la présentation de votre activité en utilisant le code suivant:

Notez que ce bouton a aussi un sur clic gestionnaire d'événement qui doit être défini dans votre Activité classe.

Étape 2: Traduire les étiquettes

L'utilisation de l'API de traduction est beaucoup plus simple que l'utilisation de l'API Vision, principalement parce qu'il n'est pas nécessaire de créer un document JSON pour définir votre demande. Au lieu de cela, vous pouvez simplement lui passer des paramètres dans une chaîne de requête.

Créer le traduire en allemand () méthode et, à l'intérieur, créer une chaîne contenant l'URL de l'API de traduction.

void public translateToGerman (Afficher la vue) String requestURL = "https://translation.googleapis.com/language/translate/v2"; // Plus de code va ici

Pour ajouter des champs à la chaîne de requête de l'URL ci-dessus, nous pouvons utiliser un liste de Paire objets. Les champs suivants sont importants:

  • clé, spécifiant votre clé secrète d'API
  • la source, en spécifiant la langue à partir de laquelle vous souhaitez traduire
  • cible, en spécifiant la langue que vous souhaitez traduire
  • q, spécifier le texte que vous voulez traduire

Le code suivant vous montre comment configurer l'API pour traduire de l'anglais en allemand:

liste> params = new ArrayList <> (); // Ajout de la clé API params.add (nouvelle paire)("clé", getResources (). getString (R.string.mykey))); // Définir les langues source et cible params.add (new Pair("source", "en")); params.add (nouvelle paire("cible", "de"));

Parce que la chaîne de requête peut contenir plusieurs q champs, nous en ajouterons un pour chaque étiquette présente dans notre mise en page Affichage widget. Voici comment:

String [] queries = ((TextView) findViewById (R.id.resultsText)) .getText (). ToString (). Split ("\ n"); for (requête de chaîne: requêtes) params.add (nouvelle paire("q", requête)); 

Enfin, vous pouvez appeler le obtenir() méthode du Carburant classe pour faire une requête HTTP GET à l’API de traduction. Cette fois aussi, vous pouvez utiliser le responseString () méthode pour obtenir de manière asynchrone la réponse sous forme de chaîne.

Fuel.get (requestURL, params) .responseString (nouveau gestionnaire() Succès de l'annulation de public @Override (demande de requête @NotNull, réponse de réponse @NotNull, données de chaîne) // Code supplémentaire ici Echec de l'annulation de public @Override (requête de requête @NotNull, @NotNull FuelError fuelError) );

La réponse de l'API de traduction est un document JSON contenant un tableau de traductions. Il a le format suivant:

"data": "translations": ["translateText": "…", "translationsText": "…",…]

Pour l'instant, à l'intérieur du Succès() méthode du Gestionnaire classe, laissez-nous simplement passer en revue la traductions tableau du document JSON ci-dessus et mettez à jour le contenu du Affichage widget en utilisant les valeurs associées à la texte traduit clés.

// Accéder au tableau de traductions JSONArray translations = new JSONObject (data) .getJSONObject ("data") .getJSONArray ("translations"); // Parcourez le tableau et extrayez la clé translateText // pour chaque élément. String result = ""; pour (int i = 0; i

Si vous exécutez l'application maintenant, générez des étiquettes pour une image et appuyez sur le deuxième bouton, vous devriez pouvoir voir les étiquettes en allemand..

Conclusion

Dans ce didacticiel, vous avez appris à utiliser les API Cloud Vision et Cloud Translation, qui font partie de la plateforme Google Cloud Machine Learning, dans une application Android. Il existe de nombreuses autres API de ce type proposées par la plate-forme. Vous pouvez en apprendre plus à leur sujet en consultant la documentation officielle. 

Pendant que vous êtes ici, consultez certains de nos autres tutoriels sur la façon d'utiliser les services d'apprentissage et de cloud computing dans vos applications Android.!