Cum se utilizează API-ul Google Cloud Vision în aplicațiile Android

Viziunea computerului este considerată o problemă AI-completă. Cu alte cuvinte, rezolvarea ei ar echivala cu crearea unui program care este la fel de inteligent ca și oamenii. Nu este nevoie să spun că un astfel de program urmează să fie creat. Cu toate acestea, dacă ați folosit vreodată aplicații cum ar fi Google Goggles sau Google Photos sau ați vizionat segmentul de pe Google Lens în tastatura Google I / O 2017, probabil că ați realizat că viziunea pe computer a devenit foarte puternică.

Printr-un API bazat pe REST numit API Cloud Vision, Google împărtășește tehnologiile sale revoluționare vizuale cu toți dezvoltatorii. Prin utilizarea API-ului, puteți adăuga fără efort funcții impresionante, cum ar fi detectarea feței, detectarea emoțiilor și recunoașterea optică a caracterelor în aplicațiile Android. În acest tutorial, vă voi arăta cum.

Cerințe preliminare

Pentru a putea urmări acest tutorial, trebuie să aveți:

  • un cont Google Cloud Platform
  • un proiect pe consola Google Cloud
  • cea mai recentă versiune de Android Studio
  • și un dispozitiv care rulează Android 4.4 sau o versiune ulterioară

Dacă unele dintre cerințele de mai sus sunt necunoscute pentru dvs., vă sugerăm să citiți următorul tutorial introductiv despre platforma Google Cloud Learning:

1. Activarea API-ului Cloud Vision

Puteți utiliza API-ul Cloud Vision în aplicația dvs. Android numai după ce l-ați activat în consola Google Cloud și ați achiziționat o cheie API valabilă. Începeți prin a vă conecta la consola și navigați la API Manager> Bibliotecă> Vision API. În pagina care se deschide, apăsați pur și simplu tasta Permite buton.

Dacă ați generat deja o cheie API pentru proiectul consolei dvs. Cloud, puteți să treceți la pasul următor deoarece veți putea reutiliza cu API-ul Cloud Vision. În caz contrar, deschideți scrisori de acreditare și selectați Creați acreditări> cheia API.

În caseta de dialog care apare, veți vedea cheia API.

2. Adăugarea dependențelor

Ca majoritatea altor API-uri oferite de Google, API-ul Cloud Vision poate fi accesat folosind biblioteca Client API Google. Pentru a utiliza biblioteca în proiectul dvs. Android Studio, adăugați următoarele compila dependențele în aplicaţia ale modulului build.gradle fişier:

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

Mai mult, pentru a simplifica operațiunile de intrare / ieșire a fișierelor, vă sugerez să adăugați și a compila dependență pentru biblioteca Apache Commons IO.

compile 'commons-io: commons-io: 2.5'

Deoarece clientul API Google poate funcționa numai dacă aplicația dvs. are INTERNET permisiune, asigurați-vă că următoarea linie este prezentă în fișierul manifest al proiectului:

3. Configurarea clientului API

Trebuie să configurați clientul API Google înainte să îl utilizați pentru a interacționa cu API-ul Cloud Vision. Acest lucru implică în primul rând specificarea cheii API, a transportului HTTP și a fabricii JSON pe care ar trebui să o utilizeze. După cum v-ați aștepta, transportul HTTP va fi responsabil pentru comunicarea cu serverele Google, iar fabrica JSON va fi, printre altele, responsabilă pentru conversia rezultatelor bazate pe JSON pe care API le generează în obiecte Java. 

Pentru aplicațiile Android moderne, Google vă recomandă să utilizați aplicația NetHttpTransport clasa ca transportul HTTP și AndroidJsonFactory clasa ca fabrica JSON.

Viziune clasa reprezintă Clientul API Google pentru Cloud Vision. Deși este posibil să creați o instanță a clasei utilizând constructorul său, faceți acest lucru folosind Vision.Builder clasa este mai ușor și mai flexibil.

În timpul utilizării Vision.Builder clasa, trebuie să vă amintiți să apelați setVisionRequestInitializer () pentru a specifica cheia API. Următorul cod vă arată cum:

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

Odata ce Vision.Builder instanța este gata, puteți să o numiți construi() metodă de generare a unui nou Viziune exemplu pe care îl puteți utiliza în întreaga aplicație.

Viziune viziune = visionBuilder.build ();

