这个博客主要是针对我自己发布的手势识别代码资源的修改方式,有需要的可以到我的主页去下载该资源。地址如下https://download.csdn.net/download/qq_35675872/89619225?spm=1001.2014.3001.5501
一、如何使用该代码
该手势识别代码是基于opencv的mediapipe手势识别代码,首先你的电脑需要有相应的环境,即需要先安装opencv和mediapipe。
在安装并配置好相关环境后,首先需要对dataset中的文件进行修改,具体修改方式见下文第二点,这里可以先使用我提前收集好的数据集。
接下来需要先打开extract_feature.py文件并运行,运行需要一定的时间。程序运行完自动退出后会在文件根目录下生成一个名为finger_feature的文件夹,看到文件夹后即可进行下一步。
打开train_gesture_classifier.py文件,直接运行。程序运行结束后会在根目录下输出一个名为gesture_detector.model的模型文件,终端中会输出本次训练出的模型的准确率,可以多训练几次得到正确率最高的模型。
得到了模型之后打开gesture_detector.py,直接运行即可使用电脑摄像头进行对于手势的实时识别。
二、修改需要识别的手势
想要识别需要识别的手势,需要到文件夹的根目录中的dateset目录下。
像图片中这样将建立子文件夹并命名,比如我这里的000-rock就代表的是第0种手势是石头,其它文件夹也是同理。新建完文件夹后需要向其中添加数据集,比如000-rock种就要添加尽可能多且清晰的石头手势,并且每个图片中最好只出现一个人手。
在添加完数据集后还需要对代码进行一定的修改。打开根目录下的gesture_detector.py文件,找到以下内容:
data = ["石头","一","剪刀","三","四","布","六","七","八","九","无"]
这里代表了在dataset中的各类手势,将其中的内容改为dataset中对应的即可,并且将最后的"无"保留。
在修改完data中的内容后,还需要对gesture_detector.py的第109行进行修改。
output = f"手势:{data[10]}"
将这里的10改为data的长度减一。
在全部都修改完毕之后按照文章一开始的流程训练一次即可。
三、修改指节算法
修改指节算法的目的是通过对不同指节的距离进行加减以判断手势的种类,适当的修改可以提高识别的准确率,但是过度的修改反而会适得其反。手的各个指节的代码如下图所示:
首先打开extract_feature.py文件并找到如下代码。
for finger_idx in [4, 8, 12, 16]:
tips_distance.append(np.linalg.norm(hand_landmarks_np[finger_idx] - hand_landmarks_np[finger_idx + 4]))
tips_distance.append(np.linalg.norm(hand_landmarks_np[20] - hand_landmarks_np[4]))
这段代码的含义就是计算了每个相邻指尖以及大拇指与小拇指指尖之间的距离之和。也就是说我们训练的模型是通过这些指尖的距离来判断手势的。
如果你想要添加更多的细节只需要在这些代码后面添上相应的内容即可,比如我除了想计算指尖指尖的距离,我还想计算指尖到指根的距离,那根据以上的指节编号,就是指节4与指节1的距离加上指节8与指节5的距离再加上.......。那么我们就可以这么写:
for finger_idx in [4, 8, 12, 16, 20]:
tips_distance.append(np.linalg.norm(hand_landmarks_np[finger_idx] - hand_landmarks_np[finger_idx - 3]))
以此类推也可以加上或减去一些指节间的计算。
在对extract_feature.py中的内容进行修改过后,还需要对gesture_detector.py中的内容进行相应的修改。在函数 finger_distance_feature(hand_landmarks) 中找到extract_feature.py中我们找到的代码,然后将其中的内容改为与extract_feature.py文件中修改过后的代码一致即可。
修改完后同样需要重新训练模型才能使用。使用摄像头进行识别时若出现如 ValueError: X has 4 features, but KNeighborsClassifier is expecting 5 features as input. 的报错,则说明gesture_detector.py与extract_feature.py中的代码修改不一致。