[PYTHON] J'ai essayé de classer les joueurs de Shogi Takami 7e Dan et Masuda 6e Dan par CNN [Pour les débutants CNN]

Ce que j'ai fait dans cet article

introduction

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) 高見七段 images (9).jfif 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. ** **

Aperçu de la mise en œuvre

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

Découpez le visage

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. takami_40_1.jpg

Création de données d'entraînement et de données de test

** 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

Créer un modèle d'apprentissage et exécuter une formation

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()

Résultat de la classification après l'apprentissage

** 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,...])

Takami 7e Dan et Masuda 6e Dan

À 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.

ダウンロード (3).png

Takami 7th Dan et Fujii 2nd Crown

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 ... ダウンロード (2).png

Takami 7th Dan et Garuri sont slov

En tant que personne différente, j'ai également essayé de le classer comme l'ancien champion du monde d'échecs Garrigasparov. images (19).jfif 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.

Résumé

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.

Code utilisé

Cliquez ici pour le code réellement utilisé. https://colab.research.google.com/drive/14Dg2-uQWSf4NT2OnxTWGVSEDST3O68d8?usp=sharing

Recommended Posts

J'ai essayé de classer les joueurs de Shogi Takami 7e Dan et Masuda 6e Dan par CNN [Pour les débutants CNN]
J'ai essayé de classer les boules de dragon par adaline
J'ai essayé de classer Hanana Oba et Emiri Otani par apprentissage profond (partie 2)
J'ai essayé de classer MNIST par GNN (avec PyTorch géométrique)
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
J'ai essayé d'extraire des noms de joueurs et de compétences d'articles sportifs
Tutoriel TensorFlow J'ai essayé CNN 4th
J'ai essayé de déplacer l'image vers le dossier spécifié en faisant un clic droit et un clic gauche
765 J'ai essayé d'identifier les trois familles professionnelles par CNN (avec Chainer 2.0.0)
J'ai essayé de classer les nombres de mnist par apprentissage non supervisé [PCA, t-SNE, k-means]
J'ai essayé de classer le texte en utilisant TensorFlow
Introduction à la création d'IA avec Python! Partie 3 J'ai essayé de classer et de prédire les images avec un réseau de neurones convolutifs (CNN)
[Python] J'ai essayé de résoudre 100 questions passées que les débutants et les intermédiaires devraient résoudre [Partie 5/22]
[Python] J'ai essayé de résoudre 100 questions passées que les débutants et les intermédiaires devraient résoudre [Partie 7/22]
[Python] J'ai essayé de résoudre 100 questions passées que les débutants et les intermédiaires devraient résoudre [Partie 4/22]
[Python] J'ai essayé de résoudre 100 questions passées que les débutants et les intermédiaires devraient résoudre [Partie 1/22]
J'ai essayé de prédire l'évolution de la quantité de neige pendant 2 ans par apprentissage automatique
J'ai essayé de traiter et de transformer l'image et d'élargir les données pour l'apprentissage automatique
J'ai essayé de passer le test G et la qualification E en m'entraînant à partir de 50
[Python] J'ai essayé de résoudre 100 questions passées que les débutants et les intermédiaires devraient résoudre [Partie 6/22]
J'ai essayé de programmer la bulle de tri par langue
Une introduction à la programmation orientée objet pour les débutants par les débutants
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé d'obtenir une image en grattant
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
J'ai essayé de classer M. Hanyu et M. Hanyu avec le traitement du langage naturel × classificateur Naive Bayes
[Série pour les gens occupés] J'ai essayé de résumer avec une analyse de syntaxe pour appeler les actualités en 30 secondes
[Pour les professionnels de la compétition débutants] J'ai essayé de résoudre 40 questions AOJ "ITP I" avec python