[PYTHON] Ich habe versucht, die handschriftliche Zeichenerkennung von Runenzeichen mit CNN mithilfe von Keras zu erkennen

Einführung

Dieser Artikel wurde von Fujitsu Systems Web Technology Co., Ltd. geplant. Inobeko Sommerferien Adventskalender 2020 Tag 33 !! (Extended Battle) Artikel. Der Inhalt dieses Artikels ist meine eigene Meinung und repräsentiert nicht die Organisation, zu der ich gehöre.

Was ich getan habe

Unsere vorherige Anzeigenpflege Gepostet von mir im, Ich habe skit-learn berührt, um die handschriftliche Zeichenerkennung "Runenzeichen" zu implementieren. Ich konnte es vorerst schaffen, aber als ich von diesem Punkt an Deep Learning studierte, "** Für die Bilderkennung nicht das grundlegende neuronale Netzwerk Es gibt eine bessere Möglichkeit, ein Faltungs-Neuronales Netzwerk (CNN) zu verwenden! **"Wann Jetzt, da wir das wissen, werden wir mitteilen, was wir über die Implementierung und die Funktionsweise wissen.

Warum ist es überhaupt ein Runencharakter?

Runencharaktere sind cool, nicht wahr? images.png

Was wurde das letzte Mal gemacht und Probleme

Was ich letztes Mal gemacht habe

Verwenden der Python-Bibliothek für maschinelles Lernen ** scikit-learn **, Wir haben den MLP-Klassifikator verwendet, ein Modell, das eine "Klassifizierung" durchführt, um handgeschriebene Runenzeichen zu klassifizieren. Für die Daten habe ich selbst ein Bild von handgeschriebenen Zeichen erstellt, es mit "Datenerweiterung" vergrößert und zum Lernen verwendet.

Ergebnisse und Herausforderungen

Als Ergebnis konnten wir ein Modell erstellen, das handgeschriebene Zeichen mit einer Genauigkeit von etwa 80% erkennen kann. Wie unten gezeigt, war ich jedoch daran interessiert, dass die Bilddaten zum Lernen in einem eindimensionalen Array angeordnet waren.


#Lesen Sie die Dateien im Verzeichnis und fügen Sie sie der Liste der Trainingsdaten hinzu
for i, file in enumerate(files):
    image = Image.open(file)
    image = image.convert("L")
    image = image.resize((image_size, image_size))
    data = np.asarray(image).flatten() ##★ Hier werden die Pixelinformationen zu einem eindimensionalen Array verarbeitet.
    X.append(data)

#Daten anzeigen
np.set_printoptions(threshold=np.inf)
print(np.array(image2).flatten())

image.png

Ergebnis der Datenausgabe
[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  15  94  34   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9 160 253 135   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  10  91 244 229 243 229  72  17   1   4   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  38 181 253 123 162 225 242 192 144  84  64   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 142 241 138   0  31  62 125 169 250 247 212 210  62  31   5   7   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  63 231 225  50   0   0   1   0  19  46 176 211 244 247 193 166 107  80   0   3   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9 159 255 171  10   0   0   0   0   0   1   0  49  86 137 175 251 251 243 209  72  21   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  48 218 247  71   0   0   0   0   0   0   0   0   0   0   0  12  59 165 180 216 253 119   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 133 248 173   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 111 224 240 113   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  30 245 246  51   0   0   0   0   0   0   0   0   0   0   0   0   0   2  40 244 253  94   8   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 147 251 177  23   0   0   0   0   0   0   0   0   0   0   0   0   0 103 228 222 117  14   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  43 204 244 102   0   0   0   0   0   0   0   0   0   0   0   0   0  31 179 251 152  11   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  93 248 228   0   0   0   0   0   0   0   0   0   0   0   0   0  21 159 255 250  43   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 191 251  88   0   0   0   0   0   0   0   0   0   0   0   0   0  35 219 225 105   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  74 216 199  25   0   0   0   0   0   0   0   0   0   0   0   0  35 158 252 148  33   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9  96 251 135   0   0   0   0   0   0   0   0   0   0   0   0   0  97 239 228  10   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1 175 253  63   1   1   0   0   0   0   0   0   0   0   0   0  14 236 225  74   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  26 180 224 156 118  26   1   0   0   0   0   0   0   0   0  28 150 245 136  23   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  29 103 254 255 255 234  90  72  19  20   0   0   0   0   0  92 220 205  30   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   3  94 171 207 249 239 219 224 170 107  13  23   0  11 198 253  42   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9   0  44  67 109 150 252 240 254 228 152 135 203 245 166  11   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   3  42 104 135 183 235 246 249 251 190  26  17   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   9  25  41 253 255 238 251 219 153 108  46  14   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   6 212 231 138 128 179 243 239 217 179  87   0   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 112 246 174   0   7  26  36 165 244 249 252 197  87  48  12   3   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  26 228 236  84   0   0   0   0   0  54 111 167 204 255 207 150  64  30   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 101 243 185  29   0   0   0   0   0   0   3  15  53  83 191 246 250 165 107  34  15   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  11 169 241 115   0   0   0   0   0   0   0   0   0   0   4  14  75 159 224 231 199 125  65   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  50 232 225   0   0   0   0   0   0   0   0   0   0   0   0   0   2  11  35 133 255 253 209 150  24   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 117 242 122   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1  33 134 164  87   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  18 160 225  62   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  16  24   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  45 235 186   5   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 110 249 109  11   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   5 168 240 106   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0  35 185 220   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 169  97   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   5   3   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0]

Wie oben erwähnt, in einer eindimensionalen Anordnung Die Pixelinformationen von links oben nach rechts unten im Bild sollten sich in der Ebene befinden. In diesem Fall gehen die vertikalen und horizontalen Informationen des Bildes verloren ...

Verwendung des Convolution Neural Network (CNN)

Auf der anderen Seite, wenn Sie ein sogenanntes Convolutional Neural Network (CNN) verwenden. Ich habe gelernt, dass Sie mit Daten lernen können, die vertikale und horizontale Informationen enthalten! Im Folgenden werde ich die von mir organisierte Gliederung und Implementierungsmethode beschreiben.

Überblick

Faltungs-Neuronales Netz (CNN) Ein neuronales Netzwerk, das im Bereich der Bildverarbeitung verwendet wird ** Das Bild kann unverändert für die Eingabe in zwei Dimensionen verwendet werden **.

Die Hauptidee von CNN lautet: "Imitieren wir die Bewegung von Nervenzellen im Gesichtsfeld des Menschen." Die Methode, die erstellt wurde.

CNN verwendet einen Filter (Kernel), um Features aus einem Bild zu extrahieren. Verwenden Sie einen Filter, der kleiner als das Originalbild ist. Überlagern Sie die Filter in der Reihenfolge oben links im Bild. Berechnen Sie die Summe aus dem Produkt des Bildes und dem Filterwert.

Die aus dem Bild erhaltenen Eigenschaften ändern sich je nachdem, was Sie mit den Filternummern tun. Sie erfahren, welchen Wert der Filter haben sollte.

[Referenz] Sie können den Prozess der Zeichenerkennung von CNN visuell auf der folgenden Site sehen! https://www.cs.ryerson.ca/~aharley/vis/conv/

Implementierungsmethode

Es scheint eine Möglichkeit zu geben, die folgenden zwei Muster zu implementieren!

1. Handmontiert mit Numpy

Dies ist eine Methode zum manuellen Implementieren des Filterberechnungsprozesses von CNN. Es wird in diesem Artikel geübt. https://qiita.com/ta-ka/items/1c588dd0559d1aad9921

2. Verwenden Sie die Keras-Bibliothek

Sie können CNN auch mit Keras implementieren, einer Bibliothek für Deep Learning.

https://keras.io/ja/

Keras ist eine in Python geschriebene übergeordnete neuronale Netzwerkbibliothek, die auf TensorFlow, CNTK oder Theano ausgeführt werden kann. Wenn Sie in den folgenden Fällen eine Deep-Learning-Bibliothek benötigen, verwenden Sie Keras:

  • Unterstützt sowohl CNN als auch RNN und Kombinationen dieser beiden

Dieses Mal werde ich versuchen, die 2.Keras-Bibliothek zu verwenden.

Verwendung von Keras

Wenn Sie versuchen, Keras für diesen Zweck zu verwenden, gibt es wahrscheinlich die folgenden Optionen.

  • Rufen Sie an und verwenden Sie die eigenständigen Keras direkt --Verwenden Sie Keras, die in TensorFlow enthalten sind

Ab Mai 2020 jedoch das offizielle Handbuch

"Keras wird mit TensorFlow 2.0 als tensorflow.keras geliefert. Um mit Keras zu beginnen, installieren Sie einfach TensorFlow 2.0. "

Es scheint ein Trend zu sein, sich zu "Keras of TensorFlow" zu vereinen. (Zitiert aus dem folgenden Artikel)

[Referenz] Das Ende von Multi-Backend-Keras, vereint in tf.keras https://www.atmarkit.co.jp/ait/articles/2005/13/news017.html

