Cum să construiți o aplicație mobilă de viziune computerizată în Flutter

Publicat: 2020-04-22

Funcțiile de învățare automată au devenit o necesitate în aplicațiile de astăzi. Ele pot îmbunătăți satisfacția și pot oferi audienței dvs. experiența extraordinară în aplicație pe care și-o dorește. Datorită optimizărilor hardware și software recente, execuția modelelor de învățare automată se mută de la cloud la dispozitivele mobile în sine.

Acest lucru are un impact uriaș asupra experienței utilizatorului, eliminând latența de răspuns și abordând problemele de confidențialitate. Când am decis să construim Planter, o aplicație care îi ajută pe utilizatori să aibă grijă de plantele lor de casă, am știut că lucrul care o putea face să iasă în evidență pe piața de aplicații a fost AI.

Ideea noastră a fost să adăugăm funcționalitatea de a recunoaște tipul de plantă de casă dintr-o imagine, folosind tehnici de viziune computerizată. Datorită optimizărilor TensorFlow Lite ale performanței pe dispozitiv, aplicația poate rula modelul nostru de clasificare numai pe dispozitivul utilizatorului. În acest articol, voi explica cum să pregătiți rapid un model de clasificare a imaginilor și să îl implementez într-o aplicație dezvoltată cu Flutter.

Construirea unui modul de învățare automată în Flutter – pas cu pas

Confruntarea cu o problemă de date mici

Primul pas în construirea unui model de învățare automată este colectarea datelor. Pentru a crea un set de date de antrenament, am folosit Google Images Downloader care ne-a permis să descărcam imagini de plante dintr-o căutare Google, cu drepturi etichetate pentru reutilizare comercială, cu următorul script scurt:

 $ googleimagesdownload --keywords „Zamioculcas zamiifolia” --usage_rights labeled-for-reuse

Setul nostru de date final a constat din aproximativ 70-170 de imagini per specie. Ar fi fost foarte greu să pregătești un model de clasificare a imaginilor performant de la zero, cu atât de puține date.

Din fericire, există câteva rețele neuronale artificiale puternice, pre-antrenate, disponibile public, care pot fi utilizate pentru a construi un clasificator de imagini de înaltă precizie, chiar dacă setul de date este format din doar aproximativ o sută de exemple pentru fiecare clasă. Această tehnică de utilizare și modificare a unui model pre-antrenat la un caz de utilizare specific se numește învățare prin transfer.

Augmentarea datelor

Pentru a profita la maximum de setul nostru de date, am folosit pachetul de preprocesare ImageDataGenerator de la keras, care generează loturi de imagini tensor, sporindu-le din mers. Am folosit următoarele transformări:

  • Răsturnarea intrărilor pe orizontală: horizontal_flip = True
  • Setarea unei valori de schimbare a luminozității din interval: brightness_range = (0,75, 1,25)
  • Forfecare cu intensitatea prevăzută: shear_range = 15
  • Rescalare, prin înmulțirea cu o valoare specificată: rescale=1./255
  • Mărirea și micșorarea: zoom_range=0,4
  • Deplasare în orice direcție: width_shift_range = 0,1, height_shift_range = 0,15
 train_datagen_augment =

           ImageDataGenerator(rotation_range = 30,

           horizontal_flip = Adevărat,

           intervalul_luminozitate = (0,75,1,25),

           shear_range = 15,

           redimensionare=1./255,

           interval_zoom=0,4,

           width_shift_range = 0,1,

           interval_deplasare_înălțime = 0,15)

Instruire

Am folosit NASNet-Mobile, o rețea neuronală convoluțională antrenată pe mai mult de un milion de imagini din setul de date ImageNet. Arhitectura NasNetMobile constă dintr-un set de blocuri construite cu celule de rețea neuronală.

Block este un modul operațional care include transformări cunoscute din rețelele neuronale de clasificare a imaginilor, inclusiv: convoluții normale, convoluții separabile, pooling maxim, pooling mediu, mapare a identității etc. Rețeaua a fost antrenată să atribuie unei imagini 1 din 1000 de categorii care includ animale, flori și mobilier. Ca rezultat, rețeaua a „învățat” reprezentări bogate de caracteristici pentru o gamă largă de imagini.

Am creat modelul nostru parcurgând următorii pași:

  • Eliminați ultimul strat al rețelei pre-antrenate
  • Adăugați un model convoluțional la sfârșitul rețelei
  • Înghețați toate straturile din rețeaua combinată, cu excepția celor care provin din modelul adăugat
  • Antrenați modelul până când precizia încetează să se îmbunătățească
  • Dezghețați toate straturile din ultimul bloc convoluțional înghețat al modelului pre-antrenat
  • Antrenați modelul până când precizia încetează să se îmbunătățească
  • Repetați punctele 5 și 6 de cinci ori
  • Dezghețați întregul model și antrenați-l până când precizia nu se mai îmbunătățește

Evaluarea modelului

Modelul de clasificare al Planterului încearcă să atribuie un tip de plantă unei plante de casă, pe baza fotografiei acesteia. Modelul returnează trei tipuri cărora le-a atribuit cele mai mari probabilități, dintre care utilizatorul poate alege unul. În timpul evaluării modelului, am folosit următoarele două metrici:

  • precizie_categorica,
  • top_k_categorical_accuracy (cu k=3).

Următorul grafic prezintă acuratețea categorică pentru fiecare epocă de antrenament a modelului nostru.

Precizie categorică pentru fiecare epocă de antrenament

Precizia categorică finală pentru setul de evaluare este de 0,870, iar acuratețea categoriei de top 3 este de 0,916. Aceste rezultate au fost foarte satisfăcătoare, ținând cont de dimensiunea redusă a setului de date de antrenament utilizat.

Conversie de model

Dacă dorim ca un model Keras să fie utilizat într-o aplicație mobilă, acesta trebuie convertit într-un obiect TensorFlow Lite FlatBuffer. Acest lucru se poate face cu codul prezentat în exemplul de mai jos.

 import tensorflow.lite ca lite

keras_model_path = "model/keras_model"

tflite_model_path = „model/model.tflite”

model.save(keras_model_path)

convertor = lite.TFLiteConverter.from_keras_model_file(keras_model_path)

tflite_model = convertor.convert()

deschide(tflite_model_path, "wb").write(tflite_model)

Acum că aveam modelul optimizat stocat în calea model/model.tflite, l-am putea folosi cu ușurință în aplicațiile mobile native, folosind:

  • Core ML – pentru aplicațiile iOS
  • Biblioteca de suport Android TensorFlow Lite – pentru aplicații Android

Vă voi arăta acum, pe baza experienței noastre cu Planter, cum să utilizați acel model cu Flutter.

De ce Flutter?

Flutter este un set de instrumente UI deținut de Google. A fost creat pentru a construi aplicații compilate nativ pentru mobil, web și desktop dintr-o singură bază de cod. Dacă vă întrebați dacă ar trebui să utilizați Flutter, vă recomand să citiți acest articol, care este un studiu de caz al Topline de la Abbey Road Studios dezvoltat în Flutter de Miquido.

Putem folosi modelul nostru cu biblioteca tflite. Este un plugin Flutter pentru accesarea API-ului TensorFlow Lite. Acceptă clasificarea imaginilor, detectarea obiectelor, Pix2Pix, Deeplab și PoseNet atât pe platformele iOS, cât și pe Android.

Pictograma serviciilor de dezvoltare multiplatformă

Ești curios despre dezvoltarea Flutter?

Află mai multe

În procesul nostru de dezvoltare a aplicației, a trebuit să parcurgem următorii pași:

  • Adăugați tflite ca dependență în fișierul nostru pubspec.yaml
  • Creați un folder de active și plasați un fișier de etichetă și un fișier model în el.
  • În pubspec.yaml, adăugați:
 active:

   - active/labels.txt

   - assets/mobilenet_v1_1.0_224.tflite
  • Importați biblioteca tflite:
 import „pachet:tflite/tflite.dart”;
  • Încărcați modelul și etichetele:
 String res = await Tflite.loadModel(

  model: „assets/model.tflite”,

  etichete: „assets/labels.txt”,

  numThreads: 1 // implicit la 1

);
  • Rulați modelul pe o imagine (faceți o predicție):
 var recognitions = await Tflite.runModelOnImage(

        cale: tfResizedImage.path, 

        imageStd: 255.0, 

        numResults: 3, 

        prag: 0,00001, 

        asincron: adevărat    

 );

Ieșirea predicției are formatul prezentat în exemplul următor:

 [{încrederea: 0.03441339731216431, index: 46, etichetă: Vriesea splendens}, {încrederea: 2.086162567138672e-7, index: 7, etichetă: Aphelandra squarrosa}, {16.490.086162567138672e-7. }]
  • Eliberați resurse:
 așteaptă Tflite.close();

Rezultate finale

Planter vă permite să adăugați o plantă cu o imagine în biblioteca dvs. Poți obține imaginea făcând o fotografie a plantei tale sau alegând una din galeria telefonului. Modelul de clasificare a plantelor de casă inclus returnează trei specii recunoscute cu cea mai mare probabilitate și le prezintă pe o listă.

Făcând clic pe o specie, veți ajunge la vizualizarea rezumată a plantei, care conține un formular pre-completat cu programe de udare și fertilizare sugerate și câteva informații suplimentare despre plantă. În fluxul de mai jos, puteți vedea un exemplu în care o Zamioculcas zamiifolia este recunoscută într-o imagine realizată cu un telefon cu cameră.

Cum funcționează Planter
Plantatoare - sistem de recunoaștere
Cum să adăugați plante în Planter

Mută-ți Machine Learning pe mobil!

În acest articol, am vrut să vă conving că adăugarea de funcții AI încântătoare pentru utilizatori în aplicația dvs. mobilă poate fi simplă și rapidă. În plus, mutarea execuției modelului pe mobil oferă utilizatorilor dvs. o experiență de utilizator încântătoare prin eliminarea latențelor de răspuns API. De asemenea, ajută la asigurarea securității datelor, deoarece trimiterea datelor în cloud nu este necesară.

Puteți beneficia foarte mult de pe urma utilizării Flutter și a capacității sale de a compila cod pentru aplicațiile native iOS și Android în același timp. Cu puțin efort, puteți face aplicația dvs. să iasă în evidență pe piață și să maximizați păstrarea audienței aplicației.

Ești gata pentru următorul tău proiect? Nu ezitați și luați legătura cu noi!