Всем привет. Я Платон и сегодня я начинаю цикл статьей на Яндекс Дзен.
Сейчас я работаю над проектом, название которого NeyroGamer. Цель проекта довольно проста - научить машину играть в видео игры.
Язык программирования - Python 3, как самый удобный и понятный для меня.
Жанром игр были выбраны гонки, как самые простые в плане геймплея. В гонках нет ничего лишнего, лишь газ, руль и трасса. Посмотрев на современные гонки я понял, что такую сложную картинку будет очень сложно разобрать (например - найти дорогу). Поэтому было решено выбрать игры с более простой графикой. Так была выбрана игра Nigel Mansell's World Championship Racing с платформы Sega Genesis.
Для получения кадра я выбрал библиотеку PIL с методом ImageGrab который позволяет делать скриншот 25 раз в секунду. Этого было достаточно для оперативного реагирования на дорожную ситуацию.
Следующем шагом картинку игры предстояло разобрать на несколько основных частей. Для этого был использован метод inRange библиотеки OpenCV. На кадре было выделены следующие ключевые данные:
- Надо найти дорогу, что бы входить в повороты
- Узнать скорость с которой движется автомобиль в текущий момент
- Положение на кадре на кадре "врагов", что бы на прямых их можно было обгонять
Далее область дороги делится на N-ое количество полос горизонтально. По каждой берётся положение центра дороги - это и есть входы.
Следующий шаг - искусственный интеллект. Я решил использовать связку генетического алгоритма и нейронных сетей, как одну из самых эффективных и простых в реализации. Я решил отказаться от использования готовых библиотек, так как хотел написать всё сам и понять как работает "двигатель"изнутри.
Я поощеряю особи за скорость, с которой они едут.
После подачи данных на входы сетей пошло обучение. Это выглядит довольно комично первые 20 минут. Как соревнование общества косоглазо-криворуких водителей. Нейронные сети не понимают, чего от них хотят. Кто-то просто вдавливает педаль в пол, а кто-то стоит на месте. Кто-то уже нашёл как повернуть руль, но вот до газа дело не дошло. Так и стоит часть из особей на старте.
Но после нескольких поколений ситуация меняется. Те, кто ехал вперёд, хоть чуть-чуть, были похвалены и остальные, решили следовать их примеру. Так по чуть-чуть ситуация выправляется. С каждой эпохой результат всё лучше, и времени на испытание особей выделяется больше.
Результат на сегодня:
- К 15 поколению особи проезжают 2 поворота
- 8 из 10 хорошо газуют и действуют почти логично.
В будущем планируется добавить:
- Обучить особей обгону на прямых
- Начать анализировать как особи входят в повороты. Сейчас анализируется лишь скорость, однако, этого недостаточно. Следует выделять особей которые хорошо справляются управлением.
Для погружённых в тему или желающих посмотреть как все работает изнутри я оставляю ссылку на мой репозиторий. Там я веду свою разработку - https://github.com/StepanovPlaton/NeyroGamer
Я планирую выкладывать статьи раз в несколько дней и делясь своим опытом и наработками. Если вам интересно какими проектами я занимался ранее я рекомендую посетить блог нашей команды - http://karandashsamodelkin.blogspot.com
Так же вышла вторая часть статьи!