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.
Pentru a putea urmări acest tutorial, trebuie să aveți:
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:
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.
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:
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.
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.
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);
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 ();
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
:
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; iAcum 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 romanPaș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 acesteaTEXT_DETECTION
sauDOCUMENT_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țigetFullTextAnnotation ()
metoda de a obține oTextAnnotation
obiect care conține tot textul extras.textul final TextAnnotation text = batchResponse.getResponses () .get (0) .getFullTextAnnotation ();Apoi puteți apela
getText ()
metodă aTextAnnotation
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!