Nach Ablauf der Zeit werde ich dieses Mal Keras von Tensorflow verwenden.

Was wurde verwendet

Also habe ich folgendes verwendet. TensorFlow musste Version 2.0.0 mit erweiterter Integration in Keras verwenden.

--Anaconda: (Ein Paket, das Python selbst und häufig verwendete Bibliotheken enthält)

  • TensorFlow : 2.0.0

Verwendete Daten

Lassen Sie uns einmal [vorher] mit den erstellten Bilddaten (24 (Zeichen) x 18 (Blätter)) lernen (https://qiita.com/kondo-a/items/02943c926bc584c40103).

Implementierung

Importieren Sie das zu verwendende Paket


#Paket für die Arbeit mit Arrays
import numpy as np
#Paket zur Verarbeitung von Bilddaten und Dateien
from PIL import Image
import os, glob
# tensorflow
import tensorflow as tf
#Ein praktisches Paket von Keras, das Daten vorverarbeitet
from tensorflow.keras.preprocessing.image import array_to_img, img_to_array, load_img
from keras.utils import np_utils
#Dient zum Trennen von Trainingsdaten und Testdaten
from sklearn.model_selection import train_test_split
#Wird zur Bildanzeige von Trainingsdaten verwendet
import matplotlib.pyplot as plt
#Wird verwendet, um eine Zusammenfassung der Lernergebnisse anzuzeigen
import pandas as pd

Datei lesen

Bereiten Sie eine Reihe von Bildern und Beschriftungen vor, die Sie zum Lernen verwenden möchten. Dieses Mal müssen wir die Bezeichnung jeder Daten numerisch an das Modell von Keras CNN übergeben. Ich habe im Voraus eine Korrespondenztabelle für jedes Runenzeichen und jede Bezeichnung (numerischer Wert) im Wörterbuch erstellt.

Entsprechungstabelle der Runenzeichen / -bezeichnungen (numerische Werte)
runeCharDict = { 0 : 'ᚠ',
               1 : 'ᚢ',
               2 : 'ᚦ',
               3 : 'ᚫ',
               4 : 'ᚱ',
               5 : 'ᚲ',
               6 : 'ᚷ',
               7 : 'ᚹ',
               8 : 'ᚺ',
               9 : 'ᚾ',
               10 : 'ᛁ',
               11 : 'ᛃ',
               12 : 'ᛇ',
               13 : 'ᛈ',
               14 : 'ᛉ',
               15 : 'ᛋ',
               16 : 'ᛏ',
               17 : 'ᛒ',
               18 : 'ᛖ',
               19 : 'ᛗ',
               20 : 'ᛚ',
               21 : 'ᛜ',
               22 : 'ᛞ',
               23 : 'ᛟ',
              }

Laden Sie das Bild.

#Datei lesen
#Array zum Speichern von Bilddaten
X = []
#Zeichen, die Bilddaten entsprechen(Antworten)Array zum Speichern
Y = []

#Trainingsdatenverzeichnisdatei
dir = '[Verzeichnis, in dem Bilddaten handgeschriebener Zeichen gespeichert sind]'
files = glob.glob(dir + "\\*.png ")

#Vertikale und horizontale Größe des Bildes(Pixel)
image_size = 50

#Lesen Sie die Dateien im Verzeichnis und fügen Sie sie der Liste der Trainingsdaten hinzu
for i, file in enumerate(files):
    
    temp_img = load_img(file, target_size=(image_size, image_size))
    temp_img_array  = img_to_array(temp_img)
    X.append(temp_img_array)
    
    moji = file.split("\\")[-1].split("_")[0]
    label = list(runeCharDict.keys())[list(runeCharDict.values()).index(moji)]
    Y.append(label)

X = np.asarray(X)
Y = np.asarray(Y)

#Konvertieren Sie Pixelwerte von 0 in 1
X = X.astype('float32')
X = X / 255.0

#Klassenformat konvertieren
Y = np_utils.to_categorical(Y, 24)

Erstellen Sie ein Modell

Erstellen Sie ein Modell zum Trainieren. Stellen Sie hier die "Faltungsschichteinstellungen (Eingabedatenform, Filtereinstellungen)" und "zu verwendende Aktivierungsfunktion" ein.

Eine ausführliche Erläuterung der einzelnen Elemente wird in diesem Artikel ausführlich beschrieben. Siehe ...!

https://qiita.com/mako0715/items/b6605a77467ac439955b

#Erstellen Sie ein Modell für CNN
model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(50, 50, 3)),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(24, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

Lernen

Das Lernen selbst kann einfach durch Aufrufen der Funktion fit () erfolgen.

#Trainingsdaten und Testdaten trennen
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=111)
#Lernen
model.fit(x_train, y_train, epochs=5)

