- Indledning
- Indholdsfortegnelse
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identificering af billeder fra CIFAR-10-datasættet ved hjælp af CNN’er
- Her er, hvad jeg ændrede i modellen:
- Kategorisering af billederne i ImageNet ved hjælp af CNNs
- Om ImageNet-datasættet
- Det er her Fast.ai’s Imagenette-datasæt kommer ind i billedet
- Download Imagenette-datasættet
- Indlæsning af billeder ved hjælp af ImageDataGenerator
- Opbygning af en grundlæggende CNN-model til billedklassifikation
- Anvendelse af transfer learning (VGG16) til at forbedre nøjagtigheden
- Download af vægte fra VGG16
- Generer funktioner fra VGG16
- Hvor skal vi gå hen herfra?
Indledning
Konvolutionelle neurale netværk (CNN) – konceptet bag de seneste gennembrud og udviklinger inden for deep learning.
CNN’er har brudt formen og besteget tronen og er blevet den mest avancerede computer vision-teknik. Blandt de forskellige typer af neurale netværk (andre omfatter recurrent neural networks (RNN), long short term memory (LSTM), artificial neural networks (ANN) osv.) er CNN’er uden tvivl de mest populære.
Disse konvolutionelle neurale netværksmodeller er allestedsnærværende i billeddatarummet. De fungerer fænomenalt godt til computer vision-opgaver som billedklassificering, objektdetektion, billedgenkendelse osv.
Så – hvor kan du øve dine CNN-færdigheder? Nå, men du er kommet til det rette sted!
Der er forskellige datasæt, som du kan udnytte til at anvende konvolutionelle neurale netværk. Her er tre populære datasæt:
- MNIST
- CIFAR-10
- ImageNet
I denne artikel vil vi opbygge billedklassifikationsmodeller ved hjælp af CNN på hvert af disse datasæt. Det er rigtigt! Vi vil undersøge MNSIT, CIFAR-10 og ImageNet for på en praktisk måde at forstå, hvordan CNN’er fungerer til billedklassifikationsopgaven.
Du kan lære alt om Convolutional Neural Networks(CNN) i dette gratis kursus: Convolutional Neural Networks (CNN) from Scratch
Min inspiration til at skrive denne artikel er at hjælpe fællesskabet med at anvende teoretisk viden på en praktisk måde. Dette er en meget vigtig øvelse, da det ikke kun hjælper dig med at opbygge en dybere forståelse af det underliggende koncept, men også vil lære dig praktiske detaljer, som kun kan læres ved at implementere konceptet.
Hvis du er ny i verdenen af neurale netværk, CNN’er, billedklassifikation, anbefaler jeg at gennemgå disse fremragende dybdegående tutorials:
- Introduktion til neurale netværk (gratis kursus!)
- Demystificering af matematikken bag Convolutional Neural Networks (CNNs)
- Byg din første billedklassifikationsmodel på kun 10 minutter
Og hvis du ønsker at lære computer vision og dybdegående læring i dybden, bør du tjekke vores populære kurser:
- Computer Vision using Deep Learning
- Certified AI & ML Blackbelt+ Program
Indholdsfortegnelse
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identificering af billeder fra CIFAR-10 Dataset ved hjælp af CNNs
- Kategorisering af billeder fra ImageNet Dataset ved hjælp af CNNs
- Hvor skal vi gå hen herfra?
Bemærk: Jeg vil bruge Keras til at demonstrere billedklassificering ved hjælp af CNN’er i denne artikel. Keras er en glimrende ramme at lære, når du starter med deep learning.
Using CNNs to Classify Hand-written Digits on MNIST Dataset
MNIST (Modified National Institute of Standards and Technology) er et velkendt datasæt, der bruges inden for Computer Vision, og som blev bygget af Yann Le Cun et. Det består af billeder, der er håndskrevne tal (0-9), opdelt i et træningssæt på 50 000 billeder og et testsæt på 10 000, hvor hvert billede er på 28 x 28 pixel i bredde og højde.
Dette datasæt bruges ofte til at øve enhver algoritme, der er lavet til billedklassifikation, da datasættet er forholdsvis let at erobre. Derfor anbefaler jeg, at dette bør være dit første datasæt, hvis du lige er på vej ind på området.
MNIST leveres med Keras som standard, og du kan simpelthen indlæse trænings- og testfilerne ved hjælp af et par linjer kode:
Her er formen af X (funktioner) og y (mål) for trænings- og valideringsdata:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Hvor vi træner en CNN-model, skal vi opbygge et grundlæggende Fully Connected Neural Network for datasættet. De grundlæggende trin til opbygning af en billedklassifikationsmodel ved hjælp af et neuralt netværk er:
- Flatter de indgående billeddimensioner til 1D (breddepixels x højdepixels)
- Normalisér billedets pixelværdier (divider med 255)
- Et-Hot Encode den kategoriske kolonne
- Byg en modelarkitektur (sekventielt) med tætte lag
- Træn modellen og lav forudsigelser
Her er, hvordan du kan bygge en neuronal netværksmodel til MNIST. Jeg har kommenteret de relevante dele af koden for bedre forståelse:
Når du har kørt ovenstående kode, vil du indse, at vi får en god valideringsnøjagtighed på omkring 97% nemt.
Lad os ændre ovenstående kode for at opbygge en CNN-model.
En stor fordel ved at bruge CNN’er frem for NN’er er, at du ikke behøver at flade indgangsbillederne til 1D, da de er i stand til at arbejde med billeddata i 2D. Dette er med til at bevare billedernes “rumlige” egenskaber.
Her er den fulde kode for CNN-modellen:
Selv om vores maksimale valideringsnøjagtighed ved brug af en simpel neuronetværksmodel var omkring 97 %, er CNN-modellen i stand til at opnå 98 %+ med blot et enkelt konvolutionslag!
Du kan gå videre og tilføje flere Conv2D-lag og også lege med hyperparametrene for CNN-modellen.
Identificering af billeder fra CIFAR-10-datasættet ved hjælp af CNN’er
MNIST er et begyndervenligt datasæt inden for computer vision. Det er nemt at score 90 %+ på valideringen ved at bruge en CNN-model. Men hvad nu, hvis du er mere end nybegynder og har brug for noget udfordrende for at sætte dine begreber i spil?
Det er her, CIFAR-10-datasættet kommer ind i billedet!
Sådan beskriver udviklerne bag CIFAR (Canadian Institute For Advanced Research) datasættet:
CIFAR-10-datasættet består af 60.000 32 x 32 farvebilleder i 10 klasser med 6.000 billeder pr. klasse. Der er 50 000 træningsbilleder og 10 000 testbilleder.
De vigtige punkter, der adskiller dette datasæt fra MNIST, er følgende:
- Billederne er farvede i CIFAR-10 sammenlignet med den sort/hvide tekstur i MNIST
- Hvert billede er 32 x 32 pixel
- 50.000 træningsbilleder og 10.000 testbilleder
Nu, disse billeder er taget under forskellige lysforhold og i forskellige vinkler, og da det er farvede billeder, vil du se, at der er mange variationer i selve farven på lignende objekter (f.eks. farven på havvand). Hvis du bruger den simple CNN-arkitektur, som vi så i MNIST-eksemplet ovenfor, vil du få en lav valideringsnøjagtighed på omkring 60 %.
Det er en vigtig grund til, at jeg anbefaler CIFAR-10 som et godt datasæt til at øve dine færdigheder i hyperparameterindstilling for CNN’er. Det gode er, at CIFAR-10 ligesom MNIST også er let tilgængelig i Keras.
Du kan simpelthen indlæse datasættet ved hjælp af følgende kode:
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Her er hvordan du kan opbygge en anstændig (omkring 78-80% på validering) CNN-model til CIFAR-10. Bemærk, hvordan formværdierne er blevet opdateret fra (28, 28, 1) til (32, 32, 3) i henhold til størrelsen af billederne:
Her er, hvad jeg ændrede i modellen:
- Også antallet af Conv2D-lag for at opbygge en dybere model
- Også antallet af filtre for at lære flere funktioner
- Også Dropout til regulering
- Også flere tætte lag
Trænings- og valideringsnøjagtighed på tværs af epokerne:
-
Du kan nemt overgå denne præstation ved at justere ovenstående model. Når du har behersket CIFAR-10, er der også CIFAR-100 tilgængelig i Keras, som du kan bruge til yderligere øvelse. Da den har 100 klasser, vil det ikke være en let opgave at opnå!
Kategorisering af billederne i ImageNet ved hjælp af CNNs
Nu, hvor du har mestret MNIST og CIFAR-10, skal vi tage dette problem en tand højere op. Her vil vi tage et kig på det berømte ImageNet-datasæt.
ImageNet er den vigtigste database bag ImageNet Large Scale Recognition Challenge (ILSVRC). Dette er ligesom De Olympiske Lege for computervision. Det er den konkurrence, der gjorde CNN’er populære første gang, og hvert år konkurrerer de bedste forskerhold på tværs af industrier og akademiske kredse med deres bedste algoritmer om computer vision-opgaver.
Om ImageNet-datasættet
ImageNet-datasættet har mere end 14 millioner billeder, der er håndmærket på tværs af 20.000 kategorier.
Og i modsætning til MNIST- og CIFAR-10-datasættene, som vi allerede har diskuteret, har billederne i ImageNet en anstændig opløsning (224 x 224), og det er det, der udgør en udfordring for os: 14 millioner billeder, hver med 224 x 224 pixels. Behandling af et datasæt af denne størrelse kræver en stor mængde computerkraft i form af CPU, GPU og RAM.
Neddelen – det er måske for meget for en almindelig bærbar computer. Så hvad er den alternative løsning? Hvordan kan en entusiast arbejde med ImageNet-datasættet?
Det er her Fast.ai’s Imagenette-datasæt kommer ind i billedet
Imagenette er et datasæt, der er udtrukket fra den store ImageNet-samling af billeder. Grunden til at frigive Imagenette er, at forskere og studerende kan øve sig på billeder på ImageNet-niveau uden at have brug for så mange beregningsressourcer.
Med Jeremy Howards egne ord:
“Jeg (Jeremy Howard, altså) lavede hovedsageligt Imagenette, fordi jeg ønskede et lille vision-datasæt, som jeg kunne bruge til hurtigt at se, om mine algoritmeidéer kunne have en chance for at virke. Det gør de normalt ikke, men det tager rigtig lang tid for mig at finde ud af det ved at teste dem på Imagenet, især fordi jeg er interesseret i algoritmer, der klarer sig særligt godt i slutningen af træningen.”
Men jeg tror også, at det kan være et nyttigt datasæt for andre.”
Og det vil vi også bruge til træning!
Download Imagenette-datasættet
Sådan kan du hente datasættet (kommandoer til din terminal):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
Når du har hentet datasættet, vil du bemærke, at det har to mapper – “train” og “val”. Disse indeholder henholdsvis trænings- og valideringssættet. Inde i hver mappe er der separate mapper for hver klasse. Her er kortlægningen af klasserne:
Disse klasser har det samme ID i det oprindelige ImageNet-datasæt. Hver af klasserne har ca. 1000 billeder, så samlet set er det et afbalanceret datasæt.
Indlæsning af billeder ved hjælp af ImageDataGenerator
Keras har denne nyttige funktionalitet til indlæsning af store billeder (som vi har her) uden at maxe RAM’en, ved at gøre det i små batches. ImageDataGenerator i kombination med fit_generator giver denne funktionalitet:
ImageDataGenerator udleder selv klasseetiketterne og antallet af klasser fra mappenavnene.
Opbygning af en grundlæggende CNN-model til billedklassifikation
Lad os opbygge en grundlæggende CNN-model til vores Imagenette-datasæt (med henblik på billedklassifikation):
Når vi sammenligner valideringsnøjagtigheden for ovenstående model, vil du indse, at selv om det er en mere dyb arkitektur end den, vi har anvendt hidtil, er vi kun i stand til at få en valideringsnøjagtighed på omkring 40-50 %.
Der kan være mange årsager til dette, såsom at vores model ikke er kompleks nok til at lære de underliggende mønstre i billederne, eller måske er træningsdataene for små til at kunne generalisere præcist på tværs af klasser.
Trin opad – transfer learning.
Anvendelse af transfer learning (VGG16) til at forbedre nøjagtigheden
VGG16 er en CNN-arkitektur, der var den første andenplads i ImageNet Challenge i 2014. Den er designet af Visual Graphics Group i Oxford og har 16 lag i alt, hvoraf selve 13 konvolutionelle lag. Vi vil indlæse de forudtrænede vægte for denne model, så vi kan udnytte de nyttige funktioner, som denne model har lært til vores opgave.
Download af vægte fra 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()
Her er modellens arkitektur:Generer funktioner fra VGG16
Lad os udtrække nyttige funktioner, som VGG16 allerede kender, fra vores datasæt af billeder:
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)
Når ovenstående funktioner er klar, kan vi bare bruge dem til at træne et grundlæggende Fully Connected Neural Network i Keras:Bemærk, hvor hurtigt din model begynder at konvergere. På blot 10 epochs har du en valideringspræcision på 94 %+. Er det ikke fantastisk?
Hvis du har styr på Imagenette-datasættet, har fastai også frigivet to varianter, som omfatter klasser, du vil have svært ved at klassificere:
- Imagewoof: 10 klasser af hunderacer, et mere vanskeligt problem at klassificere
- Image网 (“wang”): En kombination af Imagenette og Imagewoof og et par tricks, der gør det til et sværere problem
Hvor skal vi gå hen herfra?
Ud over de datasæt, vi har ovenfor, kan du også bruge nedenstående datasæt til at opbygge computer vision-algoritmer. Betragt faktisk dette som en udfordring. Kan du anvende din CNN-viden til at slå benchmark-scoren på disse datasæt?
- Fashion MNIST – MNIST-lignende datasæt af tøj og beklædning. I stedet for tal viser billederne en type beklædningsgenstand (T-shirt, bukser, taske osv.)
- Caltech 101 – Et andet udfordrende datasæt, som jeg fandt til billedklassificering
Jeg foreslår også, at du, inden du går i gang med transfer learning, prøver at forbedre dine basis-CNN-modeller. Du kan lære af arkitekturen i VGG16, ZFNet osv. for at få nogle ledetråde om hyperparameterindstilling, og du kan bruge den samme ImageDataGenerator til at øge dine billeder og øge datasættets størrelse.
Du kan også læse denne artikel på vores Mobile APP