понедельник, 6 июля 2020 г.

NeyroGamer 2

Всем привет, с вами Платон из команды "Карандаш и Самоделкин". Лето идёт полным ходом и наша команда не сидит без дела. Сегодня я готов представить вам продолжение проекта NeyroGamer, в котором я создам нейронную сеть, которая будет учиться  играть в видео игры.

Я всё глубже изучаю нейронные сети, и зачастую пишу код без использования библиотек с готовыми методами и инструментами для создания алгоритмов машинного обучения. Это связанно с желанием узнать, что находится «под капотом» у таких библиотек как Keras и TensorFlow. Однако алгоритм обратного распространения ошибки кажется мне несколько сложным, поэтому в NeyroGamer нейросети выступают в качестве особей генетического алгоритма. В сегодняшнем проекте я написал нейронную сеть с краткосрочной памятью с нуля, используя лишь стандартные библиотеки и NumPy.

В качестве игры, в которую будет учится играть мой алгоритм, снова выступит Nigel Mansell's World Championship Racing с платформы Sega Genesis. Так как я использую генетический алгоритм, использование эмулятора консоли и ретро игра дает мне следующие преимущества:

  •     Загрузка состояния с контрольной точки. Каждая особь начинает гонку со старта. 
  •     Простая графика для разбора OpenCV

В первой части проекта, я опирался на несколько моментов дороги, взятых OpenCV на разной высоте кадра. Такой подход казался мне более верным, в нем нейронной сети подавались предобработанные моментами данные. После многих поколений эволюции такой подход позволял обучать нейронную сеть, но процесс был очень долгий и после достижения N-ого уровня мастерства алгоритм переставал учится, «упираясь в потолок», так как не учитывал многие нюансы трассы - столбы, мосты, положение соперников друг относительно друга.

Во второй части проекта я пошел другим путем. На вход нейронным сетям особей теперь подается изображение нижний части экрана (машина и дорога без показаний приборов, спидометра, коробки передач и миникарты) в виде уменьшенного полноцветного битмапа. После нескольких экспериментов было выбрано разрешение 64х16. При увеличении количества точек сильно растёт количество нейронов, что приводит к медленной работе алгоритма. На картинке с меньшим количеством точек не хватает данных.

 
32х8

64х16

Такой метод оказался намного лучше и обучение пошло значительно быстрее. Правда из-за того, что нейронная сеть очень сильно выросла (3000+ входов), пришлось заняться оптимизацией. Весь алгоритм обучения я переписал на NumPy. Самое «медленное» место в старом алгоритме оказалось в методе «предсказания»(использования) нейронной сети из-за «бега» циклом по 2м матрицам. После оптимизации этого места FPS вырос в 100 раз, с 6 до 600. Вместе с переработкой всего кода и его оптимизацией, была дополнена модель нейронной сети. Была добавлена краткосрочная память, то есть теперь я использую LSTM-сеть . 

С помощью моментов  на кадре выделяется данные о скорости (вырезается полоса с показаниями передачи и по ней берётся красный момент). Эти данные показывают текущую скорость — показатель по которому сортировались нейронные сети.

  

Каждая из особей «загружается» с контрольной точки (на старте гонки) и тестируется в периоде N-ого времени. В каждый «тик» особи прибавляется количество очков в зависимости от её скорости. Таким образом переходить в следующее поколение будут самые быстрые особи. После тестирование всех особей происходит сортировка и скрещивание, после чего новое поколение особей заново тестируется. После каждых 5 поколений все особи сохраняются в файл, что бы обучение можно было продолжить позже.


Вначале своего обучения, алгоритм ведёт себя крайне случайно. Однако после первых 2-3х поколений особи случайно нажавшие на газ начинают вести за собой остальных. Тут начинается 2й этап обучения - «Зажимай, авось получится!». Нейронные сети научившись давить на газ начинают зажимать случайные кнопки. Кто-то едет прямо, а кто-то постоянно улетает в правое ограждение. Получается довольно смешно. Далее алгоритм находит «середину» и обучается уже более сложным вещам - держатся по центру дороги, правильно входить в поворот, обгонять своих противников.

Автор - Платон, 14 лет ("Карандаш и Самоделкин")

вторник, 12 мая 2020 г.

Нейронная сеть учится играть в Lunar Lander

Lunar Lander — аркадная игра, выпущенная Atari, Inc. в 1979 году. Цель игры — управлять посадочным лунным модулем, чтобы произвести мягкую посадку на поверхность Луны. На посадочный модуль действует гравитация и инерция, кроме того количество топлива в нем ограничено. Управление производится 4 кнопками: наклоны посадочного модуля влево/вправо, управление тягой двигателя +/-.


Задача, решаемая в рамках данного проекта - разработать самообучающуюся нейронную сеть, способную посадить на поверхность Луны посадочный модуль, выбрав при этом для этого пригодную для посадки площадку. Для управления посадочным модулем нейронная сеть должна "нажимать" кнопки на виртуальной клавиатуре, так как это делал бы реальный игрок.



Для ускорения обучения нейронной сети используется генетический алгоритм, в каждом поколении запускается 10 ее копий. Нейронная сеть имеет 2 скрытых слоя. Проект разрабатывается на Python, никакие дополнительные нейросетевые фреймворки/модули не используются. Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Исходный код



воскресенье, 10 мая 2020 г.

Звездолеты 3D

Продолжение игры про звездолеты, теперь в 3D. Управление с помощью наэкранных кнопок. В демо 1 уровень, есть звуковые эффекты и музыка.



Язык C#, среда разработки - Unity.
Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Исходный код здесь

суббота, 9 мая 2020 г.

Звездолеты

Игра про звездолеты. Несколько уровней, разные типы врагов и оружия. Подбираемые боеприпасы и "аптечки". Управление движением - на гироскопе/акселерометре телефона, выстрелы разным типом оружия - тапы в разных зонах экрана. Есть звуковые эффекты и миникарта. Написана без использования готовых библиотек и конструкторов.


Язык Java, среда разработки - Android Studio.
Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Исходный код здесь



Tetris 2x

Классический тетрис представляет собой головоломку, построенную на использовании геометрических фигур «тетрамино» — разновидности полимино, состоящих из четырёх квадратов. В нашей версии стакан имеет глубину в 2 квадрата (слоя), заполнять необходимо оба горизонтальных ряда из 10 клеток, расположенных на одной высоте. Управление на стрелках клавиатуры, переворот игрового поля на другой слой - Ctrl.


Язык C#, среда разработки - Unity.
Автор - Тихон, 13 лет ("Карандаш и Самоделкин")
Скачать можно c Яндекс.Диск, исходный код здесь
Прототип игры сначала написал на Python, исходники по ссылке

Самое популярное