1.环境安装:
- Python 3.7+
-
OpenCV
- Numpy
- Ultralytics
2.预训练模型
- Yolov8.pt
-
3.数据集准备
访问Roboflow网站,搜索Hand Gesture Recognition Object Detection Dataset (v6, 2023-03-18 4:44pm) by Lebanese University (roboflow.com),该数据集包含用于对象检测的 5 个手势类的 839 张图像:1,2,3,4,5. 在五个手指的帮助下,形成一个到五个数字的组合,并在这些带有相应标签的手势上训练对象检测模型。
-
链接:
-
Hand Gesture Recognition Object Detection Dataset (v6, 2023-03-18 4:44pm) by Lebanese University
- 数据集分为训练集、验证集和测试集。该数据集包含 587 个训练图像、167 个验证图像和 85 个测试图像,结构如下:
4模型训练并生成相应模型
-
4.1模型准备
下载YOLOv8.pt的预训练模型作为基础模型。
4.2配置文件设置
这个YAML文件是用来配置目标检测模型训练的参数,特别是与数据集相关的信息。
train: 指定了训练数据集的图像所在目录。在这个例子中,训练图像位于train/images目录下。
val: 指定了验证数据集的图像所在目录。验证集通常用于在训练过程中评估模型性能,而不使用测试集,以避免过拟合。这里验证图像位于valid/images目录。
test: 指定了测试数据集的图像所在目录。测试集用于最终评估模型的泛化能力,在模型训练完成后使用。测试图像位于test/images目录。
nc: 这个数值代表数据集中类别的数量。在这个场景中,nc: 5意味着有5种不同的手势类别。
names: 这是一个列表,包含数据集中每种类别的名称。这里的names列表定义了5种手势的名称,分别是'five', 'four', 'one', 'three', 和 'two'。
- 4.3模型训练
首先导入必要的库,torch是PyTorch的主库,而ultralytics包含了YOLOv8模型的接口。加载了预训练的YOLOv8模型yolov8n.pt和数据集配置文件的路径data.yaml。
调整训练的具体参数。data是数据集配置文件的路径,epochs定义了模型训练的总轮数两百轮,设置了每批次的图像数量batch为64。imgsz是输入图像的尺寸,通常使用正方形尺寸。device指定了用于训练的设备,此处我们使用默认cpu,所以device=cpu。
-
# 导入必要的库 import torch from ultralytics import YOLO # 加载预训练的YOLOv8模型 model = YOLO(r'D:\pycharm\pythonProject1\pythonjwq\yolo\yolov8n.pt') # 你可以选择不同的YOLOv8版本 # 定义数据配置文件路径 data_yaml_path = r'D:\pycharm\pythonProject1\pythonjwq\yolo\data.yaml' # 这个文件应该包含数据集的配置 # 开始训练 results = model.train( data=data_yaml_path, epochs=50, # 训练轮数 batch=16, # 批量大小 imgsz=640, # 图像尺寸 name='gesture_model', # 保存模型的目录 device='cpu' # GPU设备编号 ) # 保存最终模型 model.save('D:\pycharm\pythonProject1\pythonjwq\yolo\gesture_model.pt') # 评估模型 results = model.val(data=data_yaml_path) # 检查模型性能 print(results.metrics)
最终选用两百轮次中的最优权重为后续训练的yolov8手势识别的预训练权重:gesture_model-200.pt
-
5.模型评估
-
基于gesture_model-200.pt权重的模型性能曲线如下图:
- 左上角的两个图表分别显示了训练集和验证集上的bbox_loss(边界框损失)。可以看到,随着训练的进行,这两个损失都在逐渐下降,表明模型正在逐步改进其定位准确性。
在最右侧的两个图表中,我们看到了precision(精确率)和recall(召回率)的变化。在训练集中,precision和recall都相对稳定,但在验证集上,recall保持较高水平,而precision则有所波动。这可能表明模型在识别出所有手势的同时,有时也会出现误报的情况。
最下方的四个图表显示了验证集上的各项指标。bbox_loss和cls_loss仍然在下降,但dfc_loss似乎有些不稳定。mAP50(B)和mAP50-95(B)是平均精度的度量标准,它们衡量了模型在不同IOU阈值下的整体性能。mAP50(B)的曲线在训练后期略有上升,但mAP50-95(B)的曲线则在训练早期就达到了峰值,之后开始下降。总体来说,模型的map50的值能得到85%左右,效果不错,为后续在实验箱上部署机械臂摆动提供了基础。
-
6.模型测试
-
代码:
from ultralytics import YOLO # 加载训练好的模型 model = YOLO(r'D:\pycharm\pythonProject1\pythonjwq\yolo\best.pt') results = model.predict(source=0, show=True)
测试: