[PYTHON] J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras

introduction

Cet article est prévu par Fujitsu Systems Web Technology Co., Ltd. Calendrier de l'avent des vacances d'été Inobeko 2020 Jour 33 !! (Extended Battle) article. Le contenu de cet article est ma propre opinion et ne représente pas l'organisation à laquelle j'appartiens.

Ce que j'ai fait

Dans Our previous ad-care Article que j'ai publié dans, J'ai touché skit-learn pour implémenter la reconnaissance de caractères manuscrits de "caractère runique". J'ai pu le créer pour le moment, mais quand j'ai étudié le Deep Learning à partir de ce moment-là, "** Pour la reconnaissance d'image, pas pour le réseau neuronal de base Il existe une meilleure façon d'utiliser un réseau neuronal convolutif (CNN)! **"Quand Maintenant que nous savons cela, nous allons partager ce que nous savons sur sa mise en œuvre et son fonctionnement.

Pourquoi est-ce un personnage runique en premier lieu?

Les personnages runiques sont cool, non? images.png

Ce qui a été fait la dernière fois et les problèmes

Ce que j'ai fait la dernière fois

À l'aide de la bibliothèque d'apprentissage automatique Python ** scikit-learn **, J'ai utilisé le classificateur MLP, un modèle qui effectue une «classification», pour classer les caractères runiques manuscrits. Pour les données, j'ai préparé moi-même une image de caractères manuscrits, je l'ai augmentée avec "Data Augmentation" et je l'ai utilisée pour l'apprentissage.

Résultats et défis

En conséquence, nous avons pu créer un modèle capable de reconnaître les caractères manuscrits avec une précision d'environ 80%. Cependant, comme indiqué ci-dessous, j'étais intéressé par le fait que les données d'image étaient disposées dans un tableau unidimensionnel pour l'apprentissage.

--Traitement de la partie qui lit les données


#Lisez les fichiers du répertoire et ajoutez-les à la liste des données d'entraînement
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() ##★ Ici, les informations de pixel sont transformées en un tableau unidimensionnel.
    X.append(data)

#Afficher les données
np.set_printoptions(threshold=np.inf)
print(np.array(image2).flatten())

--Lire l'image du personnage manuscrit

image.png

<détails>

Résultat de la sortie des données </ b> </ summary>

[  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   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]

Comme mentionné ci-dessus, dans un tableau unidimensionnel Les informations sur les pixels du coin supérieur gauche au coin inférieur droit de l'image doivent être à plat. Si tel est le cas, les informations verticales et horizontales de l'image seront perdues ...

Utilisation du réseau neuronal à convolution (CNN)

D'autre part, si vous utilisez quelque chose appelé un réseau neuronal convolutif (CNN) J'ai appris que vous pouvez apprendre avec des données contenant des informations verticales et horizontales! Ci-dessous, je décrirai le schéma et la méthode de mise en œuvre que j'ai organisés.

Aperçu

Réseau neuronal convolutif (CNN) Un réseau de neurones utilisé dans le domaine du traitement d'images ** L'image peut être utilisée telle quelle pour une saisie en deux dimensions **.

L'idée principale de CNN est "Imitons le mouvement des cellules nerveuses dans le champ visuel des humains." La méthode qui a été créée.

CNN utilise un filtre (noyau) pour extraire les fonctionnalités d'une image. Utilisez un filtre plus petit que l'image d'origine. Superposez les filtres dans l'ordre en haut à gauche de l'image, Calculez la somme du produit de l'image et de la valeur du filtre.

Les caractéristiques obtenues à partir de l'image changeront en fonction de ce que vous faites avec les numéros de filtre. Vous apprendrez quelle valeur le filtre doit avoir.

[Référence] Vous pouvez voir le processus de reconnaissance de caractères de CNN visuellement sur le site suivant! https://www.cs.ryerson.ca/~aharley/vis/conv/

Méthode de mise en œuvre

Il semble y avoir un moyen d'implémenter les deux modèles suivants!

1. Assemblé à la main avec Numpy

Il s'agit d'une méthode pour implémenter manuellement le processus de calcul de filtre de CNN. C'est pratiqué dans cet article. https://qiita.com/ta-ka/items/1c588dd0559d1aad9921

2. Utilisez la bibliothèque Keras

Vous pouvez également implémenter CNN à l'aide de Keras, une bibliothèque dédiée au deep learning.

https://keras.io/ja/

Keras est une bibliothèque de réseau neuronal de haut niveau écrite en Python qui peut être exécutée sur TensorFlow, CNTK ou Theano. Si vous avez besoin d'une bibliothèque d'apprentissage en profondeur dans les cas suivants, utilisez Keras: -Supporte à la fois CNN et RNN, et les combinaisons de ces deux

Cette fois, je vais essayer d'utiliser la bibliothèque 2.Keras.

Utilisation de Keras

Lorsque vous essayez d'utiliser Keras à cette fin, les options suivantes sont probablement disponibles.

--Appelez et utilisez directement le Keras autonome --Utilisez Keras inclus avec TensorFlow

Cependant, à partir de mai 2020, le manuel officiel

"Keras est fourni avec TensorFlow 2.0 sous le nom tensorflow.keras. Pour démarrer avec Keras, installez simplement TensorFlow 2.0. "

Il semble que ce soit une tendance à s'unifier à "Keras of TensorFlow". (Cité de l'article suivant)

[Référence] La fin de Keras multi-backend, unifiée dans tf.keras https://www.atmarkit.co.jp/ait/articles/2005/13/news017.html

Après le passage du temps, j'utiliserai cette fois Keras de Tensorflow.

Ce qui a été utilisé

Donc, j'ai utilisé ce qui suit. TensorFlow a dû utiliser la version 2.0.0 avec une intégration améliorée avec Keras.

--Anaconda: (Un package qui inclut Python lui-même et les bibliothèques couramment utilisées)

  • TensorFlow : 2.0.0

Données utilisées

Apprenons avec les données d'image créées (24 (caractères) x 18 (feuilles)) une fois précédent.

la mise en oeuvre

Importez le package à utiliser


#Package pour travailler avec des tableaux
import numpy as np
#Package de gestion des données et des fichiers image
from PIL import Image
import os, glob
# tensorflow
import tensorflow as tf
#Un package pratique de Keras qui pré-traite les données
from tensorflow.keras.preprocessing.image import array_to_img, img_to_array, load_img
from keras.utils import np_utils
#Utilisé pour séparer les données d'entraînement et les données de test
from sklearn.model_selection import train_test_split
#Utilisé pour l'affichage d'image des données d'entraînement
import matplotlib.pyplot as plt
#Utilisé pour afficher un résumé des résultats d'apprentissage
import pandas as pd

Lire le fichier

Préparez un ensemble d'images et d'étiquettes à utiliser pour l'apprentissage. Cette fois, il semble que nous devions passer le libellé de chaque donnée numériquement au modèle de Keras CNN. J'ai créé à l'avance une table de correspondance de chaque caractère de rune et de l'étiquette (valeur numérique) dans Dictionary.

<détails>

Table de correspondance des caractères / étiquettes runiques (valeurs numériques) </ summary>

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 : 'ᛟ',
              }

Chargez l'image.

#Lecture de fichiers
#Tableau pour stocker les données d'image
X = []
#Caractères correspondant aux données d'image(répondre)Tableau à stocker
Y = []

#Fichier de répertoire de données d'entraînement
dir = '[Répertoire où sont stockées les données d'image des caractères manuscrits]'
files = glob.glob(dir + "\\*.png ")

#Taille verticale et horizontale de l'image(pixel)
image_size = 50

#Lisez les fichiers du répertoire et ajoutez-les à la liste des données d'entraînement
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)

#Convertir les valeurs de pixel de 0 à 1
X = X.astype('float32')
X = X / 255.0

#Convertir le format de classe
Y = np_utils.to_categorical(Y, 24)

Créer un modèle

Créez un modèle à entraîner. Ici, définissez les "paramètres de couche de convolution (forme des données d'entrée, paramètres de filtre)" et "fonction d'activation à utiliser".

Une explication détaillée de chaque élément est décrite en détail dans cet article. Se il vous plaît se référer ...!

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

#Créer un modèle pour 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'])

Apprentissage

L'apprentissage lui-même peut être fait simplement en appelant la fonction fit ().

#Séparez les données d'entraînement et les données de test
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=111)
#Apprentissage
model.fit(x_train, y_train, epochs=5)

Une fois exécuté, un résumé de chaque apprentissage sera affiché.

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
En regardant les éléments de droite, vous pouvez voir le pourcentage de réponses correctes pour le modèle en formation.

--loss: La valeur d'évaluation de la fonction de perte (plus la valeur est basse, plus la précision de la prédiction est élevée). --acc: La précision de la prédiction.

