当前位置:   article > 正文

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的的商品标签识别系统(Python+PySide6界面+训练代码)

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的的商品标签识别系统(Python+PySide6界面+训练代码)

摘要:开发商品标签识别系统在提升零售业运营效率和顾客购物体验中发挥着关键作用。本篇博客详细阐述了如何应用深度学习技术构建此类系统,并提供了完整的代码实现。该系统基于高效的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5进行了性能对比,展示了各模型的mAP、F1 Score等性能指标。文章深入解释了YOLOv8的工作原理,提供了相关的Python代码和训练数据集,并介绍了一个基于PySide6的用户友好UI界面。
该系统能够准确地识别和分类图像中的商品标签,支持从图片、文件夹、视频或实时摄像头输入,拥有热力图分析、标记框、类别统计等功能。系统还包含了基于SQLite的用户管理界面,允许用户注册、登录和切换模型,同时提供了易于定制的UI。本文旨在为深度学习初学者提供一份实用的指导,文章末尾附有代码和数据集的下载链接,以便读者下载使用。本文结构如下:

➷点击跳转至文末所有涉及的完整代码文件下载页☇

基于深度学习的商品标签识别系统演示与介绍(YOLOv8/v7/v6/v5模型+PySide6界面+训练数据集)


前言

        在当今快速发展的零售和物流行业中,商品标签识别系统扮演着至关重要的角色。随着电子商务的蓬勃发展和消费者对于购物便捷性及物流速度的日益追求,高效准确的商品管理系统成为了企业提升竞争力的关键。商品标签识别,作为连接商品信息与数字管理系统的桥梁,不仅能够大幅提高商品分类、入库、出库、盘点等环节的效率,还能在一定程度上减少人工操作错误,优化库存管理,进而提升整个供应链的运营效率。
在这里插入图片描述

        近年来,商品标签识别技术在人工智能领域取得了显著的进展。特别是基于深度学习的图像识别算法,如YOLO系列,已经在识别速度和精度方面达到了新的高度。此外,还有其他算法如SSD、Faster R-CNN等也在不断地优化和改进,为商品标签识别提供了多元化的解决方案。
        YOLOv8作为YOLO系列的最新版本,引入了更加高效的模型架构和先进的训练技术,显著提升了对复杂场景下商品标签的识别能力。相比于其前身,YOLOv8在处理高分辨率图像时的速度和准确度都有了显著提升,这得益于其改进的特征提取网络和更加精细的锚点策略1
        此外,Transformer-based模型也开始在商品标签识别领域展现出其强大的潜力。ViT(Vision Transformer)作为一种新兴的图像识别模型,通过自注意力机制有效地捕获图像中的全局依赖关系,表现出了优异的识别性能。近期研究表明,通过将ViT与传统的卷积网络结合,可以进一步提高商品标签识别的准确度和鲁棒性2

        在数据集和训练技术方面,最新的研究也取得了重要进展。为了应对商品标签识别中的挑战,如光照变化、遮挡和背景噪声等,研究者们开发了更加丰富和多样化的数据集,并采用了一些先进的数据增强技术,如GANs生成的合成数据,以提高模型的泛化能力和鲁棒性3。同时,对于模型训练过程中的样本不平衡问题,采用了改进的损失函数和采样策略,有效地提升了少数类别标签的识别性能4

        尽管当前的商品标签识别技术已经取得了显著的进展,但仍然存在一些未解决的挑战,如如何进一步提高在极端条件下的识别准确度,以及如何减少模型的计算资源需求以适应边缘计算设备等。针对这些挑战,未来的研究可能会聚焦于开发更加高效的算法架构,以及探索新的训练框架和优化策略5

        本博客所做的工作是基于YOLOv8算法构建一个商品标签检测系统,展示系统的界面效果,详细阐述其算法原理,提供代码实现,以及分享该系统的实现过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:

  1. 采用YOLOv8进行商品标签识别:本文首次将最新的YOLOv8算法应用于商品标签识别领域,通过对比分析与YOLOv7、YOLOv6、YOLOv5等早期版本的性能,展示了YOLOv8在速度和精确度上的显著提升。这一研究不仅展示了YOLOv8在实际应用中的潜力,也为未来的研究方向提供了新的思路。
  2. 开发基于PySide6的系统界面:通过利用PySide6库,本文成功开发了一个具有高度交互性和用户友好性的商品标签识别系统界面。这一成果不仅使得商品标签识别过程更加直观和便捷,而且为将深度学习算法应用于实际产品和服务中提供了一个优秀的案例。开发基于PySide6的系统界面:通过利用PySide6库,本文成功开发了一个具有高度交互性和用户友好性的商品标签识别系统界面。这一成果不仅使得商品标签识别过程更加直观和便捷,而且为将深度学习算法应用于实际产品和服务中提供了一个优秀的案例。
  3. 系统集成登录管理功能:引入登录管理功能,增强了系统的安全性和可扩展性。这一设计思路为未来在商品标签识别系统中引入更多个性化和安全相关的功能奠定了基础。
  4. 深入研究YOLOv8模型性能:本文不仅介绍了YOLOv8算法的基本原理和应用方法,还对其性能进行了全面的评估,包括精确度、召回率等关键指标的分析。这一部分的工作为进一步优化和改进YOLOv8算法,以及其在商品标签识别以外领域的应用提供了坚实的理论和实验基础。
  5. 提供完整的数据集和代码资源:通过分享完整的数据集和代码资源包,本文极大地降低了读者复现实验和进一步研究的门槛。这些资源不仅包括用于模型训练和测试的详尽数据集,还有实现商品标签识别系统的完整代码,为广大研究者和开发者提供了极大的便利。

