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.
Per poter seguire questo tutorial, devi avere:
Se alcuni dei suddetti requisiti non ti sembrano familiari, ti suggerisco di leggere il seguente tutorial introduttivo sulla piattaforma Google Cloud Machine Learning:
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.
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:
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.
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.
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);
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 ();
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.
Elencofaces = 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
:
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; iOra 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 romanzoI 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 entrambiTEXT_DETECTION
oDOCUMENT_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 ilgetFullTextAnnotation ()
metodo per ottenere unTextAnnotation
oggetto contenente tutto il testo estratto.final TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();Puoi quindi chiamare il
getText ()
metodo delTextAnnotation
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!