训练手势数据分类模型-从手势图片——手势关键点坐标-通过关键点识别手势

news/2025/2/7 10:22:25/文章来源:https://www.cnblogs.com/flyingsir/p/18702155

数据集:从手势图片——>手势关键点坐标

手势图片,获取手势关键点数据

from XEdu.hub import Workflow as wf
import numpy as npdef get_model_path():import ospath = os.path.dirname(os.path.abspath(__file__))model_path = os.path.join(path,'model.onnx')return model_pathhand = wf(task='pose_hand21',checkpoint=get_model_path())# 指定使用的onnx模型def inference(data):hand_features = hand.inference(data)hand_features = np.concatenate(hand_features).reshape(1, -1) #展平return hand_features

  

---
frameworks:
- other
license: Apache License 2.0
tasks:
- hand_detection#model-type:
##如 gpt、phi、llama、chatglm、baichuan 等
#- gpt#domain:
##如 nlp、cv、audio、multi-modal
#- nlp#language:
##语言代码列表 https://help.aliyun.com/document_detail/215387.html?spm=a2c4g.11186623.0.0.9f8d7467kni6Aa
#- cn #metrics:
##如 CIDEr、Blue、ROUGE 等
#- CIDEr#tags:
##各种自定义,包括 pretrained、fine-tuned、instruction-tuned、RL-tuned 等训练方法和其他
#- pretrained#tools:
##如 vllm、fastchat、llamacpp、AdaSeq 等
#- vllm
---
### 当前模型的贡献者未提供更加详细的模型介绍。模型文件和权重,可浏览“模型文件”页面获取。
#### 您可以通过如下git clone命令,或者ModelScope SDK来下载模型SDK下载
```bash
#安装ModelScope
pip install modelscope
```
```python
#SDK模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('tzlzy321/hand')
```
Git下载
```
#Git模型下载
git clone https://www.modelscope.cn/tzlzy321/hand.git
```<p style="color: lightgrey;">如果您是本模型的贡献者,
我们邀请您根据<a href="https://modelscope.cn/docs/ModelScope%E6%A8%A1%E5%9E%8B%E6%8E%A5%E5%85%A5%E6%B5%81%E7%A8%8B%E6%A6%82%E8%A7%88"
style="color: lightgrey; text-decoration: underline;">模型贡献文档</a>,及时完善模型卡片内容。</p>

  

模型下载地址;

model.onnx

https://www.modelscope.cn/models/tzlzy321/hand/resolve/master/model.onnx

 

 

 

 

 手势分类数据集workflow_pose.csv包含了手势的21 个关键点坐标,每个手势对应一个标签。

 

拓展实验:训练手势数据分类模型

 

 

 

用支持向量机训练手势分类数据

材料

  • 训练手势数据分类模型(支持向量机).ipynb
  • workflow_pose_val.csv
  • workflow_pose_train.csv

活动目的

了解SVM算法的基本原理及其在分类任务中的应用;掌握使用BaseML库实现SVM模型的训练和评估,能够解释模型评估指标的含义. 。;

背景知 识支持向量机(SVM)是一种强大的分类算法,特别适用于高维数据的分类任务。¶

本节课中,我们使用使用BaseML等工具来实现算法。

 

手势分类数据集workflow_pose.csv包含了手势的21个关键点坐标,每个手势对应一个标签。支持向量机(SVM)作为一种高效且强大的分类算法,其在处理复杂分类问题时展现出的优越性能,使其成为了实现手势分类的有力工具。我们将使用手势分类数据集来训练SVM模型,并预测手势类别。

 

步骤1:数据准备

查看数据集 数据集workflow_pose_train.csv是使用XEduHub提取的关键点信息文件,

前42列为关键点信息数据,代表21个关键点,每个关键点两个坐标数据;最后一列为标签,

“0”代表手势1,“1”代表手势3,“2”代表手势5。 可以直接打开数据集文件查看具体内容,也可以使用 Python 的 pandas 库来读取CSV 文件,具体代码如下:

import pandas as pd
# 查看CSV
df = pd.read_csv("data/workflow_pose_train.csv", header=None)
df

  

 

步骤2:加载模型

首先我们需要导入必要的库文件并构建SVM分类器。在构建SVM分类器时,

使用Classification模块并通过cls('SVM')实例化模型,构建SVM分类器的目标是将数据划分为不同的类别;

而在构建线性回归模型时,使用Regression模块并通reg('LinearRegression'/'Polynomial')实例化模型,目标是预测连续的数值。两者的任务模块和算法选择不同。

 

