Noțiuni de bază cu Firebase ML Kit pentru Android

Datorită TensorFlow Mobile și TensorFlow Lite, încorporarea și utilizarea modelelor adânci în aplicațiile Android a devenit foarte ușoară. Cu toate acestea, proiectarea și instruirea modelelor necesită încă multă abilitate, timp și efort, ca să nu mai vorbim de puterea de calcul. Din acest motiv, majoritatea dezvoltatorilor ocazionali nu sunt entuziaști în ceea ce privește adăugarea capabilităților de învățare a mașinilor la aplicațiile lor. Cu Firebase ML Kit, Google speră să schimbe acest lucru.

Firebase ML Kit este o bibliotecă care vă permite să obțineți fără efort și cu un cod minim, să utilizați o varietate de modele profunde și pre-instruite adânc în aplicațiile Android. Majoritatea modelelor pe care le oferă sunt disponibile atât la nivel local, cât și pe Google Cloud.

În prezent, modelele se limitează doar la sarcini legate de viziunea calculatorului, cum ar fi recunoașterea optică a caracterelor, scanarea codurilor de bare și detectarea obiectelor.

În acest tutorial, vă voi arăta cum să adăugați Firebase ML Kit într-un proiect Android Studio și să folosiți câteva dintre API-urile de bază.

Cerințe preliminare

Înainte de a continua, asigurați-vă că aveți acces la următoarele:

  • cea mai recentă versiune de Android Studio
  • un dispozitiv sau un emulator care rulează Android API nivel 21 sau superior
  • un cont Firebase
  • un cont Google Cloud

1. Creați un proiect Firebase

Pentru a activa serviciile Firebase pentru aplicația dvs., trebuie să creați un proiect Firebase pentru acesta. Deci, conectați-vă la consola Firebase și apăsați pe ecranul de întâmpinare Adăugați un proiect buton.


În dialogul care apare, dați proiectului un nume ușor de memorat și apăsați pe Creați un proiect buton.


După câteva secunde, ar trebui să vedeți o notificare care vă spune că noul proiect este gata. apasă pe Continua pentru a continua.

În ecranul următor, accesați Dezvolta și faceți clic pe ML Kit link pentru a vedea toate serviciile oferite de ML Kit.

În acest tutorial, vom folosi trei servicii: recunoașterea textului, detectarea feței și etichetarea imaginilor. Nu trebuie să faceți niciun efort pentru a le permite în mod explicit dacă intenționați să lucrați numai cu modelele locale care vin cu kitul ML. În acest tutorial, totuși, vom folosi atât modele locale, cât și cloud-based. Deci, faceți clic pe Utilizarea API-ului Cloud link-ul următor.

Acum veți fi dus la consola Google Cloud, unde puteți apăsa pur și simplu tasta Permite care se afișează în secțiunea API Cloud Vision pentru a activa modelele bazate pe nor. Rețineți însă că acest lucru va funcționa numai dacă ați activat facturarea pentru contul dvs. Google Cloud.

2. Configurați-vă proiectul Android Studio

Înainte de a începe să utilizați API-urile Firebase ML Kit, trebuie să stabiliți o conexiune între proiectul dvs. Android Studio și proiectul Firebase pe care l-ați creat în etapa anterioară. Pentru a face acest lucru, deschideți panoul Firebase Assistant accesând Instrumente> Firebase.

Asistentul Firebase nu are suport pentru Kitul ML în prezent. Cu toate acestea, folosiți-o pentru a adăuga în schimb Firebase Analytics, dar puteți evita să stabiliți manual conexiunea. Prin urmare, extindeți Google Analytics secțiune, faceți clic pe Conectați un eveniment Google Analytics și apăsați butonul Conectați-vă la Firebase buton.

În dialogul care apare, asigurați-vă că selectați Alegeți un Firebase sau un proiect Google existent și alegeți proiectul Firebase pe care l-ați creat.

