Bildbearbeitung mit CNN | Einsteigerhandbuch zur Bildverarbeitung

Inhalt

Dieser Artikel wurde im Rahmen der Data Science Blogathon

Die verschiedenen Deep-Learning-Methoden verwenden Daten, um neuronale Netzwerkalgorithmen zu trainieren, um eine Vielzahl von maschinellen Lernaufgaben auszuführen., als Klassifizierung verschiedener Objektklassen. Convolutional Neural Networks sind sehr leistungsfähige Deep-Learning-Algorithmen für die Bildanalyse. In diesem Artikel wird erklärt, wie man baut, Trainieren und evaluieren Sie neuronale Faltungsnetze.

Außerdem lernen Sie, wie Sie Ihre Fähigkeit verbessern, aus Daten zu lernen und Trainingsergebnisse zu interpretieren.. Deep Learning hat mehrere Anwendungen wie die Bildverarbeitung, Verarbeitung natürlicher Sprache, etc. Es wird auch in der Medizin verwendet, Medien und Unterhaltung, Autonome Autos, etc.

Was ist CNN?

CNN ist ein leistungsstarker Algorithmus für die Bildverarbeitung. Diese Algorithmen sind derzeit die besten Algorithmen, die wir für die automatisierte Bildverarbeitung haben.. Viele Unternehmen verwenden diese Algorithmen, um beispielsweise Objekte in einem Bild zu identifizieren.

Bilder enthalten RGB-Kombinationsdaten. Matplotlib kann verwendet werden, um ein Bild aus einer Datei in den Speicher zu importieren. Der Computer sieht kein Bild, alles was du siehst ist ein Array von Zahlen. Farbbilder werden in dreidimensionalen Arrays gespeichert. Die ersten beiden Dimensionen entsprechen der Höhe und Breite des Bildes (die Anzahl der Pixel). Die letzte Dimension entspricht den Farben Rot, Grün und Blau in jedem Pixel vorhanden.

Drei Schichten CNN

Spezialisierte neuronale Faltungsnetze für Bild- und Videoerkennungsanwendungen. CNN wird hauptsächlich bei Bildanalyseaufgaben wie der Bilderkennung verwendet, Objekterkennung und Segmentierung.

Es gibt drei Arten von Schichten in Convolutional Neural Networks:

1) Faltdeckel: in einem typischen neuronalen Netz, jedes Eingabeneuron ist mit der nächsten versteckten Schicht verbunden. Und CNN, nur ein kleiner Bereich der Neuronen der Eingabeschicht verbindet sich mit der verborgenen Neuronenschicht.

2) Gruppierungsebene: der Gruppierungs-Layer wird verwendet, um die Dimensionalität der Feature-Map zu reduzieren. Es wird mehrere Ebenen der Aktivierung und Gruppierung innerhalb der versteckten Ebene von CNN geben.

3) Vollständig verbundene Schicht: Vollständig verbundene Ebenen bilden die letzten deckt Im Netz. Der Eingang zum vollständig verbundene Schicht ist die Ausgabe der endgültigen Gruppierung oder Faltung Vorderseite, die abgeflacht und dann in die vollständig verbundene Schicht.

60350cnn-1-7990985

Quelle: Google Bilder

MNIST-Datensatz

In diesem Artikel, wir arbeiten an der Objekterkennung in Bilddaten mit dem MNIST-Datensatz für die handschriftliche Ziffernerkennung.

Der MNIST-Datensatz besteht aus Ziffernbildern einer Vielzahl gescannter Dokumente. Jedes Bild ist ein Quadrat von 28 x 28 Pixel. In diesem Datensatz, werden verwendet 60.000 Bilder zum Trainieren des Modells und 10.000 Bilder zum Testen des Modells. Es gibt 10 Ziffern (0 ein 9) Ö 10 Klassen vorherzusagen.

20748Screenshot202021-06-1820at207-18-2520pm-5492953

Quelle: Google Bilder


Laden des MNIST-Datensatzes

Installieren Sie die TensorFlow-Bibliothek und importieren Sie den Datensatz als Trainings- und Testdatensatz.

Plotten Sie die Bildbeispielausgabe