Bei der Ausführung wird eine Zusammenfassung jedes Lernens angezeigt.

Epoch 1/5
246/246 [==============================] - 2s 9ms/sample - loss: 3.1595 - acc: 0.0935
Epoch 2/5
246/246 [==============================] - 2s 9ms/sample - loss: 2.8289 - acc: 0.2317
Epoch 3/5
246/246 [==============================] - 2s 8ms/sample - loss: 2.0306 - acc: 0.4593
Epoch 4/5
246/246 [==============================] - 2s 8ms/sample - loss: 1.0820 - acc: 0.7642
Epoch 5/5
246/246 [==============================] - 2s 9ms/sample - loss: 0.6330 - acc: 0.8333
Wenn Sie sich die Elemente rechts ansehen, sehen Sie den Prozentsatz der richtigen Antworten für das Modell im Training.

--loss: Der Bewertungswert der Verlustfunktion (je niedriger der Wert, desto höher die Genauigkeit der Vorhersage). --acc: Die Genauigkeit der Vorhersage.

Beim ersten Lernen betrug die Genauigkeitsrate etwa 9%, beim fünften Lernen beträgt die Genauigkeit 83%!

Modelltest / Ergebnisanzeige

Lassen Sie das Modell die Validierungsdaten vorhersagen.

#Auf Testdaten anwenden
predict_classes = model.predict_classes(x_test)

mg_df = pd.DataFrame({'predict': predict_classes, 'class': np.argmax(y_test, axis=1)})

#Ausgabe der aktuellen maximalen Anzahl von Anzeigespalten
pd.get_option("display.max_columns")

#Geben Sie die maximale Anzahl von Anzeigespalten an (hier werden 50 Spalten angegeben).
pd.set_option('display.max_columns', 50)

# confusion matrix
pd.crosstab(mg_df['class'], mg_df['predict'])

Erstellen Sie eine Verwirrungsmatrix, indem Sie die Richtigkeit der Vorhersage der Testdaten berücksichtigen.

Die gemischte Matrix ist eine Kombinationstabelle aus "Istwert \ Vorhersagewert des Modells". Die Anzahl der richtigen Antworten ist der Schnittpunkt von Zeilen und Spalten derselben Anzahl.

Ergebnis

image.png

Die richtige Antwort ist die Mehrheit! Danach können Sie sehen, dass es viele falsche Antworten mit dem Buchstaben "ᛒ" gibt, der Nummer 17 in der Ergebnistabelle ist. Wenn Sie den Prozentsatz der richtigen Antworten wirklich erhöhen möchten, können Sie die "ᛒ" -Daten überprüfen oder erhöhen.

Aufgeblasene Daten

Ich habe das Gefühl, dass es nur wenige Trainingsdaten gibt, daher werde ich das handschriftliche Zeichenbild verarbeiten, um die Trainingsdaten zu erhöhen. Dieses Mal konnte ich die Zeichendaten mit einem Vorverarbeitungspaket namens keras_preprocessing problemlos drehen. Das wird auch zu den Daten hinzugefügt.

#Keras hinter den Kulissen von Keras verwendet_preprocessing
from keras_preprocessing.image import apply_affine_transform

#Datei lesen
#Array zum Speichern von Bilddaten
X = []
#Zeichen, die Bilddaten entsprechen(Antworten)Array zum Speichern
Y = []

#Datei lesen(Wie oben erwähnt)

#Lesen Sie die Dateien im Verzeichnis und fügen Sie sie der Liste der Trainingsdaten hinzu
for i, file in enumerate(files):
    
    #Registrieren Sie die Originaldaten(Wie oben erwähnt)
    
    #Aufgeblasene Daten
    image  = img_to_array(temp_img)
        
    #1. 1. 10 Grad im Uhrzeigersinn drehen "Theta"=Geben Sie die Frequenz an, mit der gedreht werden soll
    image1 = apply_affine_transform(image, channel_axis=2, theta=10, fill_mode="nearest", cval=0.)
    X.append(image1)
    Y.append(label)

    #2. 10 Grad gegen den Uhrzeigersinn drehen
    image2 = apply_affine_transform(image, channel_axis=2, theta=-10, fill_mode="nearest", cval=0.)
    X.append(image2)
    Y.append(label)
    
    # #3. 3. 20 Grad im Uhrzeigersinn drehen
    image3 = apply_affine_transform(image, channel_axis=2, theta=20, fill_mode="nearest", cval=0.)
    X.append(image3)
    Y.append(label)
    
    #4. 20 Grad gegen den Uhrzeigersinn drehen
    image4 = apply_affine_transform(image, channel_axis=2, theta=-20, fill_mode="nearest", cval=0.)
    X.append(image4)
    Y.append(label)

