[PYTHON] J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ②

1.Tout d'abord

À la dernière fois, nous avions collecté des images, acquis des parties du visage et des données gonflées, qui font partie du prétraitement des données.

Cette fois, j'ai en fait créé un modèle et vérifié la précision. ・ Modèle construit par moi-même ・ Apprentissage par transfert (VGG16) J'écrirai sur ces deux.

2. Création d'un fichier séparé pour les données d'entraînement et les données de test

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:le fichier image est tronqué pour éviter
ImageFile.LOAD_TRUNCATED_IMAGES = True

#Création de données d'entraînement
#Créez une liste vide pour chacun
img_shibuno = []
img_koiwai = []
img_hara = []
img_lists = [img_shibuno, img_koiwai, img_hara] 

#Obtenez le chemin sous le visage
in_dir = './face/*'
in_file = glob.glob(in_dir)

#Chaque dossier (player)Effectuer le traitement pour chaque
for num in range(len(in_file)):
    #Obtenez le chemin de chaque image dans le fichier du lecteur
    in_file_name = glob.glob(in_file[num]+'/*')
    #Traitez chaque image
    for i in range(len(in_file_name)):
        #Ouvrir l'image
        img = Image.open(in_file_name[i])
        img = img.convert("RGB")
        #Ajuster la taille
        img = img.resize((64,64))
        #Convertir en ndarray
        data = np.asarray(img)
        # img_Ajouter aux listes
        img_lists[num].append(data)

#Combinez des listes avec des images
X_train = np.array(img_shibuno+img_koiwai+img_hara)
#0 chacun~Entrez une valeur jusqu'à 2
y_train = np.array([0]*len(img_shibuno)  + [1]*len(img_koiwai) + [2]*len(img_hara))

#Créer des données de test
#Créez une liste vide pour chacun
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)):
    #Obtenez le chemin de chaque image dans le fichier du lecteur
    in_file_name = glob.glob(in_file[num]+'/*')
    #Traitez chaque image
    for i in range(len(in_file_name)):
        #Ouvrir l'image
        img = Image.open(in_file_name[i])
        img = img.convert("RGB")
        #Ajuster la taille
        img = img.resize((64,64))
        #Convertir en ndarray
        data = np.asarray(img)
        # img_Ajouter aux listes
        img_lists[num].append(data)

#Combinez des listes avec des images
X_test = np.array(img_shibuno+img_koiwai+img_hara)
#0 chacun~Entrez une valeur jusqu'à 2
y_test = np.array([0]*len(img_shibuno)  + [1]*len(img_koiwai) + [2]*len(img_hara))

# one-hot-Vecteur de processus
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

#Enregistrer les données de formation et de validation dans un fichier
xy = (X_train, X_test, y_train, y_test)
np.save('./golfer.npy', xy)

Ceci termine le prétraitement des données. Ensuite, évaluez le modèle

3. Création et évaluation de modèles

Créez votre propre modèle et le modèle d'apprentissage par transfert (vgg16) respectivement

3-1. Module d'importation

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. Fonction de lecture des données

def load_data():
    X_train, X_test, y_train, y_test = np.load('./golfer.npy', allow_pickle=True)
    #Définissez chaque valeur de pixel des données d'entrée sur 0-Normaliser dans la plage de 1
    X_train = X_train / 255
    X_test = X_test / 255
    return X_train, y_train, X_test, y_test

3-3. Fonctions pour entraîner le modèle

__ * Veuillez décrire un seul des ① et ② ci-dessous. __

① Modèle créé par vous-même
def train(X_train, y_train, X_test, y_test):
    model = Sequential()
    #X est(296, 64, 64, 3): X.shepe[1:]alors(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()

    #Algorithme d'optimisation RMSprop
    opt = keras.optimizers.rmsprop(lr=0.00005, decay=1e-6)

    model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
    return model

Visualisez le modèle créé

_________________________________________________________________
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       
=================================================================
② Apprentissage par transfert
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)

    #Je crée un modèle de la partie d'extraction de quantité de caractéristiques
    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 et top_Veuillez concaténer les modèles
    model = Model(inputs=vgg16.input, outputs=top_model)

    #Complétez les instructions suivantes et fixez les poids jusqu'à la 15e couche
    for layer in model.layers[:15]:
        layer.trainable = False

    #Vérifiez la structure du modèle avant l'entraînement
    model.summary()

    model.compile(loss='categorical_crossentropy',
                optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),
                metrics=['accuracy'])
    
    return model

