Până acum ați fi auzit despre rețelele neuronale convoluționale (CNN) și eficacitatea acesteia în clasificarea imaginilor. Precizia CNN-urilor în clasificarea imaginilor este destul de remarcabilă, iar aplicațiile sale din viața reală prin API-uri sunt destul de profunde.

clasificați

Dar, uneori, această tehnică poate să nu fie adecvată. O imagine poate reprezenta mai multe atribute. De exemplu, toate etichetele următoare sunt valabile pentru imaginea de mai jos. Un simplu clasificator s-ar confunda cu ce etichetă să ofere într-un astfel de scenariu.

Această problemă este cunoscută sub numele de Clasificare multi-etichetă.

De ce clasificarea multi-etichetă ?

Există multe aplicații în care este necesară atribuirea mai multor atribute unei imagini. De fapt, este mai natural să ne gândim la imagini ca aparținând mai multor clase decât unei singure clase. Mai jos sunt câteva aplicații ale Clasificării Multi Label.

1. Înțelegerea scenei

Clasificarea cu mai multe etichete oferă o analiză anterioară ușor de calculat pentru algoritmi complexi de înțelegere a scenei. Identificarea diferitelor etichete posibile pentru o imagine poate ajuta algoritmul Scene Understanding să creeze mai multe descrieri vii pentru imagine.

2. Recuperare bazată pe conținut

Etichetele cu etichete multiple pot spori capacitatea motoarelor de căutare de a prelua interogări foarte specifice despre un anumit produs. De exemplu, am putea oferi mai multe etichete pentru o imagine a unui model de modă care poartă ținută de marcă. Un motor de căutare poate prelua acest rezultat atunci când căutați oricare dintre etichete. Un motor de clasificare cu etichete multiple poate crea automat o bază de date pentru motorul de căutare.

Mai mult, putem folosi etichetele pentru a recomanda produse conexe pe baza activității sau preferințelor utilizatorului. De exemplu, puteți recomanda melodii sau filme similare pe baza activității utilizatorului. Un clasificator de etichete multiple poate fi utilizat pentru a indexa automat astfel de melodii și filme.

Cum funcționează clasificarea etichetelor?

Dacă sunteți familiarizați cu algoritmii de învățare automată pentru clasificare, unele modificări minore sunt suficiente pentru ca același algoritm să funcționeze pentru o problemă cu etichete multiple. În orice caz, permiteți-ne să facem o mică recenzie a modului în care funcționează clasificarea și a modului în care poate fi extinsă la un scenariu cu mai multe etichete. Pentru restul acestui blog, ne vom concentra pe implementarea aceluiași lucru pentru imagini.

Clasificare cu etichetă unică

Rețelele neuronale se numără printre cei mai puternici (și populari) algoritmi utilizați pentru clasificare. Ei iau intrări sub forma unui vector, efectuează unele calcule și apoi produc un vector de ieșire. Vectorul de ieșire este apoi comparat cu etichetele adevărului la sol și procesul de calcul este modificat (adică instruit) pentru a produce rezultate mai bune. Pentru a antrena rețeaua neuronală, ne hrănim datele de intrare sub formă de vectori de caracteristici care reprezintă esența importantă a datelor.

Un obstacol pe care l-ați fi observat este problema codării imaginilor într-un vector de caracteristici. Rețelele neuronale convoluționale (CNN) sunt utilizate în acest scop. Convoluțiile extrag caracteristici importante din imagini și le convertesc într-o reprezentare vectorială pentru procesare ulterioară. Restul procesării într-un CNN este similar cu cel al unui Perceptron cu mai multe straturi. Acesta este, pe scurt, modul în care se realizează clasificarea unei singure etichete.

Clasificare Multi Label

Acum, cum adaptăm acest model pentru Clasificarea Multi Label? Există mai multe strategii pentru a face același lucru.

Metoda 1 - Transformarea problemei

În acest caz, vom transforma problema Multi Label într-o problemă Multi Class. O modalitate de a face acest lucru este prin instruirea unui clasificator separat pentru fiecare etichetă. Această metodă are dezavantajul evident de a antrena prea mulți clasificatori. Acest lucru ignoră, de asemenea, posibila corelație între fiecare etichetă.

O altă metodă este codificarea fiecărei combinații posibile de etichete ca o clasă separată, creând astfel un set de puteri de etichete. Această metodă funcționează bine pentru un număr mic de combinații de etichete, dar sunt greu de scalat pentru un număr mare de combinații de etichete. Pentru doar 10 etichete, am avea un set de putere de dimensiunea 1024 (2 ridicate la puterea 10)!

Metoda 2 - Adaptarea algoritmului

Uneori, modificarea minoră a algoritmului ar fi suficientă pentru rezolvarea unei probleme de clasificare cu etichete multiple. De exemplu, în cazul unei rețele neuronale, putem înlocui ultimul strat softmax cu un strat Sigmoid și apoi să folosim Binary Cross Entropy pentru a optimiza modelul.

