ابتدا کتابخانه های مورد نیاز را فراخوانی میکنیم:
import cv2
import numpy as np
import pandas as pd
import glob
import os
import re
from tqdm import tqdm
import matplotlib as mpl
import matplotlib.pyplot as plt
با دستور زیر فولدری که تصاویرtrain در آن قرار دارند را یه یک متغیر نسبت میدهیم:
CHESS_BOARD_DIR = glob.glob('train/*.*')
CHESS_BOARD = []
تابع زیر نام یک فایل تصویری را میگیرد و باتوجه به کد fen آنها را تفکیک میکند.
def normalizeBoardName(boardName):
mine_code=[]
longName=boardName.split('-')
for word in longName:
for letter in word:
if letter.isnumeric():
for i in range(int(letter)):
mine_code.append(str(0))
else:
mine_code.append(letter)
return mine_code
ما با یک الگوریتم هر خانه از صفحه شطرنج را جدا کرده و آن را در یک فایل csv ذخیره کرده ایم:
df = pd.DataFrame()
points=[5,19, 20,34, 35,49, 50,64, 64,78, 79,93, 94,108, 109,123]
my_counter=0
for idx, path in enumerate(CHESS_BOARD_DIR):
my_counter_local=0
if idx==1000:
break
image = cv2.imread(path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
CHESS_BOARD = [path[6:-4], image]
PEACE_CODES=normalizeBoardName(CHESS_BOARD[0])
#--------------------------------------------
for j in range(0,len(points) , 2):# columns
for i in range (0,len(points) , 2):# rows
for board in CHESS_BOARD:
img_small = CHESS_BOARD[1]
img_small=img_small[points[j]:points[j+1],points[i]:points[i+1]] #first col , then row
# cv2.imshow('s', img_small)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# print(type(img_small))
img_small = img_small.reshape(14*14)
img_small=np.append(img_small,PEACE_CODES[my_counter_local])
df[my_counter]=img_small
my_counter+=1
my_counter_local+=1
# df=df.T
# df_1=df[df[196]!='0']
# df_1.shape
# df_1.head()
# df_1.to_csv('all_images.csv', sep=',')
حال با کد زیر آن را فراخوانی میکنیم:
df_1=pd.read_csv('all_images.csv')
df_1= df_1.drop('Unnamed: 0',axis=1)
هر ردیف از csv فراخوانی شده یک تصویر را نشان میدهد.
با کد زیرتمام ستون ها به جز ستون آخر را در متغیر X میریزیم:
X = df_1.drop('196', axis=1)
ستون آخر را در متغیرY میریزیم:
y = df_1['196']
با دستور زیر مقادیر یکتایy را مشاهده میکنیم:
y.unique()
برای استفاده کردن از حروف در مدل ماشین لرنینگ با استفاده از label encoder آن را به کد تبدیل میکنیم:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
label = le.fit_transform(df_1['196'])
label
حال دیتای خود را به تست و train تقسیم میکنیم:
X_train, X_test, \
y_train, y_test =\
X[:14000], X[14000:], y[:14000], y[14000:]
حال از sgdclassifier استفاده کرده و مدل خود train میکنیم:
from sklearn.linear_model import SGDClassifier
sgd_clf = SGDClassifier(random_state=42)
sgd_clf.fit(X_train, y_train)
مدل ما آموزش دیده است و با کد زیر یک نمونه به آن میدهیم تا برای ما پیش بینی کند:
sgd_clf.predict(pd.DataFrame(X.loc[0]).T)