Как создать игру с компьютерным зрением на 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 на ПК.
Увидимся на другой стороне!