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
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
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)
Ü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():
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