تشخیص مهره شطرنج

ابتدا کتابخانه های مورد نیاز را فراخوانی میکنیم:

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)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.