PaddlePaddle實現手勢識別玩轉喫豆豆!
文章目錄:
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、評論交流
聯繫我們:
權重文件或者源碼需要的請私戳作者~