基于深度学习的扑克牌识别软件(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

基于深度学习的扑克牌识别软件(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

def load_model(self, model_path):

self.device = select_device(self.params['device'])

self.model = YOLO(model_path, ...)

names_dict = self.model.names

self.names = [Chinese_name[v] if v in Chinese_name else v for v in names_dict.values()]

self.model(torch.zeros(1, 3, *[self.imgsz] * 2).to(self.device).type_as(next(self.model.model.parameters())))

preprocess方法用于图像的预处理工作,而predict方法则执行模型的推理。

def preprocess(self, img):

self.img = img

return img

def predict(self, img):

results = self.model(img, **ini_params)

return results

最后,postprocess方法负责处理模型的预测结果,提取识别到的对象信息,并将它们格式化为一个包含类别名称、边界框、置信度和类别ID的列表。

def postprocess(self, pred):

results = []

for res in pred[0].boxes:

for box in res:

class_id = int(box.cls.cpu())

bbox = box.xyxy.cpu().squeeze().tolist()

bbox = [int(coord) for coord in bbox]

result = {

"class_name": self.names[class_id],

"bbox": bbox,

"score": box.conf.cpu().squeeze().item(),

"class_id": class_id,

}

results.append(result)

return results

以上代码片段展示了该扑克牌识别软件中深度学习模型构建的核心步骤。它体现了从模型加载到预处理、预测及后处理的完整流程。通过对代码的专业阐述,读者可以获得深入的理解,并应用这些知识来构建或优化自己的目标识别系统。

4.3 训练代码

在我们的识别系统中,训练一个高效、准确的模型是实现目标识别的关键。我们使用的训练脚本是构建这一系统的核心,它涉及多个重要步骤,每个步骤都经过精心设计以确保最终模型的性能。以下是训练模型的详细代码介绍。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数

设置

说明

学习率(lr0)

0.01

决定了模型权重调整的步长大小,在训练初期有助于快速收敛。

学习率衰减(lrf)

0.01

控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。

动量(momentum)

0.937

加速模型在正确方向上的学习,并减少震荡,加快收敛速度。

权重衰减(weight_decay)

0.0005

防止过拟合,通过在损失函数中添加正则项减少模型复杂度。

热身训练周期(warmup_epochs)

3.0

初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。

批量大小(batch)

16

每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。

输入图像大小(imgsz)

640

模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

在这个“模型训练”部分的博客中,我们将深入讨论如何使用YOLOv8进行扑克牌识别模型的训练过程。模型训练是机器学习项目中最为关键的步骤之一,它直接影响到最终模型的性能和效果。以下是模型训练的具体实现过程及解释:

首先,我们需要导入必要的库和模块,以支持模型的训练:

import os

import torch

import yaml

from ultralytics import YOLO

from QtFusion.path import abs_path

这里我们使用了os模块来处理文件和目录路径,torch提供了深度学习的核心功能和运算支持,yaml用于读取配置文件,YOLO类是我们的模型基础,abs_path函数用于计算路径的绝对位置。接下来,我们检查并选择合适的设备来进行训练。如果GPU可用,我们会使用GPU来加速训练过程;否则,我们将使用CPU进行训练。

device = "0" if torch.cuda.is_available() else "cpu"

训练过程的具体配置开始于确定工作进程的数量和批次大小。在这个例子中,我们设置了workers为1,意味着会有一个工作进程来加载数据,batch大小设为8,表示每个批次将处理8个图像。

workers = 1

batch = 8

之后,我们定义了数据集的名称,并构建了相应配置文件的路径。配置文件通常包含训练和验证数据的路径、类别名称等关键信息。

data_name = "PokerCards"

data_path = './datasets/PokerCards/poker.yaml'

在读取和修改配置文件之前,我们先获取其目录路径,并将系统路径转换为Unix样式的路径。

directory_path = os.path.dirname(unix_style_path)

with open(data_path, 'r') as file:

data = yaml.load(file, Loader=yaml.FullLoader)

修改path键后,我们将新路径写回到YAML配置文件中。这保证了模型训练时能够正确地定位到数据集的位置。

if 'path' in data:

data['path'] = directory_path

with open(data_path, 'w') as file:

yaml.safe_dump(data, file, sort_keys=False)

最关键的一步是加载预训练的YOLO模型并启动训练过程。我们使用YOLO类创建了一个模型实例,并通过调用train方法来训练模型。

model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')

results2 = model.train(

data=data_path,

device=device,

workers=workers,

imgsz=640,

epochs=120,

batch=batch,

name='train_v8_' + data_name

)

在train方法中,我们指定了多个参数,包括数据配置文件路径、训练设备、工作进程数量、图像尺寸、训练周期数、批次大小,以及训练任务的名称。这些参数共同构成了训练过程的基础,它们每一个都对模型训练的效果和效率有直接的影响。

通过上述详细的代码说明和解释,读者应能够获得关于如何准备和执行模型训练任务的深入理解。这些步骤不仅适用于YOLO模型,也适用于其他深度学习模型的训练工作。

5. 实验结果与分析

5.1 训练曲线

在深度学习的训练过程中,损失函数图像和性能指标是评估模型性能的关键。本文分析的是基于YOLOv8算法的目标检测模型在训练过程中的表现。通过观察提供的图像,我们可以对模型训练的效果进行深入剖析。

首先,我们注意到训练集和验证集的box_loss(边界框损失)都随着训练轮数的增加而显著下降,并且很快趋于稳定。这表示模型在识别物体的位置方面的性能逐渐增强,并能够稳定地保持这一性能。同时,cls_loss(类别损失)也呈下降趋势,显示出模型在区分不同扑克牌类别方面的能力随着训练得到提升。

接着,我们观察到obj_loss(目标损失)在训练过程中也呈现下降趋势。这项指标的下降意味着模型越来越好地预测了目标的存在,随着训练的进行,其预测的置信度逐步增强。

进一步来看,模型在精度方面的表现同样出色。Precision(精确度)和Recall(召回率)图表都显示了非常高的水平,几乎达到1.0的理想状态,这表明模型在扑克牌检测任务上具有高准确率和高覆盖率。这两个指标的高值说明模型不仅能够准确地检测出大多数的扑克牌,而且在它声称检测到扑克牌的情况下,这些检测是可信的。

mAP(平均精确度)是衡量目标检测模型性能的另一个重要指标。我们看到mAP50(阈值为0.5时的mAP)和mAP50-95(阈值从0.5到0.95时的mAP的平均值)均展现了优秀的表现。特别是mAP50,接近完美,这意味着模型对于检测目标的大部分预测都是正确的。而mAP50-95虽然略低,但也显示了模型在不同置信度阈值下都保持了良好的性能,这对于实际应用中面对多种检测难度的场景是十分必要的。

整体而言,通过这些性能指标的综合分析,我们可以得出结论:训练的YOLOv8模型在扑克牌的检测任务上表现卓越,具有很高的准确度和鲁棒性。训练过程的损失函数稳定下降和性能指标的高水平表明模型训练得当且有效。这些结果为模型在实际应用中的部署提供了信心,预示着在真实世界的复杂场景中,模型有望维持这一高水准的表现。

5.2 混淆矩阵

混淆矩阵是评估分类器性能的一种重要工具,尤其是在多类别识别任务中。它显示了模型预测的结果与实际情况之间的对应关系,使我们能够直观地观察到分类器在哪些类别上表现良好,以及它在哪些类别上可能会混淆。

观察提供的混淆矩阵,我们首先可以看到主对角线上的值明显高于其他位置,这表示绝大多数的预测是准确的。每个类别,从'A'到'K'再到各个数字代表的扑克牌,都有相应的高值,这说明在大多数情况下,模型能够正确识别出扑克牌的具体类别。

具体地,这个混淆矩阵是标准化处理过的,其数值表示了在给定的真实类别中模型预测正确的比例。这种标准化是有用的,因为它允许我们不受类别样本数量不平衡的影响,从而可以公平地评价模型在所有类别上的表现。

在此混淆矩阵中,对角线上接近1的值意味着大多数类别的预测准确率很高。对于一个扑克牌识别系统来说,这是一个非常好的结果,因为它意味着模型能够可靠地区分和识别不同的牌面。

混淆矩阵没有显示明显的偏差或误差模式,这通常会出现在非对角线的元素中。在理想情况下,非对角线的元素应该接近0,表明几乎没有误分类。在此图中,非对角线上的值接近于0,表明误分类的情况非常少。这是一个指标,表明模型没有系统性的混淆问题,对于所有类别都具有较好的区分度。

此外,可以注意到混淆矩阵中没有出现模型过分倾向于预测任何一个类别的情况,这在实际应用中是很重要的。在某些情况下,模型可能会学会优先预测较为常见或容易识别的类别,导致性能偏差,但这里的均匀分布说明模型预测是公正的,没有这样的偏差。

综上所述,从混淆矩阵中我们可以得出结论,该YOLOv8模型在多类别的扑克牌识别任务上具有高度的准确性和可靠性。它能够以高信度区分不同的扑克牌类别,表明了模型的鲁棒性和实际应用的可行性。不过,混淆矩阵中的具体数值会提供更多细节,可能会揭示出需要进一步优化的特定类别。在应用这个模型前,仔细分析这些数值并考虑对策,例如增加某些类别的训练样本或调整权重,将进一步提高系统的整体性能。

5.3 YOLOv8/v7/v6/v5对比实验

(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 作为衡量模型性能的重要指标,尤其在处理类别分布不均的数据集时显得尤为关键。它通过结合精确率与召回率,提供了一个单一的度量标准,能够全面评价模型的效能。精确率衡量的是模型在所有被标记为正例中真正属于正例的比例,而召回率则关注于模型能够识别出的真正正例占所有实际正例的比例。F1-Score通过两者的调和平均,确保了只有当精确率和召回率同时高时,模型的性能评估才会高,从而确保了模型对于正例的预测既准确又完整。

mAP(Mean Average Precision):在目标识别任务中,Mean Average Precision(mAP)是评估模型性能的重要标准。它不仅反映了模型对单个类别的识别精度,而且还考虑了所有类别的平均表现,因此提供了一个全局的性能度量。在计算mAP时,模型对于每个类别的预测被单独考虑,然后计算每个类别的平均精度(AP),最后这些AP值的平均数形成了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系列的几种版本在相同任务上的性能,我们在一个标准化的扑克牌数据集上进行了一系列实验。实验的目的是明确各版本的优势和局限性,以及它们在实际应用中的可行性。实验设置旨在确保公平比较,包括使用相同的训练轮数、相同的数据增强策略以及统一的评价标准。

在度量指标方面,我们采用了mAP(平均精度均值)和F1-Score两个关键指标。mAP反映了模型在不同置信度阈值下的平均性能,是目标检测中的一个标准化评价指标,特别是在有多个类别时。而F1-Score则是精确度和召回率的调和平均,能够平衡评价这两个方面的性能。

分析实验结果,我们可以看到YOLOv5nu和YOLOv8n在mAP上都取得了0.995的高分,而YOLOv6n紧随其后,分数为0.993。YOLOv7-tiny的mAP稍低,为0.990。在F1-Score上,YOLOv5nu、YOLOv6n和YOLOv8n都实现了完美的1.00得分,表明了这些模型在精确度和召回率上达到了最优平衡。相比之下,YOLOv7-tiny的F1-Score为0.98,略低于其他模型。

在mAP的指标上,YOLOv5nu和YOLOv8n的出色表现可能源于其在网络架构中对多尺度特征的有效利用,以及更精细的边界框预测机制。YOLOv8n作为最新的版本,可能在算法优化上进行了进一步的改进,包括更先进的损失函数和正则化方法。YOLOv6n虽然稍微落后,但其表现仍然十分强劲,显示了YOLO系列在升级中的连续性和稳定性。

YOLOv7-tiny相对较低的得分可能是由于它作为一个轻量化版本,在模型复杂度和参数数量上有所减少,这在某种程度上可能限制了其学习能力和特征提取的深度。然而,它的得分仍然非常接近完美,表明即使是更小型的模型也能在此类任务上取得良好结果。

整体而言,这些结果表明了YOLO系列的强大性能和适应性。模型的选择应考虑到特定应用的需求,如计算资源、检测速度和模型复杂度。YOLOv5nu和YOLOv8n是那些追求最高准确度的理想选择,而YOLOv7-tiny则更适合那些对模型尺寸有限制的应用场景。通过这些实验,我们不仅能够为扑克牌识别任务选择合适的模型,还为未来的研究和应用提供了宝贵的参考。

6. 系统设计与实现

6.1 系统架构概览

构建一个基于YOLO的扑克牌识别系统,我们需要设计一个既能处理实时视频流又能保证高准确度识别的架构。该系统主要包含以下几个关键组成部分:

数据预处理模块 (PreprocessingModule)

功能: 负责对输入的图像或视频流进行处理,包括图像尺寸调整、归一化等。

方法: resize(), normalize()

作用: 确保输入数据符合YOLO模型的要求,提升识别准确度和速度。

模型加载与配置模块 (ModelConfigModule)

功能: 负责加载预训练的YOLO模型并进行配置,包括选择合适的版本和调整参数。

方法: load_model(), configure_parameters()

作用: 保证系统可以根据需求快速切换不同版本的YOLO模型,调优性能。

检测与识别模块 (DetectionModule)

功能: 执行实时对象检测和识别任务,输出识别结果和位置信息。

方法: detect_objects(), classify_cards()

作用: 是整个系统的核心,根据训练好的模型识别出扑克牌的种类和位置。

结果后处理模块 (PostprocessingModule)

功能: 对检测模块的输出进行后处理,包括非极大值抑制(NMS)等。

方法: apply_nms(), filter_results()

作用: 提高识别结果的准确性,去除冗余的检测框。

输出接口模块 (OutputModule)

功能: 将处理后的结果以适当的格式输出,供其他系统或模块使用。

方法: display_results(), export_data()

作用: 为用户或其他系统提供易于理解和使用的识别结果。

在这个架构中,数据预处理模块确保输入数据的质量,为模型提供正确格式的数据;模型加载与配置模块确保了系统的灵活性和高效性;检测与识别模块是系统的核心,直接关系到整个系统的性能;结果后处理模块进一步提升了识别的准确性;最后,输出接口模块负责将识别结果以适用的方式展示或传递给其他系统。

通过这样的系统架构设计,我们可以实现一个既快速又准确的扑克牌识别系统,能够满足实时处理的需求,并具有良好的可扩展性和灵活性。

6.2 系统流程

在基于YOLOv8/v7/v6/v5的扑克牌识别系统中,整个工作流程可以被概括为以下几个关键步骤。以下内容将为您详细介绍这一流程:

开始

系统启动,初始化各个模块。

数据预处理 (PreprocessingModule)

输入图像或视频流被送入PreprocessingModule。

使用resize()方法调整图像尺寸以符合模型要求。

通过normalize()方法对图像数据进行归一化处理,准备好送入模型进行识别。

模型加载与配置 (ModelConfigModule)

ModelConfigModule负责通过load_model()方法加载预训练的YOLO模型。

根据需要,调用configure_parameters()方法调整模型参数,优化性能和识别准确率。

检测与识别 (DetectionModule)

处理好的图像数据被送入DetectionModule。

detect_objects()方法运行对象检测,识别出图像中的所有扑克牌及其位置。

classify_cards()方法对检测到的扑克牌进行分类,确定其具体种类。

结果后处理 (PostprocessingModule)

DetectionModule的输出送入PostprocessingModule。

使用apply_nms()方法执行非极大值抑制,移除重叠的检测框,确保每个对象只被识别一次。

filter_results()方法过滤掉置信度较低的结果,保留最终的识别结果。

输出结果 (OutputModule)

经过后处理的结果送入OutputModule。

display_results()方法将识别结果显示给用户,例如在屏幕上绘制边界框和标签。

如需将结果用于其他系统或保存,export_data()方法可以将识别结果导出为标准格式。

结束

流程结束,等待下一帧图像或者用户结束程序。

通过上述流程,我们的系统能够实时地接收输入图像,快速准确地识别扑克牌,并给出结果,整个过程高效、流畅。这不仅展示了YOLO算法在实时图像处理方面的强大能力,也体现了我们系统设计的合理性和高效性。

代码下载链接

如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:

资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷

演示与介绍视频 :https://www.bilibili.com/video/BV1tm411r766/

YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZ2Zmp5q

YOLOv8和v5项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2ZmZxw

YOLOv7项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zmpdp

YOLOv6项目完整资源下载:https://mbd.pub/o/bread/mbd-ZZ2Zmpxq

完整安装运行教程:

这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:

Pycharm和Anaconda的安装教程:https://deepcode.blog.csdn.net/article/details/136639378;

软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:

Python环境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);

离线依赖包的安装指南:https://deepcode.blog.csdn.net/article/details/136650641(2,3方法可选一种);

如使用离线包方式安装,请下载离线依赖库,下载地址:https://pan.baidu.com/s/1uHbU9YzSqN0YP_dTHBgpFw?pwd=mt8u (提取码:mt8u)。

7. 结论与未来工作

本文通过深入研究并实践了基于YOLOv8/v7/v6/v5的深度学习模型在扑克牌识别领域的应用,成功开发了一个结合了这些先进算法的扑克牌识别系统。通过对多个版本的YOLO模型进行细致的比较和优化,本研究不仅提升了扑克牌识别的准确率和实时性,还通过Streamlit创建了一个直观、美观且易于使用的Web应用,使用户能够轻松地进行扑克牌识别,从而在实际应用中发挥重要作用。

经过一系列实验验证,本文所提出的方法在扑克牌识别的准确性和处理速度上都达到了令人满意的水平。同时,我们还提供了完整的数据集处理流程、模型训练和预测的代码,以及基于Streamlit的系统设计和实现细节,为后续的研究者和开发者复现和参考提供了方便。尽管取得了一定的成果,但扑克牌识别作为一个复杂多变的任务,仍然面临着许多挑战和改进空间。在未来的工作中,我们计划从以下几个方向进行探索:

模型优化:继续探索更深层次的网络结构和优化策略,如神经网络架构搜索(NAS)技术,以进一步提升模型的性能和效率。

多模态融合:考虑结合图像以外的数据,如元数据标签、玩家行为分析等,采用多模态学习方法进行扑克牌识别,以更全面地理解游戏场景。

跨域适应性:研究不同类型扑克牌游戏的识别,通过领域自适应技术提高模型在不同游戏和环境中的泛化能力。

用户交互体验:进一步优化系统的用户界面和交互设计,使其更加人性化、智能化,以满足更广泛用户的需求。

实际应用拓展:探索扑克牌识别在更多实际应用场景中的应用,如智能监控、娱乐游戏辅助、自动化赌场管理等,以发挥其最大的社会和经济价值。

总之,扑克牌识别技术正处于快速发展之中,随着技术的不断进步和应用场景的不断拓展,我们相信在不久的将来,基于深度学习的扑克牌识别将在多个领域发挥更加重要的作用。

Lou, Haitong, et al. "DC-YOLOv8: small-size object detection algorithm based on camera sensor." Electronics 12.10 (2023): 2323.↩ ↩︎

Wang, Chien-Yao, Alexey Bochkovskiy, and Hong-Yuan Mark Liao. "YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors." Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2023. ↩︎

Li, Chuyi, et al. "YOLOv6: A single-stage object detection framework for industrial applications." arXiv preprint arXiv:2209.02976 (2022). ↩︎

A. Lee, B. Kim, "Integrated Learning Approach for Card Recognition using YOLOv8 and Faster R-CNN", International Journal of Artificial Intelligence, 2023. ↩ ↩︎

Zhang, Chaoyun, Paul Patras, and Hamed Haddadi. "Deep learning in mobile and wireless networking: A survey." IEEE Communications surveys & tutorials 21.3 (2019): 2224-2287. ↩︎

猜你喜欢

关于开展2024年“慈善一日捐、济困献爱心”的通知
客观分析:什么是蓝海项目?老隋蓝海项目到底靠不靠谱?
金立手机黑名单怎么解除 金立手机黑名单解除方法
掌握火的艺术:如何使用 ferro rod 和刀
一般适合晚上寂寞的时候玩的社交软件都有哪些?
世界杯日本人足球队,日本足球世界杯最好成绩是多少