Come utilizzare Google Cloud Machine Learning Services per Android

Le notizie di questi giorni sono piene di parole d'ordine come automazione, intelligenza artificiale e apprendimento automatico. Questo è probabilmente il motivo per cui sempre più utenti di smartphone iniziano a cercare app più intelligenti. Come un normale sviluppatore di app per Android, tuttavia, probabilmente non hai le risorse necessarie per creare tali app da zero.

Fortunatamente, Google ha recentemente lanciato una piattaforma di Cloud Machine Learning, che offre reti neurali che sono state pre-addestrate per eseguire una serie di attività. La maggior parte dei suoi modelli non sono solo molto accurati, ma anche in costante miglioramento. E indovina cosa? Puoi usarli semplicemente facendo alcune chiamate API REST!

In questo tutorial, ti presenterò alla piattaforma Cloud Machine Learning e ti mostrerò come utilizzarlo per creare un'app Android intelligente in grado di riconoscere oggetti del mondo reale e nominarli in più lingue.

Prerequisiti

Per sfruttare al massimo questo tutorial, tutto ciò di cui hai bisogno è:

  • l'ultima versione di Android Studio
  • un dispositivo con Android 4.4 o versioni successive
  • e un account Google Cloud Platform

1. Acquisizione di una chiave API

Per poter utilizzare i servizi di apprendimento automatico di Google nell'app per Android, è necessaria una chiave API. Puoi ottenerne uno creando un nuovo progetto nella console di Google Cloud Platform.

Inizia accedendo alla console e premendo il tasto Crea un nuovo progetto pulsante. Nella finestra di dialogo che si apre, dai un nome significativo al progetto.

Una volta che il progetto è stato creato, vai a Gestore API> Dashboard e premere il Abilita API pulsante.

Nella schermata successiva, sotto il Google Cloud Machine Learning voce, sarete in grado di vedere tutte le diverse API di apprendimento automatico disponibili. In questo tutorial, utilizzeremo solo le API Vision e Translation.

Per abilitare l'API Vision, fai clic sul relativo link e premi il tasto Abilitare pulsante.

Allo stesso modo, per abilitare l'API di traduzione, fai clic sul relativo link e premi il tasto Abilitare pulsante.

Avrai bisogno di una sola chiave per utilizzare entrambe le API. Per ottenerlo, vai al Credenziali scheda, premere il Crea credenziali pulsante e selezionare Chiave API.

Ora dovresti vedere un popup contenente la tua chiave API segreta.

2. Creazione di un nuovo progetto Android

Avvia Android Studio e crea un nuovo progetto con un'attività vuota. Ti suggerisco di scegliere almeno il livello API 19 per l'SDK minimo supportato.

Anche se non è necessario, è sempre consigliabile utilizzare una robusta libreria di rete per comunicare con la piattaforma Google Cloud Machine Learning. In questo tutorial, useremo una di queste librerie chiamata Fuel. Aggiungilo come compilare dipendenza nel App modulo di build.gradle file:

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

stampa Sincronizza ora per aggiornare il tuo progetto.

Successivamente, la nostra app avrà bisogno del INTERNET permesso di comunicare con i server di Google. Pertanto, aggiungi la seguente riga all'interno del file manifest del progetto:

Infine, aggiungi la tua chiave API a Valori / strings.xml file:

ABCDEF12345-abcdef12345-123

3. Utilizzo dell'API Vision

L'API Vision ti aiuta a creare app in grado di vedere e dare un senso all'ambiente dell'utente. Il rilevamento dei volti, il rilevamento delle emozioni, il riconoscimento ottico dei caratteri e l'annotazione delle immagini sono alcune delle sue numerose funzioni. Per il momento, ci concentreremo solo sulla potente funzione di annotazione delle immagini, chiamata anche rilevamento delle etichette, che, a mio parere, è molto utile.

Come ci si potrebbe aspettare, l'API si aspetta un'immagine come uno dei suoi input. Pertanto, creiamo ora una schermata in cui l'utente può scattare foto utilizzando la fotocamera del dispositivo.

Passaggio 1: creare un layout

Il layout del nostro schermo deve avere un Pulsante widget che l'utente può premere per scattare una foto, a ImageView widget per visualizzare l'immagine e a TextView widget per visualizzare le etichette o le annotazioni generate dall'API. Di conseguenza, aggiungi il seguente codice al file XML di layout della tua attività:

Nota che abbiamo associato un al clic gestore con il pulsante. Lo definiremo nel passaggio successivo.

Passaggio 2: creare un intento

Creando un nuovo intento con il ACTION_IMAGE_CAPTURE azione e passandola al startSubActivity () metodo, puoi chiedere all'applicazione fotocamera predefinita del dispositivo dell'utente di scattare foto e trasmetterle alla tua app. Pertanto, aggiungi il seguente codice al tuo Attività classe:

public final static int MY_REQUEST_CODE = 1; public void takePicture (Visualizza vista) Intent intent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult (intent, MY_REQUEST_CODE); 

