机器学习:KNN完成英文手语分类

先来看一下标准的英文手语:

本文KNN网络识别部分效果:(当然只挑选了几个字母):



完成的主要流程为:

  1. 通过mediapipe处理kaggle上的一个图片数据集,获取21个标志点的位置关系
  2. 建立KNN模型
  3. 模型检测

建立数据集

图片数据集来源Kaggle上的一个数据集,数据集链接。
下载完成后我们得到是一堆128*128的图像,不会DL的菜鸡只能借助mediapipe完成标志点信息的提取(mediapipe的相关分装在另一篇文章中有介绍,也可见文末)。
处理流程为:

  1. 遍历图片数据集,利用mediapipe完成手势信息的提取(为提高准确度,可调节置信区间,在另一篇文章中有介绍),也就是21个坐标点的xy坐标。
  2. 数据集的提供者将图片文件的最后一个字母设置为手势的含义,我们可以将他作为我们的目标值保存到文件中。
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

可优化点

  1. KNN的参数和网格搜索的范围都可以再进行优化。
  2. KNN本身只适用于小数据场景,且对K值敏感,总体手势识别效果一般。
  3. 数据预处理部分极为粗糙,可进行数据清洗等操作

考研了,也懒得整了

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完成英文手语分类相关推荐

  1. 机器学习——kNN算法之红酒分类

    目录 StandardScaler的使用 KNeighborsClassifier的使用 代码实现 数据集介绍 数据集为一份红酒数据,总共有 178 个样本,每个样本有 13 个特征,这里不会为你提供 ...

  2. [Python从零到壹] 十四.机器学习之分类算法五万字总结全网首发(决策树、KNN、SVM、分类对比实验)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  3. [Python人工智能] 二十一.Word2Vec+CNN中文文本分类详解及与机器学习(RF\DTC\SVM\KNN\NB\LR)分类对比

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章分享了Keras实现RNN和LSTM的文本分类算法,并与传统的机器学习分类算法进行对比实验.这篇文章我们将继续巩固 ...

  4. 基于机器学习和TFIDF的情感分类算法,详解自然语言处理

    摘要:这篇文章将详细讲解自然语言处理过程,基于机器学习和TFIDF的情感分类算法,并进行了各种分类算法(SVM.RF.LR.Boosting)对比 本文分享自华为云社区<[Python人工智能] ...

  5. 机器学习 —— KNN算法简单入门

    机器学习 -- KNN算法简单入门 第1关:手动实现简单kNN算法 1 KNN算法简介 1.1 kNN 算法的算法流程 1.2 kNN 算法的优缺点 1.3 编程要求+参数解释 2. 代码实现 3. ...

  6. 机器学习中常见的六种分类算法(附Python源码+数据集)

    今天和大家学习一下机器学习中常见的六种分类算法,如K近邻.决策树.朴素贝叶斯.逻辑回归.支持向量机.随机森林 除了介绍这六种不同分类算法外,还附上对应的Python代码案例,并分析各自的优缺点. 01 ...

  7. 机器学习中相关英文专业术语

    机器学习中相关英文专业术语 Name Instructions activation function 激活函数 additive noise 加性噪声 autoencoder 自编码器 Autoen ...

  8. 【英文文本分类实战】之四——词典提取与词向量提取

    ·请参考本系列目录:[英文文本分类实战]之一--实战项目总览 ·下载本实战项目资源:神经网络实现英文文本分类.zip(pytorch) [1] 提取词典   在这一步,我们需要把训练集train.cs ...

  9. 【英文文本分类实战】之三——数据清洗

    ·请参考本系列目录:[英文文本分类实战]之一--实战项目总览 ·下载本实战项目资源:神经网络实现英文文本分类.zip(pytorch) [1] 为什么要清洗文本   这里涉及到文本分类任务中:词典.词 ...

最新文章

  1. 调用训练好的模型(tensorflow)
  2. 怎么去除桌面图标显示快捷方式字样?
  3. .net 调用命令行进行解压缩
  4. 设置一段文字显示不同的颜色及大小等属性
  5. outlook日历不显示_如何在Outlook Online中突出显示不同的日历
  6. 轻松生成ip地址的姿势,最快得到批量***目标
  7. ERP项目管理的关键控制点
  8. C3P0连接池配置方式
  9. php推送mip示例,首页—mip推送软件—首页
  10. [转]模块化——Common规范及Node模块实现
  11. 建筑能源管理系统主要有什么功能?
  12. 智慧医疗整体解决方案
  13. Git简介之部分易混淆命令的简单介绍
  14. 基于vue2使用vue-awesome-swiper 轮播图(踩坑记录)
  15. 高德导航在天地图显示
  16. Git无法clone问题
  17. linux 设置u盘为只读模式,U盘如何设置为只读模式
  18. 为什么说智能传感器必将引领时代前行?
  19. 五大抉择影响女人一生幸福
  20. 什么是PWM信号,如何实现PWM信号输出?

热门文章

  1. cs起源本地服务器无响应,CS起源上为什么我无法进入有反作
  2. linux动画制作软件,你也可以成为设计师!宫崎骏御用2D动画制作软件
  3. airpods pro是按压还是触摸_苹果三代耳机是触摸还是按键
  4. Linux 日历和计算器命令
  5. 清明节网站变灰是如何实现的
  6. 孙宇晨为恶俗炒作道歉;华为回应美国子公司裁员 600
  7. 海岸鸿蒙2018年标准物质,海岸鸿蒙标准物质目录.doc
  8. 两寸照片有多大?教你把照片尺寸修改成两寸的方法
  9. 猫学习IOS(四)UI半小时就搞定Tom猫
  10. Elasticsearch时区问题