!pip installieren tensorflow
aus keras.datasets importieren mnist
import matplotlib.pyplot als plt
(X_Zug,y_train), (X_test, y_test)= mnist.load_data()
plt.subplot()
plt.imshow(X_Zug[9], cmap=plt.get_cmap('grau'))

Produktion:

222-5863504

Deep-Learning-Modell mit mehrschichtigen Perzeptronen unter Verwendung von MNIST

Bei diesem Modell, wir werden ein einfaches neuronales Netzwerkmodell mit einer einzelnen versteckten Schicht für den MNIST-Datensatz für die handschriftliche Ziffernerkennung erstellen.

Ein Perzeptron ist ein einzelnes Neuronenmodell, das der Baustein der größten neuronalen Netze ist. Das mehrschichtige Perzeptron besteht aus drei Schichten, nämlich, die Eingabeschicht, die versteckte Schicht und die Ausgabeschicht. Die versteckte Schicht ist für die Außenwelt nicht sichtbar. Nur die Eingabeschicht und die Ausgabeschicht sind sichtbar. Für alle DL-Modelle, Daten müssen numerischer Natur sein.

Paso 1: Schlüsselbibliotheken importieren

numpy als np importieren
von keras.models importieren Sequential
aus keras.layers importieren dicht
aus keras.utils importieren np_utils

Paso 2: die Daten umformen

Jedes Bild ist 28X28 groß, also da ist 784 Pixel. Dann, die Ausgabeschicht hat 10 Abflüge, die versteckte Schicht hat 784 Neuronen und die Eingabeschicht hat 784 Karten. Später, der Datensatz wird in einen Float-Datentyp konvertiert.

number_pix=X_train.shape[1]*X_train.shape[2] 
X_train=X_train.reshape(X_train.shape[0], number_pix).astyp('float32')
X_test=X_test.reshape(X_test.shape[0], number_pix).astyp('float32')

Paso 3: Daten normalisieren

NN-Modelle erfordern im Allgemeinen skalierte Daten. In diesem Code-Schnipsel, Daten werden normalisiert von (0-255) ein (0-1) und die Zielvariable wird in einer einzigen Verwendung für die weitere Analyse kodiert. Die Zielvariable hat insgesamt 10 Lektionen (0-9)

X_train=X_train/255
X_test=X_test/255
y_train= np_utils.to_categorical(y_train)
y_test= np_utils.to_categorical(y_test)
num_classes=y_train.shape[1]
drucken(Anzahl_Klassen)

Produktion:

10

Jetzt, wir erstellen eine Funktion NN_model und kompilieren sie

Paso 4: Modellfunktion definieren

def nn_model():
    model=sequentiell()
    model.add(Dicht(number_pix, input_dim=number_pix, Aktivierung = 'neu lesen'))
    mode.add(Dicht(Anzahl_Klassen, Aktivierung='Softmax'))
    model.compile(Verlust="kategoriale_Kreuzentropie", optimieren ="Adam", Metriken=['Richtigkeit'])
    Rückgabemodell

Es gibt zwei Schichten, eine ist eine versteckte Ebene mit der ReLu-Triggerfunktion und die andere ist die Ausgabeebene, die die Softmax-Funktion verwendet.

Paso 5: führe das Modell aus

model=nn_model()
model.fit(X_Zug, y_train, Validation_data=(X_test,y_test),Epochen=10, batch_size=200, ausführlich=2)
score= model.evaluate(X_test, y_test, ausführlich=0)
drucken('Der Fehler ist: %.2F%%'%(100-Spielstand[1]*100))

Produktion:

