摘要:本篇博客深入探讨了使用深度学习技术开发石头剪刀布手势识别系统的过程,并分享了完整代码。该系统利用先进的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法,并对这几个版本进行性能对比,如mAP、F1 Score等关键指标。文章详细阐述了YOLOv8的工作机制,附上Python实现代码和训练用数据集,还整合了PySide6构建的图形用户界面。
该识别系统能够准确辨识石头、剪刀、布等手势,支持图片、图片集、视频及实时摄像头输入,功能涵盖柱状图分析、目标标记、类别统计、置信度调整、IOU阈值设置及结果展示等。此外,系统还包括一个基于SQLite的用户管理界面,提供模型选择和界面定制功能。本文目的是为深度学习新手提供指导,完整代码和数据集可在文章结尾处获取。本文结构如下:
文章目录
- 前言
- 1. 数据集介绍
- 2. 系统界面效果
- 3. YOLOv8算法原理
- 4. 代码简介
- 4.1 模型预测
- 4.2 模型训练
- 4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
- 4.4 代码实现
- 5. 石头剪刀布手势识别系统实现
- 5.1 系统设计思路
- 5.2 登录与账户管理
- 下载链接
- 6. 总结与展望
- 结束语
➷点击跳转至文末所有涉及的完整代码文件下载页☇
基于深度学习的石头剪刀布手势识别统演示与介绍(YOLOv8/v7/v6/v5模型+PySide6界面+训练数据集)
前言
在人机交互领域,手势识别技术一直是研究的热点之一,而石头剪刀布手势识别系统作为其中的一个具体应用,其研究不仅有助于推动人机交互技术的发展,也对于增强计算机视觉系统的理解能力和实时交互性具有重要意义。随着深度学习技术的飞速发展,尤其是YOLO(You Only Look Once)系列算法的不断迭代与优化,使得实时手势识别变得更加高效和准确。YOLOv5至YOLOv8的推出,不仅在识别速度和准确率上取得了显著提升,也为解决复杂背景下的手势识别问题提供了新的思路和方法。
手势识别技术的发展不仅可以应用于简单的游戏互动,如石头剪刀布,更广泛地应用于虚拟现实(VR)、增强现实(AR)、智能家居控制、辅助驾驶系统等领域,这些应用的实现极大地依赖于手势识别技术的准确性和实时性。因此,研究和优化石头剪刀布手势识别系统不仅对于提升人机交互的自然性和便利性具有重要意义,也是推动相关技术和应用发展的关键。
在近年来,石头剪刀布手势识别系统的研究取得了显著进展,这得益于深度学习算法的快速发展,尤其是YOLO系列算法的不断迭代更新。当前,研究者们不仅关注于提高手势识别的准确率,还致力于提升系统的实时性能和在复杂环境下的鲁棒性。
YOLOv5自发布以来,因其在速度和准确性上取得了良好的平衡,被广泛应用于多种实时物体识别任务中。研究表明,通过对YOLOv5进行定制化改进,可以有效提升手势识别的性能1。此外,YOLOv6引入了更多的网络优化技术,进一步提高了模型的识别速度和准确性2。随后,YOLOv7和YOLOv8的发布,不仅在算法架构上进行了创新,还通过引入新的训练技术和优化策略,显著提升了手势识别的效果34。
在手势识别的研究中,数据集的质量和多样性是提高识别准确率的关键因素之一。最近的研究显示,通过增强现有的手势识别数据集,可以有效提升模型的泛化能力和识别性能5。此外,研究者们还尝试结合多种传感器数据,如深度信息和红外信息,来提高手势识别的准确性和鲁棒性。
尽管取得了显著的进步,但手势识别技术仍然面临着多方面的挑战。如何在保证高识别准确率的同时,确保系统的实时性和低延迟,是当前研究的重点之一。此外,手势识别在复杂背景和光照条件下的性能提升,以及模型的轻量化和硬件部署优化,也是未来研究的关键方向。
本博客通过综合利用最先进的YOLOv8算法,结合PySide6开发工具,构建了一个创新的石头剪刀布手势识别系统。本研究不仅深入探讨了YOLOv8等算法的原理和应用,还提供了一个美观友好的用户界面,使得手势识别更加直观便捷。此外,本文还对YOLOv8模型进行了全面的性能评估,并与早期版本的YOLO算法进行了对比分析。以下是本文的主要贡献:
- 采用YOLOv8算法进行精准的手势识别:本研究充分展示了YOLOv8在石头剪刀布手势识别任务上的优越性能,相较于YOLOv7、v6、v5等早期版本,在识别精度、速度以及在复杂环境下的鲁棒性方面均有显著提升。通过详细的算法原理介绍和性能对比分析,为手势识别技术的研究与应用提供了新的视角和方法。
- 开发用户友好的手势识别系统界面:利用PySide6库,我们开发了一个直观、易用的石头剪刀布手势识别系统。该系统不仅简化了用户操作,还通过美观的界面设计,提升了用户体验,有效促进了YOLOv8算法在实际应用场景中的推广。
- 集成登录管理功能以提升系统安全性:系统内置的登录管理功能,不仅确保了使用者的安全性,也为将来引入更多个性化功能奠定了基础。这一创新点体现了我们在系统设计上的周到考虑,旨在为用户提供一个安全、可靠的使用环境。
- 深入研究YOLOv8模型性能:本文不仅介绍了YOLOv8算法的实现和应用,还通过实验对模型的性能进行了深入分析。包括精准度、召回率在内的多项关键指标均被细致评估,同时考察了模型在不同环境下的表现,为后续优化和改进提供了重要依据。
- 提供完整的数据集和代码资源包:为了让读者能够更易于理解和实践,本文分享了一套完整的数据集和代码资源包。这不仅包括用于模型训练和测试的详尽数据,还有实现手势识别系统的完整代码,使得读者可以方便地复现研究结果,并在此基础上进行进一步的研究与开发。
1. 数据集介绍
在本博客的篇章中,我们特别重视石头剪刀布手势识别系统的数据集构建与介绍。数据集是深度学习模型训练的基石,一个全面且均衡的数据集对于开发出高效、精确的手势识别模型至关重要。在我们的项目中,总共整理和预处理了5229张图片,这些图片被细致分为4178张训练集、546张验证集和505张测试集图片。这样的划分确保了模型可以在广泛的数据上学习,同时拥有独立的数据集来验证和测试其泛化能力。
数据集中的图片涵盖了“石头”、“剪刀”和“布”三个类别,它们是石头剪刀布游戏的基础手势。通过细致的分析,我们发现“石头”类别的样本数量最多,而“剪刀”和“布”的样本数量相对平衡。均衡的类别分布对于避免模型偏向某一类别至关重要,这样的数据集可以帮助模型更好地学习到每一类手势的独特特征。
图像标注是训练目标检测模型的重要环节,我们的数据集中的每一张图片都配备了精确的标签,包含了手势类别以及在图片中的具体位置。这些标注不仅定义了目标的类别,还精确指出了它们在图像中的位置,这对于训练高精度的模型是必不可少的。对于标注框的大小和位置,通过可视化的分布图,我们可以看出大多数的手势标注框集中在图像的中心区域。这种分布有助于模型学习在不同场景中准确识别手势的能力,同时也指导了我们在模型设计时对锚框尺寸参数的调整。
为了提高模型的鲁棒性,我们对数据集进行了一系列的预处理和增强处理。包括标准化图像尺寸、调整亮度和对比度、以及应用随机旋转和缩放等操作,这些增强技术模拟了现实世界中各种可能的变化,从而增加了模型的泛化能力。这样的处理可以确保模型不仅在理想的实验条件下表现良好,也能在复杂多变的现实环境中保持高效的识别能力。
每张图片都附有对应的标签,指出图像中手势的类别,以及手势的位置。这些标签对于训练精确的目标检测模型来说是必不可少的。博主使用的类别代码如下:
Chinese_name = {'Paper': "布", 'Rock': "石头", 'Scissors': "剪刀"}
通过以上的介绍,我们希望读者能够深入理解构成【石头剪刀布手势识别系统】核心的数据集。这些数据不仅丰富了研究内容,也为实现高精度的手势识别提供了坚实的基础。在随后的博客内容中,我们将进一步揭示数据的深层价值,并展示如何利用这些数据训练出表现卓越的手势识别模型。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行石头剪刀布手势识别的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
在探讨YOLOv8算法的原理时,我们首先需要理解YOLO(You Only Look Once)系列算法的核心理念,即在单次前向传播过程中同时进行目标的定位和分类。这种一步到位的检测方式使得YOLO算法在速度和效率上有着显著的优势。YOLOv8作为这一系列中的最新迭代,不仅继承了前代YOLO算法的这些优点,而且在结构设计和性能上都有了显著的改进,从而进一步提升了检测的准确性和速度。
YOLOv8算法的结构可以分为三个主要部分:Backbone(主干网络)、Neck(连接网络)和Head(检测头)。在Backbone部分,YOLOv8采用了CSP(Cross Stage Partial networks)结构,这种结构有效地平衡了模型的学习能力和参数量。CSP结构通过部分跨阶段连接,促进了梯度的直接传播,这对于深层网络的学习是极为有益的。它还减少了计算量,因为它允许网络在少量的参数下进行更深层次的特征学习。
Neck部分则是负责提取不同尺度特征并进行融合的关键模块。YOLOv8的Neck部分利用了SPP(Spatial Pyramid Pooling)结构和FPN(Feature Pyramid Networks)技术。SPP能够提取多尺度的上下文信息,这对于检测不同尺寸的目标至关重要。而FPN采用了一个自顶向下的结构,将高层的语义信息传递到低层,从而实现了从粗到细的特征融合。
在Head部分,YOLOv8采取了自适应标签分配(adaptive label assignment)策略,这是一种更为灵活的标签分配方式,允许模型根据目标的不同特性自动调整标签。这意味着算法能够根据目标的大小、形状以及其在图像中的上下文信息,动态地选择最合适的锚点,这种策略能够有效地减少标签分配误差,提升模型的性能。
YOLOv8还引入了AutoML技术,在算法的设计和优化过程中自动寻找最优的模型参数和结构。这种技术可以减轻手动调参的工作量,确保了YOLOv8在不同的检测场景下都能达到最佳性能。此外,YOLOv8还支持云端训练和边缘计算,使得算法可以在资源受限的设备上进行训练和推断,同时还可以利用云端的强大计算能力进行大规模的训练任务。
综上所述,YOLOv8通过其独特的结构设计,不仅继承了YOLO系列的高速检测特性,而且还通过CSP网络结构和先进的特征融合技术,显著提升了对于各种尺寸目标的检测能力。这些技术的融合使得YOLOv8在目标检测任务中,无论是在准确度还是速度上,都表现出了卓越的性能。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行石头剪刀布手势识别的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/1.jpg")
image = cv_imread(img_path)
在读取了图像文件之后,将图像大小调整为850x500,并对图像进行预处理,就可以使用模型进行预测了。
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
在这部分博客内容中,我们将深入探讨一个使用PyTorch框架和Ultralytics YOLO库进行模型训练的实际案例。通过解析提供的代码,我们将一探究竟,看看如何利用这些强大的工具来训练一个石头剪刀布手势识别模型。
代码的核心逻辑是首先设置好训练环境,然后加载预训练的YOLO模型,并在此基础上进行进一步的训练以适应我们的特定任务——在这里是石头剪刀布手势识别。这个过程涉及到许多细节,包括数据路径的设置、模型参数的配置以及训练过程的初始化。
首先,代码通过import语句导入必要的Python包,包括操作系统接口os、PyTorch库torch、YAML文件解析库yaml以及Ultralytics的YOLO模型。紧接着,我们设置设备变量device,这样模型就可以在GPU上进行训练(如果可用),这是深度学习训练过程中提升速度的关键。
import os
import torch
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
device = "cuda:0" if torch.cuda.is_available() else "cpu"
接着,我们定义了一个工作进程数workers和一个批次大小batch。然后,我们设置了数据集名称data_name和数据集配置文件的路径data_path,这里使用了一个辅助函数abs_path来确保获取到文件的绝对路径。
workers = 1
batch = 8
data_name = "RPS"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
directory_path = os.path.dirname(unix_style_path)')
接下来,代码读取了数据集的YAML配置文件,并根据当前的目录结构对其进行了更新,确保了模型训练时引用的路径是正确的。
# 读取YAML文件,保持原有顺序
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
# 修改path项
if 'path' in data:
data['path'] = directory_path
# 将修改后的数据写回YAML文件
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
在加载预训练模型的部分,我们加载了预训练模型,随后启动了训练过程。这部分代码通过指定数据集配置文件路径、训练设备、工作进程数、图像尺寸、训练周期和批次大小等参数,调用了model.train方法来开始训练。
model = YOLO(abs_path('./weights/yolov5nu.pt', path_type='current'), task='detect') # 加载预训练的YOLOv8模型
# model = YOLO('./weights/yolov5.yaml', task='detect').load('./weights/yolov5nu.pt') # 加载预训练的YOLOv8模型
# Training.
results = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device=device, # 自动选择进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=120, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v5_' + data_name # 指定训练任务的名称
)
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device=device, # 自动选择进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=120, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
在我们的石头剪刀布手势识别系统中,模型的训练过程是通过监测各种损失函数和评价指标来精细化的。训练一个高效的YOLOv8模型需要对损失函数的变化趋势有深入的理解,这些指标对于评估模型的性能和调整训练过程至关重要。损失函数图像揭示了训练和验证过程中的几个关键指标:box_loss、cls_loss、obj_loss(在图中表述为df1_loss)以及评价指标precision、recall和mAP(mean Average Precision)。在训练过程中,这些损失指标逐渐下降,而评价指标则相应提高,这是模型性能提升的直观体现。
Box_loss 反映了模型预测边界框与实际标注之间差异的大小,从图像中可以看到,训练和验证的box_loss都呈现出明显的下降趋势,这表明模型在定位手势目标上的能力随着训练的进行而不断提高。Cls_loss 表示类别损失,用于评估模型预测的类别信息与真实类别标签之间的一致性。观察到cls_loss在训练期间也在稳步下降,这意味着模型在区分“石头”、“剪刀”和“布”手势上越来越精准。Obj_loss(df1_loss)是目标损失,它衡量的是模型在预测图像中是否存在目标的能力。我们看到这一损失随着训练的进行而大幅下降,并在训练后期趋于平稳,这表明模型对手势的检测越来越可靠。
Precision 显示了模型预测为正类的样本中实际为正类的比例,即模型的精确性。图中precision的稳步上升表明随着训练的进行,模型在预测手势时误报的情况显著减少。Recall 指标衡量了所有正类样本中被模型正确预测的比例,即模型的召回率。我们的模型展现出很高的召回率,意味着它能够检测到大多数的手势目标。mAP(mean Average Precision) 则结合了precision和recall,是评估目标检测模型整体性能的重要指标。mAP在不同IoU阈值下的表现(mAP50和mAP50-95)都显示出优异的性能,这意味着无论是在较宽松的还是在更为严格的标准下,模型都能准确地识别手势。
在深度学习模型的评估过程中,精确度-召回率(Precision-Recall,简称PR)曲线是衡量模型性能的重要工具,特别是在目标检测任务中,它能够揭示模型对于不同类别目标检测能力的细致情况。根据提供的PR曲线图,我们可以对YOLOv8模型在石头剪刀布手势识别任务上的性能进行专业分析。
从模型的性能指标图中可以看到,随着训练的深入,精确度(Precision)、召回率(Recall)、平均精确度(mAP@0.5)以及更严格的mAP@0.5-0.95指标都展示出了非常高的性能水平。精确度和召回率接近或达到了0.9以上的高值,表明模型对于检测石头、剪刀、布的手势非常可靠。同时,高mAP值证实了模型具有较高的综合检测能力,在不同的IoU阈值下都能保持较高的性能。
结合F1分数的曲线图,我们可以看到模型对于所有类别的综合F1分数高达0.93,在置信度阈值为0.762时达到最优。F1分数是精确度和召回率的调和平均,是判断模型性能的重要指标,特别是在类别分布不均匀的情况下。在这里,F1分数表明我们的模型在保持检测精确度的同时,也很好地保持了召回率,达到了平衡的最佳状态。
在通过精细的参数调整和多轮训练后,YOLOv8模型展现出了卓越的性能,其在本项目中的应用效果表明了它在实时手势识别领域的巨大潜力。这些结果不仅证实了我们方法的有效性,也为未来在此领域的研究工作奠定了坚实的基础。我们将在后续的博客中继续探索YOLOv8在各种场景下的应用,并持续优化我们的系统以应对更多挑战。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在石头剪刀布手势识别任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型 | 图像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 参数数量 (百万) | FLOPs (十亿) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指标:
- F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.951 | 0.962 | 0.912 | 0.952 |
F1-Score | 0.94 | 0.96 | 0.89 | 0.93 |
(3)实验结果分析:
在我们的石头剪刀布手势识别系统研究中,对比了YOLO系列中的四个不同版本的性能:YOLOv5nu、YOLOv6n、YOLOv7-tiny、YOLOv8n。通过在同一数据集上进行严格的实验,并使用F1-Score和mAP这两个关键的度量指标,我们对每个模型的性能进行了细致的分析。
在mAP方面,YOLOv6n以0.962的得分领先,显示出最优的平均精度。紧随其后的是YOLOv8n和YOLOv5nu,分别以0.952和0.951的得分表现出接近的优异性能。YOLOv7-tiny以0.912的mAP相对落后,这可能是由于其“tiny”版本的模型结构更简单,可能在某些复杂情况下捕捉特征的能力不如完整模型。
在F1-Score指标上,YOLOv6n同样以0.96的成绩表现最佳,这说明了它在精确度和召回率之间达到了最好的平衡。YOLOv5nu和YOLOv8n分别以0.94和0.93的得分紧跟其后,两者的表现非常接近。与此同时,YOLOv7-tiny的F1-Score为0.89,表明它在正确识别和避免误识别方面的表现不如其他模型。
通过双条形图,我们清晰地看到了这些算法在两个关键性能指标上的比较。柱状图的显示范围经过优化,使得算法间的细微差别更为突出。整体上,这些结果为我们提供了宝贵的参考信息,帮助我们理解不同版本的YOLO算法在实际应用中可能表现出的性能差异,进而指导我们在选择模型时做出更加明智的决策。
4.4 代码实现
在现代计算机视觉领域,将深度学习模型应用于实时图像处理任务已成为一项重要技术。本博客将重点介绍如何通过YOLOv8模型实现石头剪刀布手势识别的完整过程。此任务不仅涉及模型的准确性,还包括用户界面的交互性和友好性,以便于用户能够直观地观察和评估模型的检测结果。
(1)引入必要的库
首先,我们引入了必要的模块。sys模块允许我们访问Python解释器的一些变量和功能,time模块帮助我们记录处理帧的时间,而cv2是OpenCV库,用于执行图像处理任务。接着是QtFusion和PySide6,这些是用于创建图形用户界面的库。而YOLOv8Model模块中的YOLOv8Detector类,是我们的手势识别核心。
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于获取当前时间
import cv2 # 导入OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 从QtFusion库导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库导入MediaHandler类,用于处理媒体流
from QtFusion.utils import drawRectBox, get_cls_color # 从QtFusion库导入drawRectBox函数,用于在图像上绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块导入YOLOv8Detector类,用于物体检测
from datasets.RPS.label_name import Label_list
QF_Config.set_verbose(False)
(2)初始化模型
我们定义了一个类别名称列表cls_name,它包含了我们要检测的所有对象的名称。然后,我们加载预训练的YOLOv8模型并获取每个类别的颜色。这些颜色将用于在最终的图像上区分不同的对象。
cls_name = Label_list # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)设置主窗口
为了能够有效地与用户交互,我们定义了MainWindow类,这是我们应用程序的主窗口。这个窗口负责显示视频流和检测结果。在构造函数中,我们设置了窗口的尺寸,并创建了一个标签(QLabel)用于展示图像。我们还定义了keyPressEvent函数,以便用户可以通过按键(这里是Q键)来关闭应用程序。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel对象的几何形状
def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的键是Q键
self.close() # 关闭窗口
(4)主程序流程
在frame_process函数中,我们首先调整每一帧图像的大小以适配我们的显示窗口。然后,我们使用YOLOv8Detector模型的preprocess方法对图像进行预处理,并通过predict方法执行物体检测。这里,我们计算并打印出模型推理的时间,以评估其性能。对于检测到的物体,我们使用postprocess方法获取详细信息,并利用drawRectBox函数在图像上绘制边界框和标签。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred, superimposed_img = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间
use_time = t2 - t1 # 计算预测所用的时间
print("推理时间: %.2f" % use_time) # 打印预测所用的时间
det = pred[0] # 获取预测结果
# 如果有检测信息则进入
if det is not None and len(det):
det_info = model.postprocess(pred) # 对预测结果进行后处理
for info in det_info: # 遍历检测信息
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info[
'class_id'] # 获取类名、边界框、置信度和类别ID
label = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类名和置信度
# 画出检测到的目标物
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制矩形框,并添加标签和颜色
window.dispImage(window.label, image) # 在窗口的label控件上显示图像
最后,我们创建了应用程序和主窗口的实例,并设置了MediaHandler来处理视频流。我们连接了frame_process函数到frameReady信号,这样每次新的视频帧准备好时,都会调用这个函数。我们选择默认的摄像头作为视频输入设备,并启动了媒体流的处理。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0) # 设置设备为0,即默认的摄像头
videoHandler.startMedia() # 开始处理媒体流
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
整个程序以一个典型的Qt应用程序流程结束,显示主窗口并进入主事件循环,等待用户操作或内部事件的发生。这段代码的魅力在于它如何将高级深度学习模型与现代GUI应用程序框架结合起来,创建出一个用户友好且功能强大的实时物体检测系统。通过精心设计的代码结构,我们可以清晰地理解整个系统的工作流程,并欣赏到将深度学习应用于实际问题的潜力。
5. 石头剪刀布手势识别系统实现
在实现一款实时石头剪刀布手势识别系统时,我们深入考虑了用户体验和操作便捷性。系统设计思路的核心是将高效的目标检测能力与直观的用户界面(UI)紧密结合,以确保即使是非技术用户也能轻松地使用系统。为此,我们设计了一个综合架构,其中MainWindow类扮演了控制中心的角色,协调处理层和界面层的交互。
5.1 系统设计思路
MainWindow类的主要目标是提供一个用户友好的交互式石头剪刀布手势识别系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。
架构设计
我们的系统设计思路以三层架构为核心:处理层、界面层和控制层。在我们的系统设计中,重点放在了确保各个组件能够协同工作,同时保持足够的模块独立性,以便于未来的维护和升级。
- 处理层(Processing Layer):这一层由YOLOv8Detector类和相关的图像处理方法构成。它的主要职责是接收从摄像头获取的原始图像数据,通过预处理增强图像质量,然后应用我们训练有素的YOLOv8模型进行手势识别。这个层面上的优化确保了无论环境条件如何变化,模型都能够以最高的准确率进行识别。
- 界面层(UI Layer):此层是用户与系统交互的前端,由Ui_MainWindow类及其构建的用户界面组件构成。我们精心设计了界面,使其既直观又功能丰富。例如,图像显示区域能够即时展示识别结果,而其他UI元素如按钮和标签则提供了对系统操作的直接控制。我们还考虑了用户体验,确保界面的反馈即时且有帮助,使用户能够轻松地与系统互动。
- 控制层(Control Layer):作为系统的中枢,MainWindow类承担着协调界面层和处理层的任务。它通过槽函数响应用户的交互,如开始识别、停止识别等,并控制媒体处理器的行为,以及模型的激活与识别过程。此外,控制层通过Qt的信号和槽机制与处理层紧密相连,确保了图像数据和识别结果能够顺畅地在系统各组件间传递。
总而言之,我们的系统设计思路以用户体验为核心,以技术效率为基础,通过各层之间精确的协作,打造出一个既直观又强大的手势识别系统。我们期待用户能够通过使用我们的系统,体验到最前沿的机器学习技术所带来的便捷与乐趣。
系统流程
在构建交互式石头剪刀布手势识别系统时,我们采纳了一个以用户为中心的系统设计思路。该系统由几个核心组件构成,包括用户界面(UI)、媒体处理器和目标检测模型。我们的目标是创建一个高效、直观且易于使用的系统,使得自动驾驶技术的复杂性对于最终用户来说变得透明。
- 当用户启动应用程序,系统首先会实例化MainWindow类。这个实例不仅负责加载和设置应用程序的图形用户界面,还配置了用于手势识别的各项参数,确保用户一开始就有一个明确、易操作的入口。界面上的选项允许用户选择输入源,这些输入源包括实时捕捉的摄像头图像、视频文件或静态图片,以适应不同的使用场景和用户需求。
- 选择了输入源后,系统将激活相应的媒体处理器。例如,如果选择了摄像头作为输入源,系统将配置摄像头并开始捕捉图像流;如果是视频文件或图像,系统则会相应地加载文件。这一步涉及到从硬件捕捉图像数据或从存储设备读取数据,为后续的图像处理和手势识别奠定基础。
- 随后,系统进入一个循环,不断处理捕捉或加载的图像数据。在预处理阶段,每一帧图像都会进行尺寸调整、色彩空间转换和归一化等处理,以确保图像数据符合YOLOv8模型的输入要求。处理后的图像随即被送入YOLOv8模型,这时模型便开始进行石头、剪刀、布手势的检测和识别工作,将识别结果以可视化的形式反馈给用户。
- 用户在界面上可以看到实时的检测框和标注的手势类别,同时系统还提供了统计数据的展示,如检测频率和准确率等,增加了用户对检测结果的认识和理解。此外,界面上的交互元素允许用户执行如保存结果、查询信息、筛选特定结果等多种操作,极大地提高了系统的可用性和互动性。
- 最后,媒体控制功能让用户能够对输入源进行管理,比如开启或停止图像捕捉,控制视频的播放和暂停,或对静态图像进行分析。这样的设计使得用户在任何时候都可以轻松地控制系统的工作状态,确保了使用体验的连贯性和一致性。
通过这样的系统设计,我们不仅能够提供一个高效准确的手势识别服务,还确保了用户可以通过一个直观友好的界面与系统进行高度交互,无论是在家庭娱乐、互动游戏还是教学研究中,都能够提供一流的体验。
5.2 登录与账户管理
在构建石头剪刀布手势识别系统的过程中,账户管理功能起到了至关重要的作用,它不仅确保了用户数据的安全性,也提供了个性化的用户体验。利用PySide6的强大功能以及SQLite数据库的便捷性,我们设计了一套完整的用户登录界面,并实现了注册、密码管理、个人化设置等功能。
当用户首次使用系统时,会被引导至登录界面。这里,用户可以进行新账户的注册,其中包括设置用户名、密码以及上传头像。注册后,用户可使用自己的凭据进行登录,系统会检索相应的账户信息,并恢复到用户的个性化设置。这意味着每个用户都能在一个独立的环境中保存他们的检测结果和个人设置。
登录后,用户进入系统的主界面,可以开始使用石头剪刀布手势识别功能。我们的系统支持多种输入源,包括实时摄像头捕获、视频文件播放,以及静态图片分析。在检测阶段,用户可以实时看到识别的手势、置信度分数和其他相关信息。系统能够识别和记录每个动作,用户可以随时查看历史记录和统计数据。
除了核心的手势识别功能外,我们的用户界面还提供了一系列交互式操作,如保存结果、查询帮助和访问系统信息等。用户可以在主界面的下拉菜单中筛选特定的结果,进行详细的分析和回顾。
我们的账户管理系统还提供了密码修改、头像更新、账户注销等功能。用户可以随时更新他们的个人资料,确保账户信息的时效性和准确性。账户注销功能为用户提供了退出系统的能力,而重新登录功能则允许用户随时回到自己的个性化空间。
这些精心设计的功能确保了每位用户都能获得安全、便捷和个性化的使用体验。无论是在公共场合还是私人空间,用户都能依赖我们的系统进行快速准确的手势识别,同时保持他们的设置和结果安全私密。通过这样的系统设计,我们不仅提供了一个功能强大的手势识别工具,也为用户的隐私和个性化需求提供了全面的保障。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1aK421x7v2/
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8模型的实时石头剪刀布手势识别系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的石头剪刀布手势识别和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎
Wang C Y, Bochkovskiy A, Liao H Y M. YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 7464-7475. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