- Introducere
- Tabelă de materii
- Utilizarea CNN-urilor pentru clasificarea cifrelor scrise de mână pe setul de date MNIST
- Identificarea imaginilor din setul de date CIFAR-10 folosind CNN-uri
- Iată ce am schimbat în model:
- Categorizarea imaginilor din ImageNet folosind CNN-uri
- Despre setul de date ImageNet
- Aici intervine setul de date Imagenette de la Fast.ai
- Download the Imagenette Dataset
- Încărcarea imaginilor folosind ImageDataGenerator
- Construirea unui model CNN de bază pentru clasificarea imaginilor
- Utilizarea învățării prin transfer (VGG16) pentru a îmbunătăți acuratețea
- Download weights of VGG16
- Generarea caracteristicilor din VGG16
- Unde să mergem de aici?
Introducere
Rețele neuronale convoluționale (CNN) – conceptul din spatele recentelor descoperiri și dezvoltări în învățarea profundă.
CNN-urile au spart matrița și au urcat pe tron pentru a deveni cea mai modernă tehnică de viziune pe calculator. Dintre diferitele tipuri de rețele neuronale (altele includ rețelele neuronale recurente (RNN), memoria de lungă durată pe termen scurt (LSTM), rețelele neuronale artificiale (ANN) etc.), CNN-urile sunt cu ușurință cele mai populare.
Aceste modele de rețele neuronale convoluționale sunt omniprezente în spațiul datelor de imagine. Ele funcționează fenomenal de bine în sarcinile de viziune computerizată, cum ar fi clasificarea imaginilor, detectarea obiectelor, recunoașterea imaginilor etc.
Atunci – unde vă puteți exersa abilitățile CNN? Ei bine, ați ajuns la locul potrivit!
Există diverse seturi de date pe care le puteți valorifica pentru aplicarea rețelelor neuronale convoluționale. Iată trei seturi de date populare:
- MNIST
- CIFAR-10
- ImageNet
În acest articol, vom construi modele de clasificare a imaginilor folosind CNN pe fiecare dintre aceste seturi de date. Așa este! Vom explora MNSIT, CIFAR-10 și ImageNet pentru a înțelege, într-o manieră practică, cum funcționează CNN-urile pentru sarcina de clasificare a imaginilor.
Puteți învăța totul despre rețelele neuronale convoluționale(CNN) în acest curs gratuit: Convolutional Neural Networks (CNN) from Scratch
Inspirația mea pentru a scrie acest articol este de a ajuta comunitatea să aplice cunoștințele teoretice într-o manieră practică. Acesta este un exercițiu foarte important, deoarece nu numai că vă ajută să construiți o înțelegere mai profundă a conceptului de bază, dar vă va învăța, de asemenea, detalii practice care pot fi învățate numai prin implementarea conceptului.
Dacă sunteți nou în lumea rețelelor neuronale, a CNN-urilor, a clasificării imaginilor, vă recomand să parcurgeți aceste excelente tutoriale aprofundate:
- Introduction to Neural Networks (Free Course!)
- Demistificarea matematicii din spatele rețelelor neuronale convoluționale (CNN))
- Construiește-ți primul model de clasificare a imaginilor în doar 10 minute
Și dacă vrei să înveți în profunzime viziunea computerizată și învățarea profundă, ar trebui să verifici cursurile noastre populare:
- Viziune pe calculator folosind Deep Learning
- Programul certificat AI & ML Blackbelt+
Tabelă de materii
- Utilizarea CNN-urilor pentru clasificarea mâinilor…written Digits on MNIST Dataset
- Identifying Images from CIFAR-10 Dataset using CNNs
- Categorizing Images of ImageNet Dataset using CNNs
- Categorizing Images of ImageNet Dataset using CNNs
- Where to go from here?
Nota: În acest articol voi folosi Keras pentru a demonstra clasificarea imaginilor cu ajutorul CNN-urilor. Keras este un cadru excelent de învățat atunci când începeți în învățarea profundă.
Utilizarea CNN-urilor pentru clasificarea cifrelor scrise de mână pe setul de date MNIST
MNIST (Modified National Institute of Standards and Technology) este un set de date bine-cunoscut utilizat în Computer Vision care a fost construit de Yann Le Cun et. al. Acesta este compus din imagini care reprezintă cifre scrise de mână (0-9), împărțite într-un set de antrenament de 50.000 de imagini și un set de testare de 10.000, unde fiecare imagine are 28 x 28 pixeli în lățime și înălțime.
Acest set de date este adesea folosit pentru a exersa orice algoritm realizat pentru clasificarea imaginilor, deoarece setul de date este destul de ușor de cucerit. Prin urmare, vă recomand ca acesta să fie primul set de date dacă abia faceți o incursiune în domeniu.
MNIST vine cu Keras în mod implicit și puteți încărca pur și simplu fișierele de antrenament și de testare folosind câteva linii de cod:
Iată forma lui X (caracteristici) și y (țintă) pentru datele de antrenament și de validare:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Înainte de a antrena un model CNN, haideți să construim o rețea neuronală de bază complet conectată pentru setul de date. Pașii de bază pentru a construi un model de clasificare a imaginilor cu ajutorul unei rețele neuronale sunt următorii:
- Platăm dimensiunile imaginii de intrare la 1D (pixeli de lățime x pixeli de înălțime)
- Normalizăm valorile pixelilor imaginii (împărțim la 255)
- Unul…Hot Encode the categorical column
- Construiți o arhitectură de model (secvențială) cu straturi dense
- Învățați modelul și faceți predicții
Iată cum puteți construi un model de rețea neuronală pentru MNIST. Am comentat părțile relevante ale codului pentru o mai bună înțelegere:
După rularea codului de mai sus, v-ați dat seama că obținem cu ușurință o precizie de validare bună, de aproximativ 97%.
Să modificăm codul de mai sus pentru a construi un model CNN.
Un avantaj major al utilizării CNN-urilor față de NN-uri este că nu este nevoie să aplatizați imaginile de intrare la 1D, deoarece acestea sunt capabile să lucreze cu date de imagine în 2D. Acest lucru ajută la păstrarea proprietăților „spațiale” ale imaginilor.
Iată codul complet pentru modelul CNN:
Chiar dacă acuratețea maximă a validării noastre prin utilizarea unui model simplu de rețea neuronală a fost de aproximativ 97%, modelul CNN este capabil să obțină 98%+ cu doar un singur strat de convoluție!
Puteți merge mai departe și adăuga mai multe straturi Conv2D și, de asemenea, puteți să vă jucați cu hiperparametrii modelului CNN.
Identificarea imaginilor din setul de date CIFAR-10 folosind CNN-uri
MNIST este un set de date ușor de utilizat pentru începători în domeniul vederii computerizate. Este ușor să obțineți un scor de peste 90% la validare folosind un model CNN. Dar ce se întâmplă dacă sunteți mai mult decât începător și aveți nevoie de ceva provocator pentru a vă pune în aplicare conceptele?
Aici intră în scenă setul de date CIFAR-10!
Iată cum descriu dezvoltatorii din spatele CIFAR (Canadian Institute For Advanced Research) setul de date:
Set de date CIFAR-10 constă din 60.000 de imagini color 32 x 32 în 10 clase, cu 6.000 de imagini pe clasă. Există 50.000 de imagini de antrenament și 10.000 de imagini de test.
Puncturile importante care diferențiază acest set de date de MNIST sunt:
- Imaginile sunt colorate în CIFAR-10, în comparație cu textura alb-negru din MNIST
- Care imagine are 32 x 32 pixeli
- 50.000 de imagini de antrenament și 10.000 de imagini de testare
Acum, aceste imagini sunt realizate în condiții de iluminare variate și din unghiuri diferite și, deoarece sunt imagini colorate, veți vedea că există multe variații în culoarea însăși a obiectelor similare (de exemplu, culoarea apei oceanului). Dacă folosiți arhitectura CNN simplă pe care am văzut-o în exemplul MNIST de mai sus, veți obține o precizie de validare scăzută, de aproximativ 60%.
Acesta este un motiv cheie pentru care recomand CIFAR-10 ca fiind un set de date bun pentru a vă exersa abilitățile de reglare a hiperparametrilor pentru CNN-uri. Lucrul bun este că, la fel ca MNIST, CIFAR-10 este, de asemenea, disponibil cu ușurință în Keras.
Puteți încărca pur și simplu setul de date utilizând următorul cod:
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Iată cum puteți construi un model CNN decent (în jur de 78-80% la validare) pentru CIFAR-10. Observați cum valorile formei au fost actualizate de la (28, 28, 1) la (32, 32, 3) în funcție de dimensiunea imaginilor:
Iată ce am schimbat în model:
- Am mărit numărul de straturi Conv2D pentru a construi un model mai profund
- Am mărit numărul de filtre pentru a învăța mai multe caracteristici
- Am adăugat Dropout pentru regularizare
- Am adăugat mai multe straturi dense
Precizia de instruire și validare pe epoci:
Puteți eclipsa cu ușurință această performanță prin ajustarea modelului de mai sus. Odată ce ați stăpânit CIFAR-10, există și CIFAR-100 disponibil în Keras, pe care îl puteți utiliza pentru a exersa în continuare. Având în vedere că are 100 de clase, nu va fi o sarcină ușoară de realizat!
Categorizarea imaginilor din ImageNet folosind CNN-uri
Acum că ați stăpânit MNIST și CIFAR-10, haideți să luăm această problemă cu o treaptă mai sus. Aici, ne vom uita la faimosul set de date ImageNet.
ImageNet este principala bază de date din spatele ImageNet Large Scale Recognition Challenge (ILSVRC). Aceasta este ca și cum ar fi Jocurile Olimpice ale viziunii computerizate. Aceasta este competiția care a făcut CNN-urile populare pentru prima dată și, în fiecare an, cele mai bune echipe de cercetare din industrii și din mediul academic concurează cu cei mai buni algoritmi ai lor pe sarcini de viziune computerizată.
Despre setul de date ImageNet
Setul de date ImageNet are mai mult de 14 milioane de imagini, etichetate manual în 20.000 de categorii.
De asemenea, spre deosebire de seturile de date MNIST și CIFAR-10 pe care le-am discutat deja, imaginile din ImageNet au o rezoluție decentă (224 x 224) și asta reprezintă o provocare pentru noi: 14 milioane de imagini, fiecare de 224 pe 224 pixeli. Procesarea unui set de date de această dimensiune necesită o mare putere de calcul în ceea ce privește CPU, GPU și RAM.
Inconvenientul – ar putea fi prea mult pentru un laptop obișnuit. Așadar, care este soluția alternativă? Cum poate un entuziast să lucreze cu setul de date ImageNet?
Aici intervine setul de date Imagenette de la Fast.ai
Imagenette este un set de date care este extras din marea colecție de imagini ImageNet. Motivul din spatele publicării Imagenette este că cercetătorii și studenții pot exersa pe imagini de nivel ImageNet fără a avea nevoie de atât de multe resurse de calcul.
În cuvintele lui Jeremy Howard însuși:
„Eu (Jeremy Howard, adică) am făcut Imagenette în principal pentru că am vrut un mic set de date de viziune pe care să-l pot folosi pentru a vedea rapid dacă ideile mele de algoritmi ar putea avea o șansă de a funcționa. În mod normal, nu funcționează, dar testarea lor pe Imagenet îmi ia foarte mult timp pentru a afla acest lucru, în special pentru că sunt interesat de algoritmi care au performanțe deosebit de bune la sfârșitul antrenamentului.”
Dar cred că acesta poate fi un set de date util și pentru alții.”
Și asta vom folosi și pentru exersare!
Download the Imagenette Dataset
Iată cum puteți prelua setul de date (comenzi pentru terminalul dvs.):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
După ce ați descărcat setul de date, veți observa că acesta are două foldere – „train” și „val”. Acestea conțin setul de antrenament și, respectiv, de validare. În interiorul fiecărui dosar, există dosare separate pentru fiecare clasă. Iată cartografierea claselor:
Aceste clase au același ID în setul de date ImageNet original. Fiecare dintre clase are aproximativ 1000 de imagini, astfel încât, în general, este un set de date echilibrat.
Încărcarea imaginilor folosind ImageDataGenerator
Keras are această funcționalitate utilă pentru încărcarea imaginilor mari (cum avem aici) fără a consuma la maximum memoria RAM, făcându-le în loturi mici. ImageDataGenerator în combinație cu fit_generator oferă această funcționalitate:
ImageDataGenerator însuși induce etichetele de clasă și numărul de clase din numele dosarelor.
Construirea unui model CNN de bază pentru clasificarea imaginilor
Să construim un model CNN de bază pentru setul nostru de date Imagenette (în scopul clasificării imaginilor):
Când comparăm precizia de validare a modelului de mai sus, vă veți da seama că, deși este o arhitectură mai profundă decât cea pe care am utilizat-o până acum, nu reușim să obținem decât o precizie de validare de aproximativ 40-50%.
Poate exista mai multe motive pentru acest lucru, cum ar fi faptul că modelul nostru nu este suficient de complex pentru a învăța modelele care stau la baza imaginilor, sau poate că datele de instruire sunt prea mici pentru a generaliza cu acuratețe între clase.
Să facem un pas înainte – învățarea prin transfer.
Utilizarea învățării prin transfer (VGG16) pentru a îmbunătăți acuratețea
VGG16 este o arhitectură CNN care a fost pe primul loc în cadrul ImageNet Challenge 2014. Este proiectată de Visual Graphics Group de la Oxford și are 16 straturi în total, cu 13 straturi convoluționale propriu-zise. Vom încărca ponderile preinstruite ale acestui model, astfel încât să putem utiliza caracteristicile utile pe care acest model le-a învățat pentru sarcina noastră.
Download weights of VGG16
from keras.applications import VGG16# include top should be False to remove the softmax layerpretrained_model = VGG16(include_top=False, weights='imagenet')pretrained_model.summary()
Generarea caracteristicilor din VGG16
Să extragem caracteristicile utile pe care VGG16 le cunoaște deja din imaginile din setul nostru de date:
from keras.utils import to_categorical# extract train and val featuresvgg_features_train = pretrained_model.predict(train)vgg_features_val = pretrained_model.predict(val)
# OHE target columntrain_target = to_categorical(train.labels)val_target = to_categorical(val.labels)
Observați cât de repede începe să converge modelul dvs. În doar 10 epoci, aveți o precizie de validare de peste 94%. Nu-i așa că este uimitor?
În cazul în care ați stăpânit setul de date Imagenette, fastai a lansat și două variante care includ clase pe care vă va fi greu să le clasificați:
- Imagewoof: 10 clase de rase de câini, o problemă mai greu de clasificat
- Image网 („wang”): O combinație între Imagenette și Imagewoof și câteva trucuri care o fac să fie o problemă mai dificilă
Unde să mergem de aici?
În afară de seturile de date pe care le-am prezentat mai sus, puteți folosi și seturile de date de mai jos pentru a construi algoritmi de viziune pe calculator. De fapt, considerați că aceasta este o provocare. Puteți să vă aplicați cunoștințele despre CNN pentru a depăși scorul de referință pe aceste seturi de date?
- Fashion MNIST – Set de date de tip MNIST de haine și îmbrăcăminte. În loc de cifre, imaginile prezintă un tip de îmbrăcăminte (tricou, pantaloni, geantă, etc.)
- Caltech 101 – Un alt set de date provocator pe care l-am găsit pentru clasificarea imaginilor
Suger, de asemenea, ca înainte de a trece la învățarea prin transfer, să încercați să vă îmbunătățiți modelele CNN de bază. Puteți învăța din arhitecturile VGG16, ZFNet, etc. pentru câteva indicii privind reglarea hiperparametrilor și puteți folosi același ImageDataGenerator pentru a vă spori imaginile și a mări dimensiunea setului de date.
Puteți citi acest articol și pe aplicația noastră mobilă .