apasă pe Conectați-vă la Firebase butonul următor. În acest moment, asistentul va descărca automat a google-services.json fișier, conținând chei API și ID-uri de proiect, și adăugați-l la aplicaţia modul.

După ce conexiunea a fost stabilită cu succes, asigurați-vă că apăsați pe Adăugați Google Analytics la aplicația dvs. pentru a adăuga diferite dependențe Firebase de bază la dvs. aplicaţia ale modulului build.gradle fişier.

Apoi, pentru a adăuga de fapt biblioteca Kit ML, deschideți build.gradle fișier și tastați următoarele punerea în aplicare dependențe:

implementare "com.google.firebase: firebase-ml-vision: 16.0.0" implementare "com.google.firebase: firebase-ml-vision-

Pentru a simplifica procesul de descărcare a imaginilor de pe Internet și de afișare a acestora în aplicația dvs., vă sugerăm să adăugați și o dependență pentru biblioteca Picasso.

implementare 'com.squareup.picasso: picasso: 2.5.2'

În plus, adăugați Anko ca dependență pentru a vă asigura că codul dvs. Kotlin este atât concis, cât și intuitiv.

implementare "org.jetbrains.anko: anko-commons: 0.10.5 '

Implicit, modelele locale ale Kitului Firebase ML sunt descărcate automat în dispozitivele utilizatorilor dvs. numai atunci când este necesar. Dacă doriți să fie descărcate de îndată ce este instalată aplicația dvs., adăugați următorul cod la AndroidManifest.xml fişier:

3. Definiți un aspect

În acest tutorial, vom crea o aplicație care permite utilizatorilor să introducă URL-uri ale imaginilor și să realizeze operații de recunoaștere a textului, detectare a feței și operații de etichetare a imaginilor pe ele. Prin urmare, aspectul aplicației trebuie să aibă un Editează textul widget, în cazul în care utilizatorii pot introduce în URL-uri, și trei Buton widget-uri, care le-au lăsat să aleagă ce operație doresc să facă. 

Opțional, puteți include un ImageView widget pentru a afișa imaginile.

Dacă poziționați toate widgeturile de mai sus utilizând a RelativeLayout widgetul dvs., fișierul dvs. XML de aspect ar trebui să vă placă acest lucru:

     

Iată o reprezentare mai vizuală a aspectului:

În XML de mai sus, este posibil să fi observat că fiecare buton are un onClick atribut care indică o metodă de manipulare a evenimentului pe clic. Aceste metode nu există încă, deci creați-le în interiorul activității dvs. acum.

(v: View) // Pentru a face distractiv detectaFaces (v: View) // Pentru a face distractiv generateLabels (v: View) // Pentru a face

4. Încărcați o imagine

Când utilizatorul apasă tasta Terminat cheie după introducerea adresei URL a unei imagini în Editează textul widget, aplicația noastră trebuie să descarce imaginea și să o afișeze în interiorul ImageView widget.

Pentru a detecta acțiunile efectuate pe tastatura virtuală a utilizatorului, asociați-o OnEditorActionListener obiect cu Editează textul widget. În interiorul ascultătorului, după ce a confirmat că IME_ACTION_DONE acțiunea a fost efectuată, puteți să-i numiți pe Picasso sarcină() și în() metodele de încărcare și afișare a imaginii.

În consecință, adăugați următorul cod în interiorul onCreate () metoda de activitate:

image_url_field.setOnEditorActionListener _, action, _ -> dacă (action == EditorInfo.IME_ACTION_DONE) Picasso.with (ctx) .load (image_url_field.text.toString ()) .into (image_holder) true false

5. Recunoașteți textul

Kitul Firebase ML are clase de detector separate pentru toate operațiile de recunoaștere a imaginii pe care le oferă. Pentru a recunoaște textul, trebuie fie să utilizați FirebaseVisionTextDetector clasa, care depinde de un model local, sau de a folosi FirebaseVisionCloudTextDetector clasa, care depinde de un model bazat pe nor. Pentru moment, hai să folosim primul. Este mult mai rapid, dar se poate ocupa doar de textul scris în alfabetul latin.