# 更新库
!pip install --upgrade BaseML
# 导入BaseML的分类模块
from BaseML import Classification as cls
# 使用BaseML中的SVM模块
model=cls('SVM')

  

 

步骤3:训练模型

将数据集载入模型,进行模型训练,并将模型保存至指定路径,

假设数据放置在当前目录下的data文件夹中,训练好的模型存储于当前目录下的checkpoints文件夹中。

# 将数据导入模型中
model.load_tab_data('data/workflow_pose_train.csv')
# 模型训练
model.train()
# 模型保存
model.save('checkpoints/SVM_1.pkl')

  

Saving model checkpoints...
Saved successfully!

步骤4:验证模型

模型已经训练完成,但是这样的模型具体的效果究竟好不好?对回归任务来说,

简单好用的评估指标之一是R平方值,而对分类任务来说,一般选择准确率指标,

准确率可以评价分类模型的准确度,衡量模型预测正确的实例占所有实例的比例。

想象一下你在做一个分类测试,准确率就是你回答正确的问题数量占总问题数量的比例。

准确率越高,表示模型整体预测的准确性越强。

model.load('checkpoints/SVM_1.pkl')# 验证模型  这里使用的是准确度验证acc
model.valid('data/workflow_pose_val.csv',metrics='acc')

  

 

步骤5:应用模型 【等待项目下载完成。】

在应用模型时,使用模型仓库repo获取图像中的关键点坐标, 测试输出的手势类型是否正确。

from BaseML import Classification as cls
from XEdu.hub import Workflow as wf
model = wf(repo='tzlzy321/hand')
res = model.inference('4.jpg')# 载入已保存模型
baseml = wf(task='baseml',checkpoint='checkpoints/SVM_1.pkl') # 指定使用的pkl模型
# 确保模型文件正确加载
# if isinstance(baseml.model, dict):
#     baseml.model = baseml.model['model']  # 提取模型对象# 使用加载的模型进行推理
result= baseml.inference(res) # 进行模型推理
print(result)

  

model = wf(repo='tzlzy321/hand')

会在这里地址下载项目,工具。

https://www.modelscope.cn/models/tzlzy321/hand

 

res = model.inference('4.jpg')
获取手势图片的关键点数据。
使用模型,分析关键点数据,
判断是什么手势。

 

 

 

 

 

 

 # 可视化窗口应用

#只能是英文的路径
import os
import numpy as np
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
from XEdu.hub import Workflow as wfclass GestureRecognitionApp:def __init__(self, root):self.root = rootself.root.title("手势识别系统")self.root.geometry("800x600")# 创建变量self.model_path = tk.StringVar()self.image_path = tk.StringVar()self.result_text = tk.StringVar()# 创建控件self.create_widgets()def create_widgets(self):# 模型选择tk.Label(self.root, text="选择模型:").grid(row=0, column=0, padx=10, pady=10)self.model_entry = tk.Entry(self.root, textvariable=self.model_path, width=50)self.model_entry.grid(row=0, column=1, padx=10, pady=10)tk.Button(self.root, text="浏览", command=self.load_model).grid(row=0, column=2, padx=10, pady=10)# 图片选择tk.Label(self.root, text="选择图片:").grid(row=1, column=0, padx=10, pady=10)self.image_entry = tk.Entry(self.root, textvariable=self.image_path, width=50)self.image_entry.grid(row=1, column=1, padx=10, pady=10)tk.Button(self.root, text="浏览", command=self.load_image).grid(row=1, column=2, padx=10, pady=10)# 显示图片self.image_label = tk.Label(self.root)self.image_label.grid(row=2, column=0, columnspan=3, padx=10, pady=10)# 显示结果tk.Label(self.root, text="识别结果:").grid(row=3, column=0, padx=10, pady=10)self.result_label = tk.Label(self.root, textvariable=self.result_text, font=("Arial", 12), wraplength=400)self.result_label.grid(row=3, column=1, columnspan=2, padx=10, pady=10)# 识别按钮tk.Button(self.root, text="开始识别", command=self.recognize).grid(row=4, column=0, columnspan=3, padx=10, pady=10)def load_model(self):file_path = filedialog.askopenfilename(filetypes=[("Pickle files", "*.pkl"), ("All files", "*.*")])if file_path:self.model_path.set(file_path)def load_image(self):file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.png;*.jpeg"), ("All files", "*.*")])if file_path:self.image_path.set(file_path)self.display_image(file_path)def display_image(self, image_path):img = Image.open(image_path)img.thumbnail((400, 400))  # 调整图片大小img_tk = ImageTk.PhotoImage(img)self.image_label.config(image=img_tk)self.image_label.image = img_tk  # 保持对图片的引用def recognize(self):model_path = self.model_path.get()image_path = self.image_path.get()if not model_path or not image_path:messagebox.showwarning("警告", "请先选择模型和图片!")returntry:# 加载手势检测模型model = wf(task='det_hand', repo='tzlzy321/hand')res = model.inference(image_path)  # 手势检测的结果# 检查 res 是否为 Noneif res is None:raise ValueError("手势检测模型没有返回结果,请检查输入图片是否有效。")# 加载 SVM 模型baseml = wf(task='baseml', checkpoint=model_path)if isinstance(baseml.model, dict):baseml.model = baseml.model['model']  # 提取模型对象# 提取手势检测结果中的特征features = np.array(res).reshape(1, -1)  # 将特征转换为二维数组# 使用加载的 SVM 模型进行推理result = baseml.inference(features)  # 进行模型推理self.result_text.set(f"识别结果: {result}")except Exception as e:messagebox.showerror("错误", f"识别过程中发生错误: {e}")if __name__ == "__main__":root = tk.Tk()app = GestureRecognitionApp(root)root.mainloop()

  

 

 

 

 

