[PYTHON] Nach dem Bild des Shiba-Hundes zu urteilen, indem man tief lernt, ob es mein Kind ist (1)

Einführung

――Dies ist das Ergebnis meiner eigenen Studienaufzeichnung über maschinelles Lernen und tiefes Lernen. ――Dieses Mal klassifiziert Google Colaboratory zwei Arten von Bilddaten. Beurteilen Sie "mein Kind (Hund)" und "außer meinem Kind (Hund)" auf dem Bild des Shiba-Hundes. ――Beschreiben Sie so weit wie möglich die Teile, die aufgrund verschiedener Fehler gestolpert sind, und beschreiben Sie sie so, dass jeder sie leicht reproduzieren kann. ――Dies ist das erste Mal, dass Sie einen Artikel über Qiita veröffentlichen. Wenn Sie also Hinweise oder Korrekturen haben, teilen Sie uns dies bitte mit.

Wer ist das Ziel dieses Artikels?

――Die Personen, die Deep Learning studieren und verschiedene Analysen durchführen möchten, aber keine Kenntnisse und Informationen haben und in und um Google Colaboratory auf verschiedene Weise gestolpert sind und die Analyse nicht wie erwartet abläuft (Artikel für fortgeschrittene Benutzer von Bali Bali) Nicht!)

über mich

――Ich habe 2018 angefangen, maschinelles Lernen zu studieren, und seit 2019 bin ich ein Mitglied der Gesellschaft, das hauptsächlich samstags und sonntags studiert, wenn es keine Arbeit gibt, und mich auf tiefes Lernen konzentriere. ――Ich habe keine Erfahrung als Ingenieur und arbeite als Mitglied der Gesellschaft. Ich habe keine Chance, maschinelles Lernen in der Praxis anzuwenden, aber je mehr ich studiere, desto mehr werde ich vom tiefen Charme dieses Fachs abhängig und im September 2019 ** JDLA Deep Learning für Engeneer 2019 # Ich habe 2 **. ――Ich möchte Erfahrungen in verschiedenen Deep-Learning-Analysen sammeln und nehme derzeit an der Fallanalyse mit tatsächlichen Daten teil. ――Bei Ende März 2020 werde ich mich mit 18 Dienstjahren aus dem öffentlichen Dienst zurückziehen und ab April den Job zu einem Dateningenieur wechseln.

Literaturhinweise

-: Closed_book: ** "Deep Learning mit Python und Keras" **: boy_tone1: Francois Chollet Übersetzt von Quipe Co., Ltd. Übersetzt von Yusuke Negago, veröffentlicht von My Navi Publishing Co., Ltd.

Vorbereitungen

-Sie müssen ein ** Google-Konto ** haben.

Verfahrensbeschreibung

** Schritt 1 Sammeln Sie Fotos zur Analyse, ändern Sie die Größe und laden Sie sie im Zip-Format auf Google Drive hoch ** ** Schritt 2 Erstellen Sie einen Arbeitsordner in Google Drive und dekomprimieren Sie die Daten. ** ** ** ** Schritt 3 Kopieren Sie die angegebene Anzahl von Shiba-Hundefotos (jeweils 50) in die Ordner Zug, Test und Validierung. ** ** ** ** Schritt 4 Modellbau ** ** Schritt 5 Lernen ** ** Schritt 6 Ergebnis ** ** Schritt 7 Datenerweiterung ** ** Schritt 8 Andere Anpassungsergebnisse (Änderung der Bildeingabegröße usw.) **

Über mein Kind

mirin025_m.jpg

Lassen Sie mich zunächst mein Kind vorstellen, bevor ich mit dem Analyseverfahren fortfahre. Seit Januar 2020 bin ich eine 16-jährige Shiba. Der Name ist ** Mirin **. Der Name ist meine Frau, aber da es sich um einen japanischen Hund handelt, wurde er im japanischen Stil benannt. ** Schon ist dieser Mirin süß und süß! ** ** ** Es gibt viele niedliche Bilder dieses Mirins in der Zip-Datei für Analysedaten (mydog), die später veröffentlicht werden. Wir hoffen, dass Sie sich dies auch ansehen und gemeinsam die verschiedenen Ausdrucksformen unserer Mirin genießen (← ** Eltern-Idiot **).

Spezifisches Verfahren

Schritt 1 Sammeln Sie Fotos zur Analyse, ändern Sie die Größe und laden Sie sie im Zip-Format auf Google Drive hoch

(1) Fotosammlung von Shiba-Hunden

――Ich habe Fotos von Mirin aus meinen Smartphone- und Digitalkamera-Ordnern gesammelt. Zu diesem Zeitpunkt habe ich den Zeitraum des Fotos ausgewählt, indem ich die Welpenperiode ausschloss und mich auf den Zeitraum von 12 bis 16 Jahren (aktuell) konzentrierte, um zu verhindern, dass die Anzahl der Merkmale verstreut wird.

(2) Zuschneiden und Ändern der Bildgröße

――Da jedes Bild verschiedene Fotos enthält, ist es nicht für die Verwendung als Daten geeignet. Deshalb habe ich es so zugeschnitten, dass das Verhältnis nur des Hundeelements in einem Bild so hoch wie möglich ist. Schneiden Sie mit einer Fotoretuschier-Software (Photoshop Elements, Gimp usw.) mit einem Seitenverhältnis von 1: 1 gleichmäßig aus, ohne sich um die Bildgröße zu kümmern, und speichern Sie sie als Bilddatei (JPG-Datei). --Die ausgeschnittene Datei verwendet Software wie ** Verkleinerung **, und diesmal handelt es sich um ein 320 x 320 Pixel großes Bild. Ändern Sie die Größe in loser Schüttung als. Ich habe ** FlexRena84 ** zum Batch-Umbenennen von Bilddateien verwendet. ―― Bereiten Sie auf diese Weise 60 Bilddateien von Mirin und 60 anderen Shiba-Hunden vor, speichern Sie sie in den Ordnern "mydog" und "otherdogs" und erstellen Sie für jeden Ordner eine Zip-Datei.

Ich werde ein paar Fotos posten. ** Mirins Foto (mein Hund) ** mydog52.jpgmydog1.jpgmydog54.jpgmydog14.jpg

** Fotos von anderen Shiba-Hunden (anderen Hunden) ** otherdogs0.jpgotherdogs1.jpgotherdogs2.jpgotherdogs21.jpg

(3) Auf Google Drive hochladen

--Erstellen Sie einen Ordner in Google Drive, um Daten im Voraus zu speichern.

Schritt 2 Erstellen Sie einen Arbeitsordner in Google Drive und dekomprimieren Sie die Daten.

Starten Sie von hier aus Google Colaboratory und arbeiten Sie mit Colab.

(1) Mounten Sie zuerst Google Drive.

Informationen für Erstbenutzer finden Sie unter ** hier **.

#Google Drive-Mount
from google.colab import drive
drive.mount('/content/drive')

(2) Ändern Sie das aktuelle Verzeichnis in den Arbeitsordner und entpacken Sie die Zip-Datei.

# cd '/content/drive/'My Drive/'Colab Notebooks'Ändern Sie das aktuelle Verzeichnis in den Arbeitsordner in
%cd '/content/drive/'My Drive/Colab Notebooks/Self_Study/02_mydog_or_otherdogs/original_data

# mydog1.Zip entpacken
!unzip "mydog1.zip"

# otherdogs1.Zip entpacken
!unzip "otherdogs1".zip"

#Überprüfen Sie die Anzahl der entpackten Dateien
!ls ./original_data/mydog1 | wc -l
!ls ./original_data/otherdogs1 | wc -l

** Hinweis) Daten sollten vor der Dekomprimierung komprimiert und auf Google Drive hochgeladen werden. </ font> ** Ich habe versucht, ohne Komprimierung direkt auf Google Drive hochzuladen, aber es dauert sehr lange. Da die Operation im Labor ausgeführt wird, verwendet der Dekomprimierungsbefehl den Linux-Befehl, der mit "!" Beginnt. unzip.png Eine Meldung wie diese wird angezeigt und die Datei wird dekomprimiert.

Schritt 3 Kopieren Sie die angegebene Anzahl von Shiba-Hundefotos (jeweils 60) in die Ordner Zug, Test und Validierung.

(1) Legen Sie den Dateipfad zum Kopieren der Bilddatei fest und erstellen Sie einen neuen Ordner.

#Laden der erforderlichen Bibliotheken
import os, shutil

#Definieren Sie den gewünschten Dateipfad
# cd '/content/drive/'My Drive/'Colab Notebooks'Ändern Sie das aktuelle Verzeichnis in den Arbeitsordner in
%cd '/content/drive/'My Drive/Colab Notebooks/Self_Study/02_mydog_or_otherdogs

# original_Festlegen des Dateipfads des Datenordners
original_dataset_dir = 'original_data'
# original_data(Definitionsname'original_dataset_dir')Legen Sie die folgenden zwei Ordnerpfade fest.
original_mydog_dir = 'original_data/mydog'
original_otherdogs_dir = 'original_data/otherdogs'

# use_Festlegen des Dateipfads von Daten
base_dir = 'use_data'

# use_Datenordner(Definitionsname'base_dir')Legen Sie die folgenden drei Ordnerpfade fest. Erstellen Sie einen Ordner.
train_dir = os.path.join(base_dir, 'train')
os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
os.mkdir(validation_dir)
test_dir = os.path.join(base_dir, 'test')
os.mkdir(test_dir)

#Im Zugordner'mydog'Mit Ordnern'otherdogs'Legen Sie den Ordnerpfad fest. Erstellen Sie einen Ordner.
train_mydog_dir = os.path.join(train_dir, 'mydog')
os.mkdir(train_mydog_dir)
train_otherdogs_dir = os.path.join(train_dir, 'otherdogs')
os.mkdir(train_otherdogs_dir)

#Im Validierungsordner'mydog'Mit Ordnern'otherdogs'Legen Sie den Ordnerpfad fest. Erstellen Sie einen Ordner.
validation_mydog_dir = os.path.join(validation_dir, 'mydog')
os.mkdir(validation_mydog_dir)
validation_otherdogs_dir = os.path.join(validation_dir, 'otherdogs')
os.mkdir(validation_otherdogs_dir)

#Im Testordner'mydog'Mit Ordnern'otherdogs'Legen Sie den Ordnerpfad fest. Erstellen Sie einen Ordner.
test_mydog_dir = os.path.join(test_dir, 'mydog')
os.mkdir(test_mydog_dir)
test_otherdogs_dir = os.path.join(test_dir, 'otherdogs')
os.mkdir(test_otherdogs_dir)

(2) Führen Sie eine Dateikopie durch und überprüfen Sie die Anzahl der kopierten Dateien.


#Zug für Zug_mydog_Kopieren Sie 30 Mydog-Dateien in das Verzeichnis
fnames = ['mydog{}.jpg'.format(i) for i in range(30)]
for fname in fnames:
    src = os.path.join(original_mydog_dir, fname)
    dst = os.path.join(train_mydog_dir, fname)
    shutil.copyfile(src, dst)

#Validierung zur Validierung_mydog_Kopieren Sie 20 Mydog-Dateien nach dir
fnames = ['mydog{}.jpg'.format(i) for i in range(30,50)]
for fname in fnames:
    src = os.path.join(original_mydog_dir, fname)
    dst = os.path.join(validation_mydog_dir, fname)
    shutil.copyfile(src, dst)

#Test für Test_mydog_Kopieren Sie 10 Mydog-Dateien nach dir
fnames = ['mydog{}.jpg'.format(i) for i in range(50,60)]
for fname in fnames:
    src = os.path.join(original_mydog_dir, fname)
    dst = os.path.join(test_mydog_dir, fname)
    shutil.copyfile(src, dst)

#Zug für Zug_otherdogs_Kopieren Sie 30 andere Hundedateien nach dir
fnames = ['otherdogs{}.jpg'.format(i) for i in range(30)]
for fname in fnames:
    src = os.path.join(original_otherdogs_dir, fname)
    dst = os.path.join(train_otherdogs_dir, fname)
    shutil.copyfile(src, dst)

#Validierung zur Validierung_otherdogs_Kopieren Sie 20 andere Hundedateien nach dir
fnames = ['otherdogs{}.jpg'.format(i) for i in range(30, 50)]
for fname in fnames:
    src = os.path.join(original_otherdogs_dir, fname)
    dst = os.path.join(validation_otherdogs_dir, fname)
    shutil.copyfile(src, dst)

#Test für Test_otherdogs_Kopieren Sie 10 andere Hundedateien nach dir
fnames = ['otherdogs{}.jpg'.format(i) for i in range(50, 60)]
for fname in fnames:
    src = os.path.join(original_otherdogs_dir, fname)
    dst = os.path.join(test_otherdogs_dir, fname)
    shutil.copyfile(src, dst)

#Überprüfen Sie die Anzahl der in jedem Ordner gespeicherten Dateien
print('total training mydog images:', len(os.listdir(train_mydog_dir)))
print('total training otherdogs images:', len(os.listdir(train_otherdogs_dir)))
print('total validation mydog images:', len(os.listdir(validation_mydog_dir)))
print('total validation otherdogs images:', len(os.listdir(validation_otherdogs_dir)))
print('total test mydog images:', len(os.listdir(test_mydog_dir)))
print('total test otherdogs images:', len(os.listdir(test_otherdogs_dir)))

Die Anzahl der Dateien wird wie folgt angezeigt. files.png

Schritt 4 Modellbau

(1) Importieren Sie Keras und erstellen Sie ein Modell wie folgt.

Die Größe des Eingabebildes in der Originaldatei beträgt 320 * 320, diesmal wird die Größe der Eingabe jedoch als 150 * 150 gelesen.


from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(150, 150, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.summary()

Die Modellkonfiguration wird folgendermaßen angezeigt. model_sum.png

(2) Stellen Sie die Verlustfunktion (binäre Kreuzentropie), den Optimierer (RMS Prop) und den Überwachungsindex (Genauigkeit) ein und kompilieren Sie das Modell.


from keras import optimizers

model.compile(loss='binary_crossentropy',
              optimizer=optimizers.RMSprop(lr=1e-4),
              metrics=['acc'])

(3) Konvertieren Sie die Bilddatei mithilfe der Keras-Bibliothek ImageDataGenerator in einen Tensor.

Diesmal wurde keine Datenerweiterung implementiert.


from keras.preprocessing.image import ImageDataGenerator

# rescaled by 1./255
train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        # target directory
        train_dir,
        # resized to 150x150
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=20,
        class_mode='binary')

Schritt 5 Lernen

(1) Trainieren Sie das Modell mit dem Batch-Generator.

history = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=30,
      validation_data=validation_generator,
      validation_steps=50)

Wenn das Lernen beginnt, sieht die Anzeige folgendermaßen aus und die Berechnung wird fortgesetzt. (Es wird eine Weile dauern) fit.png

(2) Speichern Sie das Modell nach dem Training.

model.save('mydog_or_otherdogs_01a.h5')

Schritt 6 Ergebnis

(1) Zeigen Sie das Lernergebnis in einer Grafik an

import matplotlib.pyplot as plt

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

Ergebnisdiagramm traial01.png

Vor allem Genauigkeit

--Die Übertragungsgenauigkeit hat von Anfang an 100% erreicht.

  • Die Genauigkeit der Validierung liegt zwischen 70% und 85%, und die Genauigkeit verbessert sich nicht mehr. Sie können die Funktionen wie sehen. Leider betrachten wir nur die Merkmale, die nur für Zugdaten gelten, und es kann nicht gesagt werden, dass wir ein klares Merkmal unseres Hundes haben, das für andere als Zugdaten gültig ist.

