Как создать игру с компьютерным зрением на Python?

Я вырос в (19) 90-х. До Интернета, смартфонов, игровых приставок нового поколения. Черт, до дополненной и виртуальной реальности. Я знаю, я стар ... По крайней мере, мне нужно познать физический мир. Щелчок! (Нет, Snapchat у нас тоже не было…). Мы просто сообщали примерное место, время выхода, и мы были готовы к взлету.

Это было весело. Но знаете, что еще было весело? Мастер-система II.

Краткая история игровых консолей

Давным-давно, очень-очень давно игровые консоли выглядели так:

Игры представляли собой картриджи, которые нужно было вставить в консоль. Ну… Не все. Одна игра была предустановлена ​​(спасибо G.od, они не открыли запрос на злоупотребление доминирующим положением). Игра, в которой запечатлены часы моей жизни.

Алекс Кидд в чудесном мире

Эта игра была шедевром. Действительно настоящий чудо-мир. Вы играли маленького персонажа Алекса с миссией победить незаконнорожденного тирана (заговор). Никакого импичмента, просто масса разных уровней.

Что особенно поражало в этой игре, так это разнообразие игрового процесса. Вы прыгали, ломая кирпичи, собирая деньги, плавая под водой, избегая рыб и щупалец осьминога. Почему бы не взять лодку? Ну, ты мог бы купить его. Или вертолет, мотоцикл, летающая накидка… Жизнь в Instagram до Instragram!

Давай поиграем в "Камень, ножницы, бумага"…

Алекс Кидд ничего не боялся. Кроме камня, ножниц и бумаги…

В конце почти каждого уровня вам нужно было сыграть в игру «Камень-ножницы-бумага». Я никогда не играл в более интенсивные RPS, чем в Alex Kidd. Но это было раньше.

… в прямом эфире…

Технология потрясающая. В то время как я вспоминаю часы игр, сыгранных по телевизору, которые, вероятно, весили больше, чем я, современные дети играют в виртуальных мирах без кабелей. Встретимся посередине.

Созданная мной программа использует компьютерное зрение и глубокое обучение, чтобы играть в игру «камень-ножницы-бумага» в прямом видеопотоке (в данном случае с веб-камеры). Звучит впечатляюще ... Это не так. На самом деле это действительно просто!

… с использованием OpenCV и Python

OpenCV - это очень полная библиотека компьютерного зрения, которая в значительной степени позволяет вам делать все, что вам нужно. В Интернете доступно множество руководств, которые помогут вам начать работу (при необходимости я могу порекомендовать некоторые - напишите мне в комментариях). Это то, что я использовал для захвата и обработки изображений. Я использовал Tensorflow и Keras для части глубокого обучения.

Рабочий процесс

Что вам нужно, чтобы играть в эту игру? Рука. Вот и все. Программе просто нужно распознать жест руки, сравнить его с оппонентом и вывести результат (выигрыш, проигрыш, ничья).

1 - Идентификация руки

Вы можете придумать алгоритм отслеживания рук, но мне нравится простота. Итак, я создал область интереса, в которую пользователь должен положить руку и сделать жест. Он менее гибкий и «доказательство идиота», но его достоинства заключаются в упрощении кода.

Мы сузили круг возможных мест проведения акции. Но нам все еще нужно «зафиксировать действие» (то есть идентифицировать руку). Для этого есть несколько разных подходов. Первым, что я попробовал, было использовать гистограмму ориентированных градиентов. Если вы не знаете, что это такое, не беспокойтесь, это не тот подход, к которому я пришел. Я просто хотел немного похвастаться.

Я использовал простое «вычитание фона». Если вы вычтите фон изображения, вы останетесь на переднем плане. И вот чего мы здесь хотим: рука (должна быть) единственное, что движется в интересующей области.

2 - Распознавание жеста

После того, как мы изолировали руку, мы можем начать думать о стратегиях, чтобы распознать, какой жест она делает. Я решил использовать глубокое обучение, потому что это круто для всего и чего угодно.

К тому же это невероятно просто. Считайте со мной: я записал несколько сотен изображений каждого жеста руки (20 секунд), дополнил этот набор данных (20 секунд) и обучил модель (5 минут). Глубокое обучение менее чем за 6 минут!

NB: увеличение данных состоит из случайного изменения созданных мной изображений для создания новых, немного отличающихся (повернутых на некоторый угол, увеличенных или уменьшенных на некоторый процент и т. Д.). Вы можете сделать это непосредственно при обучении модели, но мне нравится делать это отдельно, чтобы 1 / я мог визуализировать созданную мной модификацию, 2 / отслеживать изображения (для воспроизведения) и 3 / объем памяти не был проблемой здесь.

3 - Выведите результаты

Как только программа распознала, какой жест делает человек, вам просто нужно реализовать правила (бумага лучше камня, камень лучше ножниц, ножницы лучше бумаги). Я жестко запрограммировал логику, потому что она намного проще.

Поскольку никто не хотел со мной играть, я симулировал соперника. В конце концов, это то, что вы получите.

Посмотри, как мне весело !!

Как это работает?

Давайте разберемся:

1 - Программа берет первое изображение из потока и рассматривает его как фон (мы предполагаем, что в интересующей области будет двигаться только рука);

2 - Затем берет каждый кадр и вычитает фон (этот подход также работает для различного тона кожи);

3 - принимает результат 2 / и передает его в модель глубокого обучения, чтобы идентифицировать жест;

4 - сравнивает жест с жестом соперника по правилам;

5 - выводит изображение и информацию о результатах (выигрыш, ничья, проигрыш).

Как это можно улучшить?

Если эта игра не даст мне работу разработчика в Blizzard, я не знаю, что мне даст! Но если бы я хотел потратить больше времени и действительно улучшить его, я бы:

1 - Используйте систему отслеживания рук, чтобы исключить необходимость в заранее заданной области интереса;

2 - Улучшение модели глубокого обучения (дизайн, а также обучающие данные - включая дополнительные жесты рук);

3 - Улучшение оппонента (либо путем создания агента обучения с подкреплением, либо путем создания дополнительной логики, такой как «если игрок сыграл два X подряд, играйте Y» - лучшая стратегия - играть случайным образом, но более увлекательно создавать оппонента. у которого, похоже, есть стратегия, которую вы пытаетесь угадать);

4 - Улучшение графики и эффектов игрового экрана (обратный отсчет для каждой новой игры, праздничное конфетти при выигрыше и т. Д.);

5 - Другие идеи, которые у вас есть!

Удачи!

Если вы добрались до этого места, поздравляю, вы победили всех боссов (Boredominus, NotFuninator и ObviousItIs). В награду вы можете найти код на моем гитхабе. Не стесняйтесь обращаться, если у вас есть какие-либо вопросы, но код очень простой, поэтому я уверен, что у вас все будет хорошо!

Хорошо, вот и настоящая награда: бесплатно сыграй Алекса Кидда в Miracle World на ПК.

Увидимся на другой стороне!