[PYTHON] Reconnaissance faciale des personnages d'anime avec Keras

introduction

J'ai fait référence à cet article Classifier les visages d'anime par apprentissage profond avec Keras J'ai pu créer un modèle d'apprentissage et vérifier le taux de réponse correct, mais ce que je voulais faire était de saisir l'image du personnage d'anime que j'ai choisi sur le net et de la déterminer, donc cet article inclut également cette partie. Je suis en train d'écrire.

base de données

L'ensemble de données utilisé pour l'apprentissage a été obtenu à partir de animeface-character-dataset. Décompressez le fichier compressé animeface-character-dataset et ne laissez que le pouce dans le dossier.

Prétraitement de l'ensemble de données

Les images sont redimensionnées à 32x32 en utilisant opencv, et la matrice de toutes les images (14490) est enregistrée dans un autre fichier en utilisant save () de numpy. Cela vous évite d'avoir à gérer des images à chaque fois et accélère un peu la vitesse d'exécution. Stockez l'étiquette correcte de l'image dans un autre fichier.

dataset_predisporsal.py


import os
import numpy as np
import cv2 as cv

data_dir_path = "./animeface-character-dataset/thumb/"
tmp = os.listdir(data_dir_path)
tmp=sorted([x for x in tmp if os.path.isdir(data_dir_path+x)])
dir_list = tmp

X_target=[]
for dir_name in dir_list:
    file_list = os.listdir(data_dir_path+dir_name)
    for file_name in file_list:
        if file_name.endswith('.png'):
            image_path=str(data_dir_path)+str(dir_name)+'/'+str(file_name)
            image = cv.imread(image_path)
            image = cv.resize(image, (32, 32))
            image = image.transpose(2,0,1)
            image = image/255.
            X_target.append(image)

anime_class=[]
count=0
for dir_name in dir_list:
    file_list = os.listdir(data_dir_path+dir_name)
    for file_name in file_list:
        if file_name.endswith('.png'):
            anime_class.append(count)
    count+=1

anime_arr2=np.array(anime_class)
np.save('anime_face_target.npy',anime_arr2)
anime_arr=np.array(X_target)
np.save('anime_face_data.npy',anime_arr)

Une matrice d'image (14490,3,28,28) dans anime_face_data.npy Libellé de réponse correct (14490,) pour anime_face_target.npy Est sauvé.

Construction de modèles et apprentissage avec Keras

Les deux fichiers npy créés lors du prétraitement sont lus et entraînés.

anime_face.py


import numpy as np
np.random.seed(20160715) #Valeur de départ fixe
from keras.layers.convolutional import Convolution2D
from keras.layers.core import Activation
from keras.layers.core import Dense
from keras.models import Sequential
from keras.callbacks import EarlyStopping
from keras.callbacks import LearningRateScheduler
from keras.optimizers import Adam
from keras.optimizers import SGD
import sklearn.cross_validation

X_test=np.load('anime_face_data.npy')
Y_target=np.load('anime_face_target.npy')

a_train, a_test, b_train, b_test = sklearn.cross_validation.train_test_split(X_test,Y_target)

model = Sequential()

model.add(Convolution2D(96, 3, 3, border_mode='same', input_shape=(3, 32, 32)))
model.add(Activation('relu'))

model.add(Convolution2D(128, 3, 3))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(203))
model.add(Activation('softmax'))

init_learning_rate = 1e-2
opt = SGD(lr=init_learning_rate, decay=0.0, momentum=0.9, nesterov=False)
model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=["acc"])
early_stopping = EarlyStopping(monitor='val_loss', patience=3, verbose=0, mode='auto')
lrs = LearningRateScheduler(0.01)

hist = model.fit(a_train,b_train, 
                batch_size=128, 
                nb_epoch=50, 
                validation_split=0.1, 
                verbose=1)

model_json_str = model.to_json()
open('anime_face_model.json', 'w').write(model_json_str)
model.save_weights('anime_face_model.h5')

score=model.evaluate(a_test, b_test, verbose=0)
print(score[1])

Le résultat a été un taux de réponse correcte d'environ 55%. Je ne parlerai pas de la façon d'augmenter le taux de précision cette fois.

model_json_str = model.to_json()
open('anime_face_model.json', 'w').write(model_json_str)
model.save_weights('anime_face_model.h5')

