[PYTHON] Ich habe versucht, eine Gesichtsdiagnose-KI für professionelle Golferinnen zu erstellen ②

1. Zuallererst

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.

2. Erstellen einer separaten Datei für Trainingsdaten und Testdaten

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

3. Modellerstellung und -bewertung

Erstellen Sie Ihr eigenes Modell und übertragen Sie das Lernmodell (vgg16)

3-1. Modul importieren

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

3-2. Funktion zum Lesen von Daten

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

3-3. Funktionen zum Trainieren des Modells

__ * Bitte beschreiben Sie unten nur eines von ① und ②. __ __

① Von Ihnen selbst erstelltes Modell
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       
=================================================================
② Lernen übertragen
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      
=================================================================

3-4. Grafikfunktion der korrekten Antwortrate und Verlustfunktion

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

3-5 Funktionen zum Lesen von Daten und zum Trainieren von Modellen

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

4. Lernergebnis

Überprüfen Sie die Genauigkeitsrate und die Verlustfunktion des Lernergebnisses in der Grafik

① Von Ihnen selbst erstelltes Modell

mymodel.png

__ Richtige Antwortrate: 0,93__

② Lernen übertragen

転移学習.png

__ 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.

Referenz

Ich habe versucht, Nogizaka46 durch maschinelles Lernen zu klassifizieren

Recommended Posts

Ich habe versucht, eine Gesichtsdiagnose-KI für professionelle Golferinnen zu erstellen ①
Ich habe versucht, eine Gesichtsdiagnose-KI für professionelle Golferinnen zu erstellen ②
Ich habe versucht, eine Gesichtsdiagnose-KI für professionelle Golferinnen zu erstellen ③
Ich habe versucht, KI für Smash Bra zu machen
Ich habe eine Web-API erstellt
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
[Python] Ich habe versucht, eine Shiritori-KI zu erstellen, die den Wortschatz durch Schlachten verbessert
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
Ich habe versucht, mit AI kreative Kunst zu machen! Ich habe eine Neuheit programmiert! (Artikel: Creative Adversarial Network)
Ich habe versucht, einen Bot für die Ankündigung eines Wiire-Ereignisses zu erstellen
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe mit PyQt einen einfachen Texteditor erstellt
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, ein System zu erstellen, das nur gelöschte Tweets abruft
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
[Python] Ich habe versucht, eine stabile Sortierung zu implementieren
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
Ich habe versucht, einen Linebot zu erstellen (Vorbereitung)
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
[Pyto] Ich habe versucht, ein Smartphone als Flick-Tastatur für den PC zu verwenden
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich überarbeitete "Ich habe versucht, Othello AI zu machen, als Programmieranfänger Python studierten"
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, eine Super-Resolution-Methode / ESPCN zu erstellen
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
KI-Anfänger versuchen, professionelle Studenten Bot zu machen
Ich möchte ein Spiel mit Python machen
[Patentanalyse] Ich habe versucht, mit Python eine Patentkarte zu erstellen, ohne Geld auszugeben
Ich habe versucht zu erklären, wozu der Python-Generator so einfach wie möglich ist.
Ich habe eine Burgsuch-API mit Elasticsearch + Sudachi + Go + Echo erstellt
Machen Sie weiterhin Aktienprognose AI für 10 Stunden pro Tag 1. Monat
Ich las "Wie man ein Hacking Lab macht"
Ich habe versucht, einen Übersetzungs-BOT zu erstellen, der mit Discord unter Verwendung von Googletrans funktioniert
Ich dachte, ich könnte einen netten Gitignore-Editor machen, also habe ich vorerst versucht, so etwas wie MVP zu machen
Ich habe versucht, eine zufällige Zeichenfolge zu generieren
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, ein Wörterbuch ohne Berücksichtigung der Groß- und Kleinschreibung zu erstellen
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, die Gesichtsverdeckungsarbeit des Koordinationsbildes für das Tragen zu automatisieren
Ich habe versucht, eine verdächtige Person mithilfe von Geolonia-Adressdaten schnell zu einem MAP zu machen
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen