深度学习入门yolo12手势识别项目


目的:了解做深度学习项目的流程
yolo官网
首先要了解深度学习是什么?
简单理解:从一堆输入数据中提取特征,然后根据这个特征进行识别处理输出

本文章讲述使用yolo12n模型识别图片+mediapipe识别手的21个关键点+xgboost分类器实现的
项目代码下载下来看效果更好

第一步:准备数据集

你可以自己制造数据或者找网上的数据集,如Hugging Face上的免费模型和数据集
本项目我用的是hagRIDv2_512手势数据集,主要这个小一点才100G,我用的是一部分数据
使用task.py的方法二下载完整数据(不需要的可以直接用我项目中的)

# 方法二:从缓存的数据集读取数据  
  
# 加载数据集 第一次会下载100G数据到本地  
Handdata=DataSet()  
imgs,labels=Handdata.get_dataset(show=False)  
# # 保存到本地 # for i,img in enumerate(imgs):  
#     Handdata.save_image_with_label(frame=img,label=labels[i],save_dir="classifierSet")  
hands_features=[]  
  
# 识别手的21个关键点  
for i,img in enumerate(imgs):  
    hands_feature = hand_detect(img, show=True, show_hand=True)  
    if hands_feature != []:  
        # 目前支持一个手  
        hands_features.append(hands_feature[0])  
    else:  
        hands_features.append([])  
# 使用xgboost分类  
train_classifier_complex(hands_features,labels,Handdata.lable_names,random_state=int(time.time()))

第一次把保存这里不注释把数据下载到本地,按文件夹分类,可以置每个类别固定张数,不然100w张保存不下来

# # 保存到本地  
# for i,img in enumerate(imgs):  
#     Handdata.save_image_with_label(frame=img,label=labels[i],save_dir="classifierSet")

第二步:对数据集按比例分配,并数据标注

  1. 数据集分类
    把数据集分成两个或者三份
    两份的话是:训练集(80%)和测试集(20%)
    三份的话是:训练集(60%)和验证集(20%)和测试集(20%),效果更好
    • 训练集是用来训练的数据特征
    • 测试集是在训练时用正在训练的模型来识别没有训练的数据进行判别效果
    • 验证集是用来验证训练的模型在实际效果如何
  2. 数据标注
    我用的是别人制作的数据标识软件需要可以下载
    意思:在图片上标注矩形框,然后收集标记矩形框的位置和类型
    请添加图片描述如下图所示
    在这里插入图片描述
    数据标注是个体力活,我这个可以使用模型进行标注,前提你需要先训练一点数据,然后让模型标注,最后自己把标错的纠正一下
  3. 把标注的数据放到yolo指定文件夹里
trainSet    
  ├── images
  │      ├─ train   训练集图片
  │      └──val     验证集图片
  └── labels
		├── train   训练集标识数据(.txt)
		└── val     验证集标识数据(.txt)

data.yaml数据配置

# 数据集根目录(改成当前trainSet的路径)
path: E:\hand\test\trainSet  
# 训练集图片路径  
train: images\train  
# 验证集图片路径  
val: images\val  
# 类别数量  
nc: 5  
# 类别名称(在数据标注类型中的顺序要和这里相同) 
names: ["like","ok","middle_finger","dislike","grip"]

第三步:训练yolo识别手势图像模型

在train.py文件中,把训练参数配置好,就可以训练了

# 训练模型配置  
model.train(  
    data='data.yaml',# 数据集配置路径  
    epochs=100,# 训练次数  
    imgsz=512,# 输入图像大小  
    batch=16,# 训练批次大小  
    device='cpu',# GPU = 0 ,CPU ='cpu'  
    patience=10,  # 早停机制,10 轮无提升则停止训练  
    workers=2,  # 使用 2 个数据加载线程  
    lr0=0.001,  # 初始学习率,例如 1e-3    lrf=0.01,  # 最终 LR ≈ lr0 * lrf = 0.001 * 0.01 = 1e-5    warmup_epochs=3,  # 热身阶段几轮  
    cos_lr=True  # 启用余弦学习率调度  
)

下图是一部分参数,详细参数看yolo官网训练参数
请添加图片描述

注意:训练模型既可以用 CPU,也可以用 GPU

  • GPU 训练:速度快,适合大规模数据集,但需要额外配置环境。
  • CPU 训练:无需复杂配置,适合数据量较小的情况。
    跑好的模型在runs目录下的train+最大值文件里

第四步:训练xgboost分类器

“XGBoost” 全称是 eXtreme Gradient Boosting,是一种流行的、效率很高的机器学习算法 / 库,常用于分类、回归、排序等监督学习任务。详细调优请看XGBoost 文档 ,也有XGBoost视频
运行task.py,跑方法一

# 方法一: 从本地读取数据  
# 本地数据读取  
hands_features, labels=process_files_in_directory(r"classifierSet",Typenum=85,label_names=["like","ok","middle_finger","dislike","grip"])  
# 训练分类器  
train_classifier_complex(hands_features, labels,label_names=["like","ok","middle_finger","dislike","grip"],n_trials=100,random_state=int(time.time()))

训练出来的分类器在classifierResult文件夹下hand_gesture_xgb_model_complex_+最大值

第五步:测试模型

在训练了yolo图像识别模型和xgboost分类模型后,选择yolo图像识别最好的模型和xgboost分类效率高的模型
在utils.py中跑下面代码

