[PYTHON] [Zur Aufnahme] Keras-Bildsystem Teil 1: Wie erstelle ich einen eigenen Datensatz?

Freut mich, dich kennenzulernen.

Ab diesem Jahr habe ich studiert, um Python zu schreiben, und Keras aufgrund seiner Benutzerfreundlichkeit als Framework für Deep Learning verwendet. Ich denke darüber nach, PyTorch in Zukunft zu studieren, aber vorher dachte ich, ich könnte das Wissen über das Keras (Python) -Bildsystem teilen, an das ich mich im Projekt nur schwer erinnern konnte, ohne Erfahrung in der Programmierung zu haben, also machte ich meinen ersten Beitrag. Es war.

Als ich es nachgeschlagen habe, war es daher schwierig, verschiedene Websites zu durchsuchen (ich konnte die Bedeutung dieser Qiita und anderer Kommentarseiten nicht lesen, weil ich nicht genügend Grundkenntnisse hatte). (MNIST ist schon gut .. Es ist mein eigener Datensatz ...) Ich werde es auch für die Aufnahme für mich selbst zusammenfassen, worauf ich später zurückblicken werde.

Diesmal zum ersten Mal die Grundlagen zum Erfassen von Bildern und zum Erstellen eines eigenen Datensatzes? Ich werde zusammenfassen.

Ich hoffe, dass dieser eine Tag für Anfänger nützlich sein wird, die niemand kennt ... (Ich beabsichtige, mehr japanische Kommentare als andere ähnliche Artikel abzugeben)

Da es sich um den ersten Beitrag von Qiita handelt, schätze ich außerdem das Aussehen. .. .. Ich werde nach und nach lernen, bitte haben Sie etwas Geduld.


Teil 1 (dieser Artikel) Bilderfassung So erstellen Sie Ihren eigenen Datensatz

Teil 2 (geplant, um das nächste Mal zu schreiben) Lassen Sie uns den erstellten Datensatz in NN setzen


1. Keras dedizierte Bildlademethode Load_img

In Python gibt es auch eine Methode zum Importieren von Bildern mit Pillow (PIL) oder OpenCV. Da es sich jedoch um einen Keras-Artikel handelt, werde ich mich hier auf load_img konzentrieren. Wie importieren Sie hier als Beispiel Ihr Bild (A.png), wenn es in derselben Hierarchie (Verzeichnis) wie die Programmdaten (.py) platziert ist? Erklären.

python


#Die Magie, die Bilder mit matplotlib und jupyter Notebook ausgibt, die zum Anzeigen von Bildern verwendet werden
import matplotlib.pyplot as plt
%matplotlib inline

#Keras, eine Bibliothek, die Bilder mit Keras problemlos verarbeiten kann.preprocessing.image
from keras.preprocessing.image import load_img

#Wie es ist(In Farbe)Lesen(Die ursprüngliche Bildgröße von Irasutoya ist(646,839)3D-PNG-Farbbild von)
#.Da es ein Bild in derselben Hierarchie wie py gibt, ist A so wie es ist.Kann von png gelesen werden
img1 = load_img('A.png')

#Graustufen(1 Dimension)Beim Lesen mit
img2 = load_img('A.png', grayscale=True)

#Beim Ändern der Größe und Lesen
img_shape = (256, 256, 3) #Versuchen Sie, die Größe auf ein Farbbild mit 256 Höhen und Breiten zu ändern
img3 = load_img('A.png', grayscale=False, target_size=img_shape)

Als nächstes zeigen wir jedes Bild mit matplotlib an

python


plt.imshow(img1) #img2 anstelle von img1,Tausche 3 und versuche es

いらすとや.PNG

wie wär es damit? Sie können sehen, dass es richtig angezeigt wird. Übrigens ist im Allgemeinen die folgende Verarbeitung erforderlich, um ein Bild in NN (Neural Net) einzugeben.

python


#Größe ändern und laden
img_shape = (256, 256, 3) #256 Farbbilder in Höhe und Breite
img = load_img('A.png', grayscale=False, target_size=img_shape)