Per ricevere le immagini catturate dall'app fotocamera predefinita, è necessario ignorare il onActivityResult () metodo del tuo Attività classe. All'interno del metodo, avrai accesso a a impacchettare oggetto contenente tutti i dati dell'immagine. È possibile rendere i dati dell'immagine semplicemente convertendoli in a Bitmap e passandolo al ImageView widget di.

@Override protetto void onActivityResult (int requestCode, int resultCode, Intent data) if (requestCode == MY_REQUEST_CODE && resultCode == RESULT_OK) // Converti dati immagine in bitmap Bitmap picture = (Bitmap) data.getExtras (). Get ( "dati"); // Imposta la bitmap come origine di ImageView ((ImageView) findViewById (R.id.previewImage)) .setImageBitmap (immagine); // Più codice va qui

Se esegui l'app ora e fai una foto, vedrai che la dimensione dell'immagine è piuttosto piccola. Va bene, però: l'API di Cloud Vision è molto accurata anche con le miniature delle immagini.

Passaggio 3: codifica l'immagine

L'API Vision non può essere utilizzata Bitmap oggetti direttamente. Invece, si aspetta una stringa codificata Base64 di dati immagine compressi.

Per comprimere i dati dell'immagine, puoi usare il comprimere() metodo del Bitmap classe. Come argomenti, il metodo si aspetta che il formato di compressione sia utilizzato, la qualità di output desiderata e a ByteArrayOutputStream oggetto. Il seguente codice comprime la bitmap utilizzando il formato JPEG e si assicura anche che la qualità dell'immagine risultante sia sufficientemente alta:

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

Ora puoi generare la stringa Base64 usando il encodeToString () metodo del Base64 classe.

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

Passaggio 4: elaborare l'immagine

Dopo tutto questo duro lavoro, hai tutto il necessario per interagire con l'API Vision. Inizia creando una stringa che contenga sia l'URL dell'API che la tua chiave API:

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

Per inviare dati all'API, è necessario creare una richiesta POST HTTP. Il corpo della richiesta deve essere un documento JSON contenente i dati dell'immagine con codifica Base64. Per il rilevamento dell'etichetta, il documento deve anche avere un Caratteristiche array contenente il valore LABEL_DETECTION. Ecco il formato del documento JSON:

"richieste": ["immagine": "contenuto":  , "caratteristiche": ["tipo": "LABEL_DETECTION"]

Sebbene sia possibile codificare manualmente il documento JSON, la sua creazione a livello di programmazione è meno soggetta a errori. Il seguente codice mostra come farlo usando JSONObject e JSONArray classi:

// Crea un array che contiene // la funzione LABEL_DETECTION Caratteristiche di JSONArray = new JSONArray (); Funzione JSONObject = new JSONObject (); feature.put ("type", "LABEL_DETECTION"); features.put (funzione); // Crea un oggetto contenente // i dati dell'immagine con codifica Base64 JSONObject imageContent = new JSONObject (); imageContent.put ("content", base64Data); // Mettere la matrice e l'oggetto in una singola richiesta // e quindi inserire la richiesta in una serie di richieste JSONArray requests = new JSONArray (); JSONObject request = new JSONObject (); request.put ("image", imageContent); request.put ("caratteristiche", caratteristiche); requests.put (richiesta); JSONObject postData = new JSONObject (); postData.put ("richieste", richieste); // Converte il JSON in un // string String body = postData.toString ();

A questo punto, possiamo usare il inviare() metodo del Carburante classe per rendere la richiesta HTTP POST. Come unico argomento, il metodo si aspetta l'URL dell'API. Devi anche includere il content-length e tipo di contenuto intestazioni nella richiesta. Per fare ciò, utilizzare il intestazione() metodo. Allo stesso modo, per aggiungere il documento JSON al corpo della richiesta POST, utilizzare il comando inviare() metodo.

Infine, chiamando il responseString () metodo e passando una nuova istanza di handler class ad esso, è possibile ottenere in modo asincrono la risposta della richiesta come una stringa. Di conseguenza, aggiungere il seguente codice:

Fuel.post (requestURL) .header (nuova coppia("content-length", body.length ()), new Pair("content-type", "application / json")) .body (body.getBytes ()) .responseString (nuovo gestore() @Override successo void pubblico (@NotNull Richiesta richiesta, @NotNull Risposta risposta, Dati stringa) // Più codice va qui @Override pubblico void failure (@NotNull Richiesta richiesta, @NotNull Risposta risposta, @NotNull FuelError fuelError ) );

Quando si utilizza la funzione di rilevamento etichette, l'API Vision restituisce un documento JSON contenente etichette. Insieme a ciascuna etichetta, ottieni anche un punteggio che specifica quanto è accurata l'etichetta. Il documento si presenta così:

"risposte": ["labelAnnotations": ["mid": "/ m / id1", "description": "label1", "score": 0.91, "mid": "/ m / id2" , "description": "label2", "score": 0.90, ...]

Per ora, passiamo in rassegna tutti gli oggetti nel labelAnnotations array e aggiungere il valore di ciascuno descrizione chiave per il TextView widget del nostro layout. Ecco come puoi farlo all'interno del successo() metodo del handler classe:

// Accede all'etichettaAnnotazioni array JSONArray labels = new JSONObject (data) .getJSONArray ("responses") .getJSONObject (0) .getJSONArray ("labelAnnotations"); String results = ""; // Passa attraverso l'array ed estrai la // descrizione chiave per ogni oggetto per (int i = 0; i

Ora puoi eseguire l'app, scattare una foto di qualsiasi oggetto nelle vicinanze e visualizzare le etichette generate dall'API Vision.

4. Utilizzo dell'API di traduzione

L'API di Cloud Translation, come suggerisce il nome, può tradurre il testo da e verso oltre 100 lingue. Usandolo in modo efficace, è possibile creare app intelligenti in grado di comunicare con gli utenti nella propria lingua.

Nel passaggio precedente hai notato che le etichette che la nostra app genera sono in inglese. Aggiungiamo ora un pulsante per tradurre queste etichette in tedesco.

Passaggio 1: aggiorna il layout

Aggiungere un Pulsante widget verso la fine del layout della tua attività utilizzando il seguente codice:

Si noti che questo pulsante ha anche un al clic gestore di eventi che deve essere definito nel tuo Attività classe.

Passaggio 2: Traduci le etichette

L'utilizzo dell'API di traduzione è molto più semplice dell'utilizzo dell'API Vision, principalmente perché non è necessario creare un documento JSON per definire la richiesta. Invece, puoi semplicemente passare i parametri ad esso in una stringa di query.

Crea il translateToGerman () metodo e, al suo interno, crea una stringa contenente l'URL dell'API di traduzione.

public void translateToGerman (View view) String requestURL = "https://translation.googleapis.com/language/translate/v2"; // Più codice va qui

Per aggiungere campi alla stringa di query dell'URL precedente, possiamo usare a Elenco di Paio oggetti. I seguenti campi sono importanti:

  • chiave, specificando la tua chiave API segreta
  • fonte, specificando la lingua da cui vuoi tradurre
  • bersaglio, specificando la lingua in cui vuoi tradurre
  • q, specificando il testo che vuoi tradurre

Il seguente codice mostra come configurare l'API per tradurre dall'inglese al tedesco:

Elenco> params = new ArrayList <> (); // Aggiungi la chiave API params.add (nuova coppia("chiave", getResources (). getString (R.string.mykey))); // Imposta le lingue di origine e di destinazione params.add (nuova coppia("fonte", "en")); params.add (nuova coppia("target", "de"));

Perché la stringa di query può contenere più elementi q campi, ne aggiungeremo uno per ogni etichetta presente all'interno del nostro layout TextView widget di. Ecco come:

String [] queries = ((TextView) findViewById (R.id.resultsText)) .getText (). ToString (). Split ("\ n"); for (Query stringa: query) params.add (nuova coppia("q", query)); 

Infine, puoi chiamare il ottenere() metodo del Carburante classe per fare una richiesta HTTP GET all'API di traduzione. Anche questa volta, puoi usare il responseString () metodo per ottenere in modo asincrono la risposta come una stringa.

Fuel.get (requestURL, params) .responseString (nuovo gestore() @Override successo void pubblico (@NotNull Richiesta richiesta, @NotNull Risposta risposta, Dati stringa) // Altro codice qui @Override pubblico void failure (@NotNull Richiesta richiesta, @NotNull Risposta risposta, @NotNull FuelError fuelError) );

La risposta dell'API di traduzione è un documento JSON che contiene una serie di traduzioni. Ha il seguente formato:

"data": "traduzioni": ["translationText": "...", "translationText": "...", ...]

Per ora, dentro il successo() metodo del handler classe, passiamo semplicemente al ciclo traduzioni array del documento JSON sopra, e aggiornare il contenuto del file TextView widget utilizzando i valori associati a translatedText chiavi.

// Accesso all'array di traduzioni JSONArray translations = new JSONObject (data) .getJSONObject ("data") .getJSONArray ("translations"); // Passa attraverso l'array ed estrai la chiave // ​​tradotta per ogni elemento String result = ""; per (int i = 0; i

Se ora esegui l'app, generi etichette per un'immagine e premi il secondo pulsante, dovresti poter vedere le etichette in tedesco.

Conclusione

In questo tutorial, hai imparato a utilizzare le API di Cloud Vision e Cloud Translation, che fanno parte della piattaforma Google Cloud Machine Learning, in un'app Android. Ci sono molte altre API simili offerte dalla piattaforma. Puoi saperne di più su di loro facendo riferimento alla documentazione ufficiale. 

Mentre sei qui, dai un'occhiata ad alcuni dei nostri altri tutorial su come utilizzare i servizi di machine learning e cloud nelle tue app Android!