В мире искусственного интеллекта многие разработчики стремятся создать нейронные сети, способные обучаться и принимать решения в реальном времени. В данной статье рассмотрим подход к созданию нейронной сети, способной играть в культовую игру Doom. Начнем с описания подготовки данных, включая проблему обработки больших изображений и использование необходимых библиотек Python.
Размер входных данных
Одной из первоочередных проблем, с которой я столкнулся при разработке нейронной сети для игры в Doom, был размер входных данных. Планируя захватывать окно игры с помощью библиотеки mss выяснил размер окна (370x640).
Обрезав изображение, я понял, что обработка таких больших изображений может потребовать значительное количество входных нейронов (710 400) и соответственно потратит немало вычислительных ресурсов, что плохо скажется на времени выполнения задач. Для большинства нейронных сетей время выполнения не критично, но в данном случае отклик между нейронной сетью и игрой должен быть минимален.
Так-что было принято решение уменьшить изображения до размера (210x130) и преобразование цветного изображения в оттенки серого.
Все эти операции проходили через библиотеку opencv которая представляет изображение в виде матрицы размером в высоту, ширину и цветовой формат изображения (370 * 640 * 3 = 710 400).
После проведения данных манипуляций конечный объём составил (210 * 130 = 27 300) немало, но больше ужимать не стоит так-как это усложнит процесс распознания важных игровых объектов, что в свою очередь увеличит время обучения и точность принятых решений нейронной сети.
Код обработки изображений
код для получения изображений из игры
import cv2
from mss import mss
from time import sleep
mon = {"top": 25, "left": 0, "width": 640, "height": 395}
i=0
sct = mss()
while True:
sleep(5)
img = np.asarray(sct.grab(mon))
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.resize(img, (210, 130), cv2.INTER_AREA)
cv2.imwrite(f'skrins/{i}.jpg', img)
i+=1
функция для обработки изображений поступающие в нейронную сеть
def load_image_gray(image_path):
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
return img.flatten() / 255
Использование библиотек
Для реализации обработки изображений и управления игровым процессом воспользовался несколькими ключевыми библиотеками Python:
- pyautogui для эмуляции нажатия клавиш и управления игровым процессом;
- opencv для обработки изображений, изменения размера и преобразование цветного изображения в оттенки серого;
- mss для получения скриншотов игрового экрана.
Далее продолжу описание разработки нейронной сети и её обучения во второй и третьей частях статьи.