项目目的:在手机端实现用户手势的检测并且识别用户所做的手势
遇到的问题:
首先在手部检测的解决办法中,我尝试过用opencv进行手部识别,但存在的问题是背景对手的识别的影响太大,如果采用颜色进行手和背景的区分的话,又会受到光照等影响,总体而言效果不好。
之后转向使用机器学习方法进行识别。
在寻找可用的手部检测的代码中花了很长时间,试了几个github上的项目因为种种问题不能运行。
考虑过使用openpose框架进行手部的识别,虽然准确度高但是很吃GPU,所以希望寻找对性能要求低的模型进行改进。
最终在 这里 找到了通过卷积神经网络训练后的可用的手识别的项目。
下面是改编和使用该项目,并且在其基础上进行手势分类的过程:
一.对 这里 项目进行的改进
1.首先由于要取识别出来的手部图片进行图片分类操作,先将 config.py 文件中的 DEMO_TYPE 设置为
DEMO_TYPE = 'MULTI'
就可以显示出如图图片
2.接着将上图的左右两个图片的输出改为单一图片输出
在 run_demo_hand_with_tracker.py 中 将main方法中 if ('multi')分支中的imshow语句更改为
cv2.imshow('local_img', local_img.astype(np.uint8))
即取消了list的合并
3.运行run_demo_hand_with_tracker.py,保存当前手势图片
在上述imshow方法下面加上保存图片的语句
cv2.imwrite('你的路径'+'.jpg', local_img.astype(np.uint8), [int(cv2.IMWRITE_JPEG_QUALITY), 90])
即可在输出文件夹中得到类似下面的图片集
4.自行录入多种手势进行训练
在这里我录入了6种手势
每种手势600多张,一共4038张的图片作为数据集进行手势分类的训练
数据集被我保存在项目目录下的 classify -- handGesturePic目录下,共6个子目录
二.对上述数据集进行分类操作
1.搭建cnn网络
学习参考 点击打开链接 这篇博客的花图片的分类
具体实现代码 classmain.py :
# -*- coding: utf-8 -*-
from skimage import io, transform
import glob
import os
import tensorflow as tf
import numpy as np
import time
path = './handGesturePic/'
# 模型保存地址
model_path='./modelSave/model.ckpt'
# 将所有的图片resize成100*100
w = 100
h = 100
c = 3
# 读取图片
def read_img(path):
cate = [path + '/' + x for x in os.listdir(path) if os.path.isdir(path + '/' + x)]
imgs = []
labels = []
for idx, folder in enumerate(cate):
print('reading the images:%s' % (folder))
for im in glob.glob(folder + '/*.jpg'):
img = io.imread(im)
img =