# 中文路径的处理

 
import os
import shutil
import numpy as np
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageTk
from XEdu.hub import Workflow as wf
import tempfileclass GestureRecognitionApp:def __init__(self, root):self.root = rootself.root.title("手势识别系统")self.root.geometry("800x600")# 创建变量self.model_path = tk.StringVar()self.image_path = tk.StringVar()self.result_text = tk.StringVar()# 创建控件self.create_widgets()def create_widgets(self):# 模型选择tk.Label(self.root, text="选择模型:").grid(row=0, column=0, padx=10, pady=10)self.model_entry = tk.Entry(self.root, textvariable=self.model_path, width=50)self.model_entry.grid(row=0, column=1, padx=10, pady=10)tk.Button(self.root, text="浏览", command=self.load_model).grid(row=0, column=2, padx=10, pady=10)# 图片选择tk.Label(self.root, text="选择图片:").grid(row=1, column=0, padx=10, pady=10)self.image_entry = tk.Entry(self.root, textvariable=self.image_path, width=50)self.image_entry.grid(row=1, column=1, padx=10, pady=10)tk.Button(self.root, text="浏览", command=self.load_image).grid(row=1, column=2, padx=10, pady=10)# 显示图片self.image_label = tk.Label(self.root)self.image_label.grid(row=2, column=0, columnspan=3, padx=10, pady=10)# 显示结果tk.Label(self.root, text="识别结果:").grid(row=3, column=0, padx=10, pady=10)self.result_label = tk.Label(self.root, textvariable=self.result_text, font=("Arial", 12), wraplength=400)self.result_label.grid(row=3, column=1, columnspan=2, padx=10, pady=10)# 识别按钮tk.Button(self.root, text="开始识别", command=self.recognize).grid(row=4, column=0, columnspan=3, padx=10, pady=10)def load_model(self):file_path = filedialog.askopenfilename(filetypes=[("Pickle files", "*.pkl"), ("All files", "*.*")])if file_path:self.model_path.set(os.path.normpath(file_path))  # 标准化路径def load_image(self):file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.jpg;*.png;*.jpeg"), ("All files", "*.*")])if file_path:self.image_path.set(os.path.normpath(file_path))  # 标准化路径self.display_image(file_path)def display_image(self, image_path):try:img = Image.open(image_path)img.thumbnail((400, 400))  # 调整图片大小img_tk = ImageTk.PhotoImage(img)self.image_label.config(image=img_tk)self.image_label.image = img_tk  # 保持对图片的引用except Exception as e:messagebox.showerror("错误", f"加载图片失败: {e}")def recognize(self):model_path = self.model_path.get()image_path = self.image_path.get()if not model_path or not image_path:messagebox.showwarning("警告", "请先选择模型和图片!")return# 检查模型文件是否存在if not os.path.exists(model_path):messagebox.showerror("错误", f"模型文件不存在: {model_path}")return# 检查图片文件是否存在if not os.path.exists(image_path):messagebox.showerror("错误", f"图片文件不存在: {image_path}")returntry:# 创建临时目录temp_dir = tempfile.mkdtemp()temp_image_path = os.path.join(temp_dir, os.path.basename(image_path))# 将图片复制到临时目录shutil.copy(image_path, temp_image_path)# 加载手势检测模型model = wf(task='det_hand', repo='tzlzy321/hand')res = model.inference(temp_image_path)  # 手势检测的结果# 检查 res 是否为 Noneif res is None:raise ValueError("手势检测模型没有返回结果,请检查输入图片是否有效。")# 加载 SVM 模型baseml = wf(task='baseml', checkpoint=model_path)if isinstance(baseml.model, dict):baseml.model = baseml.model['model']  # 提取模型对象# 提取手势检测结果中的特征features = np.array(res).reshape(1, -1)  # 将特征转换为二维数组# 使用加载的 SVM 模型进行推理result = baseml.inference(features)  # 进行模型推理self.result_text.set(f"识别结果: {result}")# 删除临时目录shutil.rmtree(temp_dir)except Exception as e:messagebox.showerror("错误", f"识别过程中发生错误: {e}")if __name__ == "__main__":root = tk.Tk()app = GestureRecognitionApp(root)root.mainloop()

  

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879973.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数学】信息论之从熵、惊奇到交叉熵、KL散度和互信息

