Einführung

Convolutional Neural Networks (CNN) – das Konzept, das hinter den jüngsten Durchbrüchen und Entwicklungen im Bereich Deep Learning steht.

CNNs haben den Rahmen gesprengt und den Thron bestiegen, um die modernste Computer-Vision-Technik zu werden. Unter den verschiedenen Arten von neuronalen Netzen (zu den anderen gehören rekurrente neuronale Netze (RNN), Long Short Term Memory (LSTM), künstliche neuronale Netze (ANN) usw.) sind CNNs mit Abstand die populärsten.

Diese faltungsbasierten neuronalen Netzmodelle sind im Bereich der Bilddaten allgegenwärtig. Sie funktionieren phänomenal gut bei Computer-Vision-Aufgaben wie Bildklassifizierung, Objekterkennung, Bilderkennung usw.

Wo können Sie also Ihre CNN-Kenntnisse trainieren? Dann sind Sie hier genau richtig:

Es gibt verschiedene Datensätze, die Sie für die Anwendung von Faltungsneuronalen Netzen nutzen können. Hier sind drei beliebte Datensätze:

  • MNIST
  • CIFAR-10
  • ImageNet

In diesem Artikel werden wir Modelle zur Bildklassifizierung mit CNN auf jedem dieser Datensätze erstellen. That’s right! Wir werden MNSIT, CIFAR-10 und ImageNet untersuchen, um auf praktische Weise zu verstehen, wie CNNs für die Bildklassifizierung funktionieren.

In diesem kostenlosen Kurs können Sie alles über Convolutional Neural Networks (CNN) lernen: Convolutional Neural Networks (CNN) from Scratch

Ich habe diesen Artikel geschrieben, um der Community zu helfen, theoretisches Wissen in der Praxis anzuwenden. Dies ist eine sehr wichtige Übung, da sie nicht nur zu einem tieferen Verständnis des zugrunde liegenden Konzepts beiträgt, sondern auch praktische Details vermittelt, die nur durch die Implementierung des Konzepts erlernt werden können.

Wenn Sie neu in der Welt der neuronalen Netze, CNNs und der Bildklassifizierung sind, empfehle ich Ihnen, diese ausgezeichneten, ausführlichen Tutorials durchzuarbeiten:

  • Einführung in neuronale Netze (kostenloser Kurs!)
  • Demystifying the Mathematics behind Convolutional Neural Networks (CNNs)
  • Build your First Image Classification Model in just 10 Minutes

Und wenn Sie sich eingehend mit Computer Vision und Deep Learning beschäftigen möchten, sollten Sie sich unsere beliebten Kurse ansehen:

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

Inhaltsverzeichnis

  1. Using CNNs to Classify Hand-.written Digits on MNIST Dataset
  2. Identifying Images from CIFAR-10 Dataset using CNNs
  3. Categorizing Images of ImageNet Dataset using CNNs
  4. Where to go from here?

Hinweis: In diesem Artikel werde ich Keras verwenden, um die Bildklassifizierung mit CNNs zu demonstrieren. Keras ist ein hervorragendes Framework zum Erlernen von Deep Learning.

Using CNNs to Classify Hand-written Digits on MNIST Dataset

MNIST (Modified National Institute of Standards and Technology) ist ein bekannter Datensatz, der in der Computer Vision verwendet wird und von Yann Le Cun et. al. erstellt wurde. Er besteht aus Bildern handgeschriebener Ziffern (0-9), die in eine Trainingsmenge von 50.000 Bildern und eine Testmenge von 10.000 Bildern aufgeteilt sind, wobei jedes Bild eine Breite und Höhe von 28 x 28 Pixeln hat.

Dieser Datensatz wird häufig zum Üben von Algorithmen zur Bildklassifizierung verwendet, da er relativ leicht zu bewältigen ist. Daher empfehle ich, dass dies Ihr erster Datensatz sein sollte, wenn Sie gerade erst in das Feld einsteigen.

MNIST wird standardmäßig mit Keras geliefert und Sie können die Trainings- und Testdateien einfach mit ein paar Codezeilen laden:

Hier ist die Form von X (Features) und y (Ziel) für die Trainings- und Validierungsdaten:

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