Auf der anderen Seite über Verlust

  • Der Trainingsverlust liegt von Anfang an nahe bei 0. ――Der Validierungsverlust nimmt nicht mit zunehmender Häufigkeit ab, sondern steigt nach oben.

Von oben trainieren wir die Zugdaten. Immerhin war die Anzahl der Daten ursprünglich gering, so dass das Ergebnis unvermeidlich ist.

(2) Antrag auf Prüfung von Daten

Wenden wir dieses Modell mit dem folgenden Code auf die Testdaten an, um die Klassifizierungsgenauigkeit zu überprüfen. ** Hinweis) ImageDataGenerator schlägt ohne Konvertierung fehl, wenn der Zielordner keine zwei oder mehr Unterordner enthält. ** (In diesem Fall benötigen Sie zwei Unterordner, mydog und otherdogs) </ font>


test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
    test_dir,
    target_size=(150,150),
    batch_size=50,
    class_mode='binary')

test_loss, test_acc = model.evaluate_generator(test_generator, steps=50)
print('test loss:', test_loss)
print('test acc:', test_acc)

test loss: 2.7508722241719563 test acc: 0.7666666607062022

Die Genauigkeit dieses Implementierungsergebnisses beträgt ca. 76%. Weitere Anpassungen sind erforderlich.

Schritt 7 Datenerweiterung

Verwenden wir weiterhin das vorherige Modell, führen Sie eine Datenerweiterung für die Zugdaten durch und trainieren Sie sie erneut. Der Code für den aufgefüllten Teil des ImageDataGenerator befindet sich unten.

#Aufgeblasene Zugdaten
train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,)

#Validierungsdaten werden nicht aufgefüllt
test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        # Target directory
        train_dir,
        # resized to 150x150
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

Lernen Sie das Modell mit 100 Epochen.


history = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=100,
      validation_data=validation_generator,
      validation_steps=50)

Speichern Sie das trainierte Modell.


model.save('mydog_or_otherdogs_01b.h5')

Das resultierende Diagramm ist unten dargestellt. traial02.png

Wenden wir das trainierte Modell auf die Testdaten an und sehen die Klassifizierungsgenauigkeit. test loss: 2.480180886810025 test acc: 0.7499999996026357 Im Allgemeinen scheint das Auffüllen die Genauigkeit zu verbessern, aber in diesem Beispiel ist die Genauigkeit im Vergleich zum vorherigen etwas gesunken. Da die Anzahl der Datenproben ursprünglich gering ist, frage ich mich, ob dies der Fall ist.

Schritt 8 Andere Anpassungen (Änderung der Bildeingabegröße usw.)

Bisher wurde die Größe des Eingabebildes auf 150 x 150 Pixel eingestellt. Was passiert, wenn ich die Größe des Eingabebilds auf die Originalgröße von 320 x 320 Pixel ändere? Lassen Sie uns das Modell anhand des bisher erstellten Modells auf zwei Arten trainieren: ** ① ohne Datenerweiterung ** ** ② mit Datenerweiterung ** und sehen Sie sich die Implementierungsergebnisse an.

** * Hinzugefügt 2020/1/4 Da der numerische Wert falsch war, wurde der numerische Wert auf den richtigen korrigiert und der Kommentar ebenfalls überarbeitet. </ font> ** Die Klassifizierungsgenauigkeit der Testdaten ist wie folgt. Ergebnis von ① test loss: 1.6523902654647826 ~~(1.7524430536416669)~~ test acc: 0.75 ~~(0.8166666567325592)~~

Ergebnis von ② test loss: 2.102495942115784 ~~(1.382319548305386)~~ test acc: 0.75 ~~(0.8666666634877522)~~

Im Vergleich zur Eingabegröße von 150 Pixel gab es bei der Eingabegröße von 320 Pixel keinen großen Unterschied in Bezug auf Fehler und Genauigkeit. </ font>

Das nächste Mal möchte ich erneut analysieren, wenn ich die Anzahl der Bilddatenproben erhöhe.

Recommended Posts