#Konvertieren Sie in den Numpy-Array-Typ, um ihn in ein neuronales Netzwerk aufzunehmen
img_array = img_to_array(img)

#Teilen Sie durch 255 und normalisieren Sie
img_array /= 255
#img_array = img_array /255 ist in Ordnung

Jetzt können Sie in NN eingeben. Sie müssen jedoch nicht nur einen eingeben ... Normalerweise müssen Sie mehr als eine lernen. .. .. Wie können Sie dieses Mal mehrere Bilder anstelle eines einzelnen Bildes aufnehmen?

python


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

#Verzeichnis(path)Name
dir_name = 'picture'
#Bilderweiterung
file_type = 'png'

#glob.Holen Sie sich die Pfadinformationen aller Bilder mit glob
#/*.png bedeutet alle png-Erweiterungen
img_list_path = glob.glob('./' + dir_name + '/*.' + file_type ) 
#img_list_path = glob.glob('./picture./*.png' )Aber natürlich ist es möglich

#Erstellen Sie eine leere Liste, um die geladenen Bilder zu speichern
img_list = []
img_shape = (256, 256, 3)

#Extrahieren Sie die Pfadinformationen einzeln mit der for-Anweisung und laden Sie sie_Mit img lesen und in der Liste speichern
for img in img_list_path:
    temp_img = load_img(img, grayscale=False, target_size=img_shape)#Bildlesung im PIL-Format
    temp_img_array = img_to_array(temp_img) / 255 #PIL ⇒ Anordnung+Normalisieren Sie durch Teilen durch 255
    img_list.append(temp_img_array) #Zur vorbereiteten Liste hinzufügen

#Ordnen Sie als Trainingsbild die Liste weiter an,(n, width, haight, ch)In die Form von konvertieren
x_train = np.array(img_list)

Überprüfen Sie die Form dieser Liste als Test und zeigen Sie das 0. Bild als Test an.

python


print(x_train.shape)

plt.imshow(x_train[0]) #0. in der Liste(1)Versuchen Sie, auf die Elemente von zuzugreifen und diese anzuzeigen

Ich zeige es hier nicht, aber ich denke, Sie können die Form von (n, 256, 256, 3) und das 0. Bild richtig sehen. Damit ist die Vorbereitung des Eingabebildes abgeschlossen.

Ursprünglich ist es notwendig, nicht nur das Bild zu lesen, sondern gleichzeitig auch das richtige Antwortetikett zu geben. Es gibt verschiedene Möglichkeiten, dies zu tun. Wenn jedoch alle Bilder in img_list_path dasselbe Klassifizierungs-Tag haben, können Sie sie in derselben for-Anweisung hinzufügen.

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_Zug und y_Züge sind der Reihe nach gepaart
x_train = np.array(img_list)
y_train = np.array(y)

2. ImageDataGenerator, der eine große Anzahl von Bildern verarbeitet, die nicht in den Speicher passen

Übrigens, da das Trainingsbild oben als Liste gespeichert ist, tritt ein Problem auf, wenn versucht wird, es so zu verwenden, wie es zum Lernen ist. Das Problem ist, dass, wenn Sie eine lächerlich große Anzahl von Bildern als Liste speichern, der Speicher Ihres PCs voll wird und Sie überhaupt nicht lernen können.

Für den ersten Versuch oder eine kleine Menge können Sie dies mit der obigen Liste tun, aber in der Praxis lernen Sie beispielsweise die Größe (256.256,3) von 10.000 Blättern. .. Wenn es in der Praxis normal herauskommt, fängt der PC an zu stöhnen und es wird ein Problem (lacht)

In diesem Fall spielt der Imade Data Generator von Keras eine aktive Rolle. Zur Vorbereitung ist es notwendig, die Ordner nach der Lernklassifikation zu unterteilen.

Die Ordnerstruktur ist wie folgt und das als Beispiel verwendete Programm wird in derselben Hierarchie wie der Bildordner ausgeführt. Zug ist zum Lernen. val enthält ein Bild zur Überprüfung.

python


'''
picture -╷- train -╷- Apple(Kategorie 1) -╷- **.png #Zum Lernen
         ╎         ╎               ╎  (Viele Bilder ... weggelassen)
         ╎         ╎               ╵- **.png
         ╎         ╵- Mango(Kategorie 2) - (Abkürzung)
         ╎         
         ╵-  val  -╷- Apple(Kategorie 1) - (Abkürzung) #Zur Überprüfung des Lernens
                   ╵- Mango(Kategorie 2) - (Abkürzung)
'''

Betrachten wir nun die Erstellung eines Datensatzes zur Klassifizierung von Apfel- und Mangobildern.

python


from keras.preprocessing.image import ImageDataGenerator

#Aufbau
classes = ['Apple', 'Mango']#Wenn Sie lernen möchten, Äpfel und Mangos zu klassifizieren
train_data_dir = './picture/train'#Geben Sie den übergeordneten Ordner für die Klassifizierung an(Apple,Mango oberer Ordner)
img_height = 100
img_width = 100
#Chargengröße(Die Anzahl der Blätter, die NN gleichzeitig lernen soll. 2 bis zur n-ten Potenz ist üblich)
batch_size = 16

#Trainingsdaten erstellen
#Teilen Sie durch 255, um zu skalieren
train_datagen = ImageDataGenerator(rescale = 1.0 / 255) #Sie können auch die Polsterung einstellen, diesmal wird sie jedoch weggelassen

#Stellen Sie den Lerngenerator ein.
#Grob gesagt ist Generator jedes Mal(Hier für jede Losgröße)Ein Bild erzeugen
train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size = (img_height, img_width), #Keine Abmessungen erforderlich
    color_mode = 'rgb', #Wenn grau'grayscale'Eingeben
    classes = classes, 
    class_mode = 'binary', #Da gibt es zwei, binär. Wenn es 3 oder mehr gibt'categorical'
    batch_size = batch_size,
    shuffle = True)

Damit ist die Erstellung des Trainingsdatensatzes abgeschlossen. Ist das einfacher als das auf der Liste oben? ?? Dadurch wird das Bild für jeden Stapel geladen, sodass Sie Ihr Gedächtnis nicht beschädigen müssen. Wenn Sie jedoch befürchten, dass Sie das Bild lesen können, weil es wirklich so ist, geben Sie das Bild des Inhalts des Generators einmal aus

python


#Stellen Sie die für die Anzeige herauszunehmende Stapelgröße auf 1 ein.
batch_size_show = 1

#Bereiten Sie einen anderen Generator als den vorherigen für die Anzeige vor
train_generator_show = train_datagen.flow_from_directory(
    train_data_dir,
    target_size = (img_height, img_width), #Keine Abmessungen erforderlich
    color_mode = 'rgb', #Wenn grau'grayscale'Eingeben
    classes = classes, 
    class_mode = 'binary', #Da gibt es zwei, binär. Wenn es 3 oder mehr gibt'categorical'
    batch_size = batch_size_show,
    shuffle = True)

#Bereiten Sie eine Liste vor, um Bilder und Beschriftungen für die Anzeige zu speichern
imgs = []
labbels = []

#Geben Sie für 100 die Anzahl der Blätter an, die Sie anzeigen möchten. Sie können die Gesamtzahl der Bilder festlegen
for i in range(100):
    x,y = train_generator_show.next() #next()Extrahieren Sie die Elemente des Generators in der richtigen Reihenfolge mit
    
    imgs.append(x[0])
    labbels.append(y)

Als nächstes zeigen wir das Bild und die Beschriftung an

#Bestätigung der Klassifizierung der Generatorklasse
print(train_generator_show.class_indices)

#Bildschirmeinstellungen
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):#Indexnummer,Elemente können mit Aufzählung erhalten werden
    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

Damit scheint es, dass das Bild und das Klassifizierungs-Tag wahrscheinlich korrekt sind und die Trainingsdaten so eingestellt werden können Bereiten Sie danach den Validierungsdatensatz auf die gleiche Weise vor und bereiten Sie sich auf das Lernen vor. (Gehen Sie auf die gleiche Weise an den Ordner val heran.)

