姿态估计 手势动作实时识别项目(基于mediapipe、keras进行实现)
- 0、功能展示
- 1、项目原理介绍
- 2、数据集采集脚本
- 3、将采集到的动作数据集利用mediapipe库检测手部关键点信息,转换成数据信息保存到本地
- 4、训练一个效果一般的随机森林分类器
- 5、使用Kreas训练一个效果好点的全连接层分类器
- 6、实时手部动作检测效果测试
项目代码下载地址
更多相关内容请参考:
姿态估计 MediaPipe实现手势,人体姿态,面部动作估计的用法
0、功能展示
1、项目原理介绍
本项目主要实现可以实时动态进行人的手势动作的识别,识别的手势动作由以下几类为例:
项目的主要思路是:
编写脚本,采集以上9类动作图像各100张作为训练集,使用mediapipe库作为工具检测手部关节,获取到手部的20个关键点信息坐标,将关键点信息坐标去除污染数据后,作为训练数据用于训练Keras全连接网络分类器,识别手势动作。
本次项目中,分别采用scikit-learn库训练随机森林分类器与Keras全连接层分类器,对比发现后者效果更好
opencv-python==4.7.0.68
mediapipe==0.9.0.1
scikit-learn==1.0.2
Keras==2.0.2
2、数据集采集脚本
import cv2,osDATA_DIR="./data"
if not os.path.exists(DATA_DIR):os.makedirs(DATA_DIR)number_of_classes=1
dataset_size=100
print("-------")cap=cv2.VideoCapture(0)#mac系统选择1 如果打开本地视频,就直接将0改为视频的地址就可以了
success=cap.isOpened()#返回的是bool类型,用于查看是否可以打开本地的视频
print(success)for num in range(number_of_classes):if not os.path.exists(os.path.join(DATA_DIR,str(num))):os.makedirs(os.path.join(DATA_DIR,str(num)))print("Collecting data for class {}".format(num))print("000000000000000000000000000000000000000")counter = 0while True:ret,frame=cap.read()cv2.putText(frame,"Ready? Press 'Q' !:",(100,50),cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3,cv2.LINE_AA)cv2.imshow("frame",frame)if cv2.waitKey(1)==ord('q'):breakif counter < dataset_size:ret,frame=cap.read()frame_=frame.copy()cv2.putText(frame_, "Ready? Press 'Q' !:", (100, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.3, (0, 255, 0), 3,cv2.LINE_AA)cv2.imshow("frame",frame_)if cv2.waitKey(1)==ord('w'):cv2.imwrite(os.path.join(DATA_DIR,str(num),'{}.jpg'.format(counter)),frame)print("--------------------------------------已保存本地",counter,num)counter+=1else:breakcap.release()
cv2.destroyAllWindows()
3、将采集到的动作数据集利用mediapipe库检测手部关键点信息,转换成数据信息保存到本地
import os
import pickleimport mediapipe as mp
import cv2
import matplotlib.pyplot as pltmp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styleshands = mp_hands.Hands(static_image_mode=True, min_detection_confidence=0.3)DATA_DIR = './data'data = []
labels = []
for dir_ in os.listdir(DATA_DIR):for img_path in os.listdir(os.path.join(DATA_DIR, dir_)):data_aux = []x_ = []y_ = []img