Epoche 1/10
300/300 - 11S - Verlust: 0.2778 - Richtigkeit: 0.9216 - Wertverlust: 0.1397 - val_accuracy: 0.9604
Epoche 2/10
300/300 - 2S - Verlust: 0.1121 - Richtigkeit: 0.9675 - Wertverlust: 0.0977 - val_accuracy: 0.9692
Epoche 3/10
300/300 - 2S - Verlust: 0.0726 - Richtigkeit: 0.9790 - Wertverlust: 0.0750 - val_accuracy: 0.9778
Epoche 4/10
300/300 - 2S - Verlust: 0.0513 - Richtigkeit: 0.9851 - Wertverlust: 0.0656 - val_accuracy: 0.9796
Epoche 5/10
300/300 - 2S - Verlust: 0.0376 - Richtigkeit: 0.9892 - Wertverlust: 0.0717 - val_accuracy: 0.9773
Epoche 6/10
300/300 - 2S - Verlust: 0.0269 - Richtigkeit: 0.9928 - Wertverlust: 0.0637 - val_accuracy: 0.9797
Epoche 7/10
300/300 - 2S - Verlust: 0.0208 - Richtigkeit: 0.9948 - Wertverlust: 0.0600 - val_accuracy: 0.9824
Epoche 8/10
300/300 - 2S - Verlust: 0.0153 - Richtigkeit: 0.9962 - Wertverlust: 0.0581 - val_accuracy: 0.9815
Epoche 9/10
300/300 - 2S - Verlust: 0.0111 - Richtigkeit: 0.9976 - Wertverlust: 0.0631 - val_accuracy: 0.9807
Epoche 10/10
300/300 - 2S - Verlust: 0.0082 - Richtigkeit: 0.9985 - Wertverlust: 0.0609 - val_accuracy: 0.9828
Der Fehler ist: 1.72%

In den Modellergebnissen, wird sichtbar, wenn die Anzahl der Epochen zunimmt, verbessert die Genauigkeit. Der Fehler ist von 1,72%, geringfügig ist der Fehler, desto höher die Genauigkeit des Modells.

Faltungsneurales Netzwerkmodell mit MNIST

In diesem Abschnitt, wir werden einfache CNN-Modelle für MNIST erstellen, die Faltungsschichten demonstrieren, Gruppieren von Ebenen und Ablegen von Ebenen.

Paso 1: alle notwendigen Bibliotheken importieren

numpy als np importieren
von keras.models importieren Sequential
aus keras.layers importieren dicht
aus keras.utils importieren np_utils
aus keras.layers importieren Dropout
aus keras.layers importieren Flatten
aus keras.layers.convolutional importieren Conv2D
aus keras.layers.convolutional import MaxPooling2D

Paso 2: Richten Sie den Seed für Reproduzierbarkeit ein und laden Sie die MNIST-Daten

Samen=10
np.random.seed(Samen)
(X_Zug,y_train), (X_test, y_test)= mnist.load_data()

Paso 3: Daten in Float-Werte umwandeln

X_train=X_train.reshape(X_train.shape[0], 1,28,28).astyp('float32')
X_test=X_test.reshape(X_test.shape[0], 1,28,28).astyp('float32')

Paso 4: Daten normalisieren

X_train=X_train/255
X_test=X_test/255
y_train= np_utils.to_categorical(y_train)
y_test= np_utils.to_categorical(y_test)
num_classes=y_train.shape[1]
drucken(Anzahl_Klassen)

Eine klassische CNN-Architektur sieht wie folgt aus:

63838cnntoday-3782857

Quelle: Google Bilder

Ausgabeschicht
(10 Abflüge)
Versteckter Umhang
(128 Neuronen)
Flache Schicht
Umhang der Verlassenheit
20%
Maximale Gruppierungsebene
2 × 2
Faltdeckel
32 Karten, 5 × 5
Sichtbare Schicht
1x28x28

Die erste versteckte Schicht ist eine Faltungsschicht namens Convolution2D. Entsorgen 32 Feature-Maps mit Größe 5 × 5 und Schleiffunktion. Dies ist die Eingabeschicht. Das Folgende ist die Pooling-Schicht, die den maximalen Wert namens MaxPooling2D . annimmt. Bei diesem Modell, ist als Poolgröße von . konfiguriert 2 × 2.

Die Regularisierung erfolgt in der Abbruchschicht. Es ist so eingestellt, dass die nach dem Zufallsprinzip ausgeschlossen wird 20% Schichtneuronen, um eine Überanpassung zu vermeiden. Die fünfte Ebene ist die abgeflachte Ebene, die die 2D-Matrixdaten in einen Vektor namens Flatten . umwandelt. Ermöglicht die vollständige Verarbeitung der Ausgabe durch eine vollständig verbundene Standardschicht.

