玩膩了小遊戲?Paddle手勢識別玩轉游戲玩出新花樣!

文章目錄:

1. 手勢數據採集

2. PaddleX訓練模型

3. 測試手勢識別模型

4. 測試遊戲種手勢控制

5. 大功告成~

# 解壓代碼
!unzip /home/aistudio/data/data41298/code.zip -d /home/aistudio/work/
!pip install paddlex

拳頭表示向下走:

手掌表示向上走:

下面兩個分別是向左和向右:


空白表示按位不動:

# 設置工作路徑
import os
os.chdir('/home/aistudio/work/Pacman-master/')

1. 手勢數據採集:

這一步需要在本地運行collect文件夾下PalmTracker.py文件進行手勢數據採集;

運行該程序時會打開攝像頭,在指定區域做出手勢,按s保存;

# !python collect/PalmTracker.py
collect    data     game.py  pacman.py	test.jpg  utils.py
config.py  demo.py  images   src	tools	  weights

2. PaddleX訓練模型

這一步使用PaddleX提供的ResNet18進行訓練;

預訓練模型使用在’IMAGENET’上訓練的權重,PaddleX選擇參數 pretrain_weights=‘IMAGENET’ 即可;

我這裏每種手勢共收集了40張左右,訓練結果準確率在93%以上;

2.1 定義數據集

from paddlex.cls import transforms
import os
import cv2
import numpy as np
import paddlex as pdx

base = './data'

with open(os.path.join('train_list.txt'), 'w') as f:
    for i, cls_fold in enumerate(os.listdir(base)):
        cls_base = os.path.join(base, cls_fold)
        files = os.listdir(cls_base)
        print('{} train num:'.format(cls_fold), len(files))
        for pt in files:
            img = os.path.join(cls_fold, pt)
            info = img + ' ' + str(i) + '\n'
            f.write(info)

with open(os.path.join('labels.txt'), 'w') as f:
    for i, cls_fold in enumerate(os.listdir(base)):
        f.write(cls_fold+'\n')

train_transforms = transforms.Compose([
    transforms.RandomCrop(crop_size=224),
    transforms.Normalize()
])

train_dataset = pdx.datasets.ImageNet(
    data_dir=base,
    file_list='train_list.txt',
    label_list='labels.txt',
    transforms=train_transforms,
    shuffle=True)

2.2 使用ResNet18訓練模型

此處訓練20個epoch,初始學習率爲2e-2

num_classes = len(train_dataset.labels)
model = pdx.cls.ResNet18(num_classes=num_classes)
model.train(num_epochs=20,
            train_dataset=train_dataset,
            train_batch_size=32,
            lr_decay_epochs=[5, 10, 15],
            learning_rate=2e-2,
            save_dir='w',
            log_interval_steps=5,
            save_interval_epochs=4)

3 測試手勢識別模型:

from paddlex.cls import transforms
import matplotlib.pyplot as plt
import paddlex
import cv2
import warnings

warnings.filterwarnings('ignore')

train_transforms = transforms.Compose([
    transforms.RandomCrop(crop_size=224),
    transforms.Normalize()
])

model = paddlex.load_model('weights/final')
im = cv2.imread('test.jpg')
result = model.predict(im, topk=1, transforms=train_transforms)
print("Predict Result:", result)

%matplotlib inline
plt.imshow(im)
("Predict Result:", result)

%matplotlib inline
plt.imshow(im)
plt.show()
2020-06-23 09:27:29 [INFO]	Model[ResNet18] loaded.
Predict Result: [{'category_id': 1, 'category': 'left', 'score': 0.9999609}]

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xDGN7LG1-1592877702883)(output_13_1.png)]

4. 測試遊戲中手勢控制:

本地運行demo.py即可;

!python demo.py

5. 大功告成

然後將該控制嵌入到遊戲中即可~

遊戲代碼來自:https://github.com/hbokmann/Pacman

!python game.py

演示視頻我放到Youtube了(因爲B站審覈太慢了,,,)

鏈接地址:https://youtu.be/tlZT2WeaK1U

更新,B站審覈通過啦!

鏈接地址:https://www.bilibili.com/video/BV1xa4y1Y7Mb/

關於作者:

北京理工大學 大二在讀

感興趣的方向爲:目標檢測、人臉識別、EEG識別等

也歡迎大家fork、評論交流

作者博客主頁:https://blog.csdn.net/weixin_44936889

聯繫我們:

權重文件或者源碼需要的請私戳作者~

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章