# 自己训练手势识别的模型 yolo11n识别类别 +mediapipe识别21个关键点 +xgb分类 支持 like 、dislike、 middle_finger、 ok、 grip五个手势  
# camera_my_model(r'runs/detect/train/weights/best.pt',r'classifierResult/hand_gesture_xgb_model_complex_15.pkl',conf=0.6)

能正常识别手势播放相应的音乐,你可以优化模型让模型识别正确同时速度快(作者入门优化什么不会😅)
自己训练的的模型:camera_my_model()识别的手势(作者水平有限😅)
请添加图片描述

别人训练的模型:camera_use_model()识别的手势
请添加图片描述

训练文件含义解释

run(训练好之后的结果)

请添加图片描述

train(训练结果目录)

weight 权重目录
weights
	├── best.pt   # 训练过程中表现最好的模型,可直接用于推理或部署  
	└── last.pt   # 最后一次保存的模型权重,用于中断后继续训练  
args.yaml(训练模型配置的参数)
task: detect  
mode: train  
model: yolo12n.pt  
data: data.yaml  
epochs: 100  
time: null  
patience: 10  
batch: 16  
imgsz: 512  
save: true  
save_period: -1  
cache: false  
device: cpu  
workers: 2  
project: null  
name: train  
exist_ok: false  
pretrained: true  
optimizer: auto  
verbose: true  
seed: 0  
deterministic: true  
single_cls: false  
rect: false  
cos_lr: false  
close_mosaic: 10  
resume: false  
amp: true  
fraction: 1.0  
profile: false  
freeze: null  
multi_scale: false  
compile: false  
overlap_mask: true  
mask_ratio: 4  
dropout: 0.0  
val: true  
split: val  
save_json: false  
conf: null  
iou: 0.7  
max_det: 300  
half: false  
dnn: false  
plots: true  
source: null  
vid_stride: 1  
stream_buffer: false  
visualize: false  
augment: false  
agnostic_nms: false  
classes: null  
retina_masks: false  
embed: null  
show: false  
save_frames: false  
save_txt: false  
save_conf: false  
save_crop: false  
show_labels: true  
show_conf: true  
show_boxes: true  
line_width: null  
format: torchscript  
keras: false  
optimize: false  
int8: false  
dynamic: false  
simplify: true  
opset: null  
workspace: null  
nms: false  
lr0: 0.01  
lrf: 0.01  
momentum: 0.937  
weight_decay: 0.0005  
warmup_epochs: 3.0  
warmup_momentum: 0.8  
warmup_bias_lr: 0.1  
box: 7.5  
cls: 0.5  
dfl: 1.5  
pose: 12.0  
kobj: 1.0  
nbs: 64  
hsv_h: 0.015  
hsv_s: 0.7  
hsv_v: 0.4  
degrees: 0.0  
translate: 0.1  
scale: 0.5  
shear: 0.0  
perspective: 0.0  
flipud: 0.0  
fliplr: 0.5  
bgr: 0.0  
mosaic: 1.0  
mixup: 0.0  
cutmix: 0.0  
copy_paste: 0.0  
copy_paste_mode: flip  
auto_augment: randaugment  
erasing: 0.4  
cfg: null  
tracker: botsort.yaml  
save_dir: E:\hand\test\runs\detect\train
curve(曲线)结尾的图片

置信度 (Confidence):模型单次预测的为该类型的概率
精度 (Precision):在所有 被模型预测为某类别 的样本中,有多少是真的。
召回率 (Recall ):在所有 真实属于某类别 的样本中,有多少被模型识别对的。
F1 是一种 综合指标,用来平衡 精度(Precision)召回率(Recall)
F1 = (2 × Precision × Recall​) / (Precision + Recall)

以下图中红色箭头为最佳路线

F1-Confidence Curve(F1-置信度曲线)

请添加图片描述

上述图:置信度为0.96时,F1综合指标为0.465最好

Precision-Confidence(精度-置信度曲线)

请添加图片描述

比如图中置信度在0.927时,识别所有类别其中一个都能识别对该类别

Precision–Recall 曲线(精度-召回曲线)

请添加图片描述

曲线越接近 右上角 (Recall=1, Precision=1),说明模型越好

confusion_matrix(混淆矩阵)和confusion_matrix_normalized(归一化混淆矩阵)

confusion_matrix(混淆矩阵):预测类型成功和失败的数量,background是没有类别的数量
请添加图片描述

confusion_matrix_normalized(归一化混淆矩阵):预测类型识别的成功的概率,background是没有类别的数量
请添加图片描述

labels(类别)

请添加图片描述

  1. 左上角是图片中识别到类型画框的数量,最佳是所有类型数量相同
  2. 左下角画框左上角/框的中心点位置的分布,最佳是所有地方都分布
  3. 右上角是所有画框的重叠起来的分布
  4. 右下角是画框的宽和高分布
results(模型训练结果)
resultsd.csv (存储模型每轮训练的结果)
results.png (储模型每轮训练的图像走势)

请添加图片描述

最佳效果(左边三列下降,右边两列上升)
请添加图片描述

train_batch+数字是训练集部分训练结果(类别用数字标识)

请添加图片描述

val_batch+数字的是验证集的部分结果
val_batch+数字+_LABELS

请添加图片描述

val_batch+数字+_PRED 类别标签+类别置信度

请添加图片描述


在这里插入图片描述

如果你在阅读过程中也有新的见解,或者遇到类似问题,🥰不妨留言分享你的经验,让大家一起学习。

喜欢本篇内容的朋友,记得点个 👍点赞,收藏 并 关注我,这样你就不会错过后续的更多实用技巧和深度干货了!

期待在评论区看到你的声音,我们一起成长、共同进步!😊

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值