Folosiți Machine Learning pentru a recunoaște imaginile cu IBM Watson

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.

Cerințe preliminare

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

  • un cont IBM Bluemix
  • Android Studio 3.0 Canary 8 sau o versiune ulterioară
  • și un dispozitiv sau emulator care rulează Android 4.4 sau o versiune ulterioară

1. Activarea serviciului de recunoaștere vizuală

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.

2. Configurarea proiectului

Î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

3. Inițializarea unui client de recunoaștere vizuală

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.

4. Detectarea obiectelor

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.

Pasul 1: Definiți aspectul

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

Pasul 2: Faceți o imagine

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);

Pasul 3: Clasificați imaginea

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ă.

5. Analiza fețelor

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.

Pasul 1: Definiți aspectul

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.

  

Pasul 2: Afișați imaginea

Î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);

Pasul 3: Analiza feței

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:

Concluzie

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+!

Cod