python



#Werteinstellung
classes = ['Apple', 'Mango']
val_data_dir = './picture/val'
img_height = 100
img_width = 100
batch_size = 16

#Erstellen Sie Validierungsdaten
val_datagen = ImageDataGenerator(rescale = 1.0 / 255)

#Stellen Sie den Validierungsgenerator ein.
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)

Diesmal endet es hier. Ich kann es später hinzufügen

Recommended Posts

[Zur Aufnahme] Keras-Bildsystem Teil 1: Wie erstelle ich einen eigenen Datensatz?
[Zur Aufnahme] Keras-Bildsystem Teil 2: Lassen Sie CNN anhand Ihres eigenen Datensatzes beurteilen
Erstellen Sie Ihre eigenen Big Data in Python zur Validierung
Docker ausprobieren: Erstellen Sie Ihr eigenes Container-Image für eine Python-Web-App
Erstellen eines Gesichtsbilddatensatzes für maschinelles Lernen (3: Gesichtsbildgenerierung aus Kandidatenbildern Teil 1)
So erstellen Sie eine * .spec-Datei für pyinstaller.
Wenn Sie dasselbe wie zuvor verwenden, können Sie dies visualisieren, indem Sie Japan, China und Südkorea ausschließen, in denen viele Menschen infiziert sind. In diesem Fall lauten die Daten für "2020/02/21" wie folgt. Besonders auffällig sind Südostasien, Europa und Nordamerika. Ich hoffe es konvergiert so schnell wie möglich. .. .. Migrieren Sie Python, Pandas, Python3, Zeitreihendaten und eigene CMS-Daten nach WordPress
So installieren Sie Ihre eigene (Root-) Zertifizierungsstelle
[Entwicklungsumgebung] So erstellen Sie einen Datensatz in der Nähe der Produktionsdatenbank
Verwendung von "deque" für Python-Daten
Erstellen eines Gesichtsbilddatensatzes für maschinelles Lernen (1: Erfassen von Kandidatenbildern mithilfe des Web-API-Dienstes)
[Maschinelles Lernen] Erstellen Sie ein Modell für maschinelles Lernen, indem Sie Transferlernen mit Ihrem eigenen Datensatz durchführen
Erstellen von CSV-Beispieldaten mit Hypothese
So definieren Sie Ihr eigenes Ziel in Sage
Verwendung von Datenanalysetools für Anfänger
So erstellen Sie Daten für CNN (Chainer)
Kommentieren Sie Ihre eigenen Daten, um Mask R-CNN zu trainieren
Festlegen der CPU-Affinität für Prozessthreads
Memo zum Erstellen einer eigenen Box mit Peppers Python
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
So kratzen Sie Bilddaten von Flickr mit Python
So erstellen Sie während des Codierens schnell Beispieldaten für ein Array
[Go] So erstellen Sie einen benutzerdefinierten Fehler für Sentry
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen
So erstellen Sie ein lokales Repository für Linux
So erstellen Sie einen Bild-Uploader mit Bottle (Python)
So richten Sie die Cython-Umgebung ein und kompilieren sie
So richten Sie WSL2 unter Windows 10 ein und erstellen eine Lernumgebung für Linux-Befehle
So richten Sie Ubuntu für Windows Subsystem für Linux 2 (WSL2) ein
[Ansible] So rufen Sie Variablen auf, wenn Sie ein eigenes Modul erstellen
Implementieren von 100 Data Science-Schlägen für Anfänger in Data Science (für Windows 10 Home)
(Hinweis) So übergeben Sie den Pfad Ihres eigenen Moduls
Für Anfänger, wie man mit häufigen Fehlern in Keras umgeht
So erhalten Sie einen Überblick über Ihre Daten in Pandas
So erstellen Sie eine ISO-Datei (CD-Image) unter Linux
Erstellen Sie schnell Daten für die Serienkennzeichnung (Partizipationskennzeichnung)