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) 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. ** ** **
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
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.
** 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
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()
** Ü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,...])
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.
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 ...
Als eine andere Person habe ich auch versucht, es als den ehemaligen Schachweltmeister Garrigasparov zu klassifizieren. 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.
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.
Klicken Sie hier für den tatsächlich verwendeten Code. https://colab.research.google.com/drive/14Dg2-uQWSf4NT2OnxTWGVSEDST3O68d8?usp=sharing
Recommended Posts