În mod clar, există o mulțime de strategii care pot fi explorate. Adesea, o strategie poate să nu funcționeze cel mai bine pentru toate tipurile de date și, prin urmare, necesită multă experimentare.

Clasificare alimentară cu etichete multiple

Teoria sună bine, dar cum o implementăm? În această secțiune, vom construi propriul nostru algoritm de clasificare a alimentelor cu mai multe etichete folosind Keras (cu backend TensorFlow). Vom modifica un model simplu CNN pentru a permite clasificarea cu mai multe etichete. Vom face apoi o comparație cu API-ul Nanonets Multi Label Classification.

Tot codul este disponibil pe GitHub aici. Puteți urmări depozitul GitHub pentru un ghid detaliat pentru a reproduce experimentele.

Descrierea problemei

Permiteți-ne să lucrăm la o posibilă aplicație din clasa reală a clasificării multiple. Având în vedere un produs alimentar, am dori să identificăm posibile etichete pentru imagine. De exemplu, având în vedere imaginea unui tort, am dori ca modelul nostru să furnizeze etichete precum „carbohidrați” și „desert”.

Un astfel de model este extrem de util pentru recuperarea bazată pe conținut pentru întreprinderile bazate pe industria alimentară. De exemplu, putem crea o aplicație plană dietetică automată pe baza cerințelor utilizatorului și să recuperăm imagini și rețete relevante pentru produsele alimentare adecvate.

Partea 1 - Colectarea datelor

Primul pas este colectarea și curățarea datelor. Am prelevat aproximativ 2000 de imagini din setul de date Recipes5k și le-am redimensionat la dimensiunea de 224 x 224. Setul de date original avea adnotări ale ingredientelor unui produs alimentar. Cu toate acestea, au existat mai mult de 1000 de ingrediente posibile (adică etichete) și acest lucru ar crea vectori de etichete foarte rare. Prin urmare, mi-am creat propriul set de adnotări pentru aceleași imagini.

În cazul nostru, o imagine poate avea cel mult 10 etichete posibile. Lista etichetelor este: [„Supe”, „rețea”, „aperitiv”, „desert”, „proteine”, „grăsimi”, „carbohidrați”, „sănătos”, „junk”, „carne”]. Pentru a codifica etichetele într-un format care poate fi utilizat de rețeaua neuronală, creăm un vector 10 dimensiuni astfel încât să existe un „1” dacă o etichetă este prezentă în imagine și „0” dacă o etichetă este absentă.

Pentru a simplifica procesul de adnotare, am făcut câteva presupuneri îndrăznețe, cum ar fi: „Toate imaginile de tort sunt Deserturi și au carbohidrați”. Acest lucru a simplificat foarte mult procesul de adnotare și am scris o funcție simplă python pentru a transporta cea mai mare parte a ridicării grele. Deși această strategie simplifică procesul, poate crea unele adnotări zgomotoase (adică ușor greșite) și ar putea avea un impact asupra acurateței finale. Cu toate acestea, pentru acest experiment de jucărie, procedăm ca atare. Un exemplu de adnotare pentru o imagine de tort și eticheta acesteia este prezentat mai jos.

În mod clar, suntem restricționați de cantitatea de date în mână. Pentru a îmbunătăți mai bine capacitatea de antrenament a CNN-ului nostru, putem efectua învățarea de mărire și transfer de date.

Partea 2 - Construirea modelului

Vom defini modelul folosind Keras după cum urmează. Modelul de mai jos este un ResNet-50 pretrainat, cu două straturi dense în final. Observați că am folosit o activare sigmoidă mai degrabă decât softmax pentru Dense Layer.

Partea 3 - Instruire

Datele au fost împărțite în seturi de tren, validare și testare. Datele sunt normalizate în funcție de canal înainte de a fi introduse în CNN. Deoarece setul nostru de date este relativ mic, putem folosi direct model.fit () pentru a ne antrena modelul. Este afișat următorul fragment de cod:

Partea 4 - Inferință

Acum că avem un model instruit, putem vizualiza performanța acestuia folosind model.predict (). Aceasta va genera o matrice cu fiecare element reprezentând probabilitatea unei etichete (sau etichete). Putem obține un vector binar prin rotunjirea matricei prezise astfel încât un 1 să însemne prezența unei etichete și un 0 să însemne absența unei etichete. Putem folosi acest vector binar pentru a decoda etichetele prezise așa cum se arată în imaginea de mai jos.

Pentru a analiza performanța, repetăm ​​experimentul cu diferite modele pre-antrenate pe setul de date ImageNet. În general, au fost utilizate următoarele modele pre-antrenate:

  • ResNet-50
  • DenseNet-121
  • Xception
  • MobileNet

Consultați această repo Github dedicată pentru a arunca o privire asupra codului complet.

A fost grozav! Dar…

Exemplul de mai sus funcționează destul de bine. Dar există câteva probleme:

  • Așa cum am menționat mai sus, există mai multe strategii pentru a efectua clasificarea cu etichete multiple. Este necesară multă experimentare.
  • Trebuie să efectuați o căutare cu parametri hiper pentru a optimiza performanța.
  • Trebuie să gestionați manual învățarea transferului și mărirea datelor.
  • Necesită un GPU puternic și mult timp pentru antrenament.
  • Ar fi nevoie de timp și efort suplimentar (și abilitate) pentru a muta acest model în producție.

