Акшай Бахадур

Этот блог посвящен моей реализации классической игры «Камень-ножницы-бумага» с изюминкой.

Ссылка на Код.

Аннотация

Камень-ножницы-бумага (также известная как ножницы-бумага-камень или другие варианты) — это ручная игра, в которую обычно играют два человека, в которой каждый игрок одновременно формирует одну из трех фигур вытянутой рукой. Это «камень» (сжатый кулак), «бумага» (плоская рука) и «ножницы» (кулак с вытянутыми указательным и средним пальцами, образующими букву V). «Ножницы» идентичны двупалому знаку V (также известному как «победа» или «знак мира»), за исключением того, что он направлен горизонтально, а не держится вертикально в воздухе. Одновременная игра с нулевой суммой имеет только два возможных исхода: ничья или выигрыш одного игрока и проигрыш другого.

Правила

Правила довольно простые, которые можно даже запомнить 😋

  • Ножницы режут бумагу
  • Бумажные обложки Рок
  • Камень давит ящерицу
  • Ящерица отравляет Спока
  • Спок разбивает ножницы
  • Ножницы обезглавливают ящерицу
  • Ящерица ест бумагу
  • Бумага опровергает Спока
  • Спок испаряет Рок
  • (и как всегда) Камень давит ножницы

Создание набора данных

Хотя набор данных доступен в моем репозитории GitHub, я бы посоветовал вам создать его самостоятельно. Давайте подробно рассмотрим набор данных, а затем я объясню код для его захвата.

Вот что вы можете сделать:

  • Или создайте свой собственный набор данных.

Примечания из этого кода

  • Всего картинок на жест — 1200 (строка 15)
  • Изображения хранятся в папке «/gestures» (строка 19).
  • Размер изображений будет 50 x 50 — image_x, image_y = 50, 50 (строка 5)
  • Фильтрация только цвета кожи из всего изображения — cv2.inRange(hsv, np.array([2, 50, 60]), np.array([25, 150, 255]))( строка 29)
  • Из строк 29–40 мы разрабатываем наши фильтры на основе цвета кожи и отфильтровываем контуры.
  • Выбор интересующей области — x, y, w, h = 300, 50, 350, 350 (строка 17)
  • Вы увидите 2 кадра на экране: «фрейм» для обычного изображения и «thresh», который будет содержать отфильтрованный кадр. (строка 60, 61)
  • Нажмите кнопку «c» на клавиатуре, чтобы начать захват изображений (строка 63).

Процедура

Запустите файл CreateGest.py. Введите имя жеста, и вы получите 2 отображаемых кадра. Посмотрите на контурную рамку и отрегулируйте руку, чтобы убедиться, что вы передаете черты своей руки. Нажмите ‘c’ для захвата изображений. Потребуется 1200 изображений одного жеста. Попробуйте немного подвигать рукой в ​​кадре, чтобы убедиться, что ваша модель не перегружается во время тренировки.

Настройка среды

Теперь, когда у нас есть изображения в каталоге, мы можем делать с ними несколько вещей — либо мы можем загрузить их в файл pickle, создать csv или использовать генератор изображений tensorflow для автоматического получения изображений из папки. Я получил этот скрипт Python для преобразования изображений из каталога в файлы CSV — CreateCSV.py

Загрузка данных

После запуска скрипта у нас также есть готовый CSV-файл. Примечание -

  • 5 жестов
  • 1200 изображений на жест
  • Размер изображения 50 х 50 (2500 пикселей)

Обучение

Определение модели

  • Модель. Приведенная выше суть определяет модель, которую мы будем использовать.
  • Слои. В модели есть два слоя пула свертки-макс, за которыми следуют полностью связанные слои и отсев.
  • Выпадения: они действительно важны, так как вы не хотите перегружать свой тренировочный набор. Dropout заставляет вашу модель учиться на всех нейронах, а не только на некоторых из них, это помогает обобщать новые данные.
  • Вывод: выходной слой имеет активацию softmax, которая позволяет вывести на выходе одну из 6 меток, которые мы определили ранее (Камень — Бумага — Ножницы — Ящерица — Спок и 1 произвольная метка).
  • Оптимизатор: я использую оптимизатор Адам.
  • Эпохи :2
  • Пакет размер : 64
  • Обратные вызовы: я использую TensorBoard для визуализации моей модели.
  • Сохранить и загрузить: я сохраняю модель (RPS.h5) после каждой партии, чтобы позже делать прогнозы для обученной модели.

Визуализация

Показатели

В конце обучения моя точность составляет около 98% на тренировочном наборе, а наша потеря составляет около 0,04. Я думаю, что этого можно добиться только потому, что мы используем фильтры и удаляем весь фоновый шум. Тестовый набор также имеет аналогичную точность (около 95%). Я думаю, что наша модель показала себя очень хорошо, учитывая тот факт, что в ней всего 5 меток.

Создание приложения

Теперь у нас все готово. Давайте создадим приложение, которое использует веб-камеру, чтобы помочь вам «играть» в игру.

Подробности

  • Веб-камера: я использую веб-камеру для прямой трансляции с веб-камеры. Обратите внимание, что я отфильтровываю только цвет кожи из всего изображения — cv2.inRange(hsv, np.array([2, 50, 60]), np.array([25, 150, 255])).
  • Фильтры: я отфильтровываю только синюю кожу с изображения, используя эти 2 пустых массива и несколько фильтров и масок. В конце я использовал функцию поиска контуров, чтобы обнаружить мою руку.
  • Обнаружение жестов. На основе контуров я создаю изображение, которое отправляется для предсказания во время выполнения. Я назначаю ЦП случайный смайлик и на основании результата, исходя из моего жеста и случайного жеста ЦП, я объявляю победителя в этом раунде.
  • Предсказание. Затем жесты отправляются в модель для предсказания.

Вывод

Поздравляем, вы успешно построили прототип для игры «Камень-ножницы-бумага-ящерица-Спока».

Сделано с ❤️ и 🦙 Акшаем Бахадуром