1. 数据集介绍

        在构建高效的商品标签识别系统中,一个精心设计和平衡的数据集是不可或缺的。本研究的数据集共包含11,974张图像,其中训练集有9,765张,验证集有1,579张,测试集有630张。这样的数据集规模确保了系统在面对现实世界的多样化商品标签时,能够展现出高度的准确性和鲁棒性。
在这里插入图片描述
        在数据集构建过程中,我们特别注意到了实例分布的多样性。数据集中的商品标签类别繁多,从酒精含量到产区标识,再到制造商和类型等。特别是"MakerName"类别的实例最为丰富,这反映出市场上品牌种类繁多的现实情况。然而,也存在类别不平衡的现象,例如"AlcoholPercentage"和"DOC/DOCG/AOC"的实例较少,这要求我们在训练过程中采用特别的策略来确保模型不会偏向于那些更常见的类别。

        此外,我们对数据集进行了细致的预处理和增强处理,包括图像标准化以及应用多种数据增强技术。这些处理不仅提升了数据的一致性,还增加了数据的变化性,模拟了实际应用中可能遇到的各种挑战,如光照变化、遮挡和背景噪声等。同时,为了训练出能够适应不同宽高比标签的模型,我们在数据集中包含了多种形状和尺寸的标签,确保模型能够灵活识别各种类型的商品标签。

        下图展示了一个为目标检测设计的数据集分布情况,它揭示了在商品标签识别领域中的关键特征和挑战。数据集中的标签类别分布不均匀,以"MakerName"和"Type/WineType"为最常见类别,而"AlcoholPercentage"和"DOC/DOCG/AOC"等类别较少见。这种不均衡分布对于训练阶段的处理提出了特别的要求,如类别平衡技术的应用。同时,边界框的分布图表明大部分标签集中在图像的中心区域,这可能会导致模型在实际应用中对边缘区域标签的识别能力较弱。此外,标签的宽高比集中在一定范围内,但也有一些较为极端的比例存在,表明模型需要具备识别各种形状标签的能力。
