[PYTHON] [Pour l'enregistrement] Système d'image Keras Partie 1: Comment créer votre propre ensemble de données?

Ravi de vous rencontrer.

Depuis cette année, j'étudie pour écrire réellement python et j'utilise Keras comme framework pour Deep Learning en raison de sa facilité d'utilisation. Je pense étudier PyTorch à l'avenir, mais avant cela, je pensais pouvoir partager les connaissances du système d'image Keras (python) que j'avais du mal à retenir dans le projet sans avoir aucune expérience en programmation, j'ai donc fait mon premier post. C'était.

Quand j'ai cherché, il était difficile de parcourir divers sites en conséquence (je ne pouvais pas lire le sens écrit sur ce Qiita et d'autres sites de commentaires car je n'avais pas assez de connaissances de base). (MNIST est déjà bon .. C'est mon propre jeu de données ...) Je vais également le résumer pour l'enregistrement à moi-même, sur lequel je reviendrai plus tard.

Cette fois, la première fois, les bases de la capture d'images et de la création de votre propre jeu de données? Je vais résumer.

J'espère qu'un jour cela sera utile pour les débutants que personne ne connaît ... (J'ai l'intention de faire plus de commentaires japonais que d'autres articles similaires)

De plus, puisque c'est le premier post de Qiita, j'imagine l'apparence. .. .. J'étudierai progressivement, alors soyez patient.


Partie 1 (cet article) Capture d'image Comment créer votre propre ensemble de données

Partie 2 (prévu d'écrire la prochaine fois) Mettons l'ensemble de données créé dans NN


1. Méthode de chargement d'image spécifique à Keras Load_img

En python, il existe également une méthode pour importer des images à l'aide de l'oreiller (PIL) ou OpenCV, mais comme il s'agit d'un article Keras, je me concentrerai ici sur load_img. Ici, à titre d'exemple, comment importer votre image (A.png) lorsqu'elle est placée dans la même hiérarchie (répertoire) que les données du programme (.py)? Expliquer.

python


#La magie de la sortie d'images avec matplotlib et Jupyter Notebook utilisés pour afficher les images
import matplotlib.pyplot as plt
%matplotlib inline

#Keras, une bibliothèque capable de gérer facilement les images avec Keras.preprocessing.image
from keras.preprocessing.image import load_img

#Tel quel(En couleur)Lis(La taille d'image originale d'Irasutoya(646,839)Image couleur PNG 3D de)
#.Puisqu'il y a une image dans la même hiérarchie que py, A tel quel.Peut être lu par png
img1 = load_img('A.png')

#niveaux de gris(1 dimension)Lors de la lecture avec
img2 = load_img('A.png', grayscale=True)

#Lors du redimensionnement et de la lecture
img_shape = (256, 256, 3) #Essayez de redimensionner à une image couleur de 256 hauteur et largeur
img3 = load_img('A.png', grayscale=False, target_size=img_shape)

Ensuite, affichons chaque image en utilisant matplotlib

python


plt.imshow(img1) #img2 à la place de img1,Swap 3 et essayez

いらすとや.PNG

et ça? Vous pouvez voir qu'il s'affiche correctement. Par ailleurs, en général, le traitement suivant est nécessaire pour entrer une image dans NN (Neural Net).

python


#Redimensionner et charger
img_shape = (256, 256, 3) #256 images couleur en hauteur et en largeur
img = load_img('A.png', grayscale=False, target_size=img_shape)

#Convertir en type de tableau numpy pour l'inclusion dans le réseau neuronal
img_array = img_to_array(img)

#Diviser par 255 et normaliser
img_array /= 255
#img_array = img_array /255 est OK

Vous êtes maintenant prêt à entrer dans NN. Cependant, vous n'êtes pas obligé d'en saisir un seul ... Habituellement, vous en avez plus d'un à apprendre. .. .. Alors, comment capturer plusieurs images au lieu d'une seule image cette fois?

python


import numpy as np
import glob
from keras.preprocessing.image import load_img, img_to_array

#annuaire(path)Nom
dir_name = 'picture'
#Extension d'image
file_type = 'png'

#glob.Obtenez les informations de chemin de toutes les images avec glob
#/*.png signifie toutes les extensions png
img_list_path = glob.glob('./' + dir_name + '/*.' + file_type ) 
#img_list_path = glob.glob('./picture./*.png' )Mais bien sûr, c'est possible

#Créez une liste vide pour stocker les images chargées
img_list = []
img_shape = (256, 256, 3)

#Extrayez les informations de chemin une par une avec l'instruction for et chargez-la_Lire avec img et stocker dans la liste
for img in img_list_path:
    temp_img = load_img(img, grayscale=False, target_size=img_shape)#Lecture d'image au format PIL
    temp_img_array = img_to_array(temp_img) / 255 #PIL ⇒ Arrangement+Normaliser en divisant par 255
    img_list.append(temp_img_array) #Ajouter à la liste préparée

#En tant qu'image de formation, organisez davantage la liste,(n, width, haight, ch)Convertir en forme de
x_train = np.array(img_list)

Vérifiez la forme de cette liste comme un essai et affichez la 0ème image comme un essai.

python


print(x_train.shape)

plt.imshow(x_train[0]) #0e dans la liste(1er)Essayez d'accéder et d'afficher les éléments de

Je ne le montre pas ici, mais je pense que vous pouvez voir correctement la forme de (n, 256, 256, 3) et la 0ème image. Ceci termine la préparation de l'image d'entrée.

À l'origine, il est nécessaire non seulement de lire l'image, mais aussi de donner l'étiquette de réponse correcte en même temps. Il existe plusieurs façons de procéder, mais si toutes les images de img_list_path ont la même balise de classification, vous pouvez les ajouter dans la même instruction for.

python


img_list = []
y = []
img_shape = (256, 256, 3)

for img in img_list_path:
    temp_img = load_img(img, grayscale=False, target_size=img_shape)
    temp_img_array = img_to_array(temp_img) / 255
    img_list.append(temp_img_array) 
    y.append('Irasutoya')#img_list_pathにある画像は全部Irasutoyaなので、分類タグを加える

#x_train et y_les trains sont jumelés dans l'ordre
x_train = np.array(img_list)
y_train = np.array(y)

2. ImageDataGenerator qui gère un grand nombre d'images qui ne peuvent pas tenir dans la mémoire

À propos, comme l'image d'apprentissage est stockée sous forme de liste dans ce qui précède, il existe un cas où un problème survient lorsque vous essayez de l'utiliser telle quelle pour l'apprentissage. Le problème est que si vous enregistrez un nombre ridiculement grand d'images sous forme de liste, la mémoire de votre PC deviendra pleine et vous ne pourrez pas apprendre en premier lieu.

Pour le premier essai ou une petite quantité, vous pouvez le faire avec la liste ci-dessus, mais en pratique, par exemple, apprenez la taille (256,256,3) de 10 000 feuilles. .. Quand ça sort en pratique normalement, le PC commence à gémir et ça devient un problème (rires)

Et c'est Imade Data Generator de Keras qui joue un rôle actif dans un tel cas. En guise de préparation préliminaire, il est nécessaire de diviser les dossiers selon la classification d'apprentissage.

La structure des dossiers est la suivante et le programme utilisé comme exemple est exécuté dans la même hiérarchie que le dossier d'images. le train est pour apprendre. val contiendra une image pour vérification.

python


'''
picture -╷- train -╷- Apple(Catégorie 1) -╷- **.png #Pour apprendre
         ╎         ╎               ╎  (De nombreuses images ... omises)
         ╎         ╎               ╵- **.png
         ╎         ╵- Mango(Catégorie 2) - (Abréviation)
         ╎         
         ╵-  val  -╷- Apple(Catégorie 1) - (Abréviation) #Pour la vérification d'apprentissage
                   ╵- Mango(Catégorie 2) - (Abréviation)
'''

Regardons maintenant la création d'un ensemble de données pour classer les images de pommes et de mangues.

python


from keras.preprocessing.image import ImageDataGenerator

#Réglage
classes = ['Apple', 'Mango']#Si vous voulez apprendre à classer les pommes et les mangues
train_data_dir = './picture/train'#Spécifiez le dossier parent pour la classification(Apple,Dossier supérieur Mango)
img_height = 100
img_width = 100
#Taille du lot(Le nombre de feuilles à apprendre par NN à la fois. 2 à la nième puissance est commune)
batch_size = 16

#Créer des données d'entraînement
#Diviser par 255 à l'échelle
train_datagen = ImageDataGenerator(rescale = 1.0 / 255) #Vous pouvez également définir le remplissage, mais cette fois, il sera omis

#Réglez le générateur d'apprentissage.
#En gros, le générateur est à chaque fois(Ici pour chaque taille de lot)Pour générer une image
train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size = (img_height, img_width), #Aucune dimension requise
    color_mode = 'rgb', #Si gris'grayscale'Entrer
    classes = classes, 
    class_mode = 'binary', #Puisqu'il y en a deux, binaire. S'il y en a 3 ou plus'categorical'
    batch_size = batch_size,
    shuffle = True)

Ceci termine la création de l'ensemble de données d'entraînement. Est-ce plus facile que celui de la liste ci-dessus? ?? Cela chargera l'image pour chaque lot, vous n'avez donc pas à percer votre mémoire. Cependant, si vous craignez de pouvoir lire l'image parce que c'est vraiment comme ça, sortons l'image du contenu du générateur une fois

python


#Définissez la taille du lot à retirer pour l'affichage sur 1.
batch_size_show = 1

#Préparez un générateur différent du précédent pour l'affichage
train_generator_show = train_datagen.flow_from_directory(
    train_data_dir,
    target_size = (img_height, img_width), #Aucune dimension requise
    color_mode = 'rgb', #Si gris'grayscale'Entrer
    classes = classes, 
    class_mode = 'binary', #Puisqu'il y en a deux, binaire. S'il y en a 3 ou plus'categorical'
    batch_size = batch_size_show,
    shuffle = True)

#Préparez une liste pour stocker les images et les étiquettes à afficher
imgs = []
labbels = []

#Pour 100, spécifiez le nombre de feuilles à afficher. Vous pouvez définir le nombre total d'images
for i in range(100):
    x,y = train_generator_show.next() #next()Extraire les éléments du générateur dans l'ordre avec
    
    imgs.append(x[0])
    labbels.append(y)

Ensuite, affichons réellement l'image et l'étiquette

#Confirmation de la classification de la classe de générateur
print(train_generator_show.class_indices)

#Paramètres d'affichage
fig = plt.figure(figsize=(12,12))
fig.subplots_adjust(hspace=0.5, wspace=0.5)
row = 10
col = 10

for i, img in enumerate(imgs):#Numéro d'index,Les éléments peuvent être obtenus avec enumerate
    plot_num = i+1
    plt.subplot(row, col, plot_num,xticks=[], yticks=[])
    plt.imshow(img)
    plt.title('%d' % labbels[i])
plt.show():

apple,mango.PNG

Avec cela, il semble que l'image et la balise de classification sont susceptibles d'être correctes et que les données d'entraînement peuvent être définies, donc Après cela, préparez l'ensemble de données de validation de la même manière et préparez-vous à l'apprentissage. (Abordez le dossier val de la même manière)

python



#réglage de la valeur
classes = ['Apple', 'Mango']
val_data_dir = './picture/val'
img_height = 100
img_width = 100
batch_size = 16

#Créer des données de validation
val_datagen = ImageDataGenerator(rescale = 1.0 / 255)

#Définissez le générateur de validation.
val_generator = val_datagen.flow_from_directory(
    val_data_dir,
    target_size = (img_height, img_width),
    color_mode = 'rgb',
    classes = classes, 
    class_mode = 'binary',
    batch_size = batch_size,
    shuffle = True)

Cette fois, ça se termine ici. Je peux l'ajouter plus tard

Recommended Posts

[Pour l'enregistrement] Système d'image Keras Partie 1: Comment créer votre propre ensemble de données?
[Pour l'enregistrement] Système d'image Keras Partie 2: Laissez CNN juger en utilisant votre propre ensemble de données
Créez votre propre Big Data en Python pour validation
Essayez docker: créez votre propre image de conteneur pour une application Web Python
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (3: Génération d'images de visage à partir d'images candidates, partie 1)
Comment créer un fichier * .spec pour pyinstaller.
Migrez vos propres données CMS vers WordPress
Comment installer votre propre autorité de certification (racine)
[Environnement de développement] Comment créer un ensemble de données proche de la base de données de production
Comment utiliser "deque" pour les données Python
Comment créer un ensemble de données d'image de visage utilisé dans l'apprentissage automatique (1: Acquérir des images de candidats à l'aide du service API Web)
[Apprentissage automatique] Créez un modèle d'apprentissage automatique en effectuant un apprentissage par transfert avec votre propre ensemble de données
Comment créer des exemples de données CSV avec hypothèse
Comment définir votre propre cible dans Sage
Comment utiliser les outils d'analyse de données pour les débutants
Comment créer des données à mettre dans CNN (Chainer)
Annotez vos propres données pour entraîner Mask R-CNN
Comment définir l'affinité du processeur pour les threads de processus
Mémo pour créer votre propre Box avec le Python de Pepper
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Comment récupérer des données d'image de Flickr avec Python
Comment créer rapidement des exemples de données pour un tableau pendant le codage
[Go] Comment créer une erreur personnalisée pour Sentry
Comment faire un test unitaire Part.2 Conception de classe pour les tests
Comment créer un référentiel local pour le système d'exploitation Linux
Comment créer un téléchargeur d'image avec Bottle (Python)
Comment configurer et compiler l'environnement Cython
Comment configurer WSL2 sur Windows 10 et créer un environnement d'étude pour les commandes Linux
Comment configurer Ubuntu pour le sous-système Windows pour Linux 2 (WSL2)
[Ansible] Comment appeler des variables lors de la création de votre propre module
Comment mettre en œuvre 100 coups de science des données pour les débutants en science des données (pour Windows 10 Home)
(Note) Comment passer le chemin de votre propre module
Pour les débutants, comment gérer les erreurs courantes dans les keras
Comment obtenir un aperçu de vos données dans Pandas
Comment créer un fichier ISO (image CD) sous Linux
Créez rapidement des données pour l'étiquetage des séries (balisage de participation)