[PYTHON] Gesichtserkennung von Anime-Charakteren mit Keras

Einführung

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.

Datensatz

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.

Datensatzvorverarbeitung

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.

Modellbau und Lernen mit Keras

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.

Bestimmen Sie das Originalbild anhand der Lernergebnisse

Das Originalbild, das diesmal verwendet wird, ist "Yagami Hayate" (yagami.png), ein magisches Mädchen, das lyrisch ist.

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)

Es wurde als 39 ausgegeben. Diese Nummer ist die erste Nummer im Dateinamen in Daumen.

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

Daher konnte Nr. 39 Yagami die Frage richtig beantworten. Da die richtige Antwortrate jedoch 55% beträgt, ist sie häufig falsch.

abschließend

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

Gesichtserkennung von Anime-Charakteren mit Keras
Erste Anime-Gesichtserkennung mit Chainer
Gesichtserkennung mit Edison
Bilderkennung mit Keras
Gesichtserkennung mit OpenCV von Python
Gesichtserkennung durch Amazon Rekognition
Gesichtserkennung / Schneiden mit OpenCV
Versuchen Sie die Gesichtserkennung mit Python
Bilderkennung mit Keras + OpenCV
Anime-Gesichtserkennung mit OpenCV
Ich habe versucht, das Lachproblem mit Keras zu erkennen.
Ich habe versucht, die handschriftliche Zeichenerkennung von Runenzeichen mit CNN mithilfe von Keras zu erkennen
Versuchen Sie die Gesichtserkennung mit Python + OpenCV
Vorhersage der Sinuswelle mit Keras
Gesichtserkennung mit Kamera mit opencv3 + python2.7
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
4/22 Vorhersage der Sinuswelle mit Keras
Garantie der Reproduzierbarkeit mit Keras (Stand 22. September 2020)
Einfache Einführung der Spracherkennung mit Python
[python, openCV] base64 Gesichtserkennung in Bildern
Serverlose Gesichtserkennungs-API mit Python
Zählen Sie die Anzahl der Zeichen mit Echo
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Leistungsvergleich des Gesichtsdetektors mit Python + OpenCV
[Python3] [Ubuntu16] [Docker] Versuchen Sie die Gesichtserkennung mit OpenFace
Versuchen wir nun die Gesichtserkennung mit Chainer (Vorhersagephase).
Einfacher Gesichtserkennungsversuch mit Jetson Nano und Webkamera
Klassifizieren Sie Anime-Gesichter durch Fortsetzung / Deep Learning mit Keras
Aufzeichnung der ersten Herausforderung des maschinellen Lernens mit Keras
Versuchen wir nun die Gesichtserkennung mit Chainer (Lernphase)
Segfo mit 0 Zeichen mit gcc
Tensorflow / Keras-Zusammenfassung
CIFAR-10-Tutorial mit Keras
Segfo Python mit 33 Zeichen
Multivariates LSTM mit Keras
Gesichtserkennung in Echtzeit mit von getUserMedia [HTML5, openCV] aufgenommenem Video
Spracherkennung von WAV-Dateien mit der Google Cloud Speech API Beta