Visualisez le modèle créé

_________________________________________________________________
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. Fonction graphique du taux de réponse correct et de la fonction de perte

def compare_TV(history):
    #Définir les paramètres
    #Taux de réponse correct de la classification pour les données d'entraînement
    acc = history.history['accuracy']
    #Taux de réponse correct de la classification pour les données de validation
    val_acc = history.history['val_accuracy']
    #Valeur de la fonction de perte pour les données d'entraînement
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    #Valeur de la fonction de perte pour les données de validation
    epochs = range(len(acc))

    # 1)Graphique du taux de réponse correct
    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)Graphique de la fonction de perte
    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. Fonctions qui lisent des données et forment des modèles

def main():
    #Lire les données
    X_train, y_train, X_test, y_test = load_data()
    #Apprentissage de modèle
    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))
    
    #Évaluation et affichage du système de généralisation
    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')

Enfin, écrivez la fonction main () et exécutez-la.

#Cela entraîne le modèle et génère un modèle entraîné
main()

4. Résultat d'apprentissage

Vérifiez le taux de précision et la fonction de perte du résultat d'apprentissage sur le graphique

① Modèle créé par vous-même

mymodel.png

__ Taux de réponse correcte: 0,93__

② Apprentissage par transfert

転移学習.png

__ Taux de réponse correcte: 0,95__

Comme l'apprentissage par transfert était légèrement meilleur, nous adopterons le modèle d'apprentissage par transfert.

Le modèle a été créé. La prochaine fois, j'écrirai une application et la publierai sur heroku.

référence

J'ai essayé de classer Nogizaka46 par apprentissage automatique

Recommended Posts

J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ①
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ②
J'ai essayé de faire un diagnostic de visage AI pour les golfeuses professionnelles ③
J'ai essayé de faire de l'IA pour Smash Bra
J'ai créé une API Web
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai créé un jeu ○ ✕ avec TensorFlow
[Python] J'ai essayé de créer une IA Shiritori qui améliore le vocabulaire grâce aux batailles
J'ai essayé de faire un "putain de gros convertisseur de littérature"
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
J'ai essayé de faire de l'art créatif avec l'IA! J'ai programmé une nouveauté! (Article: Réseau Adversaire Créatif)
J'ai essayé de créer un bot pour annoncer un événement Wiire
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai créé un éditeur de texte simple en utilisant PyQt
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer un système qui ne récupère que les tweets supprimés
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
[Python] J'ai essayé d'implémenter un tri stable, alors notez
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé de créer un linebot (implémentation)
J'ai essayé de créer un linebot (préparation)
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
[Pyto] J'ai essayé d'utiliser un smartphone comme clavier pour PC
J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
J'ai refactoré "J'ai essayé de faire d'Othello AI lorsque les débutants en programmation ont étudié python"
Je veux faire de matplotlib un thème sombre
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé de créer une méthode de super résolution / ESPCN
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai essayé de créer une méthode de super résolution / SRCNN ①
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
Quand j'ai essayé de créer un VPC avec AWS CDK mais que je n'ai pas pu le faire
Les débutants en IA essaient de faire des étudiants professionnels Bot
Je veux faire un jeu avec Python
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
J'ai essayé d'expliquer à quoi sert le générateur Python aussi facilement que possible.
J'ai créé une API de recherche de château avec Elasticsearch + Sudachi + Go + echo
Continuer à faire des prévisions de stock AI pendant 10 heures par jour le 1er mois
J'ai lu "Comment créer un laboratoire de piratage"
J'ai essayé de créer un BOT de traduction qui fonctionne avec Discord en utilisant googletrans
Je pensais que je pouvais créer un bon éditeur gitignore, alors j'ai essayé de faire quelque chose comme MVP pour le moment
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai essayé de créer une méthode de super résolution / SRCNN ③
J'ai essayé de créer une fonction de dictionnaire insensible à la casse
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
J'ai essayé de créer une méthode de super résolution / SRCNN ②
J'ai essayé d'automatiser le travail de masquage du visage de l'image de coordination pour l'usure
J'ai essayé de faire MAP rapidement une personne suspecte en utilisant les données d'adresse Geolonia
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow