Ș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.
Pentru a profita la maximum de acest tutorial, tot ce aveți nevoie este:
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ă.
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
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.
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.
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.
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);
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; iAcum 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ă înActivitate
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 aiciPentru a adăuga câmpuri la șirul de interogări de la adresa URL de mai sus, putem folosi a
Listă
dePereche
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țiq
, specificând textul pe care doriți să-l traducețiUrmă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 nostruTextView
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ă aCombustibil
pentru a face o cerere HTTP GET către API-ul de traducere. Și de această dată puteți utilizaresponseString ()
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ă amanipulant
clasa, să ne purtăm pur și simplu printraduceri
a documentului JSON de mai sus și să actualizeze conținutulTextView
widget utilizând valorile asociate cutranslatedText
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; iDacă 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!