Bevor wir ein CNN-Modell trainieren, lassen Sie uns ein grundlegendes Fully Connected Neural Network für den Datensatz erstellen. Die grundlegenden Schritte zum Aufbau eines Bildklassifizierungsmodells mit einem neuronalen Netzwerk sind:

  1. Die Abmessungen des Eingabebildes auf 1D reduzieren (Breite Pixel x Höhe Pixel)
  2. Die Pixelwerte des Bildes normalisieren (durch 255 dividieren)
  3. Ein-.Hot Encode der kategorialen Spalte
  4. Erstellen einer Modellarchitektur (sequenziell) mit dichten Schichten
  5. Trainieren Sie das Modell und machen Sie Vorhersagen

So können Sie ein neuronales Netzwerkmodell für MNIST erstellen. Zum besseren Verständnis habe ich die relevanten Teile des Codes kommentiert:

Nachdem Sie den obigen Code ausgeführt haben, werden Sie feststellen, dass wir leicht eine gute Validierungsgenauigkeit von etwa 97 % erreichen.

Lassen Sie uns den obigen Code modifizieren, um ein CNN-Modell zu erstellen.

Ein großer Vorteil der Verwendung von CNNs gegenüber NNs ist, dass man die Eingabebilder nicht auf 1D reduzieren muss, da sie mit Bilddaten in 2D arbeiten können. Dadurch bleiben die „räumlichen“ Eigenschaften der Bilder erhalten.

Hier ist der vollständige Code für das CNN-Modell:

Obwohl unsere maximale Validierungsgenauigkeit bei Verwendung eines einfachen neuronalen Netzwerkmodells bei etwa 97 % lag, kann das CNN-Modell mit nur einer einzigen Faltungsschicht 98 %+ erreichen!

Sie können weitere Conv2D-Schichten hinzufügen und auch mit den Hyperparametern des CNN-Modells herumspielen.

Bilder aus dem CIFAR-10-Datensatz mit CNNs identifizieren

MNIST ist ein einsteigerfreundlicher Datensatz in der Computer Vision. Es ist leicht, mit einem CNN-Modell bei der Validierung 90 % und mehr zu erreichen. Aber was ist, wenn Sie nicht nur Anfänger sind und etwas Anspruchsvolles brauchen, um Ihre Konzepte anzuwenden?

Hier kommt der CIFAR-10-Datensatz ins Spiel:

So beschreiben die Entwickler von CIFAR (Canadian Institute For Advanced Research) den Datensatz:

Der CIFAR-10-Datensatz besteht aus 60.000 32 x 32-Farbbildern in 10 Klassen, mit 6.000 Bildern pro Klasse. Es gibt 50.000 Trainingsbilder und 10.000 Testbilder.

Die wichtigsten Punkte, die diesen Datensatz von MNIST unterscheiden, sind:

  • Die Bilder sind in CIFAR-10 farbig im Vergleich zur schwarz-weißen Textur von MNIST
  • Jedes Bild ist 32 x 32 Pixel groß
  • 50.000 Trainingsbilder und 10.000 Testbilder

Nun, Da es sich um farbige Bilder handelt, werden Sie feststellen, dass es viele Variationen in der Farbe ähnlicher Objekte gibt (z. B. die Farbe des Meereswassers). Wenn Sie die einfache CNN-Architektur verwenden, die wir im obigen MNIST-Beispiel gesehen haben, erhalten Sie eine niedrige Validierungsgenauigkeit von etwa 60 %.

Das ist ein Hauptgrund, warum ich CIFAR-10 als einen guten Datensatz empfehle, um Ihre Fähigkeiten beim Hyperparameter-Tuning für CNNs zu üben. Das Gute daran ist, dass CIFAR-10 genau wie MNIST leicht in Keras verfügbar ist.

Sie können den Datensatz einfach mit dem folgenden Code laden:

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

So können Sie ein anständiges CNN-Modell (ca. 78-80 % bei der Validierung) für CIFAR-10 erstellen. Beachten Sie, wie die Formwerte von (28, 28, 1) auf (32, 32, 3) entsprechend der Größe der Bilder aktualisiert wurden:

