摘要:开发扑克牌识别软件对于智能辅助决策工具的建立具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个扑克牌识别软件,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间的性能指标,如mAP、F1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码、训练数据集,并集成了一个基于PySide6的界面。
系统能够精准识别扑克牌,支持通过图片、图片文件夹、视频文件及摄像头进行检测,包含柱状图分析、标记框类别、类别统计、可调Conf、IOU参数和结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换和UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:
文章目录
- 前言
- 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界面+数据集)
前言
在当今社会,随着人工智能技术的迅速发展,计算机视觉作为其重要分支之一,在图像识别、视频分析等领域展现出了巨大的潜力和应用价值。特别是在扑克牌识别软件的研发上,它不仅对于增强在线游戏的互动性和公平性有着重要作用,也为自动化监控赌博活动、开发智能辅助决策工具等提供了技术支撑。此外,扑克牌识别技术的研究与开发,还能促进机器视觉技术在图像处理、模式识别等方面的理论与实践探索,进一步推动人工智能技术的进步。
近年来,YOLO1系列算法因其在目标检测任务中的高效率和准确性,成为了扑克牌识别软件开发中的首选技术之一。自YOLOv52以来,每一版的迭代都在不断优化模型的速度与准确率,尤其是到了YOLOv83,通过引入更先进的网络结构和优化算法,使得扑克牌识别更加精准和高效。这些进展不仅提升了实时识别的可能性,也为处理复杂场景下的识别问题提供了强有力的技术支撑。
在最近的研究中,一些研究团队通过深入探索卷积神经网络(CNN)在特征提取方面的能力,对YOLO算法进行了优化和改进,以适应扑克牌识别的特殊需求。例如,一些研究通过调整网络结构中的卷积层、引入注意力机制、优化训练策略等方法,显著提高了扑克牌识别的准确率和鲁棒性。此外,随着大规模图像数据集的不断丰富和完善,以及训练技术的持续进步,扑克牌识别软件的性能也得到了进一步的提升。
除了YOLO系列,视觉变换器(ViT)作为一种基于自注意力机制的模型,在图像识别领域也展示出了巨大的潜力。ViT通过将图像分割成序列化的块并利用自注意力机制处理这些块,能够捕获图像内部的全局依赖关系,这对于提高扑克牌识别中的细节捕捉能力尤为重要。注意力机制本身,作为一种提升神经网络理解图像内容能力的关键技术,已经被广泛应用于多种模型架构中,包括但不限于YOLOv8中的CSPDarknet结构,它通过加强模型对关键特征的关注,进一步提高了识别的准确性和鲁棒性。
MMDetection是一个开源的目标检测工具箱,它集成了包括YOLOv3、Faster R-CNN、Mask R-CNN等多种算法,并提供了丰富的模型组件和训练策略,为扑克牌识别等图像识别任务的研究与开发提供了强大的技术支持。MMDetection的高度模块化设计使得研究人员和开发者可以轻松地测试和部署不同的算法,以寻找最适合其特定任务需求的解决方案。
本博客所做的工作是基于YOLOv8算法构建一个扑克牌识别软件,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法进行扑克牌识别:本研究首次在扑克牌识别领域中引入了YOLOv8算法,并对其与早期版本的YOLO算法(包括YOLOv74、YOLOv6、YOLOv5)进行了详细的比较与分析。我们展示了YOLOv8在扑克牌识别任务上的优越性,包括在准确率、检测速度以及对复杂背景的鲁棒性方面。这不仅为扑克牌识别软件提供了一种更高效和准确的解决方案,也为相关领域的研究者和从业者开辟了新的研究和应用路径。
- 利用PySide6实现友好的用户界面:通过使用PySide6库,我们开发了一个具有高度用户友好性的扑克牌识别软件界面。该界面不仅直观易用,而且支持多种操作,使得用户能够轻松地进行扑克牌识别任务。这一部分的工作强调了将先进的目标检测技术与实用的软件工程相结合的重要性,为实际应用场景中的技术转化提供了范例。
- 集成登录管理功能增强系统安全性:本系统特别设计了登录管理功能,旨在提高系统的安全性和管理性。通过引入用户认证机制,不仅确保了数据和信息的安全,也为将来系统升级和个性化服务打下了基础。
- 对YOLOv8模型进行深入研究:我们对YOLOv8模型在扑克牌识别任务中的表现进行了全面的研究,详细评估了模型的精确度、召回率等关键性能指标,并分析了模型在不同环境条件下的适应性和鲁棒性。这些研究成果不仅加深了我们对YOLOv8算法性能的理解,也为未来进一步优化模型提供了宝贵的数据支持。
- 提供完整的数据集和代码资源包:为了促进研究的开放性和可复现性,我们分享了完整的数据集和代码资源包。这包括用于模型训练和测试的详细数据集,以及实现扑克牌识别软件的完整代码。通过提供这些资源,我们鼓励读者深入研究、验证我们的研究成果,并在此基础上探索新的研究方向。
1. 数据集介绍
在我们开发的扑克牌识别软件中,数据集的构建和分析对于确保模型精确度和性能至关重要。本项目使用了包含24240张图片的数据集,这些图片被细致地分为三个部分:21210张用于训练的图片构成了训练集,2020张用于模型验证的图片构成了验证集,最后1010张用于最终评估模型的图片构成了测试集。通过这样的划分,我们确保了模型在各个阶段都能接触到多样的数据,从而更准确地评估其在实际应用中的性能。
为了使模型能够适应各种大小和方向的扑克牌,我们对数据集进行了认真的预处理和增强。首先,每张图片都经过自动方向校正,去除了可能干扰模型学习的EXIF方向信息。然后,所有图片被统一调整到640x640像素的大小,这一标准化处理使得模型不需要处理过多的输入尺寸变化,同时保持了处理速度。此外,我们还引入了水平翻转增强,以50%的概率对图片进行随机翻转,这不仅增加了数据多样性,而且使模型能够更好地识别不同方向的扑克牌,提高了其在实际环境中的适用性和鲁棒性。
通过对数据集分布的深入分析,我们进一步了解了数据的特性。类别分布的条形图表明了我们数据集在扑克牌种类上的均匀分布,这有助于避免某些类别过度代表或欠代表的问题,确保模型能够公平地学习到每一种扑克牌的特征。位置分布的热力图显示出扑克牌在图像中心的高集中趋势,这提醒我们模型需要对图像中心区域给予更多关注。而尺寸分布的热力图则展示了扑克牌尺寸的多样性及其集中的区域,这帮助我们理解模型需要识别的目标尺寸范围,并可能指导我们在模型训练时关注特定的尺寸组合。
在数据标注方面,我们精心地对每一个扑克牌进行了框定,确保标签的准确性和一致性。博主使用的类别代码如下:
Chinese_name = {'10C': "梅花10", '10D': "方块10", '10H': "红桃10", '10S': "黑桃10",
'2C': "梅花2", '2D': "方块2", '2H': "红桃2", '2S': "黑桃2",
'3C': "梅花3", '3D': "方块3", '3H': "红桃3", '3S': "黑桃3",
'4C': "梅花4", '4D': "方块4", '4H': "红桃4", '4S': "黑桃4",
'5C': "梅花5", '5D': "方块5", '5H': "红桃5", '5S': "黑桃5",
'6C': "梅花6", '6D': "方块6", '6H': "红桃6", '6S': "黑桃6",
'7C': "梅花7", '7D': "方块7", '7H': "红桃7", '7S': "黑桃7",
'8C': "梅花8", '8D': "方块8", '8H': "红桃8", '8S': "黑桃8",
'9C': "梅花9", '9D': "方块9", '9H': "红桃9", '9S': "黑桃9",
'AC': "梅花A", 'AD': "方块A", 'AH': "红桃A", 'AS': "黑桃A",
'JC': "梅花J", 'JD': "方块J", 'JH': "红桃J", 'JS': "黑桃J",
'KC': "梅花K", 'KD': "方块K", 'KH': "红桃K", 'KS': "黑桃K",
'QC': "梅花Q", 'QD': "方块Q", 'QH': "红桃Q", 'QS': "黑桃Q"}
每张图片均配有精确的扑克牌标签,包括数值和花色,确保了训练过程的高度监督和针对性。这种精心准备和分析的数据集不仅为我们提供了训练高性能扑克牌识别模型的基础,同时也为相关领域的研究者和技术开发人员提供了丰富的资源。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行扑克牌识别的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8/v5模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法作为当前最新一代的高效目标检测模型,其核心理念依旧继承了YOLO系列的设计哲学——“You Only Look Once”(一次预测),这意味着在模型进行目标检测时,仅通过一次的前向传播就能够完成对图像中目标的检测与分类。相较于传统的多步骤检测算法,YOLOv8的这一特点极大地提升了检测的效率,同时也保持了良好的准确率,这对实时或需要快速响应的场合尤其重要。
在算法架构上,YOLOv8维持了YOLO系列的“三部曲”设计——即由Backbone(主干网络)、Neck(连接网络)和Head(头网络)三个部分组成。Backbone负责从原始图像中提取特征,是模型深入理解图像内容的基础;Neck作为Backbone与Head之间的桥梁,旨在增强不同尺度特征的学习能力,通常会采用一些特殊的结构来处理不同尺度的特征信息,如特征金字塔网络(FPN)或者自注意力机制等;Head部分则负责最终的目标分类与位置回归。
YOLOv8在这三个部分的设计上做出了创新。在Backbone部分,YOLOv8往往会集成最新的卷积神经网络架构,这些架构通过深度学习领域的最新研究成果进行优化,例如引入更高效的卷积操作、更精细的特征通道调整机制等,以增强网络对于细节的捕捉能力及特征的表征力。Neck部分可能会利用更复杂的特征融合策略,以确保不同分辨率的特征能被有效结合,从而提升模型在不同尺寸目标检测上的性能。Head部分则专注于通过这些特征进行精确的目标定位与分类,这通常涉及到锚点框(anchor boxes)的设置、边界框的回归计算以及分类置信度的输出。
YOLOv8采用了一种改进的标签分配机制,这一机制允许算法根据预测的确信度动态地分配标签,而不是简单地将标签分配给固定的锚点。这种自适应标签分配(adaptive label assignment)机制增强了模型的学习效率,因为它允许模型自主地确定最有益于训练的正样本,从而提高了训练的精度和效率。此外,通过这种机制,YOLOv8能够减少因错误标签分配导致的假阳性预测,从而提高模型的总体性能。
整体来说,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/as1.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库来训练一个先进的扑克牌识别模型。训练一个深度学习模型是一个多步骤的过程,涉及设置合适的硬件环境、处理数据、配置模型参数以及启动训练过程。
我们首先从ultralytics库中导入YOLO类,这是我们将要使用的主要工具,它封装了模型的加载、训练和推理等多个过程。
from ultralytics import YOLO # 导入YOLO模型
在这段代码中,workers参数设置为1,意味着在数据加载过程中只会有一个工作线程,这对于资源受限的环境非常有用。batch参数设为16,定义了每一批训练数据的大小,这是训练时内存消耗和速度的一个重要平衡点。data_name和data_path分别指定了我们的数据集名称和它的路径,确保模型能找到并使用正确的数据集进行训练。
workers = 1
batch = 8
data_name = "PokerCards"
data_path = './datasets/PokerCards/poker.yaml'
通过YOLO类创建了一个model对象,我们指定了预训练模型的权重文件路径和任务类型。
model = YOLO('./weights/yolov5nu.pt', task='detect') # 加载预训练的YOLOv8模型
最后,我们通过指定模型权重文件的路径和任务类型,创建了一个YOLO对象。然后,我们调用model.train函数来开始训练过程,其中指定了许多重要的参数,比如数据配置文件的路径、计算设备、工作进程数目、输入图像的大小、训练周期(epochs)数目以及批处理大小。
results = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='0', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v5_' + data_name # 指定训练任务的名称
)
model = YOLO('./weights/yolov8n.pt', task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='0', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
在扑克牌识别领域,对训练过程的损失函数进行分析是至关重要的。它不仅反映了模型学习的状况,还指示了模型的性能可能存在的问题。
从损失函数的图像中我们可以看出,模型的box_loss、cls_loss(分类损失)和obj_loss(目标损失)在训练过程中都呈现出明显的下降趋势,这表示模型在学习过程中不断优化其对扑克牌定位、分类和识别的能力。这些损失指标的下降也相对平滑,没有出现较大的波动,这说明我们的训练过程稳定,模型在逐步学习中取得了连贯的进步。
train/box_loss和val/box_loss的下降表明模型在训练和验证集上对目标的定位变得更加准确。而train/cls_loss和val/cls_loss的下降则意味着模型在目标的分类上也越来越精确。这对于扑克牌识别软件来说极为重要,因为不仅需要准确识别扑克牌的存在,还要正确判别扑克牌的种类。
在评价指标方面,precision(精确度)和recall(召回率)都维持在非常高的水平,这表示模型在识别扑克牌时不仅准确,同时也很少错过任何一个扑克牌。高精确度保证了模型的识别结果可靠,而高召回率则确保了模型能够捕捉到所有相关的目标。
最为关键的性能指标mAP(平均精度均值)同样展现出优秀的性能,mAP@0.5表示在IoU(交并比)阈值为0.5时的平均精度均值,而mAP@0.5-0.95则涵盖了从0.5到0.95不同IoU阈值的平均精度均值。这两个指标的高值说明我们的模型能够以各种不同标准准确地识别目标,这对于实际应用中的准确性和鲁棒性非常重要。
在我们的扑克牌识别项目中,对模型性能的评估同模型的训练一样重要。精确度-召回率(Precision-Recall,简称PR)曲线是衡量模型性能的关键工具之一。
该PR曲线图揭示了我们的模型在扑克牌检测任务上的卓越表现。理想的PR曲线应该是向右上角趋近,这意味着高精确度和高召回率的结合,而我们的模型展示了几乎完美的结果。PR曲线几乎贴近坐标的顶部和右侧边缘,表明在几乎所有的召回率水平上,模型都能保持极高的精确度。这种情况通常意味着即使模型尝试识别更多的扑克牌(即提高召回率),它也能维持很少或没有错误识别(即保持高精确度)。
图中标注的“all classes 0.995 mAP@0.5”表明在IoU(交并比)为0.5的条件下,模型在所有类别上的平均精度均值达到了0.995。这是一个近乎完美的性能指标,显示了模型在识别扑克牌时几乎没有错误。mAP(mean Average Precision)是目标检测中常用的性能衡量指标,一个接近1的mAP值表明模型在定位和分类目标上的性能接近完美。
通过这个评估,我们对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.995 | 0.993 | 0.990 | 0.995 |
F1-Score | 1.00 | 1.00 | 0.98 | 1.00 |
(3)实验结果分析:
在本节中,我们将深入分析并比较在同一数据集上应用不同版本的YOLO算法——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——的性能表现。评估标准采用了两个核心的度量指标:平均精度均值(mAP)和F1-Score。这两个指标广泛用于目标检测领域,以衡量模型在识别任务中的准确性和鲁棒性。
首先,我们注意到所有模型的表现都非常出色,mAP值都在0.99以上,这说明每个模型在准确地检测和分类扑克牌上都做得非常好。特别是YOLOv5nu和YOLOv8n,它们在这个数据集上达到了等高的mAP值0.995,表明在交并比(IoU)为0.5时,模型在平均精度上表现几乎完美。这样的高mAP值是在目标检测任务中十分罕见的,特别是在含有多个类别和各种尺寸的扑克牌时。
从F1-Score的角度来看,这一度量指标综合考虑了模型的精确度和召回率,是一个更加严格的性能评估。YOLOv5nu、YOLOv6n和YOLOv8n都取得了完美的1.00分,这意味着它们在精确度和召回率方面都实现了最佳的平衡,几乎没有任何漏检或误检的情况。相比之下,YOLOv7-tiny以0.98的F1-Score略微落后,这可能是由于其作为“tiny”版本,在模型容量和复杂性上的妥协导致了轻微的性能下降。
进一步分析这些结果,我们可以发现,尽管YOLOv7-tiny的性能略低于其他版本,但它仍然是一个非常强大的模型,特别是如果考虑到其可能具有更快的推理速度和更低的计算资源要求。对于需要在资源受限的环境下运行的应用来说,YOLOv7-tiny可能是一个更实用的选择。另一方面,YOLOv8n和YOLOv5nu的等高mAP和F1-Score展示了YOLO系列的最新进展和优化可以如何提升性能,尤其是在这样的高精度任务中。这两个版本的高分表明了算法设计者在网络架构、训练策略和优化算法上的成功改进。
综上所述,在相同的扑克牌数据集上进行实验时,YOLOv8n和YOLOv5nu提供了最优的性能表现,而YOLOv6n也表现得非常接近。尽管YOLOv7-tiny在这个实验中的表现略低,但仍然是一个非常有效的模型,尤其是在对计算资源有限的应用场景中。通过这些对比分析,我们能够更深入地理解各版本YOLO模型在实际应用中的优势和局限,进而为未来的模型选择和优化提供有价值的参考。
4.4 代码实现
在我们的扑克牌识别软件中,引入深度学习模型进行图像中扑克牌的识别是实现智能化的关键。为了展示模型的检测效果,我们开发了一个图形用户界面(GUI),通过该界面用户可以直观地看到模型对扑克牌识别的结果。
(1)引入必要的库
首先,我们引入random库生成随机颜色,以便在最终图像中以不同颜色标注不同的扑克牌;引入sys和time库进行系统级操作和时间测量;使用PySide6构建图形用户界面;利用OpenCV进行图像的读取和处理;引入YOLOv8Detector类进行目标检测。最后,我们通过QF_Config.set_verbose(False)关闭了一些冗余的日志信息,以便专注于重要输出。
import random # 导入random模块,用于生成随机数
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于处理时间
from QtFusion.config import QF_Config
import cv2 # 导入OpenCV库,用于处理图像
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建窗口
from QtFusion.utils import cv_imread, drawRectBox # 从QtFusion库中导入cv_imread和drawRectBox函数,用于读取图像和绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库中的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于加载YOLOv8模型并进行目标检测
from datasets.PokerCards.label_name import Label_list
QF_Config.set_verbose(False)
(2)初始化模型
接着,我们通过读取标签列表Label_list来获取扑克牌的类别,并为每个类别生成了一个随机颜色。最后,通过调用model.load_model加载了事先训练好的模型权重。
cls_name = Label_list # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 为每个目标类别生成一个随机颜色
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
(3)设置主窗口
在这里,我们重写了构造函数来设置窗口的大小和位置,并在其中创建了一个QLabel对象来显示处理后的图像。QLabel作为QtWidgets的组件,是显示图像的容器。此外,我们还定义了一个键盘事件处理函数来处理用户的交互,例如,用户可以通过按Q键来关闭应用程序。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(640, 640) # 设置窗口的大小
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象
self.label.setGeometry(0, 0, 640, 640) # 设置QLabel的位置和大小
def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的是Q键
self.close() # 关闭窗口
(4)主程序流程
在主函数中,我们初始化了应用程序和MainWindow对象。选择了一个测试图像,并使用OpenCV的功能对其进行读取和调整大小,以适应GUI中的展示。接着,将图像传入YOLOv8模型进行预处理,预处理是确保图像格式和大小符合模型输入要求的重要步骤。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
img_path = abs_path("test_media/284ee608df961759c4261b00b296dffe.jpeg")
image = cv_imread(img_path) # 使用cv_imread函数读取图像
image = cv2.resize(image, (850, 500)) # 将图像大小调整为850x500
pre_img = model.preprocess(image) # 对图像进行预处理
在调用模型的predict方法后,我们得到了预测结果。这里不仅记录了推理时间,还通过model.postprocess方法对检测结果进行了进一步处理。处理后的结果包括类别、边界框、置信度等信息,这些信息用于在图像上绘制相应的边界框和标签,其中标签包括了类别和置信度。
t1 = time.time() # 获取当前时间(开始时间)
pred = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间(结束时间)
use_time = t2 - t1 # 计算预测所用的时间
det = pred[0] # 获取预测结果的第一个元素(检测结果)
# 如果有检测信息则进入
if det is not None and len(det):
det_info = model.postprocess(pred) # 对预测结果进行后处理
for info in det_info: # 遍历检测信息
# 获取类别名称、边界框、置信度和类别ID
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id']
label = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类别名称和置信度
# 画出检测到的目标物
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制边界框和标签
print("推理时间: %.2f" % use_time) # 打印预测所用的时间
window.dispImage(window.label, image) # 在窗口的label上显示图像
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
最后,我们通过调用Qt的方法显示了主窗口,并使应用程序进入事件循环,等待用户交互。以上步骤共同构成了一个完整的扑克牌识别应用程序,从后端的图像处理和模型推理到前端的用户交互和结果展示,每一步都紧密相关,共同确保了系统的有效运行。
5. 扑克牌识别软件实现
在实现一款实时扑克牌识别软件时,我们采取了一种综合性的系统设计思路,旨在打造一个既直观又易于使用的交互界面,同时集成先进的图像处理和机器学习功能。我们的系统设计着眼于用户体验,确保用户能够无缝进行扑克牌的识别任务,而无需深入了解背后的复杂技术细节。
5.1 系统设计思路
我们的设计思路是建立在模块化和分层架构的基础上的。通过这种方式,我们能够将系统拆分成独立、高内聚的组件,每个组件负责特定的功能。这不仅使得系统易于维护和升级,而且使得我们能够快速响应未来扑克牌识别需求的变化。
架构设计
我们的系统被划分为三个主要层次,每个层次专注于执行特定的任务,并通过清晰定义的接口与其他层次通信。
- 处理层(Processing Layer):处理层是系统的核心,我们使用了YOLOv8Detector类来承担这一责任。这个类包装了一个预训练的深度学习模型,可以识别和检测图像中的扑克牌。这个层次的设计意味着所有的图像处理和目标检测逻辑都被封装在这个类中,其他系统部分不需要关心这些处理是如何完成的,只需关注它们的输出。
- 界面层(UI Layer):在界面层,我们通过Ui_MainWindow类提供了一系列用户交互元素,这些元素都是经过精心设计的,旨在提供清晰和直观的操作流程。用户可以通过简单的点击和输入来指示软件执行识别任务,并且可以通过界面上的即时反馈来了解识别过程和结果。
- 控制层(Control Layer):控制层则作为用户输入和系统输出之间的桥梁。通过MainWindow类中实现的槽函数和其他控制逻辑,我们确保了用户的每一个操作都能得到快速而正确的响应。控制层负责管理处理层和界面层的交互,确保数据和控制信息的准确传递。
此外,我们还重视信号和槽机制在系统中的应用。这是Qt框架中的一项强大功能,允许我们的应用程序组件在不直接知晓彼此内部实现的情况下进行通信。例如,当检测到新的扑克牌时,处理层会发出一个信号,界面层的某个部件可以连接到这个信号,当信号触发时更新界面上的信息。
最终,通过这样的系统设计思路,我们的软件在易用性、功能性和可扩展性上都达到了一个很好的平衡。用户可以享受到便捷的操作体验,同时又能从我们强大的后端处理能力中受益。
系统流程
在扑克牌识别软件中,我们打造的系统不仅仅是一款软件,更是一套集成了高级目标检测技术、用户交互设计和数据处理的完整解决方案。
- 当用户的体验始于启动应用程序,这一动作触发了整个系统的活动序列,从而揭开了人工智能扑克牌识别的序幕。随着MainWindow类实例的创建,用户立即被引入一个直观且功能丰富的操作界面。这个界面不仅仅是交互的平台,它还起着指挥控制中心的作用,引导用户从输入源的选择开始他们的识别之旅。无论是选择实时摄像头捕获的图像流、导入视频文件,还是上传静态图像,我们的系统都准备就绪,等待用户的指令。
- 当输入源被确定后,系统便进入到了核心阶段——媒体处理。在这一阶段,我们的媒体处理器和算法精心处理每一个输入,确保它们被正确配置和加载。通过调用预处理函数,每帧图像都被调整到最适合YOLOv8模型的形态,这一步骤对于后续的高精度识别至关重要。
- 接着,进入检测与识别阶段,这一步是我们软件的核心。利用预处理后的图像,YOLOv8模型被唤醒以执行它的使命——精准地检测和识别图像中的扑克牌。通过深度学习算法的力量,每一张扑克牌的位置和类别被精确标定,模型的输出随即成为了界面更新的直接源泉。
- 界面的更新几乎是实时的,检测结果以动态框和注释的形式展现在用户眼前,为用户提供了一个不仅生动但也极其信息化的视觉反馈。此外,统计数据、检测摘要以图表或列表的形式呈现,使用户能够立刻掌握检测的全貌。
- 而交互性则是我们系统的另一大亮点。用户不只是旁观者,他们可以主动保存结果、访问帮助信息,甚至通过各种筛选和分析工具深入了解和评估特定的检测结果。我们还赋予了用户对媒体播放全权控制的能力,包括暂停和恢复摄像头捕捉和视频分析等。
总的来说,我们的系统设计理念是将高效能的计算机视觉技术与用户友好的界面相结合,提供一个无缝的、交互式的扑克牌识别体验。从简单的开始到深入的交互操作,我们的软件确保了每一个环节都是顺畅、直观并充满探索乐趣的。
5.2 登录与账户管理
在我们的扑克牌识别软件中,我们不仅注重识别算法的精准性和效率,同样重视用户体验。为此,我们集成了一套基于PySide6和SQLite的用户登录系统,它不只简化了用户的操作流程,更在保证个人隐私和数据安全的基础上,提供了丰富的个性化设置选项。
我们的登录系统是用户使用软件的第一站。用户首次使用软件时,可以轻松注册账户,创建属于自己的个人空间。在这里,他们可以随心所欲地修改密码,选择个性化头像,甚至在不使用软件时注销账户。这一系列操作的流畅性,让用户在享受服务的同时,也感受到了软件对个人设置的尊重。
进入软件后,用户将体验到我们强大的扑克牌识别功能。软件主界面实时展示了包括检测框、类别和置信度等关键信息,确保用户可以即时获得检测反馈。无论是图片、视频还是实时摄像头捕获的画面,我们的系统都能够轻松应对,快速识别并详细记录每一张扑克牌。
我们的系统不仅限于实时检测,还支持批量文件输入,极大地提升了用户在处理大量数据时的便利性。无论用户的需求是简单的娱乐还是复杂的数据分析,我们的软件都能提供满足需求的功能和性能。
通过这些精心的设计和实现,我们的扑克牌识别软件不仅具备了导入各类深度学习模型、实现多物体识别和检测的强大能力,还通过用户登录界面提供了完善的账户管理功能,满足用户在实时目标检测场景下的多元化需求。我们相信,无论用户的技术背景如何,都能在使用我们的软件时感受到便利和安全,同时享受到高效率和高准确度的识别体验。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Uu4m1u7np/
在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时扑克牌识别软件。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的扑克牌识别和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Huang R, Pedoeem J, Chen C. YOLO-LITE: a real-time object detection algorithm optimized for non-GPU computers[C]//2018 IEEE international conference on big data (big data). IEEE, 2018: 2503-2510. ↩︎
Mathew M P, Mahesh T Y. Leaf-based disease detection in bell pepper plant using YOLO v5[J]. Signal, Image and Video Processing, 2022: 1-7. ↩︎
Wang G, Chen Y, An P, et al. UAV-YOLOv8: a small-object-detection model based on improved YOLOv8 for UAV aerial photography scenarios[J]. Sensors, 2023, 23(16): 7190. ↩︎
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. ↩︎