Dann, die vollständig verbundene Schicht wird verwendet mit 128 Neuronen und die Aktivierungsfunktion des Gleichrichters. Schließlich, die Ausgabeschicht hat 10 Neuronen für 10 Klassen und eine Softmax-Triggerfunktion, um wahrscheinlichkeitsähnliche Vorhersagen für jede Klasse zu generieren.

Paso 5: führe das Modell aus

def cnn_model():
    model=sequentiell()
    model.add(Conv2D(32,5,5, padding='gleich',input_shape=(1,28,28), Aktivierung = 'neu lesen'))
    model.add(MaxPooling2D(pool_size=(2,2), padding='gleich'))
    model.add(Aussteigen(0.2))
    model.add(Ebnen())
    model.add(Dicht(128, Aktivierung = 'neu lesen'))
    model.add(Dicht(Anzahl_Klassen, Aktivierung='Softmax'))
    model.compile(Verlust="kategoriale_Kreuzentropie", Optimierer="Adam", Metriken=['Richtigkeit'])
    Rückgabemodell
model=cnn_model()
model.fit(X_Zug, y_train, Validation_data=(X_test,y_test),Epochen=10, batch_size=200, ausführlich=2)
score= model.evaluate(X_test, y_test, ausführlich=0)
drucken('Der Fehler ist: %.2F%%'%(100-Spielstand[1]*100))

Produktion:

Epoche 1/10
300/300 - 2S - Verlust: 0.7825 - Richtigkeit: 0.7637 - Wertverlust: 0.3071 - val_accuracy: 0.9069
Epoche 2/10
300/300 - 1S - Verlust: 0.3505 - Richtigkeit: 0.8908 - Wertverlust: 0.2192 - val_accuracy: 0.9336
Epoche 3/10
300/300 - 1S - Verlust: 0.2768 - Richtigkeit: 0.9126 - Wertverlust: 0.1771 - val_accuracy: 0.9426
Epoche 4/10
300/300 - 1S - Verlust: 0.2392 - Richtigkeit: 0.9251 - Wertverlust: 0.1508 - val_accuracy: 0.9537
Epoche 5/10
300/300 - 1S - Verlust: 0.2164 - Richtigkeit: 0.9325 - Wertverlust: 0.1423 - val_accuracy: 0.9546
Epoche 6/10
300/300 - 1S - Verlust: 0.1997 - Richtigkeit: 0.9380 - Wertverlust: 0.1279 - val_accuracy: 0.9607
Epoche 7/10
300/300 - 1S - Verlust: 0.1856 - Richtigkeit: 0.9415 - Wertverlust: 0.1179 - val_accuracy: 0.9632
Epoche 8/10
300/300 - 1S - Verlust: 0.1777 - Richtigkeit: 0.9433 - Wertverlust: 0.1119 - val_accuracy: 0.9642
Epoche 9/10
300/300 - 1S - Verlust: 0.1689 - Richtigkeit: 0.9469 - Wertverlust: 0.1093 - val_accuracy: 0.9667
Epoche 10/10
300/300 - 1S - Verlust: 0.1605 - Richtigkeit: 0.9493 - Wertverlust: 0.1053 - val_accuracy: 0.9659
Der Fehler ist: 3.41%

In den Modellergebnissen, wird sichtbar, wenn die Anzahl der Epochen zunimmt, verbessert die Genauigkeit. Der Fehler ist 3.41%, geringerer Fehler höhere Modellgenauigkeit.

Ich hoffe, es hat Ihnen Spaß gemacht zu lesen und zögern Sie nicht, meinen Code zu verwenden, um ihn für Ihre Zwecke zu testen. Was ist mehr, wenn es einen Kommentar zum Code oder nur zum Blogbeitrag gibt, kontaktiere mich gerne unter [E-Mail geschützt]

Die in diesem CNN-Bildverarbeitungsartikel gezeigten Medien sind nicht Eigentum von DataPeaker und werden nach Ermessen des Autors verwendet.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.