Soudain, connaissez-vous Takami 7e Dan et Masuda 6e Dan, qui seraient similaires dans le monde du shogi? (Supérieur est Takami 7ème dan, inférieur est Masuda 6ème dan) Je pense qu'il existe de nombreux éléments similaires tels que des yeux longs et des lunettes à monture noire. En fait, j'aime aussi le shogi, mais il y a quelques années j'étais vraiment confus.
** J'ai appris CNN à Keras, alors j'ai essayé de classer ces deux personnes. ** **
La liste des bibliothèques utilisées est la suivante. La mise en œuvre est effectuée par google colab.
python
import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import random
import pandas as pd
from PIL import Image
from sklearn.model_selection import train_test_split
from google.colab.patches import cv2_imshow
Tout d'abord, j'ai téléchargé l'image par recherche d'images google. ** Environ 40 feuilles ont été rassemblées pour chaque personne. ** ** Le nombre de photos est petit, mais le nombre de photos n'est pas si grand et c'était la limite ...
Ensuite, découpez ** uniquement la partie du visage ** de l'image téléchargée. Le modèle entraîné requis pour la détection de visage peut être téléchargé à partir de ce qui suit. https://github.com/opencv/opencv/tree/master/data/haarcascades Je me suis référé au site suivant pour savoir comment l'utiliser.
python
#Télécharger depuis github
HAAR_FILE = "haarcascade_frontalface_alt2.xml"
cascade = cv2.CascadeClassifier(HAAR_FILE)
m_list = os.listdir("masuda_orig")
#Coupe du visage Masuda 6-dan
for m_num,m in enumerate(m_list):
image = cv2.imread("masuda_orig/" + m)
face_list = cascade.detectMultiScale(image, minSize=(10, 10))
for i, (x, y, w, h) in enumerate(face_list):
trim = image[y: y+h, x:x+w]
trim = cv2.resize(trim,(size_im,size_im))
cv2.imwrite(DATA_DIR + 'masuda_tmp/masuda'+str(m_num) +"_" + str(i+1) + '.jpg', trim)
Sauvegardez les données obtenues en découpant uniquement l'image du visage des fichiers du dossier "masuda_orig" dans le dossier "masuda_tmp". Cela a également été fait pour Takami 7th Dan. A titre d'exemple, l'image de Takami 7-dan ci-dessus est découpée comme suit.
** Ensuite, à partir de l'image où la partie du visage est recadrée, excluez l'image qui a été accidentellement recadrée manuellement ou l'image d'une autre personne sur l'image. ** ** Cette partie a été réalisée manuellement.
Les images ainsi obtenues sont classées en données d'apprentissage et données de test.
python
m_list = os.listdir("masuda")
t_list = os.listdir("takami")
X = []
y = []
for m in m_list:
image = Image.open("masuda/" + m)
image = image.convert("RGB")
image = np.asarray(image)
X.append(image)
y.append([1])
for t in t_list:
image = Image.open("takami/" + t)
image = image.convert("RGB")
image = np.asarray(image)
X.append(image)
y.append([0])
X=np.asarray(X)
y=np.asarray(y)
X_train,X_test, y_train,y_test = train_test_split(X,y,shuffle=True,test_size=0.3)
print(X_train.shape,X_test.shape, y_train.shape, y_test.shape)
X_train = X_train.astype("float") / 255
X_test = X_test.astype("float") / 255
Le modèle d'apprentissage est binarisé à travers la couche entièrement connectée après avoir traversé le CNN. Le modèle renvoyé au site suivant.
python
from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPool2D
from keras.optimizers import Adam
from keras.layers import Dense, Dropout, Activation, Flatten
model = Sequential()
model.add(Conv2D(32,(3,3),activation="relu",input_shape=(size_im,size_im,3)))
model.add(MaxPool2D((2,2)))
model.add(Dropout(0.1))
model.add(Conv2D(64,(3,3),activation="relu"))
model.add(MaxPool2D((2,2)))
model.add(Dropout(0.1))
model.add(Conv2D(128,(3,3),activation="relu"))
model.add(MaxPool2D((2,2)))
model.add(Dropout(0.1))
model.add(Conv2D(128,(3,3),activation="relu"))
model.add(MaxPool2D((2,2)))
model.add(Dropout(0.1))
model.add(Flatten())
model.add(Dense(512,activation="relu"))
model.add(Dense(1,activation="sigmoid"))
model.summary()
** Vérifiez l'exactitude du modèle après l'entraînement et l'exactitude des résultats du test, et confirmez quelles données ont été mal classées. ** **
python
#Apprentissage de modèle
optim=Adam()
model.compile(loss="binary_crossentropy",
optimizer=optim,
metrics="acc")
model.fit(X_train,y_train,
epochs=20,
batch_size=2,
validation_data=(X_test,y_test))
python
#Afficher des images avec une classification de modèle incorrecte
df = pd.DataFrame()
df["pred"] = model.predict(X_test).flatten()
df["test"] = y_test.flatten()
df["pred"] = df["pred"].apply(lambda x: 0 if x < 0.5 else 1)
df["acc"] = df["pred"] == df["test"]
fig, ax = plt.subplots(1,len(mistake_list),figsize=(20,5))
mistake_list = df[df["acc"] == 0].index
for i,test_i in enumerate(mistake_list):
ax[i].imshow(X_test[i,...])
À la suite de l'exécution avec le nombre d'époques fixé à 20, le taux de réponse correct est Les résultats étaient ** données d'entraînement 90% et données d'essai 67% **. ** 40 données d'entraînement et 19 données de test **. Vous pouvez voir la tendance à ** surentraîner les données d'entraînement **. De plus, 67% des résultats de la classification binaire semblent faibles. Les images mal classées sont présentées ci-dessous. Les deux à gauche semblent certainement difficiles à classer.
Puisque Takami 7e Dan et Masuda 6e Dan sont similaires, afin de vérifier la possibilité que le résultat d'apprentissage soit faible J'ai aussi essayé de classer "Takami 7th Dan et Fujii 2nd Crown". ** 40 données d'entraînement et 19 données de test **.
** Le résultat est 92% de données d'entraînement et 88% de données de test. ** ** La précision est légèrement supérieure au classement avec Masuda 6e Dan. Après tout, il est difficile de classer Takami 7e Dan et Masuda 6e Dan ...? Les images avec la mauvaise classification sont ci-dessous. Il n'y a pas de particularités ...
En tant que personne différente, j'ai également essayé de le classer comme l'ancien champion du monde d'échecs Garrigasparov. Les données d'entraînement et les données de test sont 48 et 21.
Le résultat est 100% de données d'entraînement et 100% de données de test. 100% est un peu suspect, mais c'est plus précis que le classement avec Masuda 6th Dan et Fujii Nikan.
Les résultats de la classification sont les suivants. ** - «Takami 7e Dan et Masuda 6e Dan»: 67%
** Il semble que ces deux éléments soient similaires du point de vue de la machine **. Cependant, cette fois, le problème était que les données de formation étaient très petites, environ 40 feuilles. En conséquence, les résultats obtenus sont également inexacts et varieront en fonction des données de test utilisées. Plus vous disposez de données, plus elles sont susceptibles d'être précises.
Cliquez ici pour le code réellement utilisé. https://colab.research.google.com/drive/14Dg2-uQWSf4NT2OnxTWGVSEDST3O68d8?usp=sharing
Recommended Posts