Ich habe auf diesen Artikel verwiesen Klassifizieren von Anime-Gesichtern durch tiefes Lernen mit Keras Ich konnte ein Lernmodell erstellen und die richtige Antwortrate überprüfen, aber ich wollte das Bild des im Netz aufgenommenen Anime-Charakters als Eingabe verwenden, um es zu bestimmen, sodass dieser Artikel auch diesen Bereich enthält. Ich schreibe gerade.
Der zum Lernen verwendete Datensatz wurde aus Animeface-Character-Dataset erhalten. Entpacken Sie die komprimierte Datei Animeface-Character-Dataset und lassen Sie nur den Daumen im Ordner.
Die Größe von Bildern wird mit opencv auf 32 x 32 geändert, und die Matrix aller Bilder (14490) wird mit save () von numpy in einer anderen Datei gespeichert. Dies erspart Ihnen jedes Mal die Bearbeitung von Bildern und beschleunigt die Ausführung etwas. Speichern Sie die korrekte Beschriftung des Bildes in einer anderen Datei.
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)
Bildmatrix (14490,3,28,28) in anime_face_data.npy Korrigieren Sie das Antwortetikett (14490,) für anime_face_target.npy Ist gespeichert.
Die zwei in der Vorverarbeitung erstellten npy-Dateien werden gelesen und trainiert.
anime_face.py
import numpy as np
np.random.seed(20160715) #Fester Startwert
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])
Das Ergebnis war eine korrekte Rücklaufquote von ca. 55%. Ich werde diesmal nicht darauf eingehen, wie die Genauigkeitsrate erhöht werden kann.
model_json_str = model.to_json()
open('anime_face_model.json', 'w').write(model_json_str)
model.save_weights('anime_face_model.h5')
Dieser Teil ist wichtig und speichert das Trainingsmodell und die Trainingsergebnisse in anime_face_model.json bzw. nime_face_model.h5. Sie können jetzt das Trainingsmodell und die Trainingsergebnisse wiederverwenden. Es ist ein Moment, in dem Sie es ausführen. Jetzt ist das Hauptthema.
Das Originalbild, das diesmal verwendet wird, ist "Yagami Hayate" (yagami.png), ein magisches Mädchen, das lyrisch ist.
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)
Es wurde als 39 ausgegeben. Diese Nummer ist die erste Nummer im Dateinamen in Daumen.
Daher konnte Nr. 39 Yagami die Frage richtig beantworten. Da die richtige Antwortrate jedoch 55% beträgt, ist sie häufig falsch.
Ich habe den Code geschrieben und den Inhalt ohne Erklärung verarbeitet, aber jetzt kann ich das Zeichen durch Eingabe des Originalbilds identifizieren. Selbst wenn Sie nur die richtige Antwortrate betrachten, spüren Sie sie nicht wirklich. Wenn Sie also ein einzelnes Bild eingeben und das Ergebnis zurückerhalten, habe ich das Gefühl, dass ich es für einen Anfänger im maschinellen Lernen getan habe. Wenn Sie Fragen oder Eile haben, wäre ich Ihnen dankbar, wenn Sie einen Kommentar abgeben könnten.
Es ist einfach, aber das war's.
Recommended Posts