[PYTHON] Ich habe versucht, die Shogi-Spieler Takami 7th Dan und Masuda 6th Dan von CNN zu klassifizieren [Für CNN-Anfänger]

Was ich in diesem Artikel gemacht habe

Einführung

Kennst du plötzlich Takami 7th Dan und Masuda 6th Dan, die in der Shogi-Welt ähnlich sein sollen? (Oben ist Takami 7. Dan, unten ist Masuda 6. Dan) 高見七段 images (9).jfif Ich habe das Gefühl, dass es viele ähnliche Elemente wie lange Augen und eine schwarz umrandete Brille gibt. Tatsächlich mag ich auch Shogi, aber vor ein paar Jahren war ich wirklich verwirrt.

** Ich habe CNN bei Keras gelernt und versucht, diese beiden Personen zu klassifizieren. ** ** **

Implementierungsübersicht

Die Liste der verwendeten Bibliotheken lautet wie folgt. Die Implementierung erfolgt durch 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

Schneiden Sie das Gesicht aus

Zunächst habe ich das Bild über die Google Bildsuche heruntergeladen. ** Für jede Person wurden ungefähr 40 Blätter gesammelt. ** ** ** Die Anzahl der Fotos ist klein, aber die Anzahl der Fotos ist nicht so groß und dies war die Grenze ...

Als nächstes schneiden Sie ** nur den Gesichtsteil ** aus dem heruntergeladenen Bild aus. Das für die Gesichtserkennung erforderliche trainierte Modell kann wie folgt heruntergeladen werden. https://github.com/opencv/opencv/tree/master/data/haarcascades Ich habe auf die folgende Seite verwiesen, um zu erfahren, wie man es benutzt.

python


#Download von github
HAAR_FILE = "haarcascade_frontalface_alt2.xml"
cascade = cv2.CascadeClassifier(HAAR_FILE)

m_list = os.listdir("masuda_orig")

#Masuda 6-Dan Gesichtsschnitt
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)

Speichern Sie die erhaltenen Daten, indem Sie nur das Gesichtsbild aus den Dateien im Ordner "masuda_orig" in den Ordner "masuda_tmp" schneiden. Dies wurde auch für Takami 7th Dan gemacht. Als Beispiel ist das Bild von Takami 7-dan oben wie folgt ausgeschnitten. takami_40_1.jpg

Erstellung von Trainingsdaten und Testdaten

** Schließen Sie als Nächstes aus dem Bild, in dem der Gesichtsteil zugeschnitten ist, das Bild aus, das versehentlich manuell zugeschnitten wurde, oder das Bild einer anderen Person im Bild. ** ** ** Dieser Teil wurde manuell durchgeführt.

Die auf diese Weise erhaltenen Bilder werden in Trainingsdaten und Testdaten klassifiziert.

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

Erstellen eines Lernmodells und Durchführen von Schulungen

Das Trainingsmodell wird nach dem Durchlaufen des CNN durch die vollständig verbundene Schicht binärisiert. Das Modell bezog sich auf die folgende Site.

--Erstellen Sie eine KI, mit der Sie Ayataka mit Bilderkennung auswählen können: https://qiita.com/tomo_20180402/items/e8c55bdca648f4877188

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

Klassifizierungsergebnis nach dem Lernen

** Überprüfen Sie die Genauigkeit des Modells nach dem Training und die Richtigkeit der Testergebnisse und bestätigen Sie, welche Daten falsch klassifiziert wurden. ** ** **

python


#Modelllernen
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


#Zeigen Sie Bilder mit falscher Modellklassifizierung an
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 7. Dan und Masuda 6. Dan

Aufgrund der Ausführung mit einer Anzahl von Epochen von 20 ist die richtige Antwortrate Die Ergebnisse waren ** Trainingsdaten 90% und Testdaten 67% **. ** 40 Trainingsdaten und 19 Testdaten **. Sie können die Tendenz erkennen, die Trainingsdaten zu überfordern. Darüber hinaus scheinen 67% der Ergebnisse der binären Klassifizierung niedrig zu sein. Die Bilder, die falsch klassifiziert sind, werden unten gezeigt. Die beiden links scheinen sicherlich schwer zu klassifizieren.

ダウンロード (3).png

Takami 7. Dan und Fujii 2. Krone

Da Takami 7. Dan und Masuda 6. Dan ähnlich sind, um die Möglichkeit zu überprüfen, dass das Lernergebnis niedrig war Ich habe auch versucht, "Takami 7th Dan und Fujii 2nd Crown" zu klassifizieren. ** 40 Trainingsdaten und 19 Testdaten **.

** Das Ergebnis sind 92% Trainingsdaten und 88% Testdaten. ** ** ** Die Genauigkeit ist etwas höher als die Klassifizierung mit Masuda 6th Dan. Immerhin ist es schwierig, Takami 7th Dan und Masuda 6th Dan zu klassifizieren ...? Die Bilder mit der falschen Klassifizierung sind unten. Es gibt keine besonderen Merkmale ... ダウンロード (2).png

Takami 7. Dan und Garuri sind Slowenen

Als eine andere Person habe ich auch versucht, es als den ehemaligen Schachweltmeister Garrigasparov zu klassifizieren. images (19).jfif Die Trainingsdaten und Testdaten sind 48 und 21.

Das Ergebnis sind 100% Trainingsdaten und 100% Testdaten. 100% ist etwas verdächtig, aber genauer als die Klassifizierung mit Masuda Rokudan und Fujii Nikan.

Zusammenfassung

Die Klassifizierungsergebnisse sind wie folgt. ** - "Takami 7. Dan und Masuda 6. Dan": 67%

** Es scheint, dass diese beiden aus Sicht der Maschine ähnlich sind **. Diesmal bestand das Problem jedoch darin, dass die Trainingsdaten mit etwa 40 Blatt sehr klein waren. Infolgedessen sind die erhaltenen Ergebnisse auch ungenau und variieren je nachdem, welche Testdaten verwendet werden. Je mehr Daten Sie haben, desto genauer ist es wahrscheinlich.

Code verwendet

Klicken Sie hier für den tatsächlich verwendeten Code. https://colab.research.google.com/drive/14Dg2-uQWSf4NT2OnxTWGVSEDST3O68d8?usp=sharing

Recommended Posts

Ich habe versucht, die Shogi-Spieler Takami 7th Dan und Masuda 6th Dan von CNN zu klassifizieren [Für CNN-Anfänger]
Ich habe versucht, Drachenkugeln nach Adalin zu klassifizieren
Ich habe versucht, Hanana Oba und Emiri Otani durch tiefes Lernen zu klassifizieren (Teil 2)
Ich habe versucht, MNIST nach GNN zu klassifizieren (mit PyTorch-Geometrie).
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht, Spieler- und Fertigkeitsnamen aus Sportartikeln zu extrahieren
TensorFlow Tutorial Ich habe CNN 4th ausprobiert
Ich habe versucht, das Bild durch Klicken mit der rechten und linken Maustaste in den angegebenen Ordner zu verschieben
765 Ich habe versucht, die drei Berufsfamilien durch CNN zu identifizieren (mit Chainer 2.0.0).
Ich habe versucht, die Anzahl der Mnisten durch unbeaufsichtigtes Lernen zu klassifizieren [PCA, t-SNE, k-means]
Ich habe versucht, Text mit TensorFlow zu klassifizieren
Einführung in die KI-Erstellung mit Python! Teil 3 Ich habe versucht, Bilder mit einem Convolutional Neural Network (CNN) zu klassifizieren und vorherzusagen.
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 5/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 7/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 4/22]
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 1/22]
Ich habe versucht, die Veränderung der Schneemenge für 2 Jahre durch maschinelles Lernen vorherzusagen
Ich habe versucht, das Bild zu verarbeiten und zu transformieren und die Daten für maschinelles Lernen zu erweitern
Ich habe versucht, den G-Test und die E-Qualifikation durch Training ab 50 zu bestehen
[Python] Ich habe versucht, 100 frühere Fragen zu lösen, die Anfänger und Fortgeschrittene lösen sollten [Teil 6/22]
Ich habe versucht, die Blasensortierung nach Sprache zu programmieren
Eine Einführung in die objektorientierte Programmierung für Anfänger von Anfängern
Ich habe DCGAN implementiert und versucht, Äpfel zu generieren
Ich habe versucht, durch Schaben ein Bild zu bekommen
[Einführung in PID] Ich habe versucht, ♬ zu steuern und zu spielen
Ich habe versucht, Mr. Hanyu und Mr. Hanyu mit dem Verarbeiter der Verarbeitung natürlicher Sprache × Naive Bayes zu klassifizieren
[Serie für vielbeschäftigte Personen] Ich habe versucht, mit einer Syntaxanalyse zusammenzufassen, um Nachrichten in 30 Sekunden aufzurufen
[Für Anfänger von Wettkampfprofis] Ich habe versucht, 40 AOJ "ITP I" -Fragen mit Python zu lösen