Nu ar fi minunat dacă o aplicație Android ar putea vedea și înțelege împrejurimile sale? Vă puteți imagina cât de mult ar putea fi interfața sa de utilizator dacă ar putea să se uite la utilizatorii săi și să cunoască imediat vârstele, genurile și emoțiile lor? Ei bine, o astfel de aplicație ar putea părea futuristă, dar este pe deplin posibil astăzi.
Cu ajutorul serviciului de recunoaștere vizuală IBM Watson, crearea de aplicații mobile care să detecteze cu precizie și să analizeze obiectele din imagini este mai ușor ca oricând. În acest tutorial, vă vom arăta cum să îl utilizați pentru a crea o aplicație Android inteligentă care poate ghici vârsta și sexul unei persoane și poate identifica obiecte proeminente într-o fotografie.
Pentru a putea urmări acest tutorial, trebuie să aveți:
Ca toate serviciile Watson, serviciul de recunoaștere vizuală trebuie să fie activat manual înainte de a putea fi utilizat într-o aplicație. Deci, conectați-vă la consola IBM Bluemix și navigați la Servicii> Watson. În pagina care se deschide, apăsați pe Creați serviciul Watson buton.
Din lista de servicii disponibile afișată în continuare, alegeți Recunoaștere vizuală.
Acum puteți da un nume semnificativ serviciului și apăsați pe Crea buton.
Odată ce serviciul este gata, va fi generată o cheie API. Puteți să îl vizualizați deschizând Serviciul de acreditare și apăsați pe Vizualizați acreditările buton.
În acest tutorial, vom folosi serverele Watson Java și Android SDK în timp ce interacționăm cu serviciul de recunoaștere vizuală. De asemenea, vom folosi biblioteca Picasso pentru a prelua și afișa imagini de pe Internet. Prin urmare, adăugați următoarele punerea în aplicare
dependențele față de dvs. aplicaţia
ale modulului build.gradle fişier:
implementare com.ibm.watson.developer_cloud: recunoaștere vizuală: 3.9.1 'implementare' com.ibm.watson.developer_cloud: android-sdk: 0.4.2 'implementare' com.squareup.picasso: picasso: 2.5.2 '
Pentru a putea interacționa cu serverele Watson, aplicația dvs. va avea nevoie de aceasta INTERNET
permisiune, solicitați-o în proiectul dvs. AndroidManifest.xml fişier.
În plus, aplicația pe care o vom crea azi va avea nevoie de acces la camera foto și la mediile de stocare externe, deci trebuie să solicitați și APARAT FOTO
și WRITE_EXTERNAL_STORAGE
permisiuni.
În cele din urmă, adăugați cheia API a serviciului de recunoaștere vizuală la strings.xml fişier.
a1234567890bcdefe
Watson Java SDK expune toate caracteristicile pe care le oferă serviciul de recunoaștere vizuală prin VisualRecognition
clasă. De aceea, trebuie să inițializați o instanță a acestuia folosind constructorul său, care așteaptă ca o dată de versiune și cheia API ca argumente.
În timp ce utilizați serviciul de recunoaștere vizuală, de obicei, doriți să faceți fotografii cu aparatul foto al aparatului. Aplicația Watson Android SDK are o caracteristică CameraHelper
pentru a vă ajuta să faceți acest lucru. Deși nu trebuie să vă sugerăm, de asemenea, să inițializați o instanță a acesteia în interiorul activității dvs. onCreate ()
metodă.
private VisualRecognition vrClient; privat helper CameraHelper; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); // Initializează clientul de recunoaștere vizuală vrClient = nou VisualRecognition (VisualRecognition.VERSION_DATE_2016_05_20, getString (R.string.api_key)); // Initializeaza helper camera helper = CameraHelper nou (aceasta);
În acest moment, aveți tot ce aveți nevoie pentru a începe analizarea imaginilor cu serviciul.
Serviciul de recunoaștere vizuală poate detecta o mare varietate de obiecte fizice. Ca intrare, se așteaptă o imagine rezonabilă, a cărei rezoluție este de cel puțin 224 x 224 pixeli. Pentru moment, să folosim camera aparatului pentru a face o astfel de fotografie.
Utilizatorul trebuie să aibă posibilitatea de a apăsa un buton pentru a face fotografia, astfel încât fișierul XML al aranjamentului activității trebuie să aibă a Buton
widget. De asemenea, trebuie să aibă o TextView
widget pentru a lista obiectele detectate.
Opțional, puteți să aruncați un ImageView
widget pentru a afișa imaginea.
În codul de mai sus, am adăugat un handler pentru evenimentul pe clic la Buton
widget. Puteți genera un stub pentru acest widget în codul acestuia făcând clic pe becul indicat lângă acesta.
public void takePicture (Vedere vedere) // Mai mult cod aici
Poți să faci o fotografie doar prin apelarea CameraHelper
obiecte dispatchTakePictureIntent ()
astfel încât să adăugați următorul cod în cadrul procesorului de evenimente:
helper.dispatchTakePictureIntent ();
Metoda de mai sus utilizează aplicația implicită pentru cameră a aparatului pentru a realiza fotografia. Asta înseamnă că pentru a avea acces la fotografia făcută, trebuie să suprascrieți activitatea dvs. onActivityResult ()
și căutați rezultate ale căror coduri de solicitare sunt REQUEST_IMAGE_CAPTURE
. Iată cum puteți face acest lucru:
@Override protejat void onActivityResult (int requestCode, int resultCode, date intenție) super.onActivityResult (requestCode, resultCode, data); if (requestCode == CameraHelper.REQUEST_IMAGE_CAPTURE) // Mai mult cod aici
Odată ce ați găsit rezultatul potrivit, puteți extrage imaginea din ea sub forma unui Bitmap
obiect folosind getBitmap ()
metodă a CameraHelper
clasă. De asemenea, puteți obține calea absolută a imaginii folosind ia fisierul()
metodă. Vom avea nevoie atât de bitmap cât și de calea absolută, deci adăugați următorul cod:
foaia finală Bitmap = helper.getBitmap (resultCode); ultimul fișier photoFile = helper.getFile (resultCode);
Dacă ați ales să adăugați ImageView
widget la aspectul dvs., puteți afișa acum imaginea prin trecerea directă a bitmap-ului său setImageBitmap ()
metodă.
ImageView preview = findViewById (R.id.preview); preview.setImageBitmap (foto);
Pentru a detecta elementele din imagine, trebuie să treci imaginea ca o intrare în clasifica()
metodă a VisualRecognition
obiect. Înainte de a face acest lucru, cu toate acestea, trebuie să-l înfășura într-o ClassifyImagesOptions
obiect, care poate fi creat folosind ClassifyImagesOptions.Builder
clasă.
Valoarea returnată a clasifica()
metoda este a ServiceCall
obiect, care acceptă atât cereri de rețea sincrone cât și asincron. Pentru moment, să o numim a executa()
metoda de a face o cerere sincronă. Desigur, deoarece operațiile de rețea nu sunt permise pe firul UI, trebuie să vă amintiți să faceți acest lucru dintr-un fir nou.
AsyncTask.execute (noul Runnable () @Override public void run () VisualClassification răspuns = vrClient.classify (new ClassifyImagesOptions.Builder () .images (photoFile) .build ()) .execute (); );
clasifica()
metoda este construită pentru a gestiona mai multe imagini simultan. În consecință, răspunsul său este o listă a detaliilor de clasificare. Deoarece lucrăm în prezent cu o singură fotografie, avem nevoie doar de primul articol din listă. Iată cum puteți obține:
Clasificarea de clasificare = answer.getImages (). Get (0); Clasificatorul VisualClassifier = class.getClassifiers (). Get (0);
Serviciul de recunoaștere vizuală tratează fiecare element pe care la detectat ca o clasă separată de tip VisualClassifier.VisualClass
. Apelând getClasses ()
puteți obține o listă cu toate clasele.
Fiecare clasă are, printre alte detalii, un nume și un scor de încredere asociat cu acesta. Codul următor vă arată cum să treceți prin lista de clase și să afișați numele numai a celor ale căror scoruri sunt mai mari de 70% în TextView
widget.
rezultatul final StringBuffer = nou StringBuffer (); pentru (obiect VisualClassifier.VisualClass: classifier.getClasses ()) if (object.getScore ()> 0.7f) output.append ("<") .append(object.getName()) .append("> "); runOnUiThread (noul Runnable () @Override public void run () TextView detectObjects = findViewById (R.id.detected_objects); detectObjects.setText (ieșire););
Rețineți că codul de mai sus utilizează runOnUiThread ()
deoarece conținutul TextView
widgetul poate fi actualizat numai din firul UI.
Dacă rulați aplicația acum și faceți o fotografie, veți putea vedea clasificarea imaginilor Watson care funcționează.
Serviciul de recunoaștere vizuală are o metodă dedicată procesării fețelor umane. Poate determina vârsta și sexul unei persoane în orice fotografie. Dacă persoana este faimoasă, se poate numi și el sau ea.
Analizarea persoanelor cu serviciul de recunoaștere vizuală nu este prea diferită de clasificarea obiectelor. Deci, sunteți liber să reutilizați aspectul pe care l-ați creat mai devreme. Cu toate acestea, pentru a vă prezenta mai multe funcții oferite de serviciu, voi crea un aspect nou, acesta cu o funcționalitate ușor diferită.
De data aceasta, în loc să facem fotografii utilizând camera și să le transmitem serviciului, să trecem direct la acesta o adresă URL de imagine. Pentru a permite utilizatorului să introducă un URL și să înceapă analiza, aspectul nostru va avea nevoie de un Editează textul
widget și a Buton
widget. De asemenea, va avea nevoie de a TextView
widget pentru a afișa rezultatele analizei.
Vă sugerez să adăugați și un ImageView
widget pentru aspect, astfel încât utilizatorul să poată vedea imaginea la care se îndreaptă adresa URL.
În interiorul handler-ului pe care se face clic pe Buton
widget, puteți apela getText ()
metodă a Editează textul
widget pentru a determina adresa URL a imaginii pe care a introdus-o utilizatorul. După ce cunoașteți adresa URL, puteți să o trimiteți pur și simplu lui Picasso sarcină()
și în()
metodele de descărcare și afișare a imaginii în ImageView
widget.
EditareText imageURLInput = findViewById (R.id.image_url); fișierul final Url = imageURLInput.getText (). toString (); ImageView preview = findViewById (R.id.preview); Picasso.with (acest lucru) .load (URL) .into (previzualizare);
Pentru a rula analiza feței pe adresa URL, trebuie să utilizați detectFaces ()
metodă a VisualRecognition
client. La fel ca și clasifica()
metodă, această metodă are nevoie de asemenea VisualRecognitionOptions
obiect ca intrare.
Deoarece deja știți cum să utilizați a executa()
pentru a face cereri sincrone, să sunăm acum Puneți în coadă ()
în schimb, care rulează în mod asincron și are nevoie de o inversare. Următorul cod vă arată cum:
vrClient.detectFaces (noul VisualRecognitionOptions.Builder () .url (url) .build ()) .enqueue (nou ServiceCallback() @Override public void onResponse (răspuns DetectedFaces) // Mai mult cod aici @Override public void onFailure (Excepție e) );
După cum puteți vedea în codul de mai sus, în interiorul onResponse ()
metoda obiectului de apel invers, aveți acces la a DetectedFaces
obiect, care conține o listă a rezultatelor analizei feței. Pentru că am folosit o singură imagine ca intrare, vom avea nevoie doar de primul element din listă. Prin apelarea lui getFaces ()
metoda, veți obține o listă a tuturor Față
obiecte detectate.
Listăfețe = răspuns.getImages (). get (0) .getFaces ();
Fiecare Față
obiect are un domeniu de sex și de vârstă asociate cu acesta, care poate fi accesat prin apelarea getGender ()
și getAge ()
metode.
getGender ()
metoda returnează a Sex
obiect. Trebuie să-i apelați getGender ()
metoda de a obține genul ca un șir, care va fi fie "MALE", fie "FEMALE". În mod similar, getAge ()
metoda returnează un Vârstă
obiect. Prin apelarea lui getMin ()
și getMax ()
metode, puteți determina vârsta aproximativă a feței în ani.
Codul următor vă arată cum să faceți buclă prin lista de Față
obiecte, generați un șir care conține genurile și vârstele tuturor fețelor și afișați-l în TextView
widget:
Executarea șirului = ""; pentru (Fața feței: fețe) output + = "<" + face.getGender().getGender() + ", " + face.getAge().getMin() + " - " + face.getAge().getMax() + " years old>\ n "; TextView personDetails = findViewById (R.id.person_details); personDetails.setText (ieșire);
Iată un rezultat al analizei feței:
Serviciul de recunoaștere vizuală Watson vă face extrem de ușor să creați aplicații care sunt inteligente și conștiente de împrejurimile lor. În acest tutorial, ați învățat cum să îl utilizați cu serverele Watson Java și Android SDK pentru a detecta și a analiza obiecte generice și fețe.
Pentru a afla mai multe despre acest serviciu, vă puteți referi la documentația oficială.
Și asigurați-vă că verificați câteva dintre celelalte postări despre învățarea mașinilor de aici pe Envato Tuts+!