Dans le premier apprentissage, le taux de précision était d'environ 9%, mais dans le cinquième apprentissage, la précision est de 83%!

Test du modèle / affichage des résultats

Laissez le modèle prédire les données de validation.

#Appliquer aux données de test
predict_classes = model.predict_classes(x_test)

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

#Sortie du nombre maximum actuel de colonnes d'affichage
pd.get_option("display.max_columns")

#Spécifiez le nombre maximum de colonnes d'affichage (50 colonnes sont spécifiées ici)
pd.set_option('display.max_columns', 50)

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

Créez une matrice de confusion en prenant l'exactitude de la prédiction des données de test.

La matrice mixte est une table de combinaison de «valeur réelle \ valeur prédite du modèle». Le nombre de réponses correctes correspond à l'intersection des lignes et des colonnes du même nombre.

résultat

image.png

La bonne réponse est la majorité! Après cela, vous pouvez voir qu'il y a beaucoup de mauvaises réponses avec la lettre "ᛒ", qui est le numéro 17 dans le tableau des résultats. Si vous voulez vraiment augmenter le pourcentage de réponses correctes, vous pouvez revoir ou augmenter les données "ᛒ".

Données gonflées

Je pense qu'il y a peu de données d'entraînement, donc je vais traiter l'image du personnage manuscrit pour augmenter les données d'entraînement. Cette fois, j'ai pu facilement faire pivoter les données de caractères avec un package de prétraitement appelé keras_preprocessing. Cela est également ajouté aux données.

#Keras utilisé dans les coulisses par Keras_preprocessing
from keras_preprocessing.image import apply_affine_transform

#Lecture de fichiers
#Tableau pour stocker les données d'image
X = []
#Caractères correspondant aux données d'image(répondre)Tableau à stocker
Y = []

#Lecture de fichiers(Comme mentionné ci-dessus)

#Lisez les fichiers du répertoire et ajoutez-les à la liste des données d'entraînement
for i, file in enumerate(files):
    
    #Enregistrer les données originales(Comme mentionné ci-dessus)
    
    #Données gonflées
    image  = img_to_array(temp_img)
        
    #1. 1. Rotation de 10 degrés dans le sens des aiguilles d'une montre "thêta"=Spécifiez la fréquence de rotation avec
    image1 = apply_affine_transform(image, channel_axis=2, theta=10, fill_mode="nearest", cval=0.)
    X.append(image1)
    Y.append(label)

    #2. Rotation de 10 degrés dans le sens antihoraire
    image2 = apply_affine_transform(image, channel_axis=2, theta=-10, fill_mode="nearest", cval=0.)
    X.append(image2)
    Y.append(label)
    
    # #3. 3. Rotation de 20 degrés dans le sens des aiguilles d'une montre
    image3 = apply_affine_transform(image, channel_axis=2, theta=20, fill_mode="nearest", cval=0.)
    X.append(image3)
    Y.append(label)
    
    #4. Rotation de 20 degrés dans le sens antihoraire
    image4 = apply_affine_transform(image, channel_axis=2, theta=-20, fill_mode="nearest", cval=0.)
    X.append(image4)
    Y.append(label)

C'était si simple! !! En particulier, les marges générées par la rotation étant complétées, Le fond ne devient pas noir. N'est-ce pas vraiment pratique ...?

Résultat d'apprentissage

Apprenons à nouveau en ajoutant les données augmentées en faisant pivoter l'image d'origine.

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

Le modèle peut désormais être plus précis que lorsque la quantité de données est faible! (97%)

À la fin

Jusqu'à présent, nous avons décrit le flux d'utilisation d'un réseau de neurones convolutif utilisant Keras en python.

Ce que je pensais

«Nous n'avons pas été en mesure de comparer exactement les mêmes données, mais nous avons constaté que l'utilisation de CNN offrait une précision plus élevée que le réseau neuronal de base précédent. ―― Dans l'ensemble, en utilisant les bibliothèques tensorflow et Keras, il y avait de nombreux endroits où vous pouviez écrire du code plus clairement que la dernière fois dans le prétraitement et l'affichage des résultats d'apprentissage / de prédiction! ――Je voudrais étudier et comprendre à nouveau l'emplacement de montage avec une compréhension duveteuse cette fois.

J'espère que cet article vous sera utile.

Enfin, je suis désolé d'être complètement en retard! Je suis content d'avoir pu participer à la campagne publicitaire d'été, merci.

Recommended Posts