Акшай Бахадур
Этот блог посвящен моей реализации классической игры «Камень-ножницы-бумага» с изюминкой.
Ссылка на Код.
Аннотация
Камень-ножницы-бумага (также известная как ножницы-бумага-камень или другие варианты) — это ручная игра, в которую обычно играют два человека, в которой каждый игрок одновременно формирует одну из трех фигур вытянутой рукой. Это «камень» (сжатый кулак), «бумага» (плоская рука) и «ножницы» (кулак с вытянутыми указательным и средним пальцами, образующими букву V). «Ножницы» идентичны двупалому знаку V (также известному как «победа» или «знак мира»), за исключением того, что он направлен горизонтально, а не держится вертикально в воздухе. Одновременная игра с нулевой суммой имеет только два возможных исхода: ничья или выигрыш одного игрока и проигрыш другого.
Правила
Правила довольно простые, которые можно даже запомнить 😋
- Ножницы режут бумагу
- Бумажные обложки Рок
- Камень давит ящерицу
- Ящерица отравляет Спока
- Спок разбивает ножницы
- Ножницы обезглавливают ящерицу
- Ящерица ест бумагу
- Бумага опровергает Спока
- Спок испаряет Рок
- (и как всегда) Камень давит ножницы
Создание набора данных
Хотя набор данных доступен в моем репозитории GitHub, я бы посоветовал вам создать его самостоятельно. Давайте подробно рассмотрим набор данных, а затем я объясню код для его захвата.
Вот что вы можете сделать:
- Загрузите набор данных из моего репозитория 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 пустых массива и несколько фильтров и масок. В конце я использовал функцию поиска контуров, чтобы обнаружить мою руку.
- Обнаружение жестов. На основе контуров я создаю изображение, которое отправляется для предсказания во время выполнения. Я назначаю ЦП случайный смайлик и на основании результата, исходя из моего жеста и случайного жеста ЦП, я объявляю победителя в этом раунде.
- Предсказание. Затем жесты отправляются в модель для предсказания.
Вывод
Поздравляем, вы успешно построили прототип для игры «Камень-ножницы-бумага-ящерица-Спока».
Сделано с ❤️ и 🦙 Акшаем Бахадуром