În acest moment, aveți tot ce aveți nevoie pentru a începe să utilizați API-ul Cloud Vision.

4. Detectarea și analizarea fețelor

Detectarea fețelor în fotografii este o cerință foarte comună în aplicațiile legate de viziunea calculatoarelor. Cu API-ul Cloud Vision, puteți crea un detector de față foarte precis, care poate, de asemenea, să identifice emoțiile, condițiile de iluminare și reperele față.

Din motive de demonstrație, vom rula detectarea feței pe următoarea fotografie, care conține echipajul Apollo 9:

Vă sugerăm să descărcați o versiune de înaltă rezoluție a fotografiei de pe Wikimedia Commons și să o plasați în proiectul dvs. res / raw pliant.

Pasul 1: codificați fotografia

Cloud Vision API se așteaptă ca imaginea sa să fie codificată ca șir Base64 care este plasat în interiorul unui Imagine obiect. Înainte de a genera un astfel de obiect, cu toate acestea, trebuie să convertiți fotografia pe care ați descărcat-o, care este în prezent o resursă de imagine brută, într-o octet matrice. Puteți face rapid acest lucru prin deschiderea fluxului de intrare folosind openRawResource () metodă a Resurse clasă și transmiterea acesteia către toByteArray () metodă a IOUtils clasă.

Deoarece operațiile de I / O ale fișierelor nu ar trebui să fie difuzate pe firul UI, asigurați-vă că faceți o fire nouă înainte de a deschide fluxul de intrare. Următorul cod vă arată cum:

// Crearea unui nou thread AsyncTask.execute (new Runnable () @Override public void run () // Conversia fotografiei în byte array InputStream inputStream = getResources () openRawResource (R.raw.photo); byte [] photoData = IOUtils.toByteArray (inputStream); inputStream.close (); // Mai mult cod aici);

Acum puteți crea un Imagine obiect apelând constructorul său implicit. Pentru a adăuga octet array la ea ca un șir Base64, tot ce trebuie să faceți este să treci matrice la ei encodeContent () metodă.

Introducere imagineImage = Imagine nouă (); inputImage.encodeContent (photoData);

Pasul 2: Faceți o solicitare

Deoarece API-ul Cloud Vision oferă mai multe caracteristici diferite, trebuie să specificați explicit caracteristica care vă interesează în timp ce faceți o solicitare. Pentru a face acest lucru, trebuie să creați o Caracteristică obiect și numiți-l settype () metodă. Următorul cod vă arată cum să creați un Caracteristică Obiect numai pentru detectarea feței:

Funcția dorităFeature = Funcție nouă (); desiredFeature.setType ( "FACE_DETECTION");

Utilizarea Imagine si Caracteristică obiecte, acum puteți compune un AnnotateImageRequest instanță.

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

Rețineți că o AnnotateImageRequest obiect trebuie să aparțină mereu unui BatchAnnotateImagesRequest obiect deoarece API-ul Cloud Vision este proiectat pentru a procesa mai multe imagini simultan. Pentru a inițializa o BatchAnnotateImagesRequest exemplu conținând un singur AnnotateImageRequest obiect, puteți utiliza Arrays.asList () metoda de utilitate.

BatchAnnotateImagesRequest batchRequest = noua BatchAnnotateImagesRequest (); batchRequest.setRequests (Arrays.asList (cerere));

Pentru a face cererea de detectare a feței, trebuie să apelați a executa() metoda unui Adnota obiect care a fost inițializat folosind BatchAnnotateImagesRequest obiect pe care l-ai creat. Pentru a genera un astfel de obiect, trebuie să apelați adnota() oferită de clientul API Google pentru Cloud Vision. Iată cum:

BatchAnnotateImagesResponse batchResponse = viziune.imagini () adnotă (batchRequest) .execute ();

Pasul 3: Utilizați răspunsul

Odată ce cererea a fost procesată, veți obține o BatchAnnotateImagesResponse obiect care conține răspunsul API. Pentru o cerere de detectare a feței, răspunsul conține a FaceAnnotation obiect pentru fiecare față API a detectat. Puteți obține o listă cu toate FaceAnnotation obiecte utilizând getFaceAnnotations () metodă.

Listă fețe = batchResponse.getResponses () .get (0) .getFaceAnnotații ();

