玩腻了小游戏?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

联系我们:

权重文件或者源码需要的,以及对AI志同道合的炼丹师请私戳作者~

联系我时请备注AI爱好者,我会拉你进交流群~

该群会定时分享各种源码和模型,之前分享过的请从群文件中下载~

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/106916911