机器学习:KNN完成英文手语分类
机器学习:KNN完成英文手语分类
先来看一下标准的英文手语:
本文KNN网络识别部分效果:(当然只挑选了几个字母):
完成的主要流程为:
- 通过mediapipe处理kaggle上的一个图片数据集,获取21个标志点的位置关系
- 建立KNN模型
- 模型检测
建立数据集
图片数据集来源Kaggle上的一个数据集,数据集链接。
下载完成后我们得到是一堆128*128的图像,不会DL的菜鸡只能借助mediapipe完成标志点信息的提取(mediapipe的相关分装在另一篇文章中有介绍,也可见文末)。
处理流程为:
- 遍历图片数据集,利用mediapipe完成手势信息的提取(为提高准确度,可调节置信区间,在另一篇文章中有介绍),也就是21个坐标点的xy坐标。
- 数据集的提供者将图片文件的最后一个字母设置为手势的含义,我们可以将他作为我们的目标值保存到文件中。
import pandas as pd
import HandTrackingModule as htm
import cv2
import os
import time
import numpy as np
import csvdetector = htm.handDetctor(mode=True, detectionCon=0.6, trackCon=0.6)
csv_col_name = ['0_x', '0_y', '1_x', '1_y', '2_x', '2_y', '3_x', '3_y', '4_x', '4_y', '5_x', '5_y','6_x', '6_y', '7_x', '7_y', '8_x', '8_y', '9_x', '9_y', '10_x', '10_y', '11_x', '11_y','12_x', '12_y', '13_x', '13_y', '14_x', '14_y', '15_x', '15_y', '16_x', '16_y', '17_x', '17_y','18_x', '18_y', '19_x', '19_y', '20_x', '20_y','target']def load_image():path = "dataset5"dirs = os.listdir(path)for file_ABCD in dirs:for file_abcd in os.listdir(path+"/"+file_ABCD):for img_path in os.listdir(path+"/"+file_ABCD+"/"+file_abcd):# 跳过暗的图片if "depth" in img_path:continue# print(path+"/"+file_ABCD+"/"+file_abcd+"/"+img_path)img = cv2.imread(path+"/"+file_ABCD+"/"+file_abcd+"/"+img_path)# 对图像进行处理img = detector.findHands(img)lmList = detector.findPosition(img, draw=False)if len(lmList) == 42:# print(lmList)# print(file_abcd)lmList.append(file_abcd)# 将特征点写入csv文件中write_to_csv(lmList)cv2.imshow("show", img)cv2.waitKey(1)def write_to_csv(lmList):# test = pd.DataFrame(columns=csv_col_name, data=[lmList])# test.to_csv('testcsv.csv', index=True)with open(r'testcsv.csv', mode='a', newline='', encoding='utf8') as cfa:csv_write = csv.writer(cfa)csv_write.writerow(lmList)return Noneif __name__ == '__main__':load_image()
我们将数据保存到testcsv.csv文件中,如下图:
其实这数据量有点小
建立模型以及评估
建立模型:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
import joblibdef load_data():data = pd.read_csv("testcsv.csv")# print(data.iloc[:, 0:42])# 划分数据集x_train, x_test, y_train, y_test = train_test_split(data.iloc[:, 0:42], data.target, random_state=10)# 标准化transfer = StandardScaler()x_train = transfer.fit_transform(x_train)# 训练集和测试集做相同处理(很重要!)x_test = transfer.transform(x_test)# KNN算法预估器 建立模型estimator = KNeighborsClassifier(n_neighbors=10)# 添加网格搜索交叉验证param_dict = {"n_neighbors": [11, 13, 15, 17, 19, 21]}estimator = GridSearchCV(estimator, param_grid=param_dict, cv=10)estimator.fit(x_train, y_train)# 模型评估# 1 直接对比真实值和预估值y_predict = estimator.predict(x_test)print(y_predict == y_test)# 计算准确率score = estimator.score(x_test, y_test)print(score)# 保存模型joblib.dump(estimator, "k_near.pkl")
实时检测:
import HandTrackingModule as htm
import cv2
import numpy as npwCam, hCam = 640, 480
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(3, wCam)
cap.set(4, hCam)detector = htm.handDetctor(detectionCon=0.6, trackCon=0.6)
model = joblib.load("k_near.pkl")while True:success, img = cap.read()img = detector.findHands(img)lmList = detector.findPosition(img, draw=False)if len(lmList) == 42:lm = transfer.transform(np.array(lmList).reshape(1, -1))m_predict = model.predict(lm)cv2.putText(img, str(m_predict), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)cv2.imshow("image", img)if cv2.waitKey(2) & 0xFF == 27:break
可优化点
- KNN的参数和网格搜索的范围都可以再进行优化。
- KNN本身只适用于小数据场景,且对K值敏感,总体手势识别效果一般。
- 数据预处理部分极为粗糙,可进行数据清洗等操作
考研了,也懒得整了
附
HandTrackingModule.py
import cv2
import mediapipe as mp
import time
import mathclass handDetctor():def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):self.mode = modeself.maxHands = maxHandsself.detectionCon = detectionConself.trackCon = trackConself.mpHands = mp.solutions.handsself.hands = self.mpHands.Hands(self.mode, self.maxHands,self.detectionCon, self.trackCon)self.mpDraw = mp.solutions.drawing_utilsdef findHands(self, img, draw=True, ):imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#转换为rgbself.results = self.hands.process(imgRGB)# print(results.multi_hand_landmarks)if self.results.multi_hand_landmarks:for handLms in self.results.multi_hand_landmarks:if draw:self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)return imgdef findPosition(self, img, handNo=0, draw=True):lmList = []if self.results.multi_hand_landmarks:myHand = self.results.multi_hand_landmarks[handNo]for id, lm in enumerate(myHand.landmark):# print(id, lm)# 获取手指关节点h, w, c = img.shape# cx, cy = int(lm.x*w), int(lm.y*h)lmList.append(lm.x)lmList.append(lm.y)# if draw:# cv2.putText(img, str(int(id)), (cx+10, cy+10), cv2.FONT_HERSHEY_PLAIN,# 1, (0, 0, 255), 2)return lmListdef fingerStatus(self, lmList):# 返回列表 包含每个手指的开合状态fingerList = []id, originx, originy = lmList[0]keypoint_list = [[2, 4], [6, 8], [10, 12], [14, 16], [18, 20]]for point in keypoint_list:id, x1, y1 = lmList[point[0]]id, x2, y2 = lmList[point[1]]if math.hypot(x2-originx, y2-originy) > math.hypot(x1-originx, y1-originy):fingerList.append(True)else:fingerList.append(False)return fingerList
机器学习:KNN完成英文手语分类相关推荐
- 机器学习——kNN算法之红酒分类
目录 StandardScaler的使用 KNeighborsClassifier的使用 代码实现 数据集介绍 数据集为一份红酒数据,总共有 178 个样本,每个样本有 13 个特征,这里不会为你提供 ...
- [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- [Python人工智能] 二十一.Word2Vec+CNN中文文本分类详解及与机器学习(RF\DTC\SVM\KNN\NB\LR)分类对比
从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章分享了Keras实现RNN和LSTM的文本分类算法,并与传统的机器学习分类算法进行对比实验.这篇文章我们将继续巩固 ...
- 基于机器学习和TFIDF的情感分类算法,详解自然语言处理
摘要:这篇文章将详细讲解自然语言处理过程,基于机器学习和TFIDF的情感分类算法,并进行了各种分类算法(SVM.RF.LR.Boosting)对比 本文分享自华为云社区<[Python人工智能] ...
- 机器学习 —— KNN算法简单入门
机器学习 -- KNN算法简单入门 第1关:手动实现简单kNN算法 1 KNN算法简介 1.1 kNN 算法的算法流程 1.2 kNN 算法的优缺点 1.3 编程要求+参数解释 2. 代码实现 3. ...
- 机器学习中常见的六种分类算法(附Python源码+数据集)
今天和大家学习一下机器学习中常见的六种分类算法,如K近邻.决策树.朴素贝叶斯.逻辑回归.支持向量机.随机森林 除了介绍这六种不同分类算法外,还附上对应的Python代码案例,并分析各自的优缺点. 01 ...
- 机器学习中相关英文专业术语
机器学习中相关英文专业术语 Name Instructions activation function 激活函数 additive noise 加性噪声 autoencoder 自编码器 Autoen ...
- 【英文文本分类实战】之四——词典提取与词向量提取
·请参考本系列目录:[英文文本分类实战]之一--实战项目总览 ·下载本实战项目资源:神经网络实现英文文本分类.zip(pytorch) [1] 提取词典 在这一步,我们需要把训练集train.cs ...
- 【英文文本分类实战】之三——数据清洗
·请参考本系列目录:[英文文本分类实战]之一--实战项目总览 ·下载本实战项目资源:神经网络实现英文文本分类.zip(pytorch) [1] 为什么要清洗文本 这里涉及到文本分类任务中:词典.词 ...
最新文章
- 调用训练好的模型(tensorflow)
- 怎么去除桌面图标显示快捷方式字样?
- .net 调用命令行进行解压缩
- 设置一段文字显示不同的颜色及大小等属性
- outlook日历不显示_如何在Outlook Online中突出显示不同的日历
- 轻松生成ip地址的姿势,最快得到批量***目标
- ERP项目管理的关键控制点
- C3P0连接池配置方式
- php推送mip示例,首页—mip推送软件—首页
- [转]模块化——Common规范及Node模块实现
- 建筑能源管理系统主要有什么功能?
- 智慧医疗整体解决方案
- Git简介之部分易混淆命令的简单介绍
- 基于vue2使用vue-awesome-swiper 轮播图(踩坑记录)
- 高德导航在天地图显示
- Git无法clone问题
- linux 设置u盘为只读模式,U盘如何设置为只读模式
- 为什么说智能传感器必将引领时代前行?
- 五大抉择影响女人一生幸福
- 什么是PWM信号,如何实现PWM信号输出?