A FaceAnnotation obiect conține multe informații utile despre o față, cum ar fi locația, unghiul și emoția pe care o exprimă. Începând cu versiunea 1, API poate detecta doar următoarele emoții: bucurie, durere, furie și surpriză.

Pentru a păstra scurt acest tutorial, permiteți-ne să afișăm acum următoarele informații într-un Paine prajita:

  • Numărătoarea fețelor
  • Probabilitatea ca ei să-și exprime bucuria

Poți, bineînțeles, să obțineți numărătoarea fețelor chemând mărimea() metodă a Listă conținând FaceAnnotation obiecte. Pentru a obține probabilitatea ca o persoană să-și exprime bucuria, puteți să-i spuneți numele intuitiv getJoyLikelihood () metoda asociată FaceAnnotation obiect. 

Rețineți că, pentru că un simplu Paine prajita poate afișa doar un singur șir, va trebui să concatenați toate detaliile de mai sus. În plus, a Paine prajita poate fi afișat numai din firul UI, deci asigurați-vă că îl sunați după ce apelați runOnUiThread () metodă. Următorul cod vă arată cum:

// Numără fețe int numberOfFaces = faces.size (); // Obțineți probabilitate de bucurie pentru fiecare dintre fețe Probabilități de șir = ""; pentru (int i = 0; i

Acum puteți continua și rulați aplicația pentru a vedea următorul rezultat:

5. Citirea textului

Procesul de extragere a șirurilor din fotografiile de text se numește recunoașterea optică a caracterelor, sau OCR pe scurt. API-ul Cloud Vision vă permite să creați cu ușurință un cititor de caractere optic care să poată manipula fotografii atât ale textului imprimat, cât și scrisului scris de mână. În plus, cititorul pe care îl creați nu va avea probleme în a citi textul înclinat sau textul care este suprapus pe o imagine colorată.

API oferă două caracteristici diferite pentru OCR:

  • TEXT_DETECTION, pentru a citi cantități mici de text, cum ar fi cele prezente pe panourile sau cărțile
  • și DOCUMENT_TEXT_DETECTION, pentru citirea unor cantități mari de text, cum ar fi cele prezente pe paginile unui roman

Pașii pe care trebuie să urmați pentru a face o solicitare OCR sunt identici cu pașii pe care i-ați urmat pentru a face o cerere de detectare a feței, cu excepția modului în care inițializați Caracteristică obiect. Pentru OCR, trebuie să vă setați tipul la oricare dintre acestea TEXT_DETECTION sau DOCUMENT_TEXT_DETECTION. Pentru moment, hai să mergem cu cei dintâi.

Funcția dorităFeature = Funcție nouă (); desiredFeature.setType ( "TEXT_DETECTION");

Desigur, trebuie, de asemenea, să plasați o fotografie care conține text în interiorul proiectului dvs. res / raw pliant. Dacă nu aveți o astfel de fotografie, puteți folosi această fotografie, care indică un semn de stradă:

Puteți descărca o versiune de înaltă rezoluție a fotografiei de mai sus de pe Wikimedia Commons.

Pentru a începe prelucrarea rezultatelor unei operații OCR, după ce ați obținut BatchAnnotateImagesResponse obiect, trebuie să apelați getFullTextAnnotation () metoda de a obține o TextAnnotation obiect care conține tot textul extras.

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

Apoi puteți apela getText () metodă a TextAnnotation obiect pentru a obține o referință la un șir care conține textul extras.

Următorul cod vă arată modul de afișare a textului extras utilizând a Paine prajita:

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

Dacă rulați aplicația acum, ar trebui să vedeți ceva de genul:

Concluzie

În acest tutorial, ați învățat cum să utilizați API-ul Cloud Vision pentru a adăuga capabilități de detectare a feței, de detectare a emoțiilor și de recunoaștere a caracterului optic la aplicațiile Android. Sunt sigur că veți fi de acord cu mine când vă spun că aceste noi capacități vor permite aplicațiilor dvs. să ofere interfețe utilizator mai intuitive și mai inteligente.

Merită să menționăm că există o caracteristică importantă care lipsește în API-ul Cloud Vision: recunoașterea feței. În forma sa actuală, API poate detecta numai fețele, nu le poate identifica.

Pentru a afla mai multe despre API, vă puteți referi la documentația oficială.

Între timp, verificați unele dintre celelalte tutoriale ale noastre privind adăugarea de aplicații informatice în aplicațiile Android!

Cod