Problemele de mai sus reprezintă o mare limitare la mutarea rapidă a acestor modele în implementare. Din fericire, există o alternativă ușoară.

Nanoneți la salvare!

Nanonets oferă un API ușor de utilizat pentru a instrui un clasificator Multi Label. Se ocupă de toate greutățile ridicate, inclusiv Augmentarea datelor, învățarea prin transfer și căutarea Hyper Parameter pe clusterele lor GPU. Face toate acestea într-o oră și oferă un API REST pentru a integra modelul cu serviciile dvs. De asemenea, furnizează un serviciu de adnotare, dacă este necesar.

Este destul de ușor să începeți cu API-ul Nanonets. Această secțiune oferă o prezentare generală despre pașii implicați în configurarea API-ului pentru a efectua același experiment de clasificare a alimentelor cu etichetă multiplă. Pentru un set mai detaliat de instrucțiuni, consultați depozitul GitHub aici.

Partea 1 - Configurare

Clonați depozitul GitHub. Obțineți o cheie API gratuită de la Nanonets, setați variabilele de mediu corespunzătoare și rulați create_model.py așa cum este explicat în depozit.

Notă: În create_model.py trebuie să specificăm lista posibilelor etichete (în cazul nostru, 10 categorii de alimente). Am specificat deja etichetele din cod, astfel încât să puteți rula direct pasul de mai sus. Dacă îl utilizați pentru orice altă aplicație, editați lista posibilelor etichete din acest fișier.

Partea 2 - Încărcați setul de date

Nanonets necesită ca setul de date să fie furnizat în următoarea structură de directoare:

-multilabel_data
| -Seturi de imagini
| | -imagine1.jpg
| | -imagine2.jpg
| -Anotații
| | -image1.txt
| | -image2.txt

Am creat deja setul de date în acest format și am furnizat un link de descărcare (și câteva instrucțiuni) în depozitul GitHub. Rulând upload_training.py, datele sunt împinse automat la Nanonete.

Partea 3 - Instruire și deducție

Odată ce setul de date este încărcat, puteți executa train_model.py pentru a începe procesul de instruire. Scriptul model_state.py vă va ține la curent cu starea actuală a modelului. De asemenea, puteți verifica starea modelului dvs. din pagina dvs. de utilizator la Nanonets, așa cum se arată mai jos

Odată ce modelul dvs. este instruit, puteți rula prediction.py pentru a utiliza modelul implementat! De asemenea, puteți observa exemplul de ieșire JSON din pagina dvs. de utilizator așa cum se arată mai jos.

Performanţă

Să efectuăm mai întâi o analiză rudimentară a timpului de antrenament al diferitelor modele Keras. Timpul de antrenament pentru 100 de epoci în minute este reprezentat în graficul de bare de mai jos.

MobileNet este cel mai rapid antrenament datorită arhitecturii sale eficiente. În mod surprinzător, rețeaua Xception necesită mult timp, deoarece este cea mai complexă rețea dintre cele pe care le-am comparat.

Rețineți că timpul de antrenament nu ia în calcul timpul petrecut pentru căutarea hiperparametrului, reglarea modelului și implementarea modelului. Acești factori se adaugă mult timpului necesar pentru a muta un model în producție. Cu toate acestea, Nanonets a furnizat un model pregătit pentru producție în 30 de minute, chiar și după ce a luat în considerare toți factorii de mai sus.

Fără îndoială, Nanonets s-au antrenat mai repede decât modelele Keras. Dar cum se descurcă performanța? Mai jos prezentăm scorul F1 obținut de diferitele modele Keras și Nanonets.

Nanonets are în mod clar un scor mai mare decât modelele Keras. În mod surprinzător, modelul MobileNet a ajuns foarte aproape de recuperare. Datorită arhitecturii sale eficiente din punct de vedere al parametrilor, poate atenua mai bine dotarea excesivă în comparație cu celelalte modele Keras. Scorul relativ mai mic al tuturor modelelor poate fi atribuit fie complexității și dimensiunii limitate a setului de date, fie adnotărilor zgomotoase. Să facem și o observare vizuală a rezultatului.

Se pare că pregătirea noastră a fost destul de reușită! Prin utilizarea unui set de date mai mare am putea obține performanțe mai bune. De asemenea, puteți experimenta în continuare utilizând diferite seturi de date pentru alte aplicații inovatoare, aplicând conceptele discutate mai sus.

Leneș la cod? nu doriți să cheltuiți pe GPU-uri? Mergeți la Nanonets și începeți să vă construiți gratuit modele de clasificare personalizate cu etichete multiple!

Blog AI și învățare automată

Consultați cele mai recente articole de blog, seminarii web, informații și alte resurse de pe Machine Learning, Deep Learning pe blogul Nanonets.