转自:https://www.cnblogs.com/justLittleStar/p/17322197.html 一、熵(PRML) 考虑将A地观测的一个随机变量x,编码后传输到B地。这个随机变量有8种可能的状态,每个状态都是等可能的。为了把x的值传给接收者,需要传输一个3-bits的消息。注意,这个变量的熵由下式给出:⾮均…

用多项式回归分析简单投掷数据-训练投石机数据预测模型

用多项式回归分析简单投掷数据 进阶实验:训练投石机数据预测模型 问题描述:(1)投掷角度不变,已知电机速度,如何得出实际投掷距离?(2)其电机速度(motor_speed)和投掷距离(distance)的对应关系有什么关系? 投掷角度不变,电 机速度与投掷距离 的数据集展示: 学习:i可以通过…

css背景模糊效果

下面是效果下面是实现代码<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-…

线性回归模型训练-训练温度传感器数据预测模型

基础实验:训练温度传感器数据预测模型 任务描述:LM35是科创作品制作中常用的温度传感器(1)已知电压值, 如何得出实际温度值?(2)输出电压(Sensor)和真实温度(Temperature)有什么关 系?请借助大模型生成这两列数据的关系图 /目录学习:可以通过机器学习,训练传感器数据预测模型…

【分享】银行业如何实现内外网文件传输,保持核心竞争力?

数据要素是数字经济的重要基石,也是国家经济安全的关键要素。银行业数据因其数据体量大、数据类型多、涉及主体庞大及应用场景复杂等天然特征,在数据流转上面临风险和挑战,包括法律法规层面、安全层面、效率层面等。为响应和落实国家层面对于金融行业网络安全的建设要求,同…

SMT32的HEX文件里加入固件版本的方法(转)

使用MDK编译器,让STM32程序HEX文件中加入固件版本信息。 代码代码如下: //------------------------------------------------------------------------------#include <absacc.h>//------------------------------------------------------------------------------#d…

uniapp 自定义tabBar组件 custom-tab-bar

custom-tab-bar 自定义tabBar组件。 在小程序和App端,为提升性能,在 pages.json 里配置固定的原生tabBar。但在H5端,这一设计并不会提升性能。 同时,H5端尤其是PC宽屏,对tabBar的位置和样式有更灵活的需求,tabBar作为一级导航,更多的时候是在PC网页顶部而不是底部。 自定…

无法连接/访问 Linux虚拟的中的端口(Redis)

Could not connect to Redis at 192.168.137.132:6379: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。当出现 “Could not connect to Redis at 192.168.137.132:6379: No route to host” 错误,意味着客户端无法找到通往 Redis 服务器(IP 为 192…

钉钉发送告警(非@)

环境: OS:Centos 7 python:2.7[root@yunwei-zabbix-1000001-prd alertscripts]# more dingtalk_middleware.py #!/usr/bin/env python #-*- coding: utf-8 -*-import sys, json, urllib2def Dingtalk(message):content = messageurl = "https://oapi.dingtalk.com/robot/…

为GitLab配置Microsoft Graph作为邮件收发工具

先决条件Microsoft/Office 365订阅(Exchange是必须的)并添加一个gitlab专用的账户,本文使用E5开发者订阅 部署好的GitLab,参考上一篇文章步骤一、 配置Microsoft Entra 1. 注册应用程序 登录Azure门户,进入Microsoft Entra ID,选择管理-应用注册-新注册填写你想要的名称,…

C# 深度学习框架 TorchSharp 原生训练模型和图像识别-自定义网络模型和识别手写数字

目录使用 Torch 训练模型定义神经网络加载数据集创建网络模型定义损失函数训练识别手写图像 教程名称:使用 C# 入门深度学习 作者:痴者工良 教程地址:https://torch.whuanle.cn 电子书仓库:https://github.com/whuanle/cs_pytorch Maomi.Torch 项目仓库:https://github.co…