Introduction

Convolutionele neurale netwerken (CNN) – het concept achter recente doorbraken en ontwikkelingen in deep learning.

CNN’s hebben de vorm doorbroken en zijn op de troon gestoten om de allernieuwste computervisietechniek te worden. Van de verschillende soorten neurale netwerken (waaronder recurrente neurale netwerken (RNN), lange-korte-termijngeheugen (LSTM), kunstmatige neurale netwerken (ANN), enz.), zijn CNN’s gemakkelijk de populairste.

Deze convolutionele neurale netwerkmodellen zijn alomtegenwoordig in de beeldgegevensruimte. Ze werken fenomenaal goed bij computervisietaken zoals beeldclassificatie, objectdetectie, beeldherkenning, enzovoort.

Dus – waar kun je je CNN-vaardigheden oefenen? Nou, je bent op de juiste plaats!

Er zijn verschillende datasets die je kunt gebruiken voor het toepassen van convolutionele neurale netwerken. Dit zijn drie populaire datasets:

  • MNIST
  • CIFAR-10
  • ImageNet

In dit artikel zullen we op elk van deze datasets beeldclassificatiemodellen bouwen met CNN. Dat klopt! We onderzoeken MNSIT, CIFAR-10 en ImageNet om op een praktische manier te begrijpen hoe CNN’s werken voor de classificatietaak van afbeeldingen.

U kunt alles leren over Convolutionele Neurale Netwerken (CNN) in deze gratis cursus: Convolutional Neural Networks (CNN) from Scratch

Mijn inspiratie voor het schrijven van dit artikel is om de gemeenschap te helpen theoretische kennis op een praktische manier toe te passen. Dit is een zeer belangrijke oefening, omdat het je niet alleen helpt een dieper begrip van het onderliggende concept op te bouwen, maar je ook praktische details leert die je alleen kunt leren door het concept te implementeren.

Als je nieuw bent in de wereld van neurale netwerken, CNN’s, beeldclassificatie, raad ik je aan deze uitstekende diepgaande tutorials door te nemen:

  • Introductie tot Neurale Netwerken (Gratis Cursus!)
  • Demystifying the Mathematics behind Convolutional Neural Networks (CNNs)
  • Build your First Image Classification Model in just 10 Minutes

En als je op zoek bent om computervisie en deep learning diepgaand te leren, moet je onze populaire cursussen bekijken:

  • Computer Vision using Deep Learning
  • Certified AI & ML Blackbelt+ Program

Table of Contents

  1. Using CNNs to Classify Hand-geschreven cijfers op MNIST Dataset
  2. Identificeren van afbeeldingen van CIFAR-10 Dataset met behulp van CNNs
  3. Categoriseren van afbeeldingen van ImageNet Dataset met behulp van CNNs
  4. Waarheen vanaf hier?

Note: Ik zal Keras gebruiken om beeldclassificatie met CNNs te demonstreren in dit artikel. Keras is een uitstekend framework om te leren als je begint met deep learning.

Using CNNs to Classify Hand-written Digits on MNIST Dataset

MNIST (Modified National Institute of Standards and Technology) is een bekende dataset die wordt gebruikt in Computer Vision en die is gebouwd door Yann Le Cun et. Het bestaat uit afbeeldingen van handgeschreven cijfers (0-9), verdeeld in een trainingsset van 50.000 afbeeldingen en een testset van 10.000, waarbij elke afbeelding 28 x 28 pixels in breedte en hoogte heeft.

Deze dataset wordt vaak gebruikt voor het oefenen van algoritmen voor beeldclassificatie, omdat de dataset vrij gemakkelijk te veroveren is. Vandaar dat ik aanbeveel dat dit je eerste dataset zou moeten zijn als je net in het veld vaagt.

MNIST wordt standaard geleverd met Keras en je kunt eenvoudig de train- en testbestanden laden met behulp van een paar regels code:

Hier is de vorm van X (kenmerken) en y (doel) voor de trainings- en validatiegegevens:

X_train shape (60000, 28, 28) y_train shape (60000,) X_test shape (10000, 28, 28) y_test shape (10000,)

Voordat we een CNN-model trainen, laten we een basis Fully Connected Neural Network bouwen voor de dataset. De basisstappen voor het bouwen van een beeldclassificatiemodel met behulp van een neuraal netwerk zijn:

  1. Vlak de afmetingen van de invoerafbeelding af tot 1D (breedte pixels x hoogte pixels)
  2. Normaliseer de pixelwaarden van de afbeelding (deel door 255)
  3. Een-Hot Encodeer de categorische kolom
  4. Bouw een model architectuur (Sequential) met Dichte lagen
  5. Train het model en maak voorspellingen

Hier ziet u hoe u een neuraal netwerk model kunt bouwen voor MNIST. Ik heb de relevante delen van de code becommentarieerd voor een beter begrip:

Na het uitvoeren van de bovenstaande code, zou je je realiseren dat we een goede validatie nauwkeurigheid van ongeveer 97% gemakkelijk te krijgen.

Laten we bovenstaande code wijzigen om een CNN-model te bouwen.

Een groot voordeel van het gebruik van CNN’s ten opzichte van NN’s is dat u de invoerbeelden niet hoeft af te vlakken tot 1D, aangezien ze in staat zijn om met beeldgegevens in 2D te werken. Dit helpt bij het behouden van de “ruimtelijke” eigenschappen van afbeeldingen.

Hier vindt u de volledige code voor het CNN-model:

Hoewel onze maximale validatienauwkeurigheid bij gebruik van een eenvoudig neuraal netwerkmodel rond 97% lag, is het CNN-model in staat om 98%+ te halen met slechts één convolutielaag!

Je kunt doorgaan en meer Conv2D-lagen toevoegen, en ook spelen met de hyperparameters van het CNN-model.

Identificatie van afbeeldingen uit de CIFAR-10-dataset met behulp van CNN’s

MNIST is een beginnersvriendelijke dataset in computervisie. Het is makkelijk om 90%+ te scoren op validatie door een CNN model te gebruiken. Maar wat als je geen beginner meer bent en iets uitdagends nodig hebt om je concepten toe te passen?

Daar komt de CIFAR-10 dataset in beeld!

Hierboven beschrijven de ontwikkelaars achter CIFAR (Canadian Institute For Advanced Research) de dataset:

De CIFAR-10 dataset bestaat uit 60.000 32 x 32 kleurenbeelden in 10 klassen, met 6.000 beelden per klasse. Er zijn 50.000 trainingsbeelden en 10.000 testbeelden.

De belangrijke punten die deze dataset onderscheiden van MNIST zijn:

  • De beelden zijn gekleurd in CIFAR-10 in vergelijking met de zwart-witte textuur van MNIST
  • Elk beeld is 32 x 32 pixel
  • 50.000 trainingsbeelden en 10.000 testbeelden

Nu, deze beelden zijn genomen in verschillende lichtomstandigheden en onder verschillende hoeken, en aangezien dit gekleurde beelden zijn, zult u zien dat er veel variaties zijn in de kleur zelf van vergelijkbare objecten (bijvoorbeeld de kleur van oceaanwater). Als je de eenvoudige CNN architectuur gebruikt die we in het MNIST voorbeeld hierboven zagen, krijg je een lage validatie nauwkeurigheid van rond de 60%.

Dat is een belangrijke reden waarom ik CIFAR-10 aanbeveel als een goede dataset om je hyperparameter tuning vaardigheden voor CNNs te oefenen. Het goede is dat net als MNIST, CIFAR-10 ook gemakkelijk beschikbaar is in Keras.

Je kunt de dataset eenvoudig laden met behulp van de volgende code:

from keras.datasets import cifar10# loading the dataset (X_train, y_train), (X_test, y_test) = cifar10.load_data()

