YOLOv12 手势识别训练全攻略 🚀✋
一、项目背景:让AI看懂你的手势
手势识别是人机交互领域的重要技术,从智能家居控制到AR/VR应用都大有可为。本教程将手把手教你用YOLOv12训练一个中文环境下的手势识别模型,支持10种手势分类
二、环境准备:搭好炼丹炉
1. 硬件要求
- 显卡:至少RTX 3060 (显存12GB以上)
- 内存:32GB推荐
- 存储:SSD硬盘,至少500GB空间
2. 软件环境
# 创建conda环境
conda create -n yolov12 python=3.9
conda activate yolov12
# 安装依赖
pip install torch==2.1.0 torchvision==0.16.0
pip install ultralytics==12.0.0 # YOLOv12官方库
pip install opencv-python pillow pandas
三、数据集准备:特色手势库
1. 数据集结构
datasets/
├── hand_gestures/
│ ├── images/
│ │ ├── train/
│ │ └── val/
│ └── labels/
│ ├── train/
│ └── val/
└── chinese_gestures.yaml # 数据集配置文件
names: ['0', '1', '10', '11', '12', '13', '2', '3', '4', '5', '6', '7', '8', '9']
2. 数据标注规范
- 使用LabelImg标注,保存为YOLO格式
- 每个手势对应一个类别ID(0-999)
- 特殊中文手势示例:
3. 数据增强策略
# 在配置文件中添加
augmentation:
hsv_h: 0.015 # 色相变换
hsv_s: 0.7 # 饱和度变换
hsv_v: 0.4 # 明度变换
degrees: 15 # 旋转角度
translate: 0.1 # 平移
scale: 0.5 # 缩放
shear: 0.1 # 剪切
四、模型训练:开始炼丹
1. 配置文件修改
# chinese_gestures.yaml
path: ./datasets/hand_gestures
train: images/train
val: images/val
nc: 1000 # 1000个手势类别
names: ['手势0', '手势1', ..., '666', ..., '比心'] # 中文标签
2. 启动训练
from ultralytics import YOLO
# 加载预训练模型
model = YOLO('yolov12n.pt') # 根据显存选择n/s/m/l/x版本
# 开始训练!
results = model.train(
data='datasets/chinese_gestures.yaml',
epochs=300,
batch=32, # 根据显存调整
imgsz=640,
device=0, # 使用GPU 0
name='yolov12_gestures'
)
3. 训练技巧
- 渐进式训练:先小尺寸(320x320)训练50轮,再切大尺寸(640x640)
- 冻结骨干网络:前50轮冻结特征提取层
model.train(..., freeze=[0, 1, 2, 3]) # 冻结前4层
五、模型评估:看看AI学得怎么样
1. 指标查看
# 训练完成后自动生成results.csv
import pandas as pd
metrics = pd.read_csv('runs/train/yolov12_gestures/results.csv')
print(metrics[['epoch', 'metrics/precision', 'metrics/recall']].tail())
2. 验证集测试
model.val(conf=0.5, iou=0.6) # 调整置信度和IoU阈值
3. 常见问题解决
- 过拟合:增加数据增强/添加Dropout层
- 显存不足:减小batch_size/使用更小模型
- 类别不平衡:使用focal loss
六、模型部署:让AI真正用起来
1. 导出为ONNX格式
model.export(format='onnx', dynamic=True) # 支持动态输入
2. Python推理示例
from ultralytics import YOLO
model = YOLO('yolov12_gestures.pt')
results = model('test.jpg')
# 中文标签显示
for box in results[0].boxes:
cls_id = int(box.cls)
conf = float(box.conf)
print(f"检测到手势: {model.names[cls_id]}, 置信度: {conf:.2f}")
