- Introduction
- Sisällysluettelo
- CNN:ien käyttäminen käsinkirjoitettujen numeroiden luokitteluun MNIST-tietokannassa
- Identifying Images from the CIFAR-10 Dataset using CNNs
- Tässä on, mitä muutin mallissa:
- Categorizing the Images of ImageNet using CNNs
- Tietoa ImageNet-tietokannasta
- Tässä Fast.ai:n Imagenette-tietokanta tulee kuvaan
- Lataa Imagenette Dataset
- Kuvien lataaminen ImageDataGeneratorin avulla
- Perus-CNN-mallin rakentaminen kuvien luokittelua varten
- Tarkkuuden parantaminen siirto-oppimisen (VGG16) avulla
- VGG16:n painojen lataaminen
- Ominaisuuksien generoiminen VGG16:sta
- Missä mennään tästä eteenpäin?
Introduction
Convolutional Neural Networks (CNN) – konsepti viimeaikaisten läpimurtojen ja syväoppimisen kehitystyön takana.
CNN:t ovat rikkoneet muotin ja nousseet valtaistuimelle, ja niistä on tullut tietokonenäön tekniikan huipputekniikka. Erilaisista neuroverkkotyypeistä (muita ovat muun muassa rekursiiviset neuroverkot (RNN), pitkä lyhytkestoinen muisti (LSTM), keinotekoiset neuroverkot (ANN) jne.) CNN:t ovat helposti suosituimpia.
Nämä konvolutiiviset neuroverkkomallit ovat kaikkialla läsnä kuvatietoavaruudessa. Ne toimivat ilmiömäisen hyvin tietokonenäkötehtävissä, kuten kuvien luokittelussa, objektien havaitsemisessa, kuvantunnistuksessa jne.
Niin – missä voit harjoitella CNN-taitojasi? No, olet tullut oikeaan paikkaan!
On olemassa erilaisia tietokokonaisuuksia, joita voit hyödyntää konvolutiivisten neuroverkkojen soveltamisessa. Tässä on kolme suosittua tietokokonaisuutta:
- MNIST
- CIFAR-10
- ImageNet
Tässä artikkelissa rakennamme kuvien luokittelumalleja CNN:n avulla jokaisella näistä tietokokonaisuuksista. Aivan oikein! Tutustumme MNSIT-, CIFAR-10- ja ImageNet-tietokantoihin ymmärtääkseen käytännönläheisesti, miten CNN:t toimivat kuvanluokittelutehtävässä.
Voit oppia kaiken konvolutiivisista neuroverkoista (Convolutional Neural Networks(CNN)) tällä ilmaisella kurssilla: Convolutional Neural Networks (CNN) from Scratch
Harjoitukseni tämän artikkelin kirjoittamiseen on auttaa yhteisöä soveltamaan teoreettista tietoa käytännössä. Tämä on erittäin tärkeä harjoitus, sillä se ei ainoastaan auta sinua rakentamaan syvempää ymmärrystä taustalla olevasta käsitteestä, vaan opettaa myös käytännön yksityiskohtia, joita voi oppia vain toteuttamalla käsitteen.
Jos olet uusi neuroverkkojen, CNN:ien ja kuvanluokittelun maailmassa, suosittelen käymään läpi nämä erinomaiset syvälliset opetusohjelmat:
- Introduction to Neural Networks (Free Course!)
- Demystifying the Mathematics behind Convolutional Neural Networks (CNNs)
- Build your First Image Classification Model in only 10 Minutes
Ja jos haluat oppia tietokonenäköä ja syväoppimista syvällisesti, kannattaa tutustua suosittuihin kursseihimme:
- Computer Vision using Deep Learning
- Certified AI & ML Blackbelt+ Program
Sisällysluettelo
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identifying Images from CIFAR-10 Dataset using CNNs
- Categorizing Images of ImageNet Dataset using CNNs
- Where to go from here?
Huomautus: Käytän Kerasia havainnollistamaan kuvanluokittelua CNN:ien avulla tässä artikkelissa. Keras on erinomainen kehys opeteltavaksi, kun olet aloittamassa syväoppimista.
CNN:ien käyttäminen käsinkirjoitettujen numeroiden luokitteluun MNIST-tietokannassa
MNIST (modifioitu kansallinen standardi- ja teknologiainstituutti) on tunnettu tietokonenäkymässä käytetty tietokanta, jonka rakensivat Yann Le Cun et. al. Se koostuu kuvista, jotka ovat käsinkirjoitettuja numeroita (0-9) ja jotka on jaettu 50 000 kuvan harjoitusjoukkoon ja 10 000 kuvan testijoukkoon, jossa jokainen kuva on leveydeltään ja korkeudeltaan 28 x 28 pikseliä.
Tätä tietokokonaisuutta käytetään usein minkä tahansa kuvanluokitteluun tehdyn algoritmin harjoitteluun, koska tietokokonaisuus on melko helppo valloittaa. Näin ollen suosittelen, että tämä olisi ensimmäinen datasetisi, jos olet vasta haravoimassa alaa.
MNIST:n mukana tulee oletusarvoisesti Keras, ja voit yksinkertaisesti ladata treeni- ja testitiedostot muutaman koodirivin avulla:
Tässä on X:n (piirteet) ja y:n (kohde) muoto harjoittelu- ja validointidataa varten:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Ennen kuin harjoittelemme CNN-mallia, rakentakaamme perustason Täysin kytketty neuraaliverkko datasettiin. Perusvaiheet kuvanluokittelumallin rakentamiseksi neuroverkon avulla ovat seuraavat:
- Tasoitetaan tulokuvan mitat 1D:ksi (leveys pikseliä x korkeus pikseliä)
- Normalisoidaan kuvan pikseliarvot (jaetaan 255:llä)
- Yksi-Hot Encode the categorical column
- Rakenna malliarkkitehtuuri (sekventiaalinen) tiheillä kerroksilla
- Treenaa malli ja tee ennusteita
Tässä kerrotaan, miten voit rakentaa neuroverkkomallin MNIST:lle. Olen kommentoinut koodin olennaiset osat paremman ymmärryksen vuoksi:
Ylläolevan koodin suorittamisen jälkeen olisit huomannut, että saamme hyvän validointitarkkuuden, noin 97 %, helposti.
Muokataan yllä olevaa koodia CNN-mallin rakentamiseksi.
Yksi suuri etu CNN:ien käyttämisessä NN:iin nähden on se, että syöttökuvia ei tarvitse litistää 1D:ksi, koska ne pystyvät työskentelemään 2D:n kuvatietojen kanssa. Tämä auttaa säilyttämään kuvien ”spatiaaliset” ominaisuudet.
Tässä on CNN-mallin koko koodi:
Vaikka suurin validointitarkkuutemme yksinkertaisella neuroverkkomallilla oli noin 97 %, CNN-malli pystyy saavuttamaan 98 %+ yhdellä konvoluutiokerroksella!
Voit edetä ja lisätä lisää Conv2D-kerroksia sekä leikkiä CNN-mallin hyperparametreilla.
Identifying Images from the CIFAR-10 Dataset using CNNs
MNIST on aloittelijoille sopiva tietokanta tietokonenäössä. CNN-mallia käyttämällä on helppo saada 90 %+ pisteitä validoinnissa. Mutta entä jos olet enemmän kuin aloittelija ja tarvitset jotain haastavaa, jotta voit käyttää käsitteitäsi?
Tässä kohtaa CIFAR-10-tietokanta tulee kuvaan!
Näin CIFAR:n (Canadian Institute For Advanced Research) takana olevat kehittäjät kuvaavat tietokantaa:
CIFAR-10-tietokanta koostuu 60 000:sta 32 x 32-värikuvasta 10:ssä luokassa, joissa on 6000 kuvaa kutakin luokkaa kohti. Harjoituskuvia on 50 000 ja testikuvia 10 000.
Tärkeitä seikkoja, jotka erottavat tämän tietokokonaisuuden MNIST:stä, ovat:
- Kuvat ovat CIFAR-10:ssä värillisiä verrattuna MNISTin mustavalkoiseen tekstuuriin
- Jokainen kuva on 32 x 32 pikseliä
- 50 000 harjoituskuvaa ja 10 000 testikuvaa
Nyt, nämä kuvat on otettu vaihtelevissa valaistusolosuhteissa ja eri kulmista, ja koska kyseessä ovat värikuvat, huomaat, että samankaltaisten kohteiden väreissä itsessään on paljon vaihtelua (esimerkiksi meriveden väri). Jos käytät yksinkertaista CNN-arkkitehtuuria, jonka näimme edellä MNIST-esimerkissä, saat alhaisen validointitarkkuuden, joka on noin 60 %.
Tämä on keskeinen syy siihen, miksi suosittelen CIFAR-10:tä hyväksi tietokokonaisuudeksi, jolla voit harjoitella CNN:ien hyperparametrin virittämisen taitoja. Hyvä asia on se, että kuten MNIST, myös CIFAR-10 on helposti saatavilla Kerasissa.
Voit yksinkertaisesti ladata datasetin käyttämällä seuraavaa koodia:
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Näin voit rakentaa kunnollisen (noin 78-80% validointitarkkuudella) CNN-mallin CIFAR-10:lle. Huomaa, kuinka muotoarvot on päivitetty (28, 28, 1):stä (32, 32, 3):iin (28, 28, 1) kuvien koon mukaan:
Tässä on, mitä muutin mallissa:
- Lisäsin Conv2D-kerrosten määrää syvemmän mallin rakentamiseksi
- Lisäsin suodattimien määrää oppiakseni enemmän piirteitä
- Lisäsin Dropoutia regularisointia varten
- Lisäsin lisää Dense-kerroksia
Harjoittelu- ja validointitarkkuus epookkien välillä:
Voit helposti ylittää tämän suorituskyvyn virittämällä yllä olevaa mallia. Kun hallitset CIFAR-10:n, Kerasissa on saatavilla myös CIFAR-100, jota voit käyttää lisäharjoitteluun. Koska siinä on 100 luokkaa, sen saavuttaminen ei tule olemaan helppo tehtävä!
Categorizing the Images of ImageNet using CNNs
Nyt kun hallitset MNIST:n ja CIFAR-10:n, mennään tätä ongelmaa astetta korkeammalle. Tässä tarkastelemme kuuluisaa ImageNet-tietokantaa.
ImageNet on päätietokanta ImageNet Large Scale Recognition Challenge (ILSVRC) -kilpailun taustalla. Tämä on kuin tietokonenäön olympialaiset. Tämä on kilpailu, joka teki CNN:t ensimmäisen kerran suosituiksi, ja joka vuosi parhaat tutkimusryhmät eri teollisuudenaloilla ja korkeakouluissa kilpailevat parhailla algoritmeillaan tietokonenäkötehtävissä.
Tietoa ImageNet-tietokannasta
ImageNet-tietokannassa on yli 14 miljoonaa kuvaa, jotka on merkitty käsin 20 000 kategoriaan.
Edelleen, toisin kuin jo käsittelemämme MNIST- ja CIFAR-10-tietokannat, ImageNetin kuvat ovat kunnon resoluutiolla (224 x 224), ja juuri se asettaa meille haasteen: 14 miljoonaa kuvaa, joista jokainen on 224 x 224 pikseliä. Tämän kokoisen tietokokonaisuuden käsittely vaatii paljon laskentatehoa suorittimen, näytönohjaimen ja RAM-muistin osalta.
Haittava puoli – se saattaa olla liikaa tavalliselle kannettavalle tietokoneelle. Mikä on siis vaihtoehtoinen ratkaisu? Miten harrastaja voi työskennellä ImageNet-tietokannan kanssa?
Tässä Fast.ai:n Imagenette-tietokanta tulee kuvaan
Imagenette on tietokanta, joka on poimittu suuresta ImageNet-kuvakokoelmasta. Syy Imagenetten julkaisemisen taustalla on se, että tutkijat ja opiskelijat voivat harjoitella ImageNet-tason kuvilla tarvitsematta niin paljon laskentaresursseja.
Jeremy Howardin itsensä sanoin:
”Minä (siis Jeremy Howard) tein Imagenetten lähinnä siksi, että halusin pienen visuaalisen näkemisen datasetin, jota voisin käyttää nähdäkseni nopeasti, onko algoritmi-ideoillani mahdollisuuksia toimia. Normaalisti ne eivät toimi, mutta niiden testaaminen Imagenetillä kestää todella kauan ennen kuin saan sen selville, erityisesti koska olen kiinnostunut algoritmeista, jotka toimivat erityisen hyvin harjoittelun lopussa.”
Mutta uskon, että tämä voi olla hyödyllinen tietokokonaisuus myös muille.”
Ja sitä tulemme käyttämään myös harjoittelussa!
Lataa Imagenette Dataset
Tässä kerrotaan, miten voit noutaa datasetin (komentoja päätelaitteellesi):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
Kun olet ladannut datasetin, huomaat, että siinä on kaksi kansiota – ”train” ja ”val”. Nämä sisältävät harjoittelu- ja validointijoukon. Kummankin kansion sisällä on erilliset kansiot kullekin luokalle. Tässä on luokkien kartoitus:
Näillä luokilla on sama tunnus alkuperäisessä ImageNet-tietoaineistossa. Jokaisessa luokassa on noin 1000 kuvaa, joten kaiken kaikkiaan kyseessä on tasapainoinen dataset.
Kuvien lataaminen ImageDataGeneratorin avulla
Kerasissa on tämä hyödyllinen toiminto suurten kuvien lataamiseen (kuten meillä on tässä) ilman, että RAM-muisti maksimoituu, tekemällä se pienissä erissä. ImageDataGenerator yhdessä fit_generatorin kanssa tarjoaa tämän toiminnallisuuden:
ImageDataGenerator itse päättelee luokkatunnisteet ja luokkien määrän kansioiden nimistä.
Perus-CNN-mallin rakentaminen kuvien luokittelua varten
Rakennetaan perus-CNN-malli Imagenette-tietokantaamme (kuvien luokittelua varten):
Kun vertaamme yllä olevan mallin validointitarkkuutta, huomaat, että vaikka kyseessä on syvempi arkkitehtuuri kuin mitä olemme tähän mennessä hyödyntäneet, saamme validointitarkkuudeksi vain noin 40-50 %.
Tälle voi olla monia syitä, kuten se, että mallimme ei ole tarpeeksi monimutkainen oppiakseen kuvien taustalla olevia kuvamalleja, tai kenties harjoitusdata on liian pieni yleistääkseen tarkasti eri luokkien välillä.
Vaihde ylöspäin – siirto-oppiminen.
Tarkkuuden parantaminen siirto-oppimisen (VGG16) avulla
VGG16 on CNN-arkkitehtuuri, joka sijoittui ensimmäiselle sijalle vuoden 2014 ImageNet-haasteessa. Sen on suunnitellut Oxfordin Visual Graphics Group, ja siinä on yhteensä 16 kerrosta, joista itse konvoluutiokerroksia on 13. Ladataan tämän mallin esivalmennetut painot, jotta voimme hyödyntää niitä hyödyllisiä ominaisuuksia, jotka tämä malli on oppinut tehtävämme kannalta.
VGG16:n painojen lataaminen
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()
Ominaisuuksien generoiminen VGG16:sta
Osastetaan hyödylliset piirteet, jotka VGG16 jo tuntee datasetimme kuvista:
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)
Huomatkaa, kuinka nopeasti mallinne lähtee lähentymään. Vain 10 epookissa sinulla on 94 %+ validointitarkkuus. Eikö olekin hämmästyttävää?
Jos hallitset Imagenette-tietokokonaisuuden, fastai on julkaissut myös kaksi vaihtoehtoa, jotka sisältävät luokkia, joita sinun on vaikea luokitella:
- Imagewoof: 10 koirarotuluokkaa, vaikeampi ongelma luokitella
- Image网 (”wang”): Yhdistelmä Imagenettea ja Imagewoofia ja pari temppua, jotka tekevät ongelmasta vaikeamman
Missä mennään tästä eteenpäin?
Yllä olevien tietokokonaisuuksien lisäksi voit käyttää myös alla olevia tietokokonaisuuksia tietokonenäköalgoritmien rakentamiseen. Pidä tätä itse asiassa haasteena. Pystytkö soveltamalla CNN-tietämystäsi lyömään vertailupisteet näissä tietokokonaisuuksissa?
- Muoti MNIST – MNIST:n kaltainen tietokokonaisuus vaatteista ja vaatetuksesta. Numeroiden sijaan kuvissa näkyy vaatetyyppi (T-paita, housut, laukku jne.)
- Caltech 101 – Toinen haastava tietokokonaisuus, jonka löysin kuvien luokitteluun
Ehdotan myös, että ennen kuin ryhdyt siirto-oppimiseen, yritä parantaa perus-CNN-mallejasi. Voit ottaa oppia VGG16:n, ZFNetin jne. arkkitehtuurista saadaksesi vihjeitä hyperparametrien virittämisestä, ja voit käyttää samaa ImageDataGeneratoria kuvien lisäämiseen ja datasetin koon kasvattamiseen.
Voit lukea tämän artikkelin myös mobiilisovelluksestamme Mobiilisovelluksestamme .