Es war so einfach! !! Insbesondere da die durch Rotation erzeugten Ränder ergänzt werden, Der Hintergrund wird nicht schwarz. Ist es nicht wirklich praktisch ...?

Lernergebnis

Lassen Sie uns noch einmal lernen, indem Sie die Daten hinzufügen, die durch Drehen des Originalbilds vergrößert wurden.

Epoch 1/5
1232/1232 [==============================] - 7s 6ms/sample - loss: 23.2898 - accuracy: 0.1144
Epoch 2/5
1232/1232 [==============================] - 7s 6ms/sample - loss: 1.1991 - accuracy: 0.6396
Epoch 3/5
1232/1232 [==============================] - 7s 5ms/sample - loss: 0.3489 - accuracy: 0.8847
Epoch 4/5
1232/1232 [==============================] - 7s 5ms/sample - loss: 0.1527 - accuracy: 0.9456
Epoch 5/5
1232/1232 [==============================] - 6s 5ms/sample - loss: 0.0839 - accuracy: 0.9740

Das Modell kann jetzt genauer sein als bei einer geringen Datenmenge! (97%)

Am Ende

Bisher haben wir den Ablauf der Verwendung eines Faltungsnetzwerks mit Keras in Python beschrieben.

Was ich dachte

――Wir konnten nicht genau dieselben Daten vergleichen, aber wir haben festgestellt, dass die Verwendung von CNN eine höhere Genauigkeit bietet als das vorherige grundlegende neuronale Netzwerk. ―― Insgesamt gab es bei Verwendung der Tensorflow- und Keras-Bibliotheken viele Stellen, an denen Sie bei der Vorverarbeitung und Anzeige von Lern- / Vorhersageergebnissen klarer als beim letzten Mal Code schreiben konnten! ――Ich möchte den Montageort noch einmal mit einem flauschigen Verständnis untersuchen und verstehen.

Ich hoffe, dieser Artikel ist hilfreich für Sie.

Endlich tut es mir leid, dass ich völlig spät dran war! Ich bin froh, dass ich an der Sommer-Anzeigenpflege teilnehmen konnte, danke.

Recommended Posts

Ich habe versucht, die handschriftliche Zeichenerkennung von Runenzeichen mit CNN mithilfe von Keras zu erkennen
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, das Gesicht mit Face ++ zu erkennen
Ich habe versucht, Kanas handschriftliche Zeichenerkennung Teil 3/3 Zusammenarbeit mit der GUI mithilfe von Tkinter durchzuführen
Ich habe versucht, das CNN-Modell von TensorFlow mit TF-Slim umzugestalten
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe mit Pytorch versucht, Bilder von "Moon and Suppon" zu erkennen (mit torchvision.datasets.ImageFolder, das from_from_directry of keras entspricht).
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Python: Anwendung der Bilderkennung mit CNN
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Ich habe versucht, CNN mit Resnet fein abzustimmen
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe Flask mit Remote-Containern von VS Code ausprobiert
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe DBM mit Pylearn 2 unter Verwendung künstlicher Daten ausprobiert
Ich habe versucht, die Datenbank (sqlite3) mit kivy zu verwenden
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Bilderkennung mit Keras
Ich habe versucht, aiomysql zu verwenden
Ich habe versucht, Coturn zu verwenden
Ich habe versucht, Pipenv zu verwenden
Ich habe versucht, Matplotlib zu verwenden
Ich habe versucht, "Anvil" zu verwenden.
Ich habe versucht, Hubot zu verwenden
Ich habe versucht, ESPCN zu verwenden
Ich habe versucht, openpyxl zu verwenden
Ich habe versucht, Ipython zu verwenden
Ich habe versucht, ngrok zu verwenden
Ich habe versucht, face_recognition zu verwenden
Ich habe versucht, Jupyter zu verwenden
Ich habe versucht, doctest zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, jinja2 zu verwenden
Ich habe versucht, Folium zu verwenden
Ich habe versucht, das Zeitfenster zu verwenden
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, Python (3) anstelle eines Funktionsrechners zu verwenden
Ich habe versucht, die Sprache mit CNN + Melspectogram zu identifizieren
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, Djangos Server mit VScode anstelle von Pycharm zu starten
Ich habe versucht, mit Elasticsearch Ranking zu lernen!