Hier zie je hoe je een fatsoenlijk (rond 78-80% op validatie) CNN-model voor CIFAR-10 kunt bouwen. Merk op hoe de vormwaarden zijn bijgewerkt van (28, 28, 1) tot (32, 32, 3) volgens de grootte van de afbeeldingen:

Hier is wat ik in het model heb veranderd:

  • Verhoogd aantal Conv2D lagen om een dieper model te bouwen
  • Verhoogd aantal filters om meer eigenschappen te leren
  • Extra Dropout voor regularisatie
  • Extra Dense lagen

Training en validatie nauwkeurigheid over epochs:

U kunt deze prestaties gemakkelijk overtreffen door het bovenstaande model te tunen. Als je CIFAR-10 onder de knie hebt, is er ook CIFAR-100 beschikbaar in Keras, dat je kunt gebruiken om verder te oefenen. Aangezien het 100 klassen heeft, zal het geen gemakkelijke taak zijn om te bereiken!

Categoriseren van de afbeeldingen van ImageNet met behulp van CNNs

Nu je MNIST en CIFAR-10 onder de knie hebt, laten we dit probleem een tandje hoger zetten. Hier kijken we naar de beroemde ImageNet-dataset.

ImageNet is de belangrijkste database achter de ImageNet Large Scale Recognition Challenge (ILSVRC). Dit is als de Olympische Spelen van Computervisie. Dit is de wedstrijd die CNN’s voor het eerst populair heeft gemaakt, en elk jaar strijden de beste onderzoeksteams uit het bedrijfsleven en de academische wereld met hun beste algoritmen op computervisietaken.

Over de ImageNet-dataset

De ImageNet-dataset bevat meer dan 14 miljoen afbeeldingen, die met de hand zijn gelabeld in 20.000 categorieën.

Ook hebben de afbeeldingen in ImageNet, in tegenstelling tot de MNIST- en CIFAR-10-datasets die we al hebben besproken, een behoorlijke resolutie (224 x 224) en dat is wat ons voor een uitdaging stelt: 14 miljoen afbeeldingen, elk 224 bij 224 pixels. Het verwerken van een dataset van deze omvang vereist een grote hoeveelheid rekenkracht in termen van CPU, GPU, en RAM.

Het nadeel – dat is misschien te veel voor een alledaagse laptop. Dus wat is de alternatieve oplossing? Hoe kan een enthousiasteling werken met de ImageNet dataset?

Daar komt Fast.ai’s Imagenette dataset om de hoek kijken

Imagenette is een dataset die is afgeleid van de grote ImageNet verzameling van afbeeldingen. De reden achter het uitbrengen van Imagenette is dat onderzoekers en studenten kunnen oefenen op afbeeldingen van ImageNet-niveau zonder dat ze daarvoor veel rekenkracht nodig hebben.

In de woorden van Jeremy Howard zelf:

“Ik (Jeremy Howard, dat is) heb Imagenette voornamelijk gemaakt omdat ik een kleine vision-dataset wilde die ik kon gebruiken om snel te zien of mijn algoritme-ideeën misschien een kans hadden om te werken. Normaal gesproken doen ze dat niet, maar ze testen op Imagenet kost me echt veel tijd om dat uit te vinden, vooral omdat ik geïnteresseerd ben in algoritmen die bijzonder goed presteren aan het einde van de training.

Maar ik denk dat dit ook voor anderen een nuttige dataset kan zijn.”

En dat gaan we ook gebruiken om te oefenen.

Download de Imagenette Dataset

Hier ziet u hoe u de dataset kunt ophalen (opdrachten voor uw terminal):

$ wget https://s3.amazonaws.com/fast-ai-imageclas/imagenette2.tgz$ tar -xf imagenette2.tgz

Als u de dataset eenmaal hebt gedownload, zult u merken dat deze twee mappen heeft – “train” en “val”. Deze bevatten respectievelijk de training en de validatie set. Binnen elke map zijn er aparte mappen voor elke klasse. Hier volgt een overzicht van de klassen:

Deze klassen hebben dezelfde ID in de oorspronkelijke ImageNet-dataset. Elk van de klassen heeft ongeveer 1000 afbeeldingen, dus over het geheel genomen is het een evenwichtige dataset.

Afbeeldingen laden met ImageDataGenerator

Keras heeft deze handige functionaliteit voor het laden van grote afbeeldingen (zoals we hier hebben) zonder de RAM te maximaliseren, door het in kleine batches te doen. ImageDataGenerator in combinatie met fit_generator biedt deze functionaliteit:

De ImageDataGenerator zelf leidt de klassenlabels en het aantal klassen af uit de mapnamen.

Bouwen van een elementair CNN-model voor beeldclassificatie

Laten we een elementair CNN-model bouwen voor onze Imagenette-dataset (ten behoeve van beeldclassificatie):

Wanneer we de validatienauwkeurigheid van het bovenstaande model vergelijken, zult u zich realiseren dat, hoewel het een diepere architectuur is dan wat we tot nu toe hebben gebruikt, we slechts een validatienauwkeurigheid van rond de 40-50% kunnen halen.

Daar kunnen veel redenen voor zijn, zoals dat ons model niet complex genoeg is om de onderliggende patronen van afbeeldingen te leren, of misschien zijn de trainingsgegevens te klein om nauwkeurig over klassen te generaliseren.

Step up – transfer learning.

Gebruik transfer learning (VGG16) om nauwkeurigheid te verbeteren

VGG16 is een CNN-architectuur die de eerste runner-up was in de 2014 ImageNet Challenge. Het is ontworpen door de Visual Graphics Group in Oxford en heeft 16 lagen in totaal, met 13 convolutionele lagen zelf. We zullen de voorgetrainde gewichten van dit model laden, zodat we de nuttige kenmerken kunnen gebruiken die dit model heeft geleerd voor onze taak.

Downloaden gewichten van 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()
Hier volgt de architectuur van het model:

Genereer kenmerken van VGG16

Laten we nuttige kenmerken die VGG16 al kent uit de beelden van onze dataset extraheren:

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)
Als de bovenstaande features eenmaal klaar zijn, kunnen we ze gewoon gebruiken om een basis Fully Connected Neural Network in Keras te trainen:

Merk op hoe snel uw model begint te convergeren. In slechts 10 epochs, heb je een 94%+ validatie nauwkeurigheid. Is dat niet verbazingwekkend?

In het geval dat u de Imagenette-dataset onder de knie hebt, heeft fastai ook twee varianten uitgebracht die klassen bevatten die u moeilijk zult kunnen classificeren:

  • Imagewoof: 10 klassen van hondenrassen, een moeilijker probleem om te classificeren
  • Image网 (“wang”): Een combinatie van Imagenette en Imagewoof en een paar trucs die het een moeilijker probleem maken

Hoe nu verder?

Naast de datasets die we hierboven hebben, kun je ook de onderstaande datasets gebruiken om computervisie-algoritmen te bouwen. In feite, beschouw dit als een uitdaging. Kun je met je CNN-kennis de benchmarkscore op deze datasets verslaan?

  • Fashion MNIST – MNIST-achtige dataset van kleding en kleding. In plaats van cijfers tonen de afbeeldingen een type kleding (T-shirt, broek, tas, enz.)
  • Caltech 101 – Nog een uitdagende dataset die ik vond voor beeldclassificatie

Ik stel ook voor dat je, voordat je aan transfer learning gaat doen, probeert je basis CNN-modellen te verbeteren. Je kunt leren van de architecturen van VGG16, ZFNet, enz. voor wat aanwijzingen over het afstemmen van hyperparameters en je kunt dezelfde ImageDataGenerator gebruiken om je afbeeldingen te vergroten en de omvang van de dataset te vergroten.

Je kunt dit artikel ook lezen op onze mobiele APP

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.