Hier ist, was ich im Modell geändert habe:

  • Anzahl der Conv2D-Schichten erhöht, um ein tieferes Modell zu erstellen
  • Anzahl der Filter erhöht, um mehr Merkmale zu lernen
  • Dropout für Regularisierung hinzugefügt
  • Mehr Dense-Schichten hinzugefügt

Trainings- und Validierungsgenauigkeit über Epochen hinweg:

Sie können diese Leistung leicht in den Schatten stellen, indem Sie das obige Modell optimieren. Sobald Sie CIFAR-10 gemeistert haben, steht Ihnen in Keras auch CIFAR-100 zur Verfügung, das Sie für weitere Übungen verwenden können. Da es 100 Klassen hat, wird es keine leichte Aufgabe sein, dies zu erreichen!

Kategorisierung der Bilder von ImageNet mit CNNs

Nun, da Sie MNIST und CIFAR-10 gemeistert haben, lassen Sie uns dieses Problem eine Stufe höher nehmen. Hier werden wir einen Blick auf den berühmten ImageNet-Datensatz werfen.

ImageNet ist die Hauptdatenbank hinter der ImageNet Large Scale Recognition Challenge (ILSVRC). Dies ist so etwas wie die Olympiade der Computer Vision. Dies ist der Wettbewerb, der CNNs zum ersten Mal populär gemacht hat, und jedes Jahr messen sich die besten Forschungsteams aus Industrie und Wissenschaft mit ihren besten Algorithmen bei Computer-Vision-Aufgaben.

Über den ImageNet-Datensatz

Der ImageNet-Datensatz umfasst mehr als 14 Millionen Bilder, die in 20.000 Kategorien von Hand beschriftet wurden.

Im Gegensatz zu den bereits besprochenen MNIST- und CIFAR-10-Datensätzen haben die Bilder in ImageNet eine ordentliche Auflösung (224 x 224), und genau das stellt eine Herausforderung für uns dar: 14 Millionen Bilder, jedes 224 x 224 Pixel. Die Verarbeitung eines Datensatzes dieser Größe erfordert eine große Menge an Rechenleistung in Form von CPU, GPU und RAM.

Der Nachteil – das könnte zu viel für einen gewöhnlichen Laptop sein. Was ist also die alternative Lösung? Wie kann ein Enthusiast mit dem ImageNet-Datensatz arbeiten?

Hier kommt der Imagenette-Datensatz von Fast.ai ins Spiel

Imagenette ist ein Datensatz, der aus der großen ImageNet-Bildsammlung extrahiert wurde. Der Grund für die Veröffentlichung von Imagenette ist, dass Forscher und Studenten mit Bildern auf ImageNet-Niveau üben können, ohne so viele Rechenressourcen zu benötigen.

Mit den Worten von Jeremy Howard selbst:

„Ich (Jeremy Howard) habe Imagenette hauptsächlich gemacht, weil ich einen kleinen Datensatz für die Bildverarbeitung wollte, mit dem ich schnell sehen kann, ob meine Algorithmus-Ideen eine Chance haben, zu funktionieren. Normalerweise tun sie das nicht, aber wenn ich sie auf Imagenet teste, dauert es sehr lange, bis ich das herausfinde, vor allem, weil ich mich für Algorithmen interessiere, die am Ende des Trainings besonders gut abschneiden.

Aber ich denke, dass dies auch für andere ein nützlicher Datensatz sein kann.“

Und das werden wir auch zum Üben verwenden!

Laden Sie den Imagenette-Datensatz herunter

So können Sie den Datensatz abrufen (Befehle für Ihr Terminal):

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

Wenn Sie den Datensatz heruntergeladen haben, werden Sie feststellen, dass er zwei Ordner hat – „train“ und „val“. Diese enthalten den Trainings- bzw. Validierungssatz. Innerhalb jedes Ordners gibt es separate Ordner für jede Klasse. Hier ist die Zuordnung der Klassen:

Diese Klassen haben die gleiche ID im ursprünglichen ImageNet-Datensatz. Jede der Klassen hat etwa 1000 Bilder, so dass es sich insgesamt um einen ausgewogenen Datensatz handelt.