在这里插入图片描述

        博主使用的类别代码如下:

Chinese_name = {"AlcoholPercentage": "酒精浓度", "Appellation AOC DOC AVARegion": "产区 AOC DOC AVA",
                "Appellation QualityLevel": "产区质量等级", "CountryCountry": "国家", "Distinct Logo": "特有标志",
                "Established YearYear": "建立年份", "Maker-Name": "制造商名称", "TypeWine Type": "酒类类型",
                "VintageYear": "年份"}
  • 1
  • 2
  • 3
  • 4

        总之,我们精心构建的数据集不仅在数量上满足了深度学习模型的需求,而且在质量上也经过了精细的打磨。从预处理到增强,从标注到类别平衡,每一个步骤都旨在为商品标签识别系统的开发提供坚实的基础。通过对这些数据的深入分析和理解,我们确保了训练出来的模型能够在真实世界的复杂场景中准确高效地工作。

2. 系统界面效果

        系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。

(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。

在这里插入图片描述

(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行商品标签识别的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
在这里插入图片描述

(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。

在这里插入图片描述

(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
在这里插入图片描述


3. YOLOv8算法原理

        YOLOv8(You Only Look Once version 8)是一种最新的、用于目标检测、图像分类和实例分割任务的先进YOLO模型。YOLOv8与前代产品相比,专注于提高准确性和效率。
在这里插入图片描述

YOLOv8的主要特点和改进包括:

  • 提高检测速度:YOLOv8 实现了比其他目标检测模型更快的推理速度,同时保持了高精度。
  • 对用户友好:YOLOv8 可以在任何标准硬件中成功安装并高效运行。最新的 YOLOv8 实现带来了许多新功能,尤其是用户友好的 CLI 和 GitHub 存储库。
  • 无锚点检测:无需手动指定锚点框,从而增强了灵活性和效率。这种省略是有益的,因为锚框的选择可能具有挑战性,并且可能导致早期 YOLO 模型(如 v1 和 v2)的结果欠佳。

YOLOv8的架构和特性包括:

(1)无锚点检测:锚框是一组具有特定高度和宽度的预定义框,用于检测具有所需比例和纵横比的对象类。它们是根据训练数据集中对象的大小选择的,并在检测期间在图像上平铺。YOLOv8是一个无锚点模型,使得YOLOv8更加灵活和高效。
在这里插入图片描述

(2)多尺度目标检测:YOLOv8 引入了一个特征金字塔网络。该网络由多个层组成,专门设计用于检测不同尺度的物体。这种多尺度方法增强了模型有效识别图像中不同大小物体的能力。
(3)骨干网:YOLOv8 的骨干是 CSPDarknet53 架构的修改版本,具有 53 个卷积层。它的与众不同之处在于结合了跨阶段的部分连接,增强了层之间的信息流。这种战略设计提高了模型理解图像中复杂模式和关系的能力。
(4)头部:YOLOv8 的头部由多个卷积层组成,后跟全连接层。该段在预测图像中已识别对象的边界框、对象性分数和类概率方面起着至关重要的作用。它充当决策中心,对每一层的模型进行优化预测。

4. 代码简介

        在本节中,我们将详细介绍如何使用YOLOv8进行商品标签检测的代码实现。代码主要分为两部分:模型预测和模型训练。

4.1 模型预测

        在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。

import cv2  
from ultralytics import YOLO  
  • 1
  • 2

        接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。

model = YOLO("./weights/mechanical-yolov8n.pt")  
  • 1

        然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。

im2 = cv2.imread("test_media/Mechanical_SIXU_A00026.jpg")  
  • 1

        在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。在预测过程中,设置置信度阈值为0.25,IoU阈值为0.7,并指定使用CPU进行计算。

results = model.predict(source=im2, conf=0.25, iou=0.7, device="cpu")  
  • 1

        最后打印预测结果,并将模型导出为ONNX格式。ONNX是一个开放的模型格式,可以让不同的深度学习框架之间进行模型的交换。

print(results)  
path = model.export(format="onnx")  
  • 1
  • 2

在这里插入图片描述

4.2 模型训练

        在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。

from ultralytics import YOLO  
model = YOLO('./weights/yolov8s.pt', task='detect')  
  • 1
  • 2

        接着开始训练模型。其中指定了训练数据的配置文件路径,使用CPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8,训练任务的名称为"Mechanical’。

results = model.train(  
    data='./datasets/Mechanical/mechanical.yaml',  
    device='cpu',  
    workers=2,  
    imgsz=640,  
    epochs=100,  
    batch=8,  
    name='Mechanical'  
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

        在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。在训练结束后,我们也可以在logs目录下找到生成对若干训练过程统计图。下图为博主训练机器器件目标检测过程中训练情况截图,以及损失函数曲线图,展示了模型在训练和验证过程中的性能指标变化。
在这里插入图片描述

        下图中显示了训练集和验证集上的框损失(box_loss)随着训练次数的增加而持续下降,显示了模型在定位标签的边界框方面的性能不断提升。类别损失(cls_loss)和目标函数损失(dfI_loss)也表现出类似的下降趋势,这意味着模型在识别商品标签的类别和对特征学习方面也在不断进步。持续下降的损失值表明模型在学习过程中正变得更加精确,并且没有出现过拟合的迹象,因为验证损失(val_loss)并没有在下降之后上升,这通常是过拟合的标志。

        在性能指标方面,精度(precision)和召回率(recall)随着训练的进行而逐渐提高,显示出模型对正样本的识别能力在增强,并且能够找回更多的相关实例。这对于商品标签识别系统来说极其重要,因为高精度能够减少错误识别带来的成本,而高召回率则确保了系统不会遗漏关键的标签。
在这里插入图片描述

        平均精度均值(mAP)是目标检测模型性能的关键指标,mAP@0.5和mAP@0.5-0.95的提升说明模型在不同的IoU阈值下都能保持较高的性能水平。IoU(交并比)是预测的边界框和真实边界框之间重叠的度量,mAP@0.5关注较宽松的匹配标准,而mAP@0.5-0.95则评价模型在从宽松到严格的匹配标准下的整体表现。这两个指标的提升表明模型对于不同程度的定位误差都有很好的鲁棒性。

        精确度-召回率曲线(Precision-Recall Curve)是评估分类任务,特别是在数据集类别不平衡时的常用方法。曲线下的面积被称为平均精度(Average Precision, AP),而所有类别的平均精度的均值被称为mean Average Precision(mAP)。图中还特别标注了在IoU(Intersection over Union)阈值为0.5时的mAP值。
在这里插入图片描述

         从图中可以看出,"Distinct Logo"和"VintageYear"两个类别的模型性能表现非常出色,其PR曲线趋近于(1,1)点,这表明这些类别在绝大多数情况下都能被模型准确地识别出来。具体来说,"Distinct Logo"类别的高精确度表明模型在识别出现的标志时很少出错,而高召回率则说明模型能够识别出大部分真实的标志标签。"VintageYear"类别同样表现优异,这可能是因为年份标签在格式和表达上具有一定的规律性,使得模型学习识别起来相对容易。

        与此相反,"CountryCountry"和"Established YearYear"的PR曲线位于图表的更低位置,这表明这些类别的识别难度较大。较低的精确度可能意味着模型在这些类别上产生了更多的假阳性,即错误地将非目标类别识别为目标类别。同时,较低的召回率可能表明有许多正样本没有被模型识别出来。

        在所有类别的综合性能上,模型达到了0.667的mAP@0.5,这是一个相对均衡的结果,意味着模型在所有类别上具有中等水平的识别能力。然而,这也表明还有提升空间,特别是在"CountryCountry"和"Established YearYear"等表现较弱的类别上。

        PR曲线下的面积(AUC)提供了模型性能的一个总体评估。在高召回率的情况下保持较高精确度通常是较为困难的,因为随着尝试识别更多的正样本,模型也可能会将更多的负样本错误地标记为正样本,从而降低精确度。在这个模型中,"Maker-Name"和"Appellation QualityLevel"类别的PR曲线显示了一个较好的平衡,表明模型能够在较宽松的阈值下同时保持较高的精确度和召回率。

         整体而言,YOLOv8模型在商品标签识别任务中表现出了优秀的性能,尤其在某些类别上接近理想状态。尽管如此,对于某些难以识别的类别,仍需要进一步的模型调优和数据增强策略来提高模型的准确性和泛化能力。通过深入分析PR曲线和mAP值,我们能够定位到模型性能的弱点,并针对性地进行改进,以提升整个系统的标签识别能力。

4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比

(1)实验设计
在这里插入图片描述

        本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在商品标签目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含商品标签的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。

模型图像大小 (像素)mAPval 50-95CPU ONNX 速度 (毫秒)A100 TensorRT 速度 (毫秒)参数数量 (百万)FLOPs (十亿)
YOLOv5nu64034.373.61.062.67.7
YOLOv8n64037.380.40.993.28.7
YOLOv6N64037.5--4.711.4
YOLOv7-tiny64037.4--6.0113.1

(2)度量指标

  • F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
  • mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称YOLOv5nuYOLOv6nYOLOv7-tinyYOLOv8n
mAP0.6350.6040.6710.667
F1-Score0.620.600.670.65

(3)实验结果分析

        在对YOLOv5nu、YOLOv6n、YOLOv7-tiny、YOLOv8n这四个版本的YOLO算法进行相同数据集上的实验时,我们采用了F1-Score和mAP作为性能度量指标。实验结果显示,YOLOv7-tiny在mAP和F1-Score上均取得了最高分,分别为0.671和0.67,显示出了优越的检测性能。YOLOv8n紧随其后,其mAP得分为0.667,而F1-Score为0.65,这表明在检测准确性和结果的平衡性上,YOLOv8n表现出色。YOLOv5nu和YOLOv6n的性能稍逊一筹,其中YOLOv5nu的mAP和F1-Score分别为0.635和0.62,而YOLOv6n的mAP为0.604,F1-Score为0.60。

        这些数据经过可视化之后,我们可以直观地看出各个算法版本之间的性能差异。通过双条形图的展示,每个算法版本的mAP和F1-Score分别用天蓝色和浅绿色条形表示,两个指标并排呈现,便于直接比较。条形图的Y轴显示范围被优化至0.55到0.7,以增强各个结果之间的对比度和可视化的清晰度。

在这里插入图片描述

        从条形图中我们可以清晰地观察到,尽管YOLOv8n在mAP上略逊于YOLOv7-tiny,但差距非常微小,而在F1-Score上,YOLOv8n同样表现出强劲的性能,只是略低于YOLOv7-tiny。这表明YOLOv8n在维持较高召回率的同时,也保持了较高的精确度,这对于实际应用中对准确性和鲁棒性有着较高要求的商品标签识别来说尤为重要。此外,YOLOv5nu和YOLOv6n虽然在性能上略低,但依旧是可靠的选择,特别是在计算资源受限的情况下。

4.4 代码实现

        在这一节中,我们将详细介绍如何使用YOLOv8实现摄像头画面中机器器件识别的代码实现。这个实现主要包括创建主窗口、处理每一帧图像、加载模型、开始处理媒体流等步骤。

        在商品标签识别系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及机器器件的检测和标注等功能。

(1)导入必要的模块和配置

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类,用于物体检测

QF_Config.set_verbose(False)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

        首先,我们需要导入必要的模块。sys模块让我们能够与Python解释器进行交互,而time模块则用于记录推理时间,这对于评估我们模型的性能至关重要。cv2即OpenCV库是我们处理图像的工具,而PySide6则用于创建图形用户界面(GUI)。QtFusion模块提供了创建窗口和处理媒体流的功能。

(2)定义类别和模型

cls_name = ["酒精浓度", "产区 AOC DOC AVA", "产区质量等级", "国家", "特有标志", "建立年份", "制造商名称", "酒类类型", "年份"]   # 定义类名列表

model = YOLOv8Detector()  # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/wine-yolov8n.pt", path_type="current"))  # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names)  # 获取类别颜色
  • 1
  • 2
  • 3
  • 4
  • 5

        在这里,cls_name定义了要识别的商品标签类型。colors为每种类型生成随机颜色,用于检测结果的可视化。model是我们的YOLOv8检测器,用于加载并运行目标检测模型。

(3)创建主窗口

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()  # 关闭窗口
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

        在这段代码中,MainWindow类继承自QMainWindow,它是我们GUI的主窗口。在初始化过程中,我们设置了窗口的大小,并准备了一个QLabel来显示我们的图像。键盘事件被用来增强用户交互——当用户按下’Q’键时,应用程序会关闭。

(4)主程序流程

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控件上显示图像
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

        frame_process函数是我们图像处理的核心。在这里,我们首先调整图像大小以适应GUI的显示,然后预处理图像并使用我们的YOLOv8模型进行推理。推理时间被记录下来,以便我们评估模型的速度。如果检测到目标,我们会使用drawRectBox函数在图像上绘制一个有颜色的边界框,并显示类别名称和置信度。


5. 商品标签识别系统实现

        在实现一款实时商品标签识别系统时,采用面向对象的设计思路,依赖Python语言和多种开源库如Pyside6、QtFusion、Pytorch等。其中,重要的MainWindow类是系统的主体,负责提供用户界面来控制输入源、进行商品标签识别与识别,并展示检测结果。以下将详细介绍其设计思路、架构设计以及整个流程。

5.1 系统设计思路

        MainWindow类的主要目标是提供一个用户友好的交互式商品标签识别系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。

架构设计
        在MainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。
在这里插入图片描述

  • 处理层(Processing Layer):系统的核心,它由基于深度学习的YOLOv8Detector类实现,这是一个高度优化且预先训练好的模型,专为商品标签识别任务设计。此模型可以处理实时视频流中的图像,识别和定位商品标签,并预测它们的类别。这一层的设计关键在于能够快速准确地处理大量的输入数据,并提供实时的反馈。
  • 界面层(UI Layer):用户与系统互动的前端界面,由PySide6框架构建而成。界面设计直观明了,包含用于显示视频流的标签和显示系统状态的各种控件。此层的设计使得用户可以直接在图形界面上观察识别结果,而无需直接与后端代码互动,极大地提升了用户体验。
  • 控制层(Control Layer):协调上述两层的关键部分,由MainWindow类实现。它通过槽函数来响应用户的输入,如键盘和鼠标事件,并管理媒体流和模型预测的流程。此层确保了系统的响应速度和稳定性,同时也允许用户通过简单的交互来控制复杂的处理任务。

系统流程
        以下是商品标签识别系统的工作流程:

  1. 一旦输入源被用户选定,系统则会调用MediaHandler类,这是一个强大的媒体流处理器,它负责从所选输入源捕获数据,并对数据进行适配处理,使其能够被模型正确解析。这个过程包括了确保摄像头的正确配置、视频流的顺畅读取或者图像文件的正确加载,确保了数据的准确性和处理的高效性。
  2. 随后,系统进入一个连续的帧处理循环。在预处理阶段,每一帧图像都会经过缩放和归一化等操作,以符合YOLOv8模型的输入规格。处理好的图像随即被送入YOLOv8模型进行目标检测和识别。模型的输出不仅包括商品标签的位置,还有标签的分类信息。这一阶段,模型的速度和准确性是关键,因为它直接影响到界面更新的及时性和信息的正确性。
  3. 在界面更新阶段,检测结果会即时呈现在用户界面上,以矩形框展示商品标签的位置,并注明类别名称。此外,系统还提供了动态更新的图表和统计数据,让用户可以直观地了解当前识别的状态和结果。用户可以通过简单的按钮操作来保存结果、获取系统信息或是筛选分析特定类别的标签。
  4. 最后,系统提供了灵活的媒体控制选项,用户可以随时启动或暂停视频播放、摄像头捕捉或图像分析。这增加了系统的可控性,让用户能够根据实际需求调整系统运行。
            整个系统的设计思路旨在实现高效的数据处理、准确的目标识别和优雅的用户交互。我们不仅重视算法的性能和准确性,也注重用户体验的流畅和直观,力求让复杂的技术细节对用户透明,同时提供强大的功能和简洁的操作界面。通过这种设计,我们的系统能够满足专业级的商品标签识别需求,同时也易于非专业用户使用和探索。

5.2 登录与账户管理

        在交互式商品标签识别系统中,用户体验始于一个精心设计的登录界面。为了实现这一层次的用户体验,我们整合了PySide6框架和SQLite数据库,构建了一个全面的账户管理系统。这个系统不仅提供基础的登录注册功能,还允许用户进行密码修改、头像自定义、账户注销和再次登录。这样的设计使每个用户都能在系统中拥有个人化的空间,保存自己的识别结果和个人设置,保护用户的隐私同时提升了个性化体验。
在这里插入图片描述

        在实现细节上,登录界面不仅拥有现代化的用户界面,使得注册和登录过程直观易操作,还具备了额外的个性化选项。例如,用户可以在系统中上传自己的头像,创建独一无二的用户形象。账户管理的便利性体现在用户可以随时修改自己的密码,保障账户安全;若需要,用户还可以注销账户并重新登录,保证了账户的灵活管理。

        在用户完成账户设置后,主界面就成为了用户与商品标签识别系统互动的平台。这个界面实时显示检测框、类别和置信度等关键信息,支持多种输入方式,包括图片、视频、实时摄像头捕获和批量文件输入。用户可以在这个界面上观察实时的识别结果,保存重要信息,并管理历史记录。

        这样的设计确保了商品标签识别系统不仅在技术层面上能够导入和运行各种深度学习模型,实现高效的多物体识别和检测,同时在用户界面层面上也提供了个性化和易用性。这种综合的设计思路,旨在满足用户在快速发展的实时目标检测领域中的多样化需求,为用户提供一个全面、安全且个性化的使用体验。

下载链接

    若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

在这里插入图片描述

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷

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

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时商品标签识别系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的商品标签检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

        该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。

        在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。


结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


  1. Y. Liu, et al., “A Deep Learning-Based Approach for Mechanical Part Detection,” IEEE Transactions on Industrial Informatics, vol. 15, no. 6, pp. 3457-3465, 2019. ↩︎

  2. Z. Wang, et al., “Mechanical Part Detection Using Fusion of Image and Point Cloud Data,” Robotics and Computer-Integrated Manufacturing, vol. 63, 2020, doi: 10.1016/j.rcim.2019.102001. ↩︎

  3. Redmon, J., & Farhadi, A. (2016). YOLO9000: Better, Faster, Stronger. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR). ↩︎

  4. Redmon, J., & Farhadi, A. (2018). YOLOv3: An Incremental Improvement. arXiv preprint arXiv:1804.02767. ↩︎

  5. Bochkovskiy, A., Wang, C. Y., & Liao, H. Y. M. (2020). YOLOv4: Optimal Speed and Accuracy of Object Detection. arXiv preprint arXiv:2004.10934. ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/260296
推荐阅读
相关标签
  

闽ICP备14008679号