姿态估计 手势动作实时识别项目(基于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,os
DATA_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 = 0
while 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'):
break
if 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+=1
else:
break
cap.release()
cv2.destroyAllWindows()
3、将采集到的动作数据集利用mediapipe库检测手部关键点信息,转换成数据信息保存到本地
import os
import pickle
import mediapipe as mp
import cv2
import matplotlib.pyplot as plt
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
hands = 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