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..
Pour tirer le meilleur parti de ce didacticiel, il vous suffit de:
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.
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
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.
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.
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..
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);
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; iVous 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 votreActivité
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 iciPour ajouter des champs à la chaîne de requête de l'URL ci-dessus, nous pouvons utiliser un
liste
dePaire
objets. Les champs suivants sont importants:
clé
, spécifiant votre clé secrète d'APIla source
, en spécifiant la langue à partir de laquelle vous souhaitez traduirecible
, en spécifiant la langue que vous souhaitez traduireq
, spécifier le texte que vous voulez traduireLe 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 pageAffichage
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 duCarburant
classe pour faire une requête HTTP GET à l’API de traduction. Cette fois aussi, vous pouvez utiliser leresponseString ()
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 duGestionnaire
classe, laissez-nous simplement passer en revue latraductions
tableau du document JSON ci-dessus et mettez à jour le contenu duAffichage
widget en utilisant les valeurs associées à latexte 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; iSi 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.!