Un detector Kit ML se așteaptă ca intrarea să fie sub formă de a FirebaseVisionImage obiect. Pentru a crea un astfel de obiect, tot ce trebuie să faceți este să apelați fromBitmap () metoda de utilitate a FirebaseVisionImage clasa și să transmită un bitmap. Următorul cod, care trebuie adăugat la recognizeText () manipulare de evenimente pe care am creat-o mai devreme, vă arată cum să convertiți imaginea afișată în layout ImageView widget într-un bitmap, și apoi creați un FirebaseVisionImage obiecte din el:

val textImage = FirebaseVisionImage.fromBitmap ((image_holder.drawable ca BitmapDrawable) .bitmap)

Apoi, pentru a obține o referință la a FirebaseVisionTextDetector obiect, trebuie să utilizați a FirebaseVision instanță.

val detector = FirebaseVision.getInstance (). viziuneTextDetector

Acum puteți începe procesul de recunoaștere a textului apelând detectInImage () metoda și trecerea FirebaseVisionImage obiectează la ea. Deoarece metoda rulează asincron, ea returnează a Sarcină obiect. În consecință, pentru a putea procesa rezultatul atunci când este disponibil, trebuie să atașați unul OnCompleteListener de exemplu. Iată cum:

detector.detectInImage (textImage) .addOnCompleteListener // Mai mult cod aici

În interiorul ascultătorului, veți avea acces la o listă de bloc obiecte. În general, fiecare bloc poate fi considerat ca un paragraf separat detectat în imagine. Privind la text proprietățile tuturor bloc obiecte, puteți determina tot textul care a fost detectat. Următorul cod vă arată cum să faceți acest lucru:

var detectatText = "" it.result.blocks.forFiecare detectText + = it.text + "\ n"

Modul în care utilizați textul detectat depinde, bineînțeles, de dvs. Pentru moment, să-l afișăm doar utilizând un dialog de alertă. Mulțumită lui Anko alerta() funcția, acest lucru ia foarte puțin cod.

runOnUiThread alertă (detectatăText, "Text"). show ()

În codul de mai sus, runOnUiThread () metodă asigură că alerta() funcția este rulată pe firul principal al aplicației.

În cele din urmă, odată ce ați terminat de folosit detectorul, trebuie să vă amintiți să-l sunați închide() pentru a elibera toate resursele pe care le deține.

detector.close ()

Dacă rulați aplicația acum, introduceți adresa URL a unei imagini care conține o mulțime de text și apăsați pe Text buton, ar trebui să puteți vedea serviciul de recunoaștere a textului ML Kit în acțiune.

Modelul ML Kit local pentru recunoașterea textului este destul de precis cu cele mai multe tipuri de text imprimat.

6. Detectați chipurile

Chiar dacă nu împărtășesc nici o interfață comună la nivel înalt, majoritatea claselor detectorilor au metode identice. Asta înseamnă că detectarea fețelor într-o imagine nu este prea diferită de recunoașterea textului. Cu toate acestea, rețineți că ML Kit oferă în prezent doar un model local pentru detectarea feței, care poate fi accesat utilizând FirebaseVisionFaceDetector clasă. Puteți obține o referință la o instanță a acestuia folosind FirebaseVision clasă.

Adăugați următorul cod la detectFaces () metodă:

val detector = FirebaseVision.getInstance (). viziuneFaceDetector

Apelând detectInImage () metoda din nou și trecerea unui bitmap la aceasta, puteți porni procesul de detectare a feței în mod asincron. Folosind un OnCompleteListener instanță atașată la Sarcină obiect se întoarce, puteți ști cu ușurință când procesul este complet.

detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable ca BitmapDrawable) .bitmap)). addOnCompleteListener // Mai mult cod aici

În interiorul ascultătorului, veți avea acces la o listă de FirebaseVisionFace obiecte care conțin coordonatele dreptunghiurilor care circumscriu fețele detectate. Deci, haideți să desenăm acele dreptunghiuri peste o copie a imaginii originale care a fost procesată.

Pentru a crea o copie a bitmap-ului imaginii originale, trebuie să-l utilizați copie() după cum se arată mai jos:

var marcatBitmap = (image_holder.drawable ca BitmapDrawable) .bitmap .copy (Bitmap.Config.ARGB_8888, true)

Apoi, pentru a putea să folosiți noua bitmap, trebuie să creați pânză și A picta obiecte pentru el. Folosirea unei culori ușor transparente pentru dreptunghiuri ar fi ideală.

val canvas = Canvas (marcatBitmap) val paint = Paint (Paint.ANTI_ALIAS_FLAG) paint.color = Culoare.parseColor ("# 99003399") // albastru semi-transparent

În acest moment, puteți pur și simplu trece prin lista de FirebaseVisionFace obiecte și să le folosească casetă de încadrare proprietăți pentru a desena dreptunghiuri peste fețele detectate.

it.result.forFiecare canvas.drawRect (it.boundingBox, vopsea)

În cele din urmă, nu uitați să treceți noul bitmap la ImageView widget după ce e gata.

runOnUiThread image_holder.setImageBitmap (marcatBitmap)

Dacă rulați aplicația acum, ar trebui să puteți efectua detectarea feței pe orice imagine care are persoane în ea.

Sunt sigur că veți fi impresionat de operațiile de detectare a feței ML cât mai rapide și mai precise.

7. Generați etichete

Pentru a genera etichete pentru o imagine, trebuie să utilizați modelul local FirebaseVisionLabelDetector clasa sau modelul bazat pe nor FirebaseVisionCloudLabelDetector clasă. Deoarece am folosit numai modele locale în acest tutorial, să folosim acum modelul cloud. Pentru a obține o referință la o instanță a FirebaseVisionCloudLabelDetector clasa, trebuie să utilizați din nou FirebaseVision clasă.

Adăugați următorul cod la generateLabels () metodă:

val detector = FirebaseVision.getInstance (). viziuneCloudLabelDetector

Apoi, ca de obicei, apelați detectInImage () și a atribui un OnCompleteListener de exemplu la valoarea sa de retur.

detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable ca BitmapDrawable) .bitmap)). addOnCompleteListener // Mai mult cod aici

De data aceasta, în interiorul ascultătorului, veți avea acces la o listă de FirebaseVisionCloudLabel obiecte, fiecare dintre ele având o eticheta proprietate care conține o etichetă potențială pentru imagine. Fiecare etichetă are de asemenea a încredere proprietățile asociate acestuia, specificând cât de sigur este Kitul ML despre etichetă.

Următorul cod vă arată cum să treceți prin lista de etichete și să generați o fereastră de alertă care să afișeze numai etichetele ale căror scoruri de încredere sunt mai mari de 70%.

var output = "" it.result.forEach if (it.confidence> 0.7) ieșire + = it.label + "\ n" runOnUiThread alertă (ieșire, "etichete"

Continuați și rulați aplicația din nou pentru a vedea ce etichete generează aplicația dvs. pentru imaginile pe care le aruncați.

Concluzie

Cu ajutorul kitului Firebase ML, Google dorește ca învățarea mașinilor să devină accesibilă și să devină una dintre cele mai simple sarcini, cum ar fi analiza și raportarea la impact. În acest tutorial introductiv, ați învățat cum să lucrați cu unele dintre API-urile de bază ale acestuia în aplicațiile Android. De asemenea, ați învățat cum să utilizați atât modelele nor și modelele locale pe care le oferă.

Pentru a afla mai multe, consultați documentația oficială.

Cod