- Introduktion
- Table of Contents
- Användning av CNNs för att klassificera handskrivna siffror på MNIST-dataset
- Identifiering av bilder från CIFAR-10-dataset med hjälp av CNNs
- Här är vad jag ändrade i modellen:
- Kategorisering av bilderna i ImageNet med hjälp av CNNs
- Om ImageNet-dataset
- Det är där Fast.ai:s Imagenette-dataset kommer in
- Ladda ner Imagenette Dataset
- Ladning av bilder med hjälp av ImageDataGenerator
- Byggandet av en grundläggande CNN-modell för bildklassificering
- Användning av överföringsinlärning (VGG16) för att förbättra noggrannheten
- Hämtning av vikter från VGG16
- Generera funktioner från VGG16
- Vart ska vi ta vägen härifrån?
Introduktion
Konvolutionella neurala nätverk (CNN) – konceptet bakom de senaste genombrotten och utvecklingen inom djupinlärning.
CNN har brutit mot normen och stigit upp på tronen för att bli den senaste tekniken för datorseende. Bland de olika typerna av neurala nätverk (andra inkluderar recurrent neural networks (RNN), long short term memory (LSTM), artificial neural networks (ANN) etc.) är CNNs lätt de mest populära.
Dessa konvolutionella neurala nätverksmodeller är allestädes närvarande i bilddatarummet. De fungerar fenomenalt bra på datorseendeuppgifter som bildklassificering, objektsdetektering, bildigenkänning osv.
Så – var kan du öva dina CNN-färdigheter? Du har kommit till rätt ställe!
Det finns olika dataset som du kan använda för att tillämpa konvolutionella neurala nätverk. Här är tre populära dataset:
- MNIST
- CIFAR-10
- ImageNet
I den här artikeln kommer vi att bygga bildklassificeringsmodeller med hjälp av CNN på vart och ett av dessa dataset. Det stämmer! Vi kommer att utforska MNSIT, CIFAR-10 och ImageNet för att på ett praktiskt sätt förstå hur CNN fungerar för bildklassificeringsuppgiften.
Du kan lära dig allt om Convolutional Neural Networks(CNN) i den här gratiskursen: Du kan lära dig allt om Convolutional Neural Networks (CNN) i denna kostnadsfria kurs: Convolutional Neural Networks (CNN) from Scratch
Min inspiration till att skriva den här artikeln är att hjälpa samhället att tillämpa teoretisk kunskap på ett praktiskt sätt. Detta är en mycket viktig övning eftersom den inte bara hjälper dig att bygga upp en djupare förståelse för det underliggande konceptet utan också lär dig praktiska detaljer som du bara kan lära dig genom att implementera konceptet.
Om du är ny i världen av neurala nätverk, CNN och bildklassificering rekommenderar jag att du går igenom dessa utmärkta, djupgående handledningar:
- Introduktion till neurala nätverk (gratis kurs!)
- Demystifying the Mathematics behind Convolutional Neural Networks (CNNs)
- Bygg din första bildklassificeringsmodell på bara 10 minuter
Och om du vill lära dig datorseende och djupinlärning på djupet bör du kolla in våra populära kurser:
- Computer Vision using Deep Learning
- Certified AI & ML Blackbelt+ Program
Table of Contents
- Using CNNs to Classify Hand-written Digits on MNIST Dataset
- Identifiera bilder från CIFAR-10 Dataset med hjälp av CNNs
- Kategorisera bilder från ImageNet Dataset med hjälp av CNNs
- Vart ska vi gå härifrån?
Note: Jag kommer att använda Keras för att demonstrera bildklassificering med hjälp av CNNs i den här artikeln. Keras är ett utmärkt ramverk att lära sig när man börjar med djupinlärning.
Användning av CNNs för att klassificera handskrivna siffror på MNIST-dataset
MNIST (Modified National Institute of Standards and Technology) är ett välkänt dataset som används inom datorseende och som byggdes av Yann Le Cun et. Den består av bilder som är handskrivna siffror (0-9), uppdelade i en träningsuppsättning på 50 000 bilder och en testuppsättning på 10 000 där varje bild är 28 x 28 pixlar i bredd och höjd.
Den här datauppsättningen används ofta för att öva på algoritmer som är gjorda för bildklassificering eftersom datauppsättningen är ganska lätt att erövra. Därför rekommenderar jag att detta bör vara ditt första dataset om du bara försöker dig på området.
MNIST levereras med Keras som standard och du kan helt enkelt ladda tränings- och testfilerna med hjälp av några få rader kod:
Här är formen på X (funktioner) och y (mål) för tränings- och valideringsdata:
X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)
Innan vi tränar en CNN-modell, låt oss bygga ett grundläggande Fully Connected Neural Network för datasetetet. De grundläggande stegen för att bygga en modell för bildklassificering med hjälp av ett neuralt nätverk är följande:
- Flatta ut de ingående bilddimensionerna till 1D (bredd pixlar x höjd pixlar)
- Normalisera bildens pixelvärden (dela med 255)
- En-Hot Encode the categorical column
- Bygg en modellarkitektur (Sequential) med täta lager
- Tränar modellen och gör förutsägelser
Här är hur du kan bygga en modell av ett neuralt nätverk för MNIST. Jag har kommenterat de relevanta delarna av koden för bättre förståelse:
Efter att ha kört ovanstående kod hade du insett att vi får en bra valideringsnoggrannhet på cirka 97 % enkelt.
Låt oss modifiera ovanstående kod för att bygga en CNN-modell.
En stor fördel med att använda CNN:er framför NN:er är att du inte behöver platta till de ingående bilderna till 1D eftersom de kan arbeta med bilddata i 2D. Detta bidrar till att bibehålla bildernas ”rumsliga” egenskaper.
Här är den fullständiga koden för CNN-modellen:
Även om vår maximala valideringsnoggrannhet med hjälp av en enkel modell av ett neuralt nätverk var omkring 97 %, kan CNN-modellen uppnå 98 %+ med bara ett enda konvolutionslager!
Du kan gå vidare och lägga till fler Conv2D-skikt och även leka med CNN-modellens hyperparametrar.
Identifiering av bilder från CIFAR-10-dataset med hjälp av CNNs
MNIST är ett nybörjarvänligt dataset inom datorseende. Det är lätt att få 90 % eller mer på valideringen genom att använda en CNN-modell. Men vad händer om du är mer än nybörjare och behöver något utmanande för att använda dina begrepp?
Det är där CIFAR-10-dataset kommer in i bilden!
Så här beskriver utvecklarna bakom CIFAR (Canadian Institute For Advanced Research) datasetet:
CIFAR-10-datasetet består av 60 000 32 x 32 färgbilder i 10 klasser, med 6 000 bilder per klass. Det finns 50 000 träningsbilder och 10 000 testbilder.
De viktiga punkter som skiljer detta dataset från MNIST är följande:
- Bilderna är färgade i CIFAR-10 jämfört med den svartvita texturen i MNIST
- Varje bild är 32 x 32 pixlar
- 50 000 träningsbilder och 10 000 testbilder
Nu, Dessa bilder är tagna i olika ljusförhållanden och i olika vinklar, och eftersom det är färgade bilder kommer du att se att det finns många variationer i själva färgen på liknande objekt (t.ex. färgen på havsvatten). Om du använder den enkla CNN-arkitekturen som vi såg i MNIST-exemplet ovan kommer du att få en låg valideringsnoggrannhet på cirka 60 %.
Det är en viktig anledning till varför jag rekommenderar CIFAR-10 som en bra datamängd för att öva upp dina färdigheter i att ställa in hyperparametrar för CNN:er. Det som är bra är att precis som MNIST är CIFAR-10 också lätt tillgänglig i Keras.
Du kan helt enkelt ladda datamängden med följande kod:
from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()
Här ser du hur du kan bygga en hyfsad (cirka 78-80 % på validering) CNN-modell för CIFAR-10. Lägg märke till hur formvärdena har uppdaterats från (28, 28, 1) till (32, 32, 3) i enlighet med storleken på bilderna:
Här är vad jag ändrade i modellen:
- Ökat antalet Conv2D-skikt för att bygga en djupare modell
- Ökat antalet filter för att lära sig fler funktioner
- Tillagt Dropout för regularisering
- Tillagt fler Täta skikt
Tränings- och valideringsnoggrannhet över epoker:
Du kan lätt överträffa denna prestanda genom att justera ovanstående modell. När du väl behärskar CIFAR-10 finns det även CIFAR-100 tillgängligt i Keras som du kan använda för ytterligare övning. Eftersom den har 100 klasser kommer det inte att bli en lätt uppgift att uppnå!
Kategorisering av bilderna i ImageNet med hjälp av CNNs
Nu när du behärskar MNIST och CIFAR-10, ska vi ta det här problemet ett steg högre. Här ska vi ta en titt på den berömda ImageNet-dataseten.
ImageNet är huvuddatabasen bakom ImageNet Large Scale Recognition Challenge (ILSVRC). Detta är som de olympiska spelen i datorseende. Detta är den tävling som gjorde CNNs populära för första gången och varje år tävlar de bästa forskargrupperna inom industrier och den akademiska världen med sina bästa algoritmer om datorseende uppgifter.
Om ImageNet-dataset
ImageNet-dataset har mer än 14 miljoner bilder som är handmärkta i 20 000 kategorier.
Och till skillnad från MNIST- och CIFAR-10-dataseten som vi redan har diskuterat har bilderna i ImageNet en hyfsad upplösning (224 x 224) och det är det som utgör en utmaning för oss: 14 miljoner bilder, var och en 224 x 224 pixlar. För att bearbeta en datamängd av den här storleken krävs en stor mängd datorkraft i form av CPU, GPU och RAM.
Nackdelen – det kan vara för mycket för en vanlig bärbar dator. Så vad är den alternativa lösningen? Hur kan en entusiast arbeta med ImageNet-dataset?
Det är där Fast.ai:s Imagenette-dataset kommer in
Imagenette är ett dataset som är hämtat från den stora ImageNet-samlingen av bilder. Anledningen till att Imagenette släpps är att forskare och studenter kan öva på bilder på ImageNet-nivå utan att behöva så mycket beräkningsresurser.
Med Jeremy Howards egna ord:
”Jag (Jeremy Howard, alltså) gjorde Imagenette främst för att jag ville ha en liten vision-dataset som jag kunde använda för att snabbt se om mina algoritmidéer kunde ha en chans att fungera. Det gör de normalt inte, men att testa dem på Imagenet tar väldigt lång tid för mig att ta reda på det, särskilt eftersom jag är intresserad av algoritmer som presterar särskilt bra i slutet av träningen.
Men jag tror att detta kan vara ett användbart dataset även för andra.”
Och det kommer vi också att använda för att träna!
Ladda ner Imagenette Dataset
Här är hur du hämtar datasetet (kommandon för din terminal):
$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz
När du väl har laddat ner datasetetet kommer du att märka att det har två mappar – ”train” och ”val”. Dessa innehåller träningsuppsättningen respektive valideringsuppsättningen. Inom varje mapp finns det separata mappar för varje klass. Här är kartläggningen av klasserna:
Dessa klasser har samma ID i den ursprungliga ImageNet-dataseten. Var och en av klasserna har ungefär 1000 bilder så totalt sett är det ett balanserat dataset.
Ladning av bilder med hjälp av ImageDataGenerator
Keras har den här användbara funktionaliteten för att ladda stora bilder (som vi har här) utan att maxa RAM-minnet, genom att göra det i små batcher. ImageDataGenerator i kombination med fit_generator ger den här funktionaliteten:
ImageDataGenerator själv härleder klassbeteckningarna och antalet klasser från mappnamnen.
Byggandet av en grundläggande CNN-modell för bildklassificering
Låt oss bygga en grundläggande CNN-modell för vårt Imagenette-dataset (för bildklassificering):
När vi jämför valideringsnoggrannheten för ovanstående modell kommer du att inse att även om det är en djupare arkitektur än vad vi har använt hittills, kan vi bara få en valideringsnoggrannhet på cirka 40-50 %.
Det kan finnas många orsaker till detta, t.ex. att vår modell inte är tillräckligt komplex för att lära sig de underliggande mönstren i bilderna, eller att träningsdatan kanske är för liten för att kunna generalisera exakt mellan olika klasser.
Steg uppåt – överföringsinlärning.
Användning av överföringsinlärning (VGG16) för att förbättra noggrannheten
VGG16 är en CNN-arkitektur som var förstaplatsen i ImageNet Challenge 2014. Den är utformad av Visual Graphics Group vid Oxford och har totalt 16 lager, varav 13 konvolutionella lager i sig. Vi kommer att ladda de förtränade vikterna för den här modellen så att vi kan använda de användbara funktioner som den här modellen har lärt sig för vår uppgift.
Hämtning av vikter från 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()
Generera funktioner från VGG16
Låt oss extrahera användbara funktioner som VGG16 redan känner till från bilderna i vårt dataset:
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)
Märk hur snabbt din modell börjar konvergera. Efter bara 10 epoker har du en valideringsnoggrannhet på över 94 %. Är inte det fantastiskt?
Infall du behärskar Imagenette-dataset har fastai också släppt två varianter som innehåller klasser som du har svårt att klassificera:
- Imagewoof: 10 klasser av hundraser, ett svårare problem att klassificera
- Image网 (”wang”): En kombination av Imagenette och Imagewoof och ett par knep som gör det till ett svårare problem
Vart ska vi ta vägen härifrån?
Avstånd från de datamängder vi har ovan kan du också använda nedanstående datamängder för att bygga algoritmer för datorseende. Se det här som en utmaning. Kan du använda dina CNN-kunskaper för att slå referensvärdet på dessa dataset?
- Fashion MNIST – MNIST-liknande dataset med kläder och klädesplagg. I stället för siffror visar bilderna en typ av kläder (T-shirt, byxor, väska etc.)
- Caltech 101 – Ett annat utmanande dataset som jag hittade för bildklassificering
Jag föreslår också att du försöker förbättra dina CNN-basmodeller innan du börjar med transferinlärning. Du kan lära dig av arkitekturen hos VGG16, ZFNet osv. för att få några ledtrådar om hyperparameterinställning och du kan använda samma ImageDataGenerator för att öka dina bilder och öka datasetets storlek.
Du kan också läsa den här artikeln på vår mobilapp