Cum să utilizați serviciile Google Learning Cloud Machine pentru Android

Știri în aceste zile sunt pline de buzzwords cum ar fi automatizarea, inteligența artificială și învățarea în mașină. Probabil că din ce în ce mai mulți utilizatori de smartphone-uri încep să caute aplicații mai inteligente. Ca dezvoltator obișnuit de aplicații Android, cu toate acestea, probabil că nu aveți resursele necesare pentru a crea astfel de aplicații de la zero.

Din fericire, Google a lansat recent o platformă Cloud Machine Learning, care oferă rețele neuronale care au fost pre-instruite pentru a efectua o varietate de sarcini. Majoritatea modelelor sale nu numai că sunt foarte precise, dar și se îmbunătățesc constant. Si ghici ce? Puteți să le utilizați pur și simplu făcând câteva apeluri REST API!

În acest tutorial vă prezint platforma Cloud Machine Learning și vă arăt cum să o utilizați pentru a crea o aplicație Android inteligentă care poate recunoaște obiecte din lumea reală și le poate numi în mai multe limbi.

Cerințe preliminare

Pentru a profita la maximum de acest tutorial, tot ce aveți nevoie este:

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

1. Obținerea unei chei API

Pentru a putea utiliza serviciile de învățare a mașinilor Google în aplicația dvs. Android, aveți nevoie de o cheie API. Puteți obține una prin crearea unui nou proiect în consola platformei Google Cloud.

Începeți prin a vă conecta la consola și apăsați pe Creați un nou proiect buton. În dialogul care apare, dați un nume semnificativ proiectului.

Odată ce proiectul a fost creat, mergeți la Managerul API> tabloul de bord și apăsați tasta Activați API-ul buton.

În ecranul următor, în secțiunea Google Cloud Machine Learning , veți putea vedea toate API-urile de învățare automată disponibile pentru dvs. În acest tutorial, vom folosi doar API-urile de viziune și traducere.

Pentru a activa API-ul Vision, faceți clic pe link-ul său și apăsați pe Permite buton.

În mod similar, pentru a activa API-ul de traducere, faceți clic pe link-ul său și apăsați pe Permite buton.

Veți avea nevoie de o singură cheie pentru a utiliza ambele API-uri. Pentru ao obține, du-te la scrisori de acreditare , apăsați pe Creați acreditări și selectați Cheia API.

Ar trebui să vedeți un pop-up care conține cheia ta API secretă.

2. Crearea unui nou proiect Android

Activați Android Studio și creați un nou proiect cu o activitate goală. Vă sugerez să alegeți cel puțin nivelul 19 API pentru SDK-ul minim suportat.

Deși nu este necesar, este întotdeauna o idee bună să folosiți o bibliotecă de rețea puternică pentru a comunica cu platforma Google Learning Cloud Machine. În acest tutorial, vom folosi o astfel de bibliotecă numită Fuel. Adăugați-o ca pe compila dependența în aplicaţia ale modulului build.gradle fişier:

compilați com.github.kittinunf.fuel: fuel-android: 1.5.0 '

presa Sincronizați acum pentru a vă actualiza proiectul.

Apoi, aplicația noastră va avea nevoie de INTERNET permisiunea de a comunica cu serverele Google. Prin urmare, adăugați următoarea linie în fișierul manifest al proiectului:

În cele din urmă, adăugați cheia API la Valorile / strings.xml fişier:

ABCDEF12345-abcdef12345-123

3. Utilizarea API-ului Vision

API-ul Vision vă ajută să creați aplicații care pot vedea și înțelege mediul utilizatorului. Detectarea feței, detectarea emoțiilor, recunoașterea optică a caracterelor și adnotarea imaginilor sunt unele dintre multele sale caracteristici. Deocamdată, vom concentra doar pe caracteristica puternică de adnotare a imaginii, numită și detectarea etichetelor - care, după părerea mea, este foarte utilă.

Așa cum v-ați putea aștepta, API se așteaptă ca o imagine ca una dintre intrările sale. Prin urmare, să creați acum un ecran în care utilizatorul să poată face fotografii utilizând camera aparatului.

Pasul 1: Creați un aspect

Ecranul nostru are un a Buton widget pe care utilizatorul îl poate apăsa pentru a face o fotografie, o ImageView widget pentru a afișa imaginea și a TextView widget pentru a afișa etichetele sau adnotările generate de API. În consecință, adăugați următorul cod în fișierul XML de aspect al activității dvs .:

Rețineți că am asociat unul onClick handler cu butonul. O vom defini în etapa următoare.

Pasul 2: Creați un intenție

Prin crearea unei noi intenții cu ACTION_IMAGE_CAPTURE acțiune și transmiterea acesteia către startActivityForResult () , puteți să solicitați aplicației implicite de cameră a dispozitivului utilizatorului să realizeze fotografii și să le transmită aplicației dvs. Prin urmare, adăugați următorul cod la dvs. Activitate clasă:

public final static int MY_REQUEST_CODE = 1; public void takePicture (Vizualizare vedere) Intent intent = new Intent (MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult (intenție, MY_REQUEST_CODE); 

Pentru a primi imaginile captate de aplicația implicită pentru cameră, trebuie să ignorați onActivityResult () metoda dvs. Activitate clasă. În interiorul metodei, veți avea acces la a Pachet obiect care conține toate datele de imagine. Puteți face datele imaginii prin transformarea acestora într-un Bitmap și trecerea la ImageView widget.

@Override protejat void onActivityResult (int requestCode, int resultCode, date intelect) if (requestCode == MY_REQUEST_CODE && resultCode == RESULT_OK) // Conversia datelor de imagine pe bitmap Bitmap picture = (Bitmap) data.getExtras () "date"); // Setați bitmap-ul ca sursă a ImageView ((ImageView) findViewById (R.id.previewImage)) .setImageBitmap (imagine); // Mai multe coduri sunt aici

Dacă rulați aplicația acum și faceți o fotografie, veți vedea că dimensiunea imaginii este destul de mică. Totul este în regulă - API-ul Cloud Vision este foarte precis chiar și cu miniaturile de imagini.

Pasul 3: codificați imaginea

API-ul Vision nu poate folosi Bitmap obiecte direct. În schimb, se așteaptă ca un șir de date comprimate codate Base64.

Pentru a comprima datele de imagine, puteți utiliza comprima() metodă a Bitmap clasă. Ca argumente, metoda se așteaptă ca formatul de compresie să fie utilizat, calitatea de ieșire dorită și a ByteArrayOutputStream obiect. Următorul cod comprimă bitmap-ul utilizând formatul JPEG și asigură, de asemenea, că calitatea imaginii rezultate este suficient de mare:

ByteArrayOutputStream byteStream = nou ByteArrayOutputStream (); picture.compress (Bitmap.CompressFormat.JPEG, 90, byteStream);

Acum puteți genera șirul Base64 folosind encodeToString () metodă a base64 clasă.

String base64Data = Base64.encodeToString (byteStream.toByteArray (), Base64.URL_SAFE);

Pasul 4: Procesați imaginea

După toată munca grea, aveți tot ce aveți nevoie pentru a interacționa cu API-ul Vision. Începeți prin crearea unui șir care conține atât adresa URL a API, cât și cheia API:

Cerere de șirURL = "https://vision.googleapis.com/v1/images:annotate?key=" + getResources (). GetString (R.string.mykey);

Pentru a trimite date către API, trebuie să creați o cerere POST HTTP. Corpul cererii trebuie să fie un document JSON care conține datele de imagine codate Base64. Pentru detectarea etichetelor, documentul trebuie să aibă și a caracteristici array care conține valoarea LABEL_DETECTION. Iată formatul documentului JSON:

"solicitări": ["imagine": "content":  , "caracteristici": ["tip": "LABEL_DETECTION"]

Deși este posibilă codarea manuală a documentului JSON, crearea acestuia în mod programat este mai puțin predispusă la erori. Următorul cod vă arată cum să faceți acest lucru folosind obiect JSON și JSONArray clase:

// Creați un matrice care conține // caracteristica LABEL_DETECTION Funcțiile JSONArray = nou JSONArray (); Caracteristică JSONObject = nou JSONObject (); feature.put ("tip", "LABEL_DETECTION"); features.put (caracteristica); // Creați un obiect care conține // datele de imagine codate Base64 JSONObject imageContent = new JSONObject (); imageContent.put ("conținut", bază64Data); // Pune matricea și obiectul într-o singură cerere // și apoi pune cererea într-o serie de cereri JSONArray requests = new JSONArray (); Solicitare JSONObject = nou JSONObject (); request.put ("imagine", imagineContent); request.put ("caracteristici", caracteristici); requests.put (cerere); JSONObject postData = nou JSONObject (); postData.put ("cereri", cereri); // Convertiți JSON-ul într-un // string String body = postData.toString ();

În acest moment, putem folosi post() metodă a Combustibil pentru a efectua solicitarea HTTP POST. Ca singurul său argument, metoda se așteaptă la adresa URL a API-ului. Trebuie să includeți și Conținutul de lungime și tipul de conținut anteturile din cerere. Pentru a face acest lucru, utilizați antet() metodă. În mod similar, pentru a adăuga documentul JSON la corpul solicitării POST, utilizați post() metodă.

În cele din urmă, sunând la responseString () și transmiterea unei noi instanțe a manipulant pentru aceasta, puteți obține în mod asincron răspunsul solicitării ca șir. În consecință, adăugați următorul cod:

Fuel.post (requestURL) .header (noua pereche("content-length", body.length ()), o pereche nouă("tip de conținut", "aplicație / json")) .body (body.getBytes ()) .responseString() @Override public void success (@NotNull Cerere de solicitare, @NotNull răspuns răspuns, String date) // Mai mult cod merge aici @Override publice void eșec (@NotNull Solicitare cerere, @NotNull răspuns răspuns, @NotNull FuelError fuelError ) );

Când utilizați caracteristica de detectare a etichetelor, API-ul Vision returnează un document JSON care conține etichete. Împreună cu fiecare etichetă, obțineți și un scor specificând cât de precis este eticheta. Documentul arată astfel:

"răspunsuri": ["etichetăAnnotații": "mijloc": "/ m / id1", "descriere": "label1", " , "descriere": "label2", "scor": 0.90, ...

Deocamdată, hai să trecem prin toate obiectele din labelAnnotations și adăugați valoarea fiecărei Descriere cheie pentru TextView widgetul aspectului nostru. Iată cum puteți face acest lucru în interiorul lui succes() metodă a manipulant clasă:

// Accesați etichetaArticole de notare JSONArray etichete = noi JSONObject (date) .getJSONArray ("răspunsuri") .getJSONObject (0) .getJSONArray ("labelAnnotations"); Rezultate șir = ""; // Faceți buclă prin matrice și extrageți / // tasta de descriere pentru fiecare element pentru (int i = 0; i

Acum puteți rula aplicația, puteți fotografia orice obiect din apropiere și puteți vedea etichetele pe care API-ul Vision le generează.

4. Folosind API-ul de traducere

API-ul pentru traducerea cloud-ului, așa cum sugerează și numele, poate traduce text în și din peste 100 de limbi. Prin utilizarea eficientă a acesteia, puteți crea aplicații inteligente care pot comunica cu utilizatorii dvs. în propriile limbi.

În pasul anterior, ați văzut că etichetele pe care aplicația noastră le generează sunt în limba engleză. Să adăugăm acum un buton pentru a traduce aceste etichete în limba germană.

Pasul 1: Actualizați aspectul

Adauga o Buton widget spre sfârșitul aspectului activității dvs. utilizând următorul cod:

Observați că și acest buton are o funcție onClick manipulare eveniment care trebuie să fie definită în Activitate clasă.

Pasul 2: Traduceți etichetele

Utilizarea API-ului de traducere este mult mai ușor decât utilizarea API-ului Vision, în primul rând pentru că nu trebuie să creați un document JSON pentru a defini cererea dvs. În schimb, puteți pur și simplu să transmiteți parametrii într-un șir de interogări.

Creați translateToGerman () și, în interiorul acestuia, să creeze un șir care să conțină URL-ul API-ului de traducere.

public void translateToGerman (Vizualizare vizualizare) solicitare șirURL = "https://translation.googleapis.com/language/translate/v2"; // Mai multe coduri aici

Pentru a adăuga câmpuri la șirul de interogări de la adresa URL de mai sus, putem folosi a Listă de Pereche obiecte. Următoarele câmpuri sunt importante:

  • cheie, specificând cheia ta API secretă
  • sursă, specificând limba în care doriți să traduceți
  • ţintă, specificând limba în care doriți să traduceți
  • q, specificând textul pe care doriți să-l traduceți

Următorul cod vă arată cum să configurați API-ul pentru a traduce din engleză în germană:

Listă> params = noul ArrayList <> (); // Adăugați cheia API params.add (noua pereche("cheie", getResources (), getString (R.string.mykey)); // Setați limbile sursă și țintă params.add (noua pereche("sursă", "en")); params.add (noua pereche("țintă", "de"));

Deoarece șirul interogării poate conține mai multe q câmpuri, vom adăuga unul pentru fiecare etichetă care este prezentă în interiorul layout-ului nostru TextView widget. Iată cum:

String [] interogări = ((TextView) findViewById (R.id.resultsText)) .getText (). ToString () split ("\ n"); pentru (interogare de coarde: interogări) params.add (new Pair("q", interogare)); 

În cele din urmă, puteți apela obține() metodă a Combustibil pentru a face o cerere HTTP GET către API-ul de traducere. Și de această dată puteți utiliza responseString () pentru a obține răspunsul asincron ca șir.

Fuel.get (requestURL, paramuri) .responseString (new Handler() @Override public void success (@NotNull Request request, @NotNull Response response, String data) // Mai mult cod aici @Override public void eșec (@NotNull Solicitare cerere, @NotNull Răspuns răspuns, @NotNull FuelError fuelError) );

Răspunsul API-ului de traducere este un document JSON care conține o serie de traduceri. Are următorul format:

"date": "traduceri": "traducereText": "...", "traducereText": "...", ...]

Deocamdată, în interiorul succes() metodă a manipulant clasa, să ne purtăm pur și simplu prin traduceri a documentului JSON de mai sus și să actualizeze conținutul TextView widget utilizând valorile asociate cu translatedText chei.

// Accesați matricea traducerilor JSONArray translations = new JSONObject (data) .getJSONObject ("data") .getJSONArray ("traduceri"); // Faceți buclă prin matrice și extrageți cheia translatedText // pentru fiecare element String result = ""; pentru (int i = 0; i

Dacă rulați aplicația acum, generați etichete pentru o imagine și apăsați al doilea buton, ar trebui să vedeți etichetele în limba germană.

Concluzie

În acest tutorial, ați învățat cum să utilizați API-urile Cloud Vision și Cloud Translation, care fac parte din platforma Google Cloud Learning, într-o aplicație Android. Există multe alte API-uri oferite de platformă. Puteți afla mai multe despre ele prin trimiterea la documentația oficială. 

În timp ce sunteți aici, verificați câteva din celelalte instrucțiuni despre cum să utilizați serviciile de învățare în mașină și serviciile cloud în aplicațiile Android!

Cod