Laden von Bildern mit ImageDataGenerator

Keras verfügt über diese nützliche Funktion zum Laden großer Bilder (wie hier), ohne den Arbeitsspeicher auszulasten, indem es in kleinen Stapeln arbeitet. ImageDataGenerator in Kombination mit fit_generator bietet diese Funktionalität:

Der ImageDataGenerator selbst leitet die Klassenbezeichnungen und die Anzahl der Klassen aus den Ordnernamen ab.

Building a Basic CNN model for Image Classification

Let’s build a basic CNN model for our Imagenette dataset (for the purpose of image classification):

Wenn wir die Validierungsgenauigkeit des obigen Modells vergleichen, werden Sie feststellen, dass wir, obwohl es sich um eine tiefere Architektur handelt als die, die wir bisher verwendet haben, nur eine Validierungsgenauigkeit von etwa 40-50 % erreichen können.

Dafür kann es viele Gründe geben, z. B. ist unser Modell nicht komplex genug, um die zugrunde liegenden Muster der Bilder zu lernen, oder vielleicht sind die Trainingsdaten zu klein, um genau über die Klassen hinweg zu verallgemeinern.

Step up – Transfer Learning.

Using Transfer Learning (VGG16) to improve accuracy

VGG16 ist eine CNN-Architektur, die den ersten Platz bei der ImageNet Challenge 2014 belegt hat. Sie wurde von der Visual Graphics Group in Oxford entwickelt und hat insgesamt 16 Schichten, davon 13 Faltungsschichten. Wir werden die vortrainierten Gewichte dieses Modells laden, damit wir die nützlichen Merkmale, die dieses Modell für unsere Aufgabe gelernt hat, nutzen können.

Herunterladen der Gewichte von 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 ist die Architektur des Modells:

Erzeugen von Merkmalen aus VGG16

Lassen Sie uns nützliche Merkmale extrahieren, die VGG16 bereits aus den Bildern unseres Datensatzes kennt:

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)
Wenn die oben genannten Merkmale fertig sind, können wir sie einfach verwenden, um ein einfaches Fully Connected Neural Network in Keras zu trainieren:

Beachten Sie, wie schnell Ihr Modell zu konvergieren beginnt. In nur 10 Epochen haben Sie eine Validierungsgenauigkeit von über 94 %. Ist das nicht erstaunlich?

Für den Fall, dass Sie den Imagenette-Datensatz gemeistert haben, hat fastai auch zwei Varianten veröffentlicht, die Klassen enthalten, die für Sie schwer zu klassifizieren sind:

  • Imagewoof: 10 Klassen von Hunderassen, ein schwierigeres Problem zu klassifizieren
  • Image网 („wang“): Eine Kombination aus Imagenette und Imagewoof und ein paar Tricks, die das Problem schwieriger machen

Wie geht es weiter?

Abgesehen von den oben genannten Datensätzen können Sie auch die folgenden Datensätze für die Entwicklung von Computer-Vision-Algorithmen verwenden. Betrachten Sie dies als eine Herausforderung. Können Sie Ihr CNN-Wissen anwenden, um die Benchmark-Punktzahl in diesen Datensätzen zu übertreffen?

  • Fashion MNIST – MNIST-ähnlicher Datensatz von Kleidung und Bekleidung. Anstelle von Ziffern zeigen die Bilder eine Art von Kleidung (T-Shirt, Hose, Tasche usw.)
  • Caltech 101 – Ein weiterer anspruchsvoller Datensatz, den ich für die Bildklassifizierung gefunden habe

Ich schlage auch vor, dass Sie, bevor Sie sich für Transfer Learning entscheiden, versuchen, Ihre CNN-Basismodelle zu verbessern. Sie können von den Architekturen von VGG16, ZFNet usw. lernen, um einige Anhaltspunkte für die Abstimmung der Hyperparameter zu erhalten, und Sie können denselben ImageDataGenerator verwenden, um Ihre Bilder zu erweitern und die Größe des Datensatzes zu erhöhen.

Sie können diesen Artikel auch in unserer mobilen APP lesen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.