Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 16 additions & 13 deletions ai.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,50 +9,53 @@
from game_control import *
from keras.models import model_from_json


def main():
# Get Model:
model_file = open('Data/Model/model.json', 'r')
model_file = open('data/model/model.json', 'r')
model = model_file.read()
model_file.close()
model = model_from_json(model)
model.load_weights("Data/Model/weights.h5")
model.load_weights('data/model/weights.h5')

print('AI start now!')
print('AI training has begun')

while 1:
# Get screenshot:
screen = ImageGrab.grab()
# Image to numpy array:
screen = np.array(screen)
# 4 channel(PNG) to 3 channel(JPG)
Y = predict(model, screen)
if Y == [0,0,0,0]:
y = predict(model, screen)
if y == [0, 0, 0, 0]:
# Not action
continue
elif Y[0] == -1 and Y[1] == -1:
elif y[0] == -1 and y[1] == -1:
# Only keyboard action.
key = get_key(Y[3])
if Y[2] == 1:
key = get_key(y[3])
if y[2] == 1:
# Press:
press(key)
else:
# Release:
release(key)
elif Y[2] == 0 and Y[3] == 0:
elif y[2] == 0 and y[3] == 0:
# Only mouse action.
click(Y[0], Y[1])
pass
# click(y[0], y[1])
else:
# Mouse and keyboard action.
# Mouse:
click(Y[0], Y[1])
# click(y[0], y[1])
# Keyboard:
key = get_key(Y[3])
if Y[2] == 1:
key = get_key(y[3])
if y[2] == 1:
# Press:
press(key)
else:
# Release:
release(key)


if __name__ == '__main__':
main()
46 changes: 34 additions & 12 deletions create_dataset.py
Original file line number Diff line number Diff line change
@@ -1,41 +1,59 @@
# Arda Mavi
import os
import cv2
import sys
import platform
import numpy as np
from time import sleep
from PIL import ImageGrab
from game_control import *
from predict import predict
from scipy.misc import imresize
from game_control import get_id
from get_dataset import save_img
from multiprocessing import Process
from keras.models import model_from_json
from pynput.mouse import Listener as mouse_listener
from pynput.keyboard import Listener as key_listener
from pynput.mouse import Listener as Mouse_Listener
from pynput.keyboard import Listener as Key_Listener


def get_screenshot():
img = ImageGrab.grab()
img = np.array(img)[:,:,:3] # Get first 3 channel from image as numpy array.
img = imresize(img, (150, 150, 3)).astype('float32')/255.
img = np.array(img)[:, :, :3] # Get first 3 channel from image as numpy array.

"""
The ratio is r. The new image will
have a height of 150 pixels. To determine the ratio of the new
height to the old height, we divide 150 by the old height.
"""

r = 150.0 / img.shape[0]
dim = (int(img.shape[1] * r), 150)

img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)
print(img)

return img


def save_event_keyboard(data_path, event, key):
key = get_id(key)
data_path = data_path + '/-1,-1,{0},{1}'.format(event, key)
screenshot = get_screenshot()
save_img(data_path, screenshot)
return


"""

def save_event_mouse(data_path, x, y):
data_path = data_path + '/{0},{1},0,0'.format(x, y)
screenshot = get_screenshot()
save_img(data_path, screenshot)
return


def listen_mouse():
data_path = 'Data/Train_Data/Mouse'
data_path = 'data/train_data/mouse'
if not os.path.exists(data_path):
os.makedirs(data_path)

Expand All @@ -44,15 +62,17 @@ def on_click(x, y, button, pressed):

def on_scroll(x, y, dx, dy):
pass

def on_move(x, y):
pass

with mouse_listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:
with Mouse_Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:
listener.join()
"""


def listen_keyboard():
data_path = 'Data/Train_Data/Keyboard'
data_path = 'data/train_data/keyboard'
if not os.path.exists(data_path):
os.makedirs(data_path)

Expand All @@ -62,18 +82,20 @@ def on_press(key):
def on_release(key):
save_event_keyboard(data_path, 2, key)

with key_listener(on_press=on_press, on_release=on_release) as listener:
with Key_Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()


def main():
dataset_path = 'Data/Train_Data/'
dataset_path = 'data/train_data/'
if not os.path.exists(dataset_path):
os.makedirs(dataset_path)

# Start to listening mouse with new process:
Process(target=listen_mouse, args=()).start()
# Process(target=listen_mouse, args=()).start()
listen_keyboard()
return


if __name__ == '__main__':
main()
8 changes: 8 additions & 0 deletions database_process.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,41 @@
import os
import sqlite3


def set_sql_connect(database_name):
return sqlite3.connect(database_name)


def set_sql_cursor(database_connect):
return database_connect.cursor()


def close_connect(vt):
if vt:
vt.commit()
vt.close


def set_connect_and_cursor(path='Data/database.sqlite'):
vt = set_sql_connect(path)
db = set_sql_cursor(vt)
return vt, db


def create_table(table_name, columns):
vt, db = set_connect_and_cursor()
db.execute("CREATE TABLE IF NOT EXISTS {0} ({1})".format(table_name, columns))
close_connect(vt)


def get_data(sql_command):
vt, db = set_connect_and_cursor()
db.execute(sql_command)
gelen_veri = db.fetchall()
close_connect(vt)
return gelen_veri


def add_data(table, adding):
vt, db = set_connect_and_cursor()
db.execute("INSERT INTO '{0}' VALUES ({1})".format(table, adding))
Expand Down
45 changes: 30 additions & 15 deletions game_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,52 @@
from pynput.mouse import Button, Controller as Mouse
from pynput.keyboard import Controller as Keyboard

keyboard = Keyboard()

mouse = Mouse()


# For encoding keyboard keys:
def get_keys():
return ['\t', '\n', '\r', ' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', 'accept', 'add', 'alt', 'altleft', 'altright', 'apps', 'backspace', 'browserback', 'browserfavorites', 'browserforward', 'browserhome', 'browserrefresh', 'browsersearch', 'browserstop', 'capslock', 'clear', 'convert', 'ctrl', 'ctrlleft', 'ctrlright', 'decimal', 'del', 'delete', 'divide', 'down', 'end', 'enter', 'esc', 'escape', 'execute', 'f1', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f2', 'f20', 'f21', 'f22', 'f23', 'f24', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'final', 'fn', 'hanguel', 'hangul', 'hanja', 'help', 'home', 'insert', 'junja', 'kana', 'kanji', 'launchapp1', 'launchapp2', 'launchmail', 'launchmediaselect', 'left', 'modechange', 'multiply', 'nexttrack', 'nonconvert', 'num0', 'num1', 'num2', 'num3', 'num4', 'num5', 'num6', 'num7', 'num8', 'num9', 'numlock', 'pagedown', 'pageup', 'pause', 'pgdn', 'pgup', 'playpause', 'prevtrack', 'print', 'printscreen', 'prntscrn', 'prtsc', 'prtscr', 'return', 'right', 'scrolllock', 'select', 'separator', 'shift', 'shiftleft', 'shiftright', 'sleep', 'space', 'stop', 'subtract', 'tab', 'up', 'volumedown', 'volumemute', 'volumeup', 'win', 'winleft', 'winright', 'yen', 'command', 'option', 'optionleft', 'optionright']
return ['a', 'd', 's', 'enter', 'return', 'space', 'right', 'left', 'up', 'down']


def get_key(key_id):
return get_keys()[key_id]

def get_key(id):
return get_keys()[id]

def get_id(key):
return get_keys().index(key)
print('key', key)
print(get_keys(), 'index')
return
# return get_keys().index(key)


# Keyboard:
def press(key):
keyboard.press(key)
return


def release(key):
keyboard.release(key)
return

keyboard = Keyboard()
mouse = Mouse()

# Mouse:
"""

def move(x, y):
mouse.position = (x, y)
return


def scroll(x, y):
mouse.scroll(x, y)
return


def click(x, y):
mouse.press(Button.left)
return

# Keyboard:
def press(key):
keyboard.press(key)
return

def release(key):
keyboard.release(key)
return
"""
80 changes: 51 additions & 29 deletions get_dataset.py
Original file line number Diff line number Diff line change
@@ -1,47 +1,69 @@
# Arda Mavi
import os
import numpy as np
import cv2
from keras.utils import to_categorical
from scipy.misc import imread, imresize, imsave
import imageio
from skimage import *
import skimage.io
from sklearn.model_selection import train_test_split


def get_img(data_path):
# Getting image array from path:
img = imread(data_path)
img = imresize(img, (150, 150, 3))
img = skimage.io.imread(data_path)
"""
The ratio is r. The new image will
have a height of 150 pixels. To determine the ratio of the new
height to the old height, we divide 150 by the old height.
"""

r = 150.0 / img.shape[0]
dim = (int(img.shape[1] * r), 150)

img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)
# img = imresize(img, (150, 150, 3)).astype('float32') / 255.

return img


def save_img(img, path):
imsave(path, img)
sk_img = skimage.io.imread(path)
sk_img = sk_img.transpose(1, 0, 2).reshape(130, -1)
image = img_as_ubyte(sk_img)
skimage.io.imsave(path, image)
skimage.io.imsave(path, img)
# skimage.io.imsave(path, img_as_uint(img))
return

def get_dataset(dataset_path='Data/Train_Data'):

def get_dataset(dataset_path='data\\train_data'):
# Getting all data from data path:
try:
X = np.load('Data/npy_train_data/X.npy')
Y = np.load('Data/npy_train_data/Y.npy')
except:
labels = os.listdir(dataset_path) # Geting labels
X = []
Y = []
count_categori = [-1,''] # For encode labels
x = np.load('data\\npy_train_data\\x.npy')
y = np.load('data\\npy_train_data\\y.npy')
except AttributeError:
labels = os.listdir(dataset_path) # getting labels
x = []
y = []
count_category = [-1, ''] # For encode labels
for label in labels:
datas_path = dataset_path+'/'+label
for data in os.listdir(datas_path):
img = get_img(datas_path+'/'+data)
X.append(img)
datas_path = dataset_path + '/' + label
for d_data in os.listdir(datas_path):
img = get_img(datas_path + '/' + d_data)
x.append(img)
# For encode labels:
if data != count_categori[1]:
count_categori[0] += 1
count_categori[1] = data.split(',')
Y.append(count_categori[0])
if d_data != count_category[1]:
count_category[0] += 1
count_category[1] = d_data.split(',')
y.append(count_category[0])
# Create dateset:
X = np.array(X).astype('float32')/255.
Y = np.array(Y).astype('float32')
Y = to_categorical(Y, count_categori[0]+1)
if not os.path.exists('Data/npy_train_data/'):
os.makedirs('Data/npy_train_data/')
np.save('Data/npy_train_data/X.npy', X)
np.save('Data/npy_train_data/Y.npy', Y)
X, X_test, Y, Y_test = train_test_split(X, Y, test_size=0.1, random_state=42)
return X, X_test, Y, Y_test
x = np.array(x).astype('float32') / 255.
y = np.array(y).astype('float32')
y = to_categorical(y, count_category[0] + 1)
if not os.path.exists('data\\npy_train_data/'):
os.makedirs('data\\npy_train_data/')
np.save('data\\npy_train_data/x.npy', x)
np.save('data\\npy_train_data/y.npy', y)
x, x_test, y, y_test = train_test_split(x, y, test_size=0.1, random_state=42)
return x, x_test, y, y_test
Loading