记使用yolov8完成的剪刀石头布手势识别
发表于 2026-01-26 共 1036 字
分类于 记录分类于 计算机视觉

记使用yolov8完成的剪刀石头布手势识别

前言

大一刚入学不久的时候,我人工智能通识课自选的作业课题,就是使用yolov8来检测摄像头中的剪刀、石头、布手势,主要目的是动手体验一下数据集标注和训练的流程。

环境搭建

在我的轻薄本上,只能用CPU跑,于是用pip装的是CPU版本的pytorch,再装上ultralytics模块就能用了。

当时yolo最新版并非v8,只是用yolov8的精度也足够了。

后面的训练过程还是在Google colab跑的,所用GPU也就是其免费提供的NVIDIA Tesla T4。

数据集制作

于是我闲暇时间在宿舍,使用电脑摄像头采集了若干张“剪刀石头布”的手势图片,试图通过不同角度、不同远近位置来拍摄,同时为了提高模型对复杂环境的适应程度,我选择不同的时间段以及开关灯来模拟宿舍背景不同的光照亮度效果。

借鉴了官方文档的custom dataset教程,我总共设计了3种类别"bu", "jiandao", "shitou"。最开始,我使用了labelImg软件来手动框选目标,针对三种类别的图片生成坐标标注。同时将样本图像压缩填充为标准的416*416格式。

labelImg数据集手动标注

后来我发现Roboflow这个网站,把数据集图片批量传上去,可以很方便地在线标注,并导出打包的标准格式。

Roboflow界面

开始训练

在标注了每种50张图片(总共150张)并根据比例划分为train, valid, test集以后,我考虑到大规模的数据量很难利用CPU来训练,于是就用yolov8的最小模型 (yolov8n.pt) 训练出了第一个版本。这个过程中,我使用yolo自带的cli进行100轮训练:

yolo task=detect mode=train model=yolov8n.pt data=gesture/data.yaml epochs=100 imgsz=416 workers=4 batch=4

训练中

可以看到mAP50指标在不断上升,最后基本趋近于一个值。

在将近半个小时后,第一版模型训练完成,但是准确率不是很好,经常会把石头识别成布。

接着,我给每个类别分别增加了50张图片,包含左右手的不同角度(如手心手背,旋转翻转)的图片,扩大到了总共300张图片,再次进行了训练。这一次耗时快一个半小时,效果有显著的提升,但是依旧发现了剪刀出现在左手的时候容易识别成布。

考虑到更大数据量在CPU上运行会耗时很长,后续便转移到Google colab进行训练。最后,我把整个数据集提升到了480张图片的规模,并换成了参数量稍微大一点的yolov8s模型,用T4 GPU仅用10分钟就完成了训练。

Google colab截图

得到训练模型权重best.pt

视频流实时识别

之后,我使用opencv的VideoCapture视频流,实现了视频图像的逐帧实时识别。

利用yolo的export函数,我将模型导出成了onnx格式以提升推理速度,最终在CPU上每帧处理耗时都小于100ms。

视频流实时识别

总结

下图展示了训练过程中的指标,训练轮次足够大后指标基本收敛:

训练指标

总的来说,这个只能算是一个小实验,自己构建了一个小型数据集,并没有考虑到模型针对不同人手的泛化能力。

在这种小规模的数据集下,对我手势的识别有着较好效果。

筛选文章
类别选择 (分类/标签)
全屏 关闭