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.
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.
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é.
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.
L'image originale utilisée cette fois est "Yagami Hayate" (yagami.png), qui est une fille lyrique magique.
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.
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.
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