Come utilizzare l'API di Google Cloud Vision nelle app Android

La visione artificiale è considerata un problema completo dell'IA. In altre parole, risolverlo equivarrebbe a creare un programma intelligente come gli umani. Inutile dire che un tale programma deve ancora essere creato. Tuttavia, se hai mai utilizzato app come Google Goggles o Google Foto o hai guardato il segmento su Google Lens nella nota chiave di Google I / O 2017, probabilmente ti rendi conto che la visione artificiale è diventata molto potente.

Attraverso un'API basata su REST chiamata API Cloud Vision, Google condivide con tutti gli sviluppatori le sue rivoluzionarie tecnologie di visione. Utilizzando l'API, puoi aggiungere facilmente funzionalità impressionanti come il rilevamento del volto, il rilevamento delle emozioni e il riconoscimento ottico dei caratteri alle tue app Android. In questo tutorial, ti mostrerò come.

Prerequisiti

Per poter seguire questo tutorial, devi avere:

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

Se alcuni dei suddetti requisiti non ti sembrano familiari, ti suggerisco di leggere il seguente tutorial introduttivo sulla piattaforma Google Cloud Machine Learning:

1. Abilitazione dell'API di Cloud Vision

Puoi utilizzare l'API di Cloud Vision nella tua app Android solo dopo averlo abilitato nella console di Google Cloud e aver acquisito una chiave API valida. Quindi inizia accedendo alla console e navigando verso Gestione API> Libreria> API Vision. Nella pagina che si apre, basta premere il tasto Abilitare pulsante.

Se hai già generato una chiave API per il tuo progetto della console cloud, puoi saltare al passaggio successivo perché sarai in grado di riutilizzarlo con l'API di Cloud Vision. Altrimenti, apri il Credenziali scheda e selezionare Crea credenziali> Chiave API.

Nella finestra di dialogo che si apre, vedrai la tua chiave API.

2. Aggiunta di dipendenze

Come la maggior parte delle altre API offerte da Google, è possibile accedere all'API di Cloud Vision utilizzando la libreria Client dell'API di Google. Per utilizzare la libreria nel tuo progetto Android Studio, aggiungi quanto segue compilare dipendenze nel App modulo di build.gradle file:

compila 'com.google.api-client: google-api-client-android: 1.22.0' compila 'com.google.apis: google-api-services-vision: v1-rev357-1.22.0' compile 'com. google.code.findbugs: JSR305: 2.0.1'

Inoltre, per semplificare le operazioni di I / O dei file, ti suggerisco di aggiungere anche un compilare dipendenza per la libreria IO di Apache Commons.

compilare 'commons-io: commons-io: 2.5'

Perché il client API di Google può funzionare solo se la tua app ha il INTERNET permesso, assicurati che la seguente riga sia presente nel file manifest del tuo progetto:

3. Configurazione del client API

Devi configurare il client dell'API di Google prima di utilizzarlo per interagire con l'API di Cloud Vision. Ciò implica principalmente la specifica della chiave API, del trasporto HTTP e della factory JSON che dovrebbe utilizzare. Come ci si potrebbe aspettare, il trasporto HTTP sarà responsabile della comunicazione con i server di Google e lo stabilimento JSON, tra le altre cose, sarà responsabile della conversione dei risultati basati su JSON che l'API genera in oggetti Java. 

Per le moderne app Android, Google ti consiglia di utilizzare il NetHttpTransport classe come il trasporto HTTP e il AndroidJsonFactory classe come fabbrica JSON.

Il Visione class rappresenta il client API di Google per Cloud Vision. Sebbene sia possibile creare un'istanza della classe usando il suo costruttore, facendo così usando il Vision.Builder la classe invece è più facile e più flessibile.

Durante l'utilizzo del Vision.Builder classe, è necessario ricordare di chiamare il setVisionRequestInitializer () metodo per specificare la chiave API. Il seguente codice mostra come:

Vision.Builder visionBuilder = new Vision.Builder (nuovo NetHttpTransport (), nuovo AndroidJsonFactory (), null); visionBuilder.setVisionRequestInitializer (new VisionRequestInitializer ("YOUR_API_KEY"));

Una volta il Vision.Builder l'istanza è pronta, puoi chiamarla costruire() metodo per generare un nuovo Visione istanza che puoi utilizzare nella tua app.

Vision vision = visionBuilder.build ();

A questo punto, hai tutto il necessario per iniziare a utilizzare l'API di Cloud Vision.

4. Rilevazione e analisi dei volti

Rilevare volti nelle fotografie è un requisito molto comune nelle applicazioni relative alla visione di computer. Con l'API di Cloud Vision, è possibile creare un rilevatore di volti estremamente accurato in grado di identificare anche emozioni, condizioni di illuminazione e punti di riferimento.

Per motivi di dimostrazione, eseguiremo il rilevamento del volto sulla seguente foto, che include l'equipaggio di Apollo 9:

Ti suggerisco di scaricare una versione ad alta risoluzione della foto da Wikimedia Commons e inserirla nei tuoi progetti res / raw cartella.

Passaggio 1: codifica la foto

L'API di Cloud Vision prevede che l'immagine di input venga codificata come una stringa Base64 inserita in un file Immagine oggetto. Prima di generare un tale oggetto, tuttavia, è necessario convertire la foto che hai scaricato, che è attualmente una risorsa di immagine grezza, in a byte array. Puoi farlo rapidamente aprendo il suo flusso di input usando il openRawResource () metodo del risorse classe e passandolo al toByteArray () metodo del IOUtils classe.

Poiché le operazioni di I / O sui file non devono essere eseguite sul thread dell'interfaccia utente, assicurati di generare un nuovo thread prima di aprire il flusso di input. Il seguente codice mostra come:

// Crea nuovo thread AsyncTask.execute (new Runnable () @Override public void run () // Converti l'array di foto in byte InputStream inputStream = getResources (). OpenRawResource (R.raw.photo); byte [] photoData = IOUtils.toByteArray (inputStream); inputStream.close (); // Altro codice qui);

Ora puoi creare un Immagine oggetto chiamando il suo costruttore predefinito. Per aggiungere il byte array come stringa Base64, tutto ciò che devi fare è passare l'array al suo encodeContent () metodo.

Image inputImage = new Image (); inputImage.encodeContent (photoData);

Passaggio 2: effettuare una richiesta

Poiché l'API di Cloud Vision offre diverse funzionalità, è necessario specificare in modo esplicito la funzione che ti interessa mentre fai una richiesta. Per fare ciò, è necessario creare un caratteristica oggetto e chiamatelo setType () metodo. Il codice seguente mostra come creare un caratteristica oggetto per il solo rilevamento del volto:

Feature desiredFeature = new Feature (); desiredFeature.setType ( "FACE_DETECTION");

Usando il Immagine e il caratteristica oggetti, ora puoi comporre un AnnotateImageRequest esempio.

AnnotateImageRequest request = new AnnotateImageRequest (); request.setImage (inputImage); request.setFeatures (Arrays.asList (desiredFeature));

Si noti che a AnnotateImageRequest l'oggetto deve sempre appartenere a a BatchAnnotateImagesRequest oggetto perché l'API di Cloud Vision è progettata per elaborare più immagini contemporaneamente. Per inizializzare a BatchAnnotateImagesRequest istanza contenente un singolo AnnotateImageRequest oggetto, puoi usare il Arrays.asList () metodo di utilità.

BatchAnnotateImagesRequest batchRequest = new BatchAnnotateImagesRequest (); batchRequest.setRequests (Arrays.asList (richiesta));

Per effettuare effettivamente la richiesta di rilevamento del volto, è necessario chiamare il eseguire() metodo di un Annotare oggetto inizializzato usando il BatchAnnotateImagesRequest oggetto appena creato. Per generare un tale oggetto, devi chiamare il annotare() metodo offerto dal client API di Google per Cloud Vision. Ecco come:

BatchAnnotateImagesResponse batchResponse = vision.images (). Annotate (batchRequest) .execute ();

Passaggio 3: utilizzare la risposta

Una volta che la richiesta è stata elaborata, ottieni a BatchAnnotateImagesResponse oggetto contenente la risposta dell'API. Per una richiesta di rilevamento volto, la risposta contiene a FaceAnnotation oggetto per ogni faccia rilevata dall'API. Puoi ottenere un elenco di tutti FaceAnnotation oggetti che usano il getFaceAnnotations () metodo.

Elenco faces = batchResponse.getResponses () .get (0) .getFaceAnnotations ();

UN FaceAnnotation oggetto contiene molte informazioni utili su un viso, come la sua posizione, il suo angolo e l'emozione che sta esprimendo. A partire dalla versione 1, l'API può solo rilevare le seguenti emozioni: gioia, dolore, rabbia e sorpresa.

Per mantenere questo tutorial breve, mostriamo ora le seguenti informazioni in a Crostini:

  • Il conteggio delle facce
  • La probabilità che esprimano gioia

Puoi, naturalmente, ottenere il conteggio dei volti chiamando il taglia() metodo del Elenco contenente il FaceAnnotation oggetti. Per ottenere la probabilità che un volto esprima gioia, puoi chiamare il nome intuitivamente getJoyLikelihood () metodo degli associati FaceAnnotation oggetto. 

Si noti che perché è semplice Crostini puoi visualizzare solo una singola stringa, dovrai concatenare tutti i dettagli sopra. Inoltre, a Crostini può essere visualizzato solo dal thread dell'interfaccia utente, quindi assicurati di chiamarlo dopo aver chiamato il runOnUiThread () metodo. Il seguente codice mostra come:

// Count faces int numberOfFaces = faces.size (); // Ottieni probabilità di gioia per ogni faccia String likelihoods = ""; per (int i = 0; i

Ora puoi andare avanti ed eseguire l'app per vedere il seguente risultato:

5. Leggere il testo

Il processo di estrazione di stringhe da foto di testo è chiamato riconoscimento ottico dei caratteri o, in breve, OCR. L'API di Cloud Vision consente di creare facilmente un lettore di caratteri ottici in grado di gestire le foto sia del testo stampato che manoscritto. Inoltre, il lettore che crei non avrà problemi a leggere testo angolato o testo sovrapposto a un'immagine colorata.

L'API offre due diverse funzionalità per l'OCR:

  • TEXT_DETECTION, per leggere piccole quantità di testo, come quelle presenti su insegne o copertine di libri
  • e DOCUMENT_TEXT_DETECTION, per leggere grandi quantità di testo, come quello presente sulle pagine di un romanzo

I passi che devi seguire per fare una richiesta OCR sono identici ai passi che hai seguito per fare una richiesta di rilevamento volto, tranne per come hai inizializzato il caratteristica oggetto. Per OCR, è necessario impostarne il tipo su entrambi TEXT_DETECTION o DOCUMENT_TEXT_DETECTION. Per ora, andiamo con il primo.

Feature desiredFeature = new Feature (); desiredFeature.setType ( "TEXT_DETECTION");

Ovviamente, dovrai anche inserire una foto contenente testo all'interno del tuo progetto res / raw cartella. Se non hai una foto del genere, puoi usare questa, che mostra un segnale stradale:

È possibile scaricare una versione ad alta risoluzione della foto sopra da Wikimedia Commons.

Per avviare l'elaborazione dei risultati di un'operazione OCR, dopo aver ottenuto il BatchAnnotateImagesResponse oggetto, è necessario chiamare il getFullTextAnnotation () metodo per ottenere un TextAnnotation oggetto contenente tutto il testo estratto.

final TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();

Puoi quindi chiamare il getText () metodo del TextAnnotation oggetto per ottenere effettivamente un riferimento a una stringa contenente il testo estratto.

Il codice seguente mostra come visualizzare il testo estratto usando a Crostini:

Toast.makeText (getApplicationContext (), text.getText (), Toast.LENGTH_LONG) .show ();

Se esegui la tua app ora, dovresti vedere qualcosa di simile a questo:

Conclusione

In questo tutorial hai imparato come utilizzare l'API di Cloud Vision per aggiungere funzionalità di rilevamento di volti, rilevamento di emozioni e riconoscimento ottico dei caratteri alle tue app Android. Sono sicuro che sarai d'accordo con me quando dico che queste nuove funzionalità consentiranno alle tue app di offrire interfacce utente più intuitive e più intelligenti.

Vale la pena ricordare che c'è una caratteristica importante che manca nell'API di Cloud Vision: riconoscimento facciale. Nella sua forma attuale, l'API può solo rilevare i volti, non identificarli.

Per ulteriori informazioni sull'API, è possibile fare riferimento alla documentazione ufficiale.

E nel frattempo, dai un'occhiata ad alcuni dei nostri altri tutorial sull'aggiunta di computer learning alle tue app Android!