Bis zum vorherigen Zeitpunkt hatten wir Bilder gesammelt, Gesichtsteile erfasst und Daten aufgeblasen, die Teile der Datenvorverarbeitung sind.
Dieses Mal habe ich tatsächlich ein Modell erstellt und die Genauigkeit überprüft. ・ Modell von mir gebaut ・ Transferlernen (VGG16) Ich werde über diese beiden schreiben.
preparation.py
from PIL import Image
import os, glob
import numpy as np
from PIL import ImageFile
import cv2
from keras.utils.np_utils import to_categorical
# IOError:Die Bilddatei wird abgeschnitten, um dies zu vermeiden
ImageFile.LOAD_TRUNCATED_IMAGES = True
#Erstellung von Trainingsdaten
#Erstellen Sie jeweils eine leere Liste
img_shibuno = []
img_koiwai = []
img_hara = []
img_lists = [img_shibuno, img_koiwai, img_hara]
#Holen Sie sich den Pfad unter Gesicht
in_dir = './face/*'
in_file = glob.glob(in_dir)
#Jeder Ordner (Player)Führen Sie die Verarbeitung für jeden durch
for num in range(len(in_file)):
#Holen Sie sich den Pfad jedes Bildes in der Datei des Players
in_file_name = glob.glob(in_file[num]+'/*')
#Verarbeiten Sie jedes Bild
for i in range(len(in_file_name)):
#Bild öffnen
img = Image.open(in_file_name[i])
img = img.convert("RGB")
#Größe anpassen
img = img.resize((64,64))
#In ndarray konvertieren
data = np.asarray(img)
# img_Zu Listen hinzufügen
img_lists[num].append(data)
#Kombinieren Sie Listen mit Bildern
X_train = np.array(img_shibuno+img_koiwai+img_hara)
#Jeweils 0~Geben Sie einen Wert bis zu 2 ein
y_train = np.array([0]*len(img_shibuno) + [1]*len(img_koiwai) + [2]*len(img_hara))
#Testdaten erstellen
#Erstellen Sie jeweils eine leere Liste
img_shibuno = []
img_koiwai = []
img_hara = []
img_lists = [img_shibuno, img_koiwai, img_hara]
in_dir = './valid/*'
in_file = glob.glob(in_dir)
for num in range(len(in_file)):
#Holen Sie sich den Pfad jedes Bildes in der Datei des Players
in_file_name = glob.glob(in_file[num]+'/*')
#Verarbeiten Sie jedes Bild
for i in range(len(in_file_name)):
#Bild öffnen
img = Image.open(in_file_name[i])
img = img.convert("RGB")
#Größe anpassen
img = img.resize((64,64))
#In ndarray konvertieren
data = np.asarray(img)
# img_Zu Listen hinzufügen
img_lists[num].append(data)
#Kombinieren Sie Listen mit Bildern
X_test = np.array(img_shibuno+img_koiwai+img_hara)
#Jeweils 0~Geben Sie einen Wert bis zu 2 ein
y_test = np.array([0]*len(img_shibuno) + [1]*len(img_koiwai) + [2]*len(img_hara))
# one-hot-Prozessvektor
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
#Speichern Sie Trainings- und Validierungsdaten in einer Datei
xy = (X_train, X_test, y_train, y_test)
np.save('./golfer.npy', xy)
Damit ist die Datenvorverarbeitung abgeschlossen. Bewerten Sie als Nächstes das Modell
Erstellen Sie Ihr eigenes Modell und übertragen Sie das Lernmodell (vgg16)
from keras.models import Model, Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Activation, Dropout, Flatten, Dense, Input
from keras.applications.vgg16 import VGG16
from keras.utils import np_utils
import keras
from keras import optimizers, models, layers
import numpy as np
import matplotlib.pyplot as plt
classes = ['shibuno', 'koiwai', 'hara']
num_classes = len(classes)
image_size = 64
def load_data():
X_train, X_test, y_train, y_test = np.load('./golfer.npy', allow_pickle=True)
#Setzen Sie jeden Pixelwert der Eingabedaten auf 0-Normalisieren Sie im Bereich von 1
X_train = X_train / 255
X_test = X_test / 255
return X_train, y_train, X_test, y_test
__ * Bitte beschreiben Sie unten nur eines von ① und ②. __ __
def train(X_train, y_train, X_test, y_test):
model = Sequential()
#X ist(296, 64, 64, 3): X.shepe[1:]damit(64, 64, 3)
model.add(Conv2D(32, (3, 3), padding='same', input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.1))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.45))
model.add(Dense(3))
model.add(Activation('softmax'))
model.summary()
#Optimierungsalgorithmus RMSprop
opt = keras.optimizers.rmsprop(lr=0.00005, decay=1e-6)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
return model
Visualisieren Sie das erstellte Modell
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64, 64, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 64, 64, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 64, 64, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 32, 32, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (None, 32, 32, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (None, 32, 32, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 16, 16, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (None, 16, 16, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (None, 16, 16, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (None, 16, 16, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 8, 8, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (None, 8, 8, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (None, 8, 8, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (None, 8, 8, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 4, 4, 512) 0
_________________________________________________________________
block5_conv1 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
block5_conv2 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
block5_conv3 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 2, 2, 512) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 2048) 0
_________________________________________________________________
dense_1 (Dense) (None, 256) 524544
_________________________________________________________________
dropout_1 (Dropout) (None, 256) 0
_________________________________________________________________
dense_2 (Dense) (None, 3) 771
=================================================================
def train(X, y, X_test, y_test):
input_tensor = Input(shape=(64, 64, 3))
vgg16 = VGG16(include_top=False, weights='imagenet', input_tensor=input_tensor)
#Ich erstelle ein Modell des Merkmalsmengenextraktionsteils
top_model = vgg16.output
top_model = Flatten(input_shape=vgg16.output_shape[1:])(top_model)
top_model = Dense(256, activation='sigmoid')(top_model)
top_model = Dropout(0.5)(top_model)
top_model = Dense(3, activation='softmax')(top_model)
#vgg16 und top_Bitte verketten Sie Modelle
model = Model(inputs=vgg16.input, outputs=top_model)
#Vervollständigen Sie die folgenden Anweisungen und fixieren Sie die Gewichte bis zur 15. Schicht
for layer in model.layers[:15]:
layer.trainable = False
#Überprüfen Sie vor dem Training die Modellstruktur
model.summary()
model.compile(loss='categorical_crossentropy',
optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
metrics=['accuracy'])
return model
Visualisieren Sie das erstellte Modell
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 64, 64, 3) 0
_________________________________________________________________
block1_conv1 (Conv2D) (None, 64, 64, 64) 1792
_________________________________________________________________
block1_conv2 (Conv2D) (None, 64, 64, 64) 36928
_________________________________________________________________
block1_pool (MaxPooling2D) (None, 32, 32, 64) 0
_________________________________________________________________
block2_conv1 (Conv2D) (None, 32, 32, 128) 73856
_________________________________________________________________
block2_conv2 (Conv2D) (None, 32, 32, 128) 147584
_________________________________________________________________
block2_pool (MaxPooling2D) (None, 16, 16, 128) 0
_________________________________________________________________
block3_conv1 (Conv2D) (None, 16, 16, 256) 295168
_________________________________________________________________
block3_conv2 (Conv2D) (None, 16, 16, 256) 590080
_________________________________________________________________
block3_conv3 (Conv2D) (None, 16, 16, 256) 590080
_________________________________________________________________
block3_pool (MaxPooling2D) (None, 8, 8, 256) 0
_________________________________________________________________
block4_conv1 (Conv2D) (None, 8, 8, 512) 1180160
_________________________________________________________________
block4_conv2 (Conv2D) (None, 8, 8, 512) 2359808
_________________________________________________________________
block4_conv3 (Conv2D) (None, 8, 8, 512) 2359808
_________________________________________________________________
block4_pool (MaxPooling2D) (None, 4, 4, 512) 0
_________________________________________________________________
block5_conv1 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
block5_conv2 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
block5_conv3 (Conv2D) (None, 4, 4, 512) 2359808
_________________________________________________________________
block5_pool (MaxPooling2D) (None, 2, 2, 512) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 2048) 0
_________________________________________________________________
dense_1 (Dense) (None, 256) 524544
_________________________________________________________________
dropout_1 (Dropout) (None, 256) 0
_________________________________________________________________
dense_2 (Dense) (None, 6) 1542
=================================================================
def compare_TV(history):
#Parameter einstellen
#Richtige Antwortklassifizierungsrate für Trainingsdaten
acc = history.history['accuracy']
#Richtige Antwortrate der Klassifizierung für Validierungsdaten
val_acc = history.history['val_accuracy']
#Wert der Verlustfunktion für Trainingsdaten
loss = history.history['loss']
val_loss = history.history['val_loss']
#Verlustfunktionswert für Validierungsdaten
epochs = range(len(acc))
# 1)Richtiges Antwortraten-Diagramm
plt.plot(epochs, acc, 'bo' ,label = 'training acc')
plt.plot(epochs, val_acc, 'b' , label= 'validation acc')
plt.title('Training and Validation acc')
plt.legend()
plt.figure()
# 2)Verlustfunktionsdiagramm
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()
def main():
#Daten lesen
X_train, y_train, X_test, y_test = load_data()
#Modelllernen
model = train(X_train, y_train, X_test, y_test)
history = model.fit(X_train, y_train, batch_size=32, epochs=70, verbose=1, validation_data=(X_test, y_test))
#Bewertung und Anzeige des Generalisierungssystems
score = model.evaluate(X_test, y_test, batch_size=32, verbose=0)
print('validation loss:{0[0]}\nvalidation accuracy:{0[1]}'.format(score))
compare_TV(history)
model.save('./golfer.h5')
Schreiben Sie abschließend die Funktion main () und führen Sie sie aus.
#Dies trainiert das Modell und erzeugt ein trainiertes Modell
main()
Überprüfen Sie die Genauigkeitsrate und die Verlustfunktion des Lernergebnisses in der Grafik
__ Richtige Antwortrate: 0,93__
__ Richtige Antwortrate: 0,95__
Da das Transferlernen etwas besser war, werden wir das Transferlernmodell übernehmen.
Das Modell wurde erstellt. Nächstes Mal werde ich eine Bewerbung schreiben und auf Heroku veröffentlichen.
Ich habe versucht, Nogizaka46 durch maschinelles Lernen zu klassifizieren