Cette partie est importante et enregistre le modèle de formation et les résultats de la formation respectivement dans anime_face_model.json et nime_face_model.h5. Vous pouvez désormais réutiliser le modèle d'entraînement et les résultats de l'entraînement. C'est un moment où vous l'exécutez. Maintenant, le sujet principal est.

Déterminez l'image originale à l'aide des résultats d'apprentissage

L'image originale utilisée cette fois est "Yagami Hayate" (yagami.png), qui est une fille lyrique magique.

yagami.png

load_anime_face.py


import numpy as np
from keras.models import model_from_json
from keras.utils import np_utils
from keras.optimizers import SGD
import sklearn.cross_validation
import cv2 as cv
np.random.seed(20160717)

X_test=np.load('anime_face_data.npy')
Y_target=np.load('anime_face_target.npy')

model = model_from_json(open('anime_face_model.json').read())
model.load_weights('anime_face_model.h5')
init_learning_rate = 1e-2
opt = SGD(lr=init_learning_rate, decay=0.0, momentum=0.9, nesterov=False)
model.compile(loss='sparse_categorical_crossentropy', optimizer=opt, metrics=["acc"])

image = cv.imread('yagami.png')
image = cv.resize(image, (32, 32))
image = image.transpose(2,0,1)
image = image/255.

image=image.reshape(1,3,32,32)

for i in range(202):
    sample_target=np.array([i])
    score = model.evaluate(image, sample_target, verbose=0)
    if score[1]==1.0:
        break
print(i)

Il était sorti comme 39. Ce numéro sera le premier numéro du nom de fichier dans le pouce.

スクリーンショット 2016-10-18 13.51.55.png

Par conséquent, le n ° 39 Yagami a pu répondre correctement à la question. Cependant, comme le taux de réponse correcte est de 55%, il est assez souvent incorrect.

en conclusion

J'ai écrit le code et le contenu de traitement sans aucune explication, mais maintenant je peux identifier le personnage en saisissant l'image originale. Même si vous ne regardez que le taux de réponse correct, vous ne le sentez pas vraiment, donc lorsque vous saisissez une seule image et récupérez le résultat, j'ai l'impression de l'avoir fait pour un débutant en apprentissage automatique. Si vous avez des questions ou si vous vous précipitez, je vous serais reconnaissant de bien vouloir commenter.

C'est facile, mais c'est tout.

Recommended Posts

Reconnaissance faciale des personnages d'anime avec Keras
Première reconnaissance faciale d'anime avec Chainer
Reconnaissance faciale avec Edison
Reconnaissance d'image avec keras
Reconnaissance faciale avec OpenCV de Python
Reconnaissance faciale par Amazon Rekognition
Reconnaissance faciale / coupe avec OpenCV
Essayez la reconnaissance faciale avec Python
Reconnaissance d'image avec Keras + OpenCV
Détection de visage d'anime avec OpenCV
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras
Essayez la reconnaissance faciale avec python + OpenCV
Prédiction de l'onde de péché avec keras
Reconnaissance faciale avec caméra avec opencv3 + python2.7
J'ai essayé la reconnaissance faciale avec OpenCV
4/22 prédiction de l'onde de péché avec keras
Garantie de reproductibilité avec les keras (à partir du 22 septembre 2020)
Introduction facile de la reconnaissance vocale avec Python
[python, openCV] base64 Reconnaissance faciale dans les images
API de reconnaissance faciale sans serveur conçue avec Python
Compter le nombre de caractères avec écho
J'ai essayé la reconnaissance manuscrite des caractères des runes avec scikit-learn
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
Comparaison des performances du détecteur de visage avec Python + OpenCV
[Python3] [Ubuntu16] [Docker] Essayez la reconnaissance faciale avec OpenFace
Maintenant, essayons la reconnaissance faciale avec Chainer (phase de prédiction)
Essai de reconnaissance faciale facile avec Jetson Nano et caméra Web
Classer les visages d'anime par suite / apprentissage profond avec Keras
Bilan du premier défi du machine learning avec Keras
Maintenant, essayons la reconnaissance faciale avec Chainer (phase d'apprentissage)
Segfo avec 0 caractères avec gcc
Résumé de Tensorflow / Keras
Tutoriel CIFAR-10 avec Keras
Segfo Python avec 33 caractères
LSTM multivarié avec Keras
Reconnaissance faciale en temps réel avec vidéo acquise par getUserMedia [HTML5, openCV]
Reconnaissance vocale des fichiers wav avec Google Cloud Speech API Beta