Skip to content

手把手教你用PaddleX训练手势识别模型,并将该模型用于吃豆豆游戏

Notifications You must be signed in to change notification settings

CVUsers/play-Pacman-with-gesture-recognition-by-resnet18

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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)
plt.show()
2020-06-23 09:27:29 [INFO]	Model[ResNet18] loaded.
Predict Result: [{'category_id': 1, 'category': 'left', 'score': 0.9999609}]

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

About

手把手教你用PaddleX训练手势识别模型,并将该模型用于吃豆豆游戏

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%