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.
Per sfruttare al massimo questo tutorial, tutto ciò di cui hai bisogno è:
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.
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
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.
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.
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.
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);
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; iOra 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 tuoAttività
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 quiPer aggiungere campi alla stringa di query dell'URL precedente, possiamo usare a
Elenco
diPaio
oggetti. I seguenti campi sono importanti:
chiave
, specificando la tua chiave API segretafonte
, specificando la lingua da cui vuoi tradurrebersaglio
, specificando la lingua in cui vuoi tradurreq
, specificando il testo che vuoi tradurreIl 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 layoutTextView
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 delCarburante
classe per fare una richiesta HTTP GET all'API di traduzione. Anche questa volta, puoi usare ilresponseString ()
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 delhandler
classe, passiamo semplicemente al ciclotraduzioni
array del documento JSON sopra, e aggiornare il contenuto del fileTextView
widget utilizzando i valori associati atranslatedText
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; iSe 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!