摘要:在物流和制造业中,开发一套高效的条形码与二维码识别系统显得尤为关键。本博文深入探讨了如何利用深度学习技术打造出一套先进的条形码及二维码检测系统,并且提供了一套完整的实施方案。该系统搭载了性能卓越的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界面+训练数据集)
前言
在当今快速发展的数字化和自动化时代,条形码和二维码作为信息编码和解码的重要工具,在各个行业中发挥着至关重要的作用。从零售业的商品管理到物流行业的包裹追踪,再到制造业的部件跟踪,条形码和二维码的高效、准确识别技术是提高操作效率和准确性的关键。因此,研究和开发高性能的条形码和二维码检测系统具有重大的实际应用价值和深远的研究意义。
在过去的几年里,随着深度学习技术的迅速发展和应用,条形码和二维码检测技术也经历了从传统图像处理方法到基于深度学习的方法的转变。这一变化极大地提升了检测的准确率和效率,尤其是在复杂环境下的表现。YOLO1算法由于其单阶段检测机制,相比传统的两阶段检测方法(如R-CNN系列),在速度上有着显著的优势,同时也保持了较高的准确率。
Deep Anchoring Network(DAN),该网络通过引入一种新颖的锚定策略,显著提高了模型对条形码和二维码的定位准确率。DAN算法通过深度学习模型预测目标的最优锚点位置和大小,减少了传统锚点方法中的手动选择偏差,从而提高了检测的精度和鲁棒性。
Spatial Attention Guided Network(SAGNet),利用空间注意力机制来增强模型对目标特征的识别能力。SAGNet通过引入一个空间注意力模块,使网络能够更加集中地关注图像中的关键区域,从而提高了对复杂背景下条形码和二维码的检测准确率[。
基于改进的卷积神经网络(CNN)结构,专为小尺寸物体检测优化。该算法,称为MiniDet,通过引入一种新的多尺度特征融合技术,有效地提高了对于小尺寸条形码和二维码的检测能力。MiniDet算法通过在不同层级的特征图之间进行精细的特征融合,能够捕获更多的细节信息,从而提高检测的精度和召回率。在公开的Barcode-500数据集上,MiniDet算法展示了超过传统YOLOv5算法5%的准确率提升。
基于图卷积网络(GCN)的检测框架,这种框架特别适合处理在复杂背景下的条形码和二维码检测问题。该框架,命名为CodeGCN,利用GCN强大的关系建模能力来理解条码之间的相互作用和背景噪声。通过在GCN中引入注意力机制,CodeGCN能够自动区分对检测任务有用的特征和不相关的噪声,显著提高了在复杂场景下的检测性能。在一个包含丰富背景噪声的自定义数据集上,CodeGCN比现有的最好方法提高了约8%的F1分数。
为了进一步提高检测系统的实时性和准确性,一项研究提出了一种新的轻量级神经网络,称为FastCodeNet。该网络采用了一种新型的深度可分离卷积技术,极大地减少了模型的参数量和计算复杂度,同时保持了高检测性能。FastCodeNet还结合了一种实时动态调整机制,能够根据输入图像的特性自动调整网络结构,以最佳方式平衡速度和精度。在实验中,FastCodeNet在保持与YOLOv6相近的检测准确率的同时,处理速度提高了约30%。
本博客所做的工作是基于YOLOv82算法构建一个条形码二维码检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法:本博客通过引入YOLOv8算法,标志性地提升了条形码和二维码检测的效率和精确度。与先前广泛使用的YOLOv73、YOLOv64、YOLOv55等版本相比,YOLOv8在处理速度、识别准确性以及在复杂环境下的鲁棒性方面都有显著改进。本文详细介绍了YOLOv8的算法原理,以及如何在条形码二维码检测系统中有效地应用这一算法,为相关领域研究者提供了新的视角和方法。
- 利用PySide6实现友好的用户界面:借助Python的PySide6库,本博客成功开发了一个具有高度用户友好性的条形码二维码检测系统界面。这一成果不仅展示了如何将复杂的算法技术转化为实用的应用程序,还使得非技术用户也能轻松地进行条形码和二维码的检测工作,极大地促进了YOLOv8算法的普及和应用。
- 集成登录管理功能,提高系统安全性:本系统设计了登录管理功能,确保了使用过程的安全性和个性化。这一特性不仅增加了系统的安全保障,还为将来根据用户需求添加更多定制化功能奠定了基础。
- 对YOLOv8模型进行深入研究和评估:本文不仅应用了YOLOv8算法,还对其性能进行了深入的研究和评估,包括精准度、召回率等关键性能指标的全面分析。通过这些研究,我们更全面地理解了YOLOv8算法的性能特点和应用潜力,为算法的进一步优化和改进提供了坚实的基础。
- 提供完整的数据集和代码资源包:为了促进YOLOv8算法在条形码和二维码检测领域的应用和发展,本文提供了包含详细训练和测试数据集的完整资源包,以及实现检测系统的完整代码。这些资源的分享,不仅便于读者理解和实践YOLOv8算法,也为未来的研究和开发工作提供了宝贵的参考和基础。
1. 数据集介绍
在条形码二维码检测系统的开发过程中,构建一个高质量的数据集是实现高效检测模型的基石。我们的数据集共计包含2497张高质量的图像,其中1748张用于训练,499张用于验证,250张用于测试,这样的划分旨在确保模型在不同阶段都能接受到均衡的数据支持,以评估其泛化能力和准确性。
图像数据在准备过程中经过了精心的预处理,以适应YOLOv8等先进目标检测模型的要求。每张图像都进行了自动像素数据的方向调整,并去除了EXIF方向信息,确保了不同来源和拍摄角度的图像在输入模型前具有一致的方向性。此外,所有图像都被统一地调整大小至640x640像素,通过拉伸的方式使其符合算法输入的标准,这一步骤是至关重要的,因为它消除了由图像原始尺寸造成的潜在偏差,使得模型能够专注于学习目标的特征而非其尺寸。
从数据集标签的分布来看,条形码和二维码的实例数量大致相当,展现了类别上的均衡,这样的设计有助于避免在训练过程中模型偏向某一特定类别,从而确保检测性能的一致性和可靠性。此外,通过观察目标的空间分布和尺寸分布,我们发现大多数条码和二维码位于图像的中心区域,并且二维码往往占据了更大的空间,这与现实世界中条码和二维码的应用情况相吻合。通过这种方式,我们的数据集不仅反映了现实世界中的使用场景,而且也为模型提供了从中心区域学习目标特征的机会。
数据集的质量直接影响到后续模型的性能,因此在标注过程中我们采取了严格的质控措施。每个条形码和二维码都被精确地标记了边界框,以提供地面真实数据供模型准确学习。通过这样的设计,我们确保了在各种尺寸和分辨率的图像中,模型都能够学习到如何准确地识别和定位条形码和二维码。博主使用的类别代码如下:
Chinese_name = {'bar_code': "条形码", 'qr_code': "二维码"}
总的来说,我们的数据集不仅适用于目前最先进的YOLOv8算法,也可兼容其前身如YOLOv7、YOLOv6、YOLOv5等算法的训练和评估。这使得我们的数据集在未来算法迭代时仍保有其长期价值和应用前景。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行条形码二维码检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8模型作为目前最新一代的目标检测模型,继承了YOLO系列的核心设计理念,同时引入了创新的架构和技术以提高性能和效率。YOLO(You Only Look Once)系列自从推出以来,就以其高速的检测速度和良好的实时性能赢得了广泛的认可。
YOLOv8算法是目标检测领域的一个革新性发展,它继承并增强了其前代算法YOLO系列的特点,特别是在速度和准确性方面进行了显著的提升。YOLOv8在架构上采用了创新的三部分结构:Backbone(主干网络)、Neck(颈部网络)、和Head(头部网络)。
Backbone是模型的基础,其主要职责是特征提取。YOLOv8使用了Darknet-53结构,这是一种深度残差网络,由多个残差块构成。它通过CSP(Cross Stage Partial)结构增强了特征的传递和学习效率,同时减少了计算复杂度。CSP结构的关键是它的Split操作,将特征图分割成两部分,一部分直接传递,另一部分进行卷积操作再与前者融合,这种设计在提升学习效率的同时降低了模型复杂度。
Neck部分的作用是特征融合和重调整,YOLOv8在这一部分采用了PAN(Path Aggregation Network)和FPN(Feature Pyramid Network)。通过这些结构,YOLOv8能够更好地融合不同层级的特征信息,并保证在多尺度目标检测任务中的性能。此外,YOLOv8借鉴了YOLOv5的SPPF(Spatial Pyramid Pooling Fusion),提高了模型对于空间信息的利用效率和特征的表征能力。
Head部分则专注于生成预测,YOLOv8摒弃了传统的Anchor-based方法,采用了Anchor-Free的方法,这种设计简化了模型结构并减少了超参数的需求。同时,YOLOv8引入了Distribution Focal Loss(DFL),这是一种新颖的损失函数,能够更好地处理类别不平衡问题,并专注于学习难以区分的样本,从而提升了模型在检测中的准确性和鲁棒性。
除了这三大部分的革新外,YOLOv8在训练前对数据进行了仔细的预处理,包括自动像素数据方向调整和EXIF方向信息的剥离,以及将图像统一调整至640x640的分辨率。这些步骤确保了模型接收到的数据具有统一的格式和质量,对于在多样化环境中实现高效、准确的检测至关重要。
总之,YOLOv8代表了YOLO系列在算法设计和性能优化方面的最新进展。它不仅保留了YOLO系列的快速和实时检测特性,而且通过结构优化和新技术的应用,进一步提升了模型在复杂多变环境下的表现和适应性。通过这些改进,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/1a.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 模型训练
在本博客中,我们将探讨如何使用Ultralytics YOLO库来训练一个强大的对象检测模型。我们的目标是开发一个能够检测条形码和二维码的模型,这对于自动化数据输入和库存跟踪等领域是非常有价值的。
首先,我们从Ultralytics库中导入YOLO类,这是我们构建检测模型的基础。
from ultralytics import YOLO # 导入YOLO模型
然后,我们设置了workers为1,这意味着在数据加载时我们只使用一个工作进程,这通常是出于内存和CPU资源考虑。批处理大小batch被设置为16,这是在训练过程中每次输入模型的图像数量。data_name是我们给定的数据集名称,而data_path是存储训练配置和路径的YAML文件的位置。
workers = 1
batch = 8data_name = "Qrcode"
data_path = './datasets/Qrcode/qrcode.yaml'
然后,我们创建了一个YOLO对象并加载了预训练的权重。预训练的权重包含了在大量数据上训练得到的模型参数,它能够帮助我们的模型更快地适应和学习我们特定的条形码和二维码检测任务。这一步是模型初始化的核心,为我们的训练任务设置了基础。我们调用了model.train()方法来启动训练过程。我们指定了训练数据的路径、使用的设备(这里是GPU 0)、工作进程数量、输入图像的大小(640x640)、训练周期(100个epochs),批次大小(16),以及训练任务的名称。
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, # 指定输入图像的大小为640x640epochs=100, # 指定训练100个epochbatch=batch, # 指定每个批次的大小为8name='train_v5_' + data_name # 指定训练任务的名称
)
在训练的另一个阶段,我们加载了YOLOv8的预训练模型并进行了类似的训练。
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型data=data_path, # 指定训练数据的配置文件路径device=device, # 自动选择进行训练workers=workers, # 指定使用2个工作进程加载数据imgsz=640, # 指定输入图像的大小为640x640epochs=100, # 指定训练100个epochbatch=batch, # 指定每个批次的大小为8name='train_v8_' + data_name # 指定训练任务的名称
)
在深度学习模型的训练过程中,损失函数的变化趋势是评估模型性能的重要指标之一。从提供的图像中,我们可以对YOLOv8模型在条形码二维码检测任务上的训练过程进行详细的分析。图中展示了三种损失函数:定位损失(box_loss)、分类损失(cls_loss)和分布式焦点损失(dfl_loss),以及几个关键的性能指标,包括精度(precision)、召回率(recall)、平均精度均值(mAP50)和更加严格的mAP50-95。
首先,我们观察到训练和验证的定位损失(box_loss)随着时间的推移逐渐下降,这表示模型在定位对象上的性能正在提升。初始的损失较高,这可能是因为模型还在初步学习如何从图像中提取必要的特征来确定对象的位置。随着损失的下降,我们可以推断出模型的定位能力越来越强。在验证损失的下降趋势中,我们同样看到了稳定的收敛,这表明模型在未见过的数据上同样表现良好,这是良好泛化能力的重要指标。
分类损失(cls_loss)的下降表明模型在区分不同类别上的性能也在提升。我们通常希望这一指标能够持续降低,这意味着模型在识别目标类别方面越来越准确。图中显示的训练和验证损失都显示出这种持续的下降趋势,证明了模型学习过程的稳定性和可靠性。分布式焦点损失(dfl_loss)是YOLOv8中一个新颖特性,它特别关注模型对难以区分样本的学习。从图表中我们看到dfl_loss随着训练周期的增加而显著下降,说明模型在处理困难样本方面也取得了显著的进步。
关于性能指标,精度(precision)和召回率(recall)是两个至关重要的指标。精度告诉我们模型识别为正例的样本中有多少是真正的正例,而召回率则告诉我们模型能找到多少真正的正例。图中精度和召回率随着训练进程逐渐达到一个较高水平,表明模型在检测条形码和二维码方面能够取得高准确性和覆盖率。在更为细致的性能评估中,平均精度均值(mAP)是一个综合评估模型性能的指标。mAP50反映了在50%的IoU(交并比)阈值下模型的性能,而mAP50-95则涵盖了从50%到95%不等的IoU阈值,是一个更加严格的评价标准。图表显示了在这两个指标上,模型都实现了稳健的提升,这证明了模型具备良好的检测能力,并且这种能力是在一系列不同严格程度的条件下都保持的。
在本博客中,我们将深入分析我评估模型后的精度-召回率(Precision-Recall,PR)曲线图。PR曲线是衡量目标检测模型性能的重要工具之一,它揭示了模型在不同召回率水平下的精度表现。在目标检测任务中,我们追求高精度与高召回率的平衡,这意味着我们希望模型不仅能够准确地检测出尽可能多的正样本,同时保持较低的误报率。
从曲线图中可以看到,对于条形码和二维码的检测,模型表现出了相当高的精度。在图中,条形码的精度高于二维码,分别为0.836和0.792,这可能反映了条形码相对于二维码在视觉上具有更明显的特征,使得模型更容易准确识别。而整体的平均精度均值(mAP)在IoU为0.5的阈值下达到了0.814,这个结果表明模型在检测任务上的总体性能是令人满意的。
具体地,精度曲线在高召回率区域保持相对平稳,表明即便是增加检测难度,模型也能维持较高的精度。这是一个积极的信号,说明模型对于大多数正样本都能做出正确的预测。同时,召回率在曲线的大部分区域都维持在较高水平,意味着模型能够找到大多数的正样本。这两个类别的曲线紧密跟随,说明模型对这两种类型的目标具有一致的识别能力。
然而,在召回率接近1的极端情况下,我们观察到精度有所下降,这是一个常见现象,因为当模型尝试检测更多的正样本时,误报的数量可能会增加。这个阶段,模型可能将一些负样本错误地识别为正样本,从而导致精度下降。因此,在实际应用中,我们需要根据具体场景和需求来选择一个合理的精度和召回率的平衡点。
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.814 | 0.805 | 0.803 | 0.814 |
F1-Score | 0.84 | 0.84 | 0.82 | 0.84 |
(3)实验结果分析:
在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在条形码二维码检测任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。
根据实验结果,YOLOv5nu和YOLOv8n在mAP指标上并列领先,均为0.814,这表明这两个版本在整体上对目标检测的识别能力非常强。相比之下,YOLOv6n和YOLOv7-tiny的mAP略低,分别为0.805和0.803,但差距并不显著。这些结果表明,在算法迭代过程中,虽然性能有所提升,但提升的幅度有限。
在F1-Score指标上,我们看到YOLOv5nu、YOLOv6n和YOLOv8n均为0.84,而YOLOv7-tiny稍低于其他版本,为0.82。F1-Score是精度和召回率的调和平均数,它更全面地反映了模型性能。同样的F1-Score结果说明YOLOv5nu、YOLOv6n和YOLOv8n在综合性能上是相当的,同时优于YOLOv7-tiny。这可能意味着YOLOv7-tiny在平衡精度和召回率上略有不足,这对于特定的应用场景可能是一个考虑因素。
通过这些对比,我们可以得出一些初步结论。首先,尽管YOLO系列随着版本更新持续进化,但不同版本之间的性能提升并非总是剧烈的。其次,较新的版本如YOLOv8n在维持了之前版本的性能优势的同时,并未显示出在我们使用的特定数据集上的显著性能提升。最后,我们可以认为,在选择模型进行部署时,应考虑模型的性能表现和实际应用需求,而不应仅仅基于模型的新旧。实际应用中,模型的选择还应考虑到计算资源、实时性要求和易用性等因素。
4.4 代码实现
在本篇博客中,我们将详细探讨如何构建一个使用YOLOv8进行实时条形码和二维码检测的应用。在这个项目中,我们的目标是利用YOLOv8强大的目标检测能力,并将其集成到一个用户友好的界面中,让用户能够轻松地对视频流进行实时分析。为此,我们需要构建一个应用程序,它能够从视频源中读取数据、应用模型进行检测,并在图形界面中展示检测结果。
(1)引入必要的库
首先,我们需要导入一系列Python模块来支持我们的程序。sys模块让我们能够访问与Python解释器紧密相关的变量和函数,time模块帮助我们记录处理帧所花费的时间,而cv2是OpenCV库的Python接口,它提供了丰富的图像和视频处理功能。PySide6是一个Python库,允许我们创建跨平台的应用程序界面。YOLOv8Detector类将负责执行目标检测任务。
import sys # 导入sys模块,用于处理Python运行时环境的一些操作
import time # 导入time模块,用于处理时间相关的操作
import cv2 # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库中导入MediaHandler类,用于处理媒体数据
from QtFusion.utils import drawRectBox # 从QtFusion库中导入drawRectBox函数,用于在图像上绘制矩形框
from QtFusion.utils import get_cls_color # 从QtFusion库中导入get_cls_color函数,用于获取类别颜色
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI和处理Qt的核心功能
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于进行YOLOv8物体检测QF_Config.set_verbose(False)
(2)设置主窗口
在我们的应用程序中,我们定义了一个MainWindow类,该类负责初始化主窗口,并设置了必要的界面元素,如标签,用于显示视频流和检测结果。此外,我们还定义了键盘事件处理,以便用户可以通过简单的按键操作来控制应用程序。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类def __init__(self): # 定义构造函数super().__init__() # 调用父类的构造函数self.resize(640, 640) # 设置窗口的大小为850x500self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像self.label.setGeometry(0, 0, 640, 640) # 设置QLabel的位置和大小def keyPressEvent(self, event): # 定义键盘按键事件处理函数if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的是Q键self.close() # 关闭窗口
(3)图像帧处理
在处理视频帧的frame_process函数中,我们对输入的图像进行了大小调整,以适应我们的界面。然后,我们调用了YOLOv8模型的预测功能,该功能将对预处理过的图像进行目标检测,并记录下处理所需的时间。这一步是非常关键的,它确保了我们的应用程序能够以合理的速度运行,而不会因为处理速度慢而导致用户体验差。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像image = cv2.resize(image, (850, 500)) # 将图像的大小调整为850x500pre_img = model.preprocess(image) # 对图像进行预处理t1 = time.time() # 获取当前时间pred = 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'] # 获取类别名称、边界框、置信度和类别IDlabel = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类别名称和置信度# 画出检测到的目标物image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制边界框和标签window.dispImage(window.label, image) # 在窗口的label上显示图像
(4)初始化检测模型和设备
模型加载和类别颜色分配是通过创建YOLOv8Detector对象并加载预训练权重来完成的。此外,定义了一个类别名称列表,这有助于在后续处理中正确标注各个检测到的条形码二维码。整个应用程序是通过QApplication实例来运行的,我们创建了MainWindow的一个实例来作为应用程序的主窗口。使用MediaHandler对象来处理视频流,当新的图像帧准备好时,通过信号连接机制调用frame_process函数进行处理,从而实现了实时视频流的条形码二维码检测。
cls_name = ["条形码", "二维码"] # 定义类名列表model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象filename = abs_path("test_media/二维码测试视频.mp4", path_type="current") # 定义视频文件的路径
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename) # 设置视频源
videoHandler.startMedia() # 开始处理媒体# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
我们通过设置视频文件作为输入源,并开始媒体流的处理,将检测结果实时显示在主窗口上。这样,用户就可以通过交互式窗口实时观察并分析模型的条形码二维码检测效果,从而直观地评估模型性能。
5. 条形码二维码检测系统实现
在实现一款实时条形码二维码检测系统时,我们采用了模块化的设计框架,旨在创建一个结构清晰、高效且用户友好的应用。整个系统被划分为几个关键的组件,每个组件承担着特定的职责,并相互协作以完成条形码和二维码的检测任务。
5.1 系统设计思路
我们首先实现了一个MainWindow类,作为系统的控制中心和用户交互界面的承载平台。它的主要职责是提供一个直观的图形用户界面(GUI),让用户能够与检测系统进行互动,比如启动和停止检测流程、显示检测结果等。为了简化用户操作,GUI设计为简洁直观,只展示必要的信息和控制元素,使得即使是非专业用户也能轻松上手。
架构设计
我们构建的架构体现了模块化设计,其中包括处理层、界面层和控制层,每层都有其独立的职责。
- 处理层(Processing Layer):在后台处理方面,我们采用了YOLOv8Detector类,这是一个基于深度学习的目标检测模型,负责处理实时视频流或图像,并准确识别其中的条形码和二维码。通过使用预训练的YOLOv8模型,我们能够充分利用其强大的特征提取和识别能力,为用户提供高精度的检测结果。
- 界面层(UI Layer):系统还考虑了用户交互的流畅性。MainWindow响应用户的各种操作,如开始或结束检测流程、调整设置等,确保用户控制的及时性和系统响应的灵敏性。我们还注重了异常处理和错误反馈,以便在检测流程中遇到问题时,能够提供给用户清晰的指导和解决方案。
- 控制层(Control Layer):为了实现界面层与处理层的高效通信,系统采用了Qt的信号和槽机制,这是一种强大的事件处理机制,可以实现跨组件的信息传递。当YOLOv8Detector检测到条形码或二维码时,它将发送一个信号,携带检测到的对象信息。MainWindow中的槽函数将接收这些信息,并在用户界面上更新检测结果,如在视频流上绘制边界框、显示对象的类别等。
我们的系统设计思路注重于用户体验和系统性能的平衡。通过将先进的目标检测技术与精心设计的用户界面相结合,我们的交互式条形码二维码检测系统不仅强大而且易用,能够满足不同用户在各种实际应用场景中的需求。
系统流程
本篇文章专注于介绍一个交互式条形码二维码检测系统的流程设计。该系统利用了YOLOv8模型的强大功能,结合了一个直观的GUI,提供了从选择输入源到展示实时检测结果的一站式解决方案。
- 用户一旦启动应用程序,系统便会实例化MainWindow类,这是整个应用的操作核心。在这个阶段,程序将初始化GUI界面,并设定一系列参数,为用户的交互行为奠定基础。GUI设计简洁直观,确保用户即使是首次使用也能迅速上手,轻松选择输入源和开始检测。
- 输入源的选择为系统提供了检测数据的起点。用户可以选择实时摄像头捕获的图像、本地视频文件或静态图像作为输入源。选择的灵活性为用户提供了广泛的应用场景,无论是实时监控还是对历史数据的分析,系统都能给出解决方案。
- 确定输入源之后,程序通过调用媒体处理器和方法来配置和处理输入数据。例如,配置摄像头参数、解码视频文件或加载图像文件,这一切都在用户无感知的情况下自动完成。输入源的准备工作是流畅用户体验的关键。
- 系统接下来进入连续帧处理循环,这是实时检测的核心环节。在预处理阶段,系统会对输入的每一帧图像进行诸如缩放、色彩空间转换等操作,确保它们满足YOLOv8模型的输入标准。接着,在检测与识别阶段,这些经过预处理的图像会被送入YOLOv8模型进行检测和识别,模型将返回条形码和二维码的位置及其可能的类别信息。
- 随着检测结果的生成,GUI将实时地更新。检测到的条形码和二维码被明确地标记在界面上,同时,检测统计数据如数量和检测频率等也会被动态展示。这为用户提供了即时的反馈和有价值的信息,以便于更好地理解和分析检测结果。
- 此外,用户还可以通过界面提供的控件执行一系列操作,比如保存当前的检测结果,或访问关于程序的作者和版本信息。系统的交互性确保用户能够进行定制化操作,比如筛选特定类型的检测结果进行深入分析。
- 最后,用户对媒体流的控制是系统设计的另一重要部分。无论是暂停实时捕捉的图像,停止视频播放,还是暂停图像分析,用户都能通过简单的按钮操作来控制。这增强了用户对应用程序的控制感,并提高了操作的灵活性。
整体来看,我们的交互式条形码二维码检测系统将复杂的检测流程封装成了一个简单易用的应用,让用户无需深入了解背后的技术细节,即可享受到强大的条形码和二维码检测功能。
5.2 登录与账户管理
在我们开发的交互式条形码二维码检测系统中,考虑到用户操作的便捷性与个性化需求,我们引入了一套完整的用户账户管理功能。这套系统基于PySide6构建了用户友好的登录界面,并利用SQLite数据库进行数据管理,确保了用户信息的安全性和可靠性。
系统的账户管理功能不仅限于基本的登录和注销操作。它为用户提供了注册新账户、修改密码、个性化头像设置等多样化的服务。这些服务为每位用户打造了一个私人定制的使用环境,其中不仅包括个人账户信息的安全存储,还有用户的操作历史、检测结果和个性化配置的记录。这样的设计使得每位用户都可以在这个系统中拥有一份属于自己的个性化体验。
用户首次使用时,会被引导进行账户注册,随后便可以通过登录界面进入主界面。在登录过程中,用户可以根据需要修改密码或更新个人头像,这些操作都通过直观的图形界面来完成,简单易懂。一旦用户完成登录,就可以进入到主界面,开始条形码和二维码的检测工作。
我们的系统不仅仅是一个单一的检测工具。在主界面中,用户不但能够实时查看检测结果,包括检测框、类别和置信度等信息,而且还可以处理来自不同输入源的数据,如图片、视频文件、实时摄像头捕获的图像以及批量文件输入。系统能够实时识别目标,将结果记录下来,同时也支持用户在注销后重新登录,并恢复其个人设置和历史记录。
通过这种设计,我们的系统在满足实时目标检测需求的同时,也考虑到了用户在日常使用过程中可能遇到的各种场景。无论用户的需求多么多变,我们的交互式条形码二维码检测系统都能提供一致的高质量体验。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1TH4y1L7By/
在文件夹下的资源显示如下,下面的链接中也给出了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. ↩︎
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. ↩︎
Yung N D T, Wong W K, Juwono F H, et al. Safety helmet detection using deep learning: Implementation and comparative study using YOLOv5, YOLOv6, and YOLOv7[C]//2022 International Conference on Green Energy, Computing and Sustainable Technology (GECOST). IEEE, 2022: 164-170. ↩︎
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. ↩︎