-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathburnout_driver.py
119 lines (104 loc) · 3.66 KB
/
burnout_driver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import gamepy
import numpy as np
from gamepy import press_key, release_key
from keras.models import load_model
from keras.preprocessing.image import img_to_array, load_img
model = load_model('./Burnout/Models/vgg_model.h5')
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
###################################################################################################
# We first create a function that will be fed to our KeyController class.
# This function will take the screen as an input, and output a prediction of which key to press.
# The input screen is fed through to a neural network, which generates our prediction.
###################################################################################################
def predict_key(img):
"""Feeds an image to a neural network. Maps the neural net's prediction to
a key press.
Params
------
img: opencv image
Image from which a key-press prediction should be made
"""
# preprocess image
img = img_to_array(img)/255.
if img.shape[-1] == 1:
#last channel is wrong size
new_img = np.zeros([*img.shape[0:2], 3])
for i in range(3):
new_img[:,:,i] = img[:,:,0]
img = new_img
del new_img
# loads a mask for removing unwanted parts from the image
# (in this case, song titles and speedometer)
# mask = load_img('C:/Data/Games/Burnout/processed/mask.png')
# img = img*mask
img = img.reshape(1, *img.shape)
# predict the key press to be made
key = model.predict(img)[0].argmax()
print(key)
# map the prediction to a keystroke
if key == 0:
# up
press_key('up')
release_key('left')
release_key('right')
release_key('down')
elif key == 1:
# up left
press_key('up')
press_key('left')
release_key('right')
release_key('down')
elif key == 2:
# left
release_key('up')
press_key('left')
release_key('right')
release_key('down')
elif key == 3:
# down left
release_key('up')
press_key('left')
release_key('right')
press_key('down')
elif key == 4:
# down
release_key('up')
release_key('left')
release_key('right')
press_key('down')
elif key == 5:
# down right
release_key('up')
release_key('left')
press_key('right')
press_key('down')
elif key == 6:
# right
release_key('up')
release_key('left')
press_key('right')
release_key('down')
elif key == 7:
# up right
press_key('up')
release_key('left')
press_key('right')
release_key('down')
elif key == 8:
# no key press
release_key('up')
release_key('left')
release_key('right')
release_key('down')
###################################################################################################
# Load the keycontroller, whose input is a function that takes
# the screen as an input image and produces key_presses
###################################################################################################
start_keys='home'
pause_keys='pause'
terminate_keys='end'
controller = gamepy.KeyController(predict_key)
controller.set_control_keys(start_keys=start_keys, pause_keys=pause_keys, terminate_keys=terminate_keys)
print('Press %s to start the controller, %s to pause the controller, and %s to terminate the controller.' %(str(start_keys), str(pause_keys), str(terminate_keys)))
# activate the controller
controller.control(height=299, grayscale=False)