摘要:开发高效的零售柜商品识别系统对于智能零售领域的进步至关重要。本文深入介绍了如何运用深度学习技术开发此类系统,并分享了全套实现代码。系统采用了领先的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(You Only Look Once)系列等,实现了对零售柜内商品的快速、准确检测,极大地提高了零售业的运营效率和顾客的购物体验。这一技术的研究与应用,不仅能够实现零售柜内商品的自动化管理,降低人力成本,还能通过实时的商品监控,优化库存管理和商品布局,提升销售效率。
国内外的研究者在智能零售领域均进行了大量的探索。近年来,基于YOLO的算法因其高效的检测速度和良好的准确率,成为商品检测领域的热门研究方向。从YOLOv5到YOLOv8,每一次迭代都在尝试解决更复杂的检测场景,提高在各种环境下的鲁棒性和准确性。同时,新的算法如EfficientDet等也被提出,用于改进检测性能和速度。
在YOLO系列算法之外,其他一些算法如SSD(Single Shot MultiBox Detector)和Faster R-CNN也在商品检测领域中得到了应用。这些算法各有优势,例如Faster R-CNN在检测准确度上表现出色,而SSD则在检测速度上有较好的表现。随着技术的进步,最新的算法版本如YOLOv8,不仅在速度和准确性上取得了平衡,还通过引入新的网络架构和训练技巧,如自适应锚框机制和跨阶段特征融合,进一步提升了在复杂场景下的检测性能。
数据集的发展对于提升商品检测技术的准确性和鲁棒性至关重要。早期,研究者们主要依赖于如PASCAL VOC和ImageNet这样的通用数据集来训练和测试他们的模型。然而,这些数据集往往在商品多样性和真实零售环境场景的覆盖上存在限制。为了解决这一问题,近年来出现了更专注于零售场景的数据集,如SKU-110K和GroZi-120,它们提供了大量的零售商品图片,包括在架商品的多角度拍摄,这极大地促进了商品检测技术在实际应用中的性能提升。
尽管如此,零售柜商品检测仍面临着一系列技术挑战,例如如何准确识别和分类在复杂背景下由于遮挡、光线变化或商品堆叠而导致的视觉不清晰的商品。此外,随着零售柜种类的增多,如何高效地扩展模型以适应更多种类的商品,也是当前研究需要解决的问题。
本博客所做的工作是基于YOLOv8算法构建一个零售柜商品检测软件,呈现系统界面的效果,深入讲解其算法原理,提供代码实现,并分享系统的开发过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
- 采用最先进的YOLOv8算法进行零售柜商品检测:我们详细介绍了如何应用当前最先进的目标检测算法—YOLOv8—来实现零售柜商品的高效准确检测。相较于早期的深度学习模型,如CNN和ResNet,YOLOv8在效率和精准度上均有显著提升。本文不仅对YOLOv8算法进行了深入研究,还与YOLOv72、YOLOv63、YOLOv54等前序版本进行了对比分析,展示了YOLOv8在零售柜商品检测上的优势。
- 利用PySide6实现用户友好的软件界面:通过运用Python的PySide6库,我们开发了一个界面友好、操作直观的零售柜商品检测软件系统。该系统不仅提升了用户的操作便捷性,还促进了YOLOv8算法在实际零售环境中的应用,推动了零售柜商品检测技术的进一步实践和普及。
- 集成登录管理功能以提升系统安全性:我们在系统中设计了登录管理功能,确保用户在使用系统前完成身份验证。这一措施不仅加强了系统的安全性,也为将来引入更多个性化和高级功能奠定了基础。
- 对YOLOv8模型性能进行全面评估:本文对YOLOv8算法的性能进行了全面的研究,包括模型的精确度、召回率等关键性能指标的评估,以及模型在不同环境条件下的表现分析。这些分析工作为更深入理解YOLOv8算法提供了坚实的基础,并为未来的优化和改进工作指明了方向。
- 提供完整的数据集和代码资源包:为了帮助读者更好地理解和应用YOLOv8算法在零售柜商品检测中的实践操作,我们分享了完整的数据集和代码资源包。这些资源不仅包括用于模型训练和测试的详尽数据集,还有实现零售柜商品检测功能的完整代码。通过这些资源,读者可以轻松复现文中的实验结果,并在此基础上进行进一步的研究和开发工作。
1.数据集介绍
在本篇博客中,我们将深入探讨用于零售柜商品检测软件开发的关键基石——数据集的构建与分析。这一数据集是经过精心准备和组织的,旨在支持和推动零售环境中商品检测技术的前沿研究。数据集的全面性和质量直接关系到后续模型训练的效果和实用性,因此我们在此详细介绍其特征和构成。
我们的数据集总计包含5422张图像,划分为3796张训练集图片、1084张验证集图片以及542张测试集图片。这样细致的划分确保了模型能在足够大的数据量上进行训练,同时还有充分的数据进行验证和测试,以评估模型的泛化能力。在预处理阶段,所有图像均经过自动定向处理以消除由于不同拍摄设备导致的方向不一致性,并移除了EXIF方向信息,以确保图像的统一性。此外,图像都被调整到了640x640的统一分辨率,采用拉伸的方式使图像符合YOLOv8等对象检测算法输入的标准尺寸,尽管这一处理可能会引起一定程度的形状失真,但是基于深度学习的模型通常对此具备容忍度。
数据集的多样性和真实性对于训练高效的检测模型至关重要。根据我们的数据集分布图分析,类别实例的分布显示出显著的不平衡,这种现象在实际的零售环境中是常见的,因为某些商品的流通量和存储量远大于其他商品。这提示我们可能需要采取特定的数据增强或重采样策略,来避免模型在训练过程中对频繁出现的类别过度拟合,同时提高对少数类别商品的检测能力。
边界框的位置分布热力图显示,商品的定位在图像中心区域的集中趋势非常明显,这可能反映了零售柜中商品摆放的实际情况。为了让检测模型适应各种位置的商品检测,我们可能需要通过数据增强技术,如随机裁剪和平移,来增加模型对图像边缘区域商品的识别能力。此外,边界框形状的分布关系表明,大多数商品具有一定的宽高比,这为我们优化模型中锚框的尺寸提供了直观的依据。博主使用的类别代码如下:
Chinese_name = {'3+2-2': "3+2-2", '3jia2': "3+2", 'aerbeisi': "阿尔卑斯", 'anmuxi': "安慕希", 'aoliao': "奥利奥",
'asamu': "阿萨姆", 'baicha': "白茶", 'baishikele': "百事可乐", 'baishikele-2': "百事可乐-2",
'baokuangli': "宝矿力", 'binghongcha': "冰红茶", 'bingqilinniunai': "冰淇淋牛奶",
'bingtangxueli': "冰糖雪梨", 'buding': "布丁", 'chacui': "茶萃", 'chapai': "茶π", 'chapai2': "茶π-2",
'damaicha': "大麦茶", 'daofandian1': "到饭点-1", 'daofandian2': "到饭点-2", 'daofandian3': "到饭点-3",
'daofandian4': "到饭点-4", 'dongpeng': "东鹏特饮", 'dongpeng-b': "东鹏特饮-b", 'fenda': "芬达",
'gudasao': "顾大嫂", 'guolicheng': "果粒橙", 'guolicheng2': "果粒橙-2", 'haitai': "海苔",
'haochidian': "好吃点", 'haoliyou': "好丽友", 'heweidao': "合味道", 'heweidao2': "合味道-2",
'heweidao3': "合味道-3", 'hongniu': "红牛", 'hongniu2': "红牛-2", 'hongshaoniurou': "红烧牛肉",
'jianjiao': "尖叫", 'jianlibao': "健力宝", 'jindian': "金典", 'kafei': "咖啡", 'kaomo_gali': "烤馍-咖喱",
'kaomo_jiaoyan': "烤馍-椒盐", 'kaomo_shaokao': "烤馍-烧烤", 'kaomo_xiangcon': "烤馍-香葱", 'kebike': "可比克",
'kele': "可乐", 'kele-b': "可乐-b", 'kele-b-2': "可乐-b-2", 'laotansuancai': "老坛酸菜",
'liaomian': "撩面", 'libaojian': "力保健", 'lingdukele': "零度可乐", 'lingdukele-b': "零度可乐-b",
'liziyuan': "李子园", 'lujiaoxiang': "鹿角巷",
'lujikafei': "露吉咖啡", 'luxiangniurou': "卤香牛肉", 'maidong': "脉动", 'mangguoxiaolao': "芒果小酪",
'meiniye': "梅尼耶", 'mengniu': "蒙牛",
'mengniuzaocan': "蒙牛早餐奶",
'moliqingcha': "茉莉清茶", 'nfc': "NFC果汁", 'niudufen': "牛肚粉", 'niunai': "牛奶",
'nongfushanquan': "农夫山泉", 'qingdaowangzi-1': "青岛王子-1",
'qingdaowangzi-2': "青岛王子-2",
'qinningshui': "沁柠水", 'quchenshixiangcao': "屈臣氏香草味苏打水", 'rancha-1': "燃茶", 'rancha-2': "燃茶",
'rousongbing': "肉松饼",
'rusuanjunqishui': "乳酸菌汽水",
'suanlafen': "酸辣粉",
'suanlaniurou': "酸辣牛肉", 'taipingshuda': "太平梳打", 'tangdaren': "汤达人", 'tangdaren2': "汤达人-2",
'tangdaren3': "汤达人-3", 'ufo': "UFO",
'ufo2': "UFO-2",
'wanglaoji': "王老吉", 'wanglaoji-c': "王老吉-c",
'wangzainiunai': "旺仔牛奶", 'weic': "维C", 'weitanai': "维他奶", 'weitanai2': "维他奶-2",
'weitanaiditang': "维他奶低糖",
'weitaningmeng': "维他柠檬", 'weitaningmeng-bottle': "维他柠檬-瓶装",
'weiweidounai': "维他豆奶", 'wuhounaicha': "午后奶茶", 'wulongcha': "乌龙茶", 'xianglaniurou': "香辣牛肉",
'xianguolao': "鲜果捞",
'xianxiayuban': "鲜虾鱼板面", 'xuebi': "雪碧", 'xuebi-b': "雪碧-b",
'xuebi2': "雪碧-2", 'yezhi': "椰汁", 'yibao': "怡宝", 'yida': "益达", 'yingyangkuaixian': "营养快线",
'yitengyuan': "伊藤园",
'youlemei': "优乐美", 'yousuanru': "优酸乳", 'youyanggudong': "有养谷咚",
'yuanqishui': "元气水", 'zaocanmofang': "早餐魔方", 'zihaiguo': "自嗨锅"}
最后,我们提供的数据集不仅具有高质量的图像和精准的标注,还包括了图像增强后的版本,这些增强版本通过模拟不同的拍摄条件,进一步提升了模型的鲁棒性。我们相信,通过这样一个综合性的数据集的使用,能够显著推动零售柜商品检测软件的开发和优化,同时也为整个智能零售行业的技术进步贡献力量。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行零售柜商品检测的图片或视频,或者启动摄像头进行实时检测。在进行零售柜商品检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8是最新一代的YOLO(You Only Look Once)系列目标检测算法,它在YOLOv7的基础上进一步优化和改进,以提高检测的准确性和速度。YOLOv8算法继承了YOLO系列的设计理念,即“单次查看”,通过单次前向传播即可预测出图像中的目标位置和类别。YOLOv8主要由三个部分组成:主干网络(Backbone)、颈部网络(Neck)以及头部网络(Head),每一部分都对算法的性能起到至关重要的作用。
YOLOv8的主干网络采用了CSPDarknet结构,这一结构通过引入交叉级联(cross-stage partial connections)来减少计算量并保持网络深度和特征学习的能力。CSP结构使网络在保持深度和复杂度的同时,能够有效减少计算资源的消耗,使得模型更加高效。此外,主干网络还融入了SPPF(Spatial Pyramid Pooling Fast)模块,该模块通过不同尺度的池化层来提取多尺度的特征,增强模型对于不同尺寸目标的识别能力。
在颈部网络方面,YOLOv8引入了FPN(Feature Pyramid Networks)和PAN(Path Aggregation Network)结构,这两种结构都旨在聚合不同尺度的特征图,以此来提高小目标的检测性能。FPN结构通过自顶向下的方式将高层次的语义信息传递给低层次的特征图,而PAN则通过自底向上的方式强化了低层次特征图的细节信息,两者的结合使得YOLOv8能够更准确地检测出图像中的所有目标。
YOLOv8的头部网络设计上采用了解耦合头(Decoupled Head)的策略,这种设计使得分类和定位任务能够独立优化,提高了模型的灵活性和精确度。此外,YOLOv8还引入了Anchor-free的机制,与传统的基于Anchor的检测方法不同,Anchor-free的方法直接预测目标的中心点和宽高,从而避免了与Anchor选择相关的复杂性和局限性。
YOLOv8在损失函数设计上引入了CIoU Loss和Distribution Focal Loss,这两种损失函数都旨在改善模型在训练过程中的优化效果,进一步提升模型的性能。CIoU Loss是一种改进的IoU损失函数,它考虑了预测框和真实框之间的重叠程度、中心点距离以及长宽比的匹配度,从而更加精确地指导模型在训练过程中的框回归任务。而Distribution Focal Loss则针对类别不平衡问题,通过减少易分类样本的权重,增加难分类样本的权重,从而使得模型在训练时更加关注那些难以识别的目标。
综上所述,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/test.png")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。
以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) | 0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) | 0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) | 0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) | 0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) | 3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) | 16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) | 640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在这个博客章节中,我们将深入探索如何利用现代深度学习技术训练一个强大的视觉识别模型,专注于零售柜商品的检测。我们的工具是YOLOv8,这是一个高效的对象检测算法,能够实现实时检测,而且对于实际应用场景具有极好的适应性。让我们开始从代码层面分析这个过程。
我们首先导入了os、torch和yaml三个库,分别用于操作系统交互、深度学习计算和配置文件处理。这些是构建现代机器学习应用的基础工具。我们接着通过ultralytics库导入了YOLO类,这是我们训练模型的核心。为了确保我们的代码能在各种硬件上运行,我们通过检查torch.cuda.is_available()来决定模型是在CPU还是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"
接着,我们定义了工作进程的数量和批处理大小。这些参数影响数据加载的速度和内存使用量。我们使用abs_path函数来获得配置文件的绝对路径,确保无论代码运行在什么环境中,路径都是准确无误的。路径的转换还涉及到不同操作系统之间的兼容性处理,这是跨平台软件开发中常见的实践。
workers = 1
batch = 8
data_name = "Goods"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
紧接着,通过yaml.load函数,我们读取了配置文件的内容,并在需要时更新了其中的path项。这是为了确保当我们在不同的文件夹或者服务器上运行代码时,模型能够找到正确的数据路径。
# 获取目录路径
directory_path = os.path.dirname(unix_style_path)
# 读取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)
最后,我们初始化模型并启动训练过程。YOLO类用于加载预训练的模型权重,准备模型进行检测任务。通过调用train方法,我们传入了数据集的路径、设备类型、工作线程数、图像尺寸、训练周期和批处理大小,以及训练任务的名称。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),这一指标衡量的是模型在分类对象方面的性能。从图中我们可以看到,分类损失在训练和验证过程中都表现出类似的快速下降趋势,这表明模型在区分不同类型的对象上也表现出色。分类损失的下降意味着模型能够越来越好地识别出图片中的具体类别。再来看定向边界框损失(dfl_loss),这是YOLOv8特有的,用于评估模型对目标方向的预测准确性。从图中可见,该损失也随着训练迅速下降,这说明模型在预测对象的方向上也取得了显著进步。
最后,mAP(mean Average Precision)是衡量模型整体性能的关键指标,它考虑了不同置信度阈值下模型的精确度和召回率。mAP50指的是在IOU(Intersection Over Union)为0.5时的mAP值,而mAP50-95则是在IOU从0.5到0.95之间每隔0.05取值时mAP的平均值。我们看到这两个指标都呈现出稳步上升的趋势,显示了模型具有较高的检测质量,并且对于各种重叠程度的对象都能保持较好的识别能力。
在深入分析和评估机器学习模型的性能时,F1分数是一个极为重要的指标。它是精确率和召回率的调和平均数,提供了一个综合衡量模型精确性和鲁棒性的方法。
在图中,我们可以看到多条曲线,每一条代表了一个类别的F1分数随置信度阈值变化的情况。图中的深色曲线代表所有类别的平均F1分数,而明显的一点是,在约0.6的置信度阈值处,模型达到了0.92的F1分数。这是一个相当高的分数,表明模型在这一置信度水平下对于大多数类别都有着较高的精确率和召回率平衡。
分析这些曲线,我们注意到随着置信度阈值的增加,大多数类别的F1分数先是迅速提升,然后达到峰值,之后逐渐降低。这个趋势反映出当模型对其预测更加自信时,其预测的精确性通常会提高,但同时可能会牺牲一些召回率,因为较高的置信度阈值可能会排除一些正确的预测。因此,选择最佳的置信度阈值是一个权衡过程,目的是在保持高精确率的同时尽可能地提高召回率。
从图中我们还可以观察到,不同的类别之间的F1分数表现出了显著的差异。这种现象指出,模型对某些类别的识别更为准确,而对另外一些类别则不那么精准。这可能是由于数据集中某些类别的样本数量更多,或者类别之间的特征差异更为明显。总的来说,F1-Confidence曲线为我们提供了一种直观的工具来评估和调整我们的模型。通过选择一个合适的置信度阈值,我们可以确保模型在实际应用中达到最佳的性能平衡点。
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.943 | 0.970 | 0.985 | 0.972 |
F1-Score | 0.89 | 0.94 | 0.97 | 0.92 |
(3)实验结果分析:
在目标检测领域,YOLO系列算法因其出色的性能和快速的检测速度而广受欢迎。本次实验中,我们将YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个版本在同一数据集上进行了对比测试,主要关注它们在平均精度(mAP)和F1-Score这两个关键性能指标上的表现。
从mAP的角度来看,YOLOv7-tiny以0.985的得分表现最佳,显示出在整个数据集中平均检测准确率方面的优势。这一高分可能归功于其更高效的特征提取和优化的锚点配置,这使得YOLOv7-tiny在处理各种尺寸的对象时都能保持高度的灵活性和准确性。YOLOv6n和YOLOv8n的表现也很接近,mAP分别为0.970和0.972,说明这两个版本在不断优化中已经达到了相似的性能水平。而YOLOv5nu以0.943的mAP稍低,这可能是因为它作为一个较早的版本,在特征学习和适应性方面相比后续版本有所不足。
在F1-Score的评估中,YOLOv7-tiny同样以0.97的分数领先,这一结果表明它在精确度与召回率之间取得了最佳平衡。F1-Score较高意味着模型在识别正确的目标上不仅准确,而且遗漏率较低。这对于实际应用尤为重要,因为它意味着模型能够可靠地识别出更多的正例,同时保持误报率低。YOLOv6n和YOLOv8n的F1得分分别为0.94和0.92,显示出较好的性能,而YOLOv5nu以0.89的得分略低。这可能反映出YOLOv5nu在处理特定类别或特定场景时,召回率或精确度有待提高。
综合考虑,各个版本的YOLO在性能上都有各自的优势和不足。YOLOv7-tiny在这一系列的实验中展现出了最为突出的性能,这可能得益于其在网络架构、训练策略和锚点选择上的综合优化。而YOLOv5nu尽管在性能上稍逊一筹,但在资源受限或对速度要求更高的场景下,它的简洁性可能仍然是一个重要考虑因素。
这些实验结果提供了宝贵的参考,帮助我们在实际应用中选择最合适的YOLO版本。同时,它们也指出了未来研究的方向,比如进一步优化网络结构,或者调整训练策略以提升模型在特定任务上的性能。通过精细调优和深入研究,我们有望在准确性、速度和计算资源之间找到更好的平衡点。
4.4 代码实现
在这篇博客中,我们要探讨的是如何使用Python结合YOLOv8模型和QtFusion工具包,实现一个实时的物体检测系统。这个系统的目标是通过摄像头实时捕捉图像,使用YOLOv8模型对图像中的物体进行检测,并在图形用户界面(GUI)上展示检测结果。这种应用在零售分析、安全监控等众多领域都有着广泛的应用前景。
(1)导入必要的模块和配置
首先,为了处理图像和视频流,我们需要引入一系列的库。sys库让我们可以处理程序外部的参数,time库用于计时,评估我们模型处理单帧图像所需的时间,而cv2即OpenCV库,是一个功能强大的图像处理库。为了构建我们的GUI,我们使用PySide6,这是一个提供绑定到Qt库的Python库,适用于创建跨平台的应用程序。QtFusion提供了一些便捷的工具,使得在Python中使用Qt变得更加直观和方便。
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.Goods.label_name import Label_list
QF_Config.set_verbose(False)
(2)创建主窗口
我们的系统是围绕MainWindow类构建的,它继承自QMainWindow,是我们GUI的核心。我们设置了主窗口的尺寸并初始化了一个标签控件用于显示图像。键盘事件的处理函数让用户可以通过按键来控制应用,如按下’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() # 关闭窗口
(3)图像帧处理
在物体检测的实现上,我们定义了一个函数frame_process来处理每一帧图像。这个函数首先调整图像的大小,以符合模型的输入要求,然后将图像传递给YOLOv8模型进行预测。我们通过打印每次推理的时间来监控性能,并根据预测结果在图像上绘制边界框和类别标签。
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控件上显示图像
(4)主程序流程
我们使用YOLOv8Detector类来加载预训练好的模型,并通过get_cls_color函数分配颜色到不同的类别,使得最终的可视化结果既直观又信息丰富。整个系统通过QApplication实例化,并将frame_process函数与视频流处理器MediaHandler关联起来,确保每当有新的视频帧准备好时,都会自动调用该函数进行处理。系统的运行通过app.exec()进入主事件循环,直到用户决定退出。
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) # 获取类别颜色
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())
通过以上的步骤,我们构建了一个完整的实时零售柜商品检测应用。这个应用不仅可以实时识别和显示零售柜商品,还能响应用户的交互操作。
5. 零售柜商品检测软件实现
在实现一款实时零售柜商品检测软件时,我们的系统设计思路旨在打造一个既直观又高效的用户体验。为此,我们采纳了一个多层次的架构策略,确保了软件的可用性、可扩展性和维护性。
5.1 系统设计思路
在我们的系统设计中,我们采取了模块化和分层的架构策略,旨在提高系统的可维护性、可扩展性以及用户交互的直观性。整个系统设计围绕提供一个高效、准确和用户友好的零售柜商品检测解决方案展开。
(1)架构设计
我们的主要窗口类MainWindow不仅是用户交互的门户,也是整个软件架构的核心。它连接了用户界面(UI)、媒体处理和模型预测这三个关键领域,形成了一个协同工作的整体。在此基础上,我们特别强调了模块化设计,使得每个组件都可以独立运作,从而增强了系统的灵活性和鲁棒性。例如,YOLOv8模型的检测器作为一个独立模块,可以在不影响其他组件的情况下更新或替换。
- 处理层(Processing Layer):在处理层,我们利用了先进的YOLOv8Detector类,它内置了预训练的深度学习模型,能够处理实时视频流并准确地识别各种零售柜商品。这个模型是我们软件的智能核心,其高性能确保了软件能够快速响应并在各种环境条件下稳定工作。
- 界面层(UI Layer):系统的界面层设计简洁而直观,让用户可以轻松地加载图像、开始检测任务,并查看检测结果。用户界面不仅仅是按钮和图像的集合,它还被设计成了用户操作的指挥中心。所有的操作,无论是启动视频流还是处理单个图像文件,都可以通过这个界面层轻松完成。
- 控制层(Control Layer):控制层则是系统的指挥棒,它负责解释用户的指令并将其转化为具体的动作。这层通过定义一系列槽函数和方法,处理用户在界面层的交互,指导媒体处理器捕捉视频流,以及操纵模型进行图像识别和检测。控制层的设计确保了软件的响应性和稳定性,无论是实时视频流处理还是静态图像分析,都可以快速且准确地完成。
最后,我们采用了Qt的信号和槽机制,这是一种强大的事件驱动编程模型,使得不同的功能模块之间能够无缝沟通和数据交换。这意味着,无论是新的检测框出现,还是用户改变检测参数,系统的各个部分都可以及时响应和更新状态。这种设计使得系统既灵活又稳固,为用户提供了一个既实时又准确的商品检测工具。
总的来说,我们的设计哲学是以用户为中心,从易用性到性能,每一步都旨在提供最佳的用户体验。通过将前沿的YOLOv8模型与高效的图像处理技术和用户友好的界面相结合,我们的软件不仅能够满足零售业对商品检测的需求,同时也为研究人员和开发者提供了一个强大的研究和开发平台。
(2)系统流程
在构建我们的交互式零售柜商品检测软件时,我们采纳了一种综合的系统设计思路,旨在将界面设计、媒体处理以及深度学习模型紧密集成,以提供一个高效、直观且用户友好的应用体验。这一设计思路的核心在于利用对象组合和模块化,确保各个组件——从前端界面到后端处理逻辑——都能够独立运行,同时通过Qt框架的信号和槽机制进行有效沟通。这样的架构不仅促进了高度的解耦,还提供了灵活性,允许系统轻松适应未来的扩展或修改。
-
用户进入系统后,会遇到由MainWindow类实例化的主界面。这个类的初始化过程中不仅包括了用户界面的布局设置,还涉及到了视频流和图像处理的配置。用户可以通过这个界面来选择不同的输入源,包括实时视频流、视频文件或是图像文件,每一种输入源都通过系统内部的媒体处理器得到妥善处理。对于实时视频流,系统会配置摄像头;对于视频文件,系统会处理文件的读取;对于图像文件,系统则负责加载和转换。
-
在媒体资源准备就绪后,系统会进入一个连续的帧处理循环。在这个循环中,系统首先进行预处理,包括图像尺寸的调整和颜色空间的转换,以适配YOLOv8模型的要求。接着,这些预处理过的图像会被送入模型进行目标的检测和识别。检测结果不仅包括商品的定位,还可能包括商品的类别和其他相关信息。这些结果将即时反馈到GUI,用户可以看到包括检测框和类别标签在内的视觉结果,同时,检测的统计数据也会以表格或图表的形式展示在界面上。
-
此外,为了增强用户互动,我们在界面上提供了多种按钮和控制元素,使用户能够执行各种操作,例如保存结果、调整检测设置或是查询帮助信息。用户还可以通过界面控制媒体播放,例如开始或停止视频流的捕捉,这为用户提供了对检测过程的直接控制。
通过这样的设计,我们的系统不仅能够提供实时的商品检测功能,还能让用户通过交互来深入理解和分析检测结果。整个系统流程的设计旨在使用户能够在一个统一的平台上完成从输入源选择到结果分析的所有步骤,无缝地整合了技术的复杂性和用户体验的简洁性。这种综合性的设计思路是我们应对快速变化和技术发展的关键,它确保了我们的系统不仅能够满足当前的需求,还能够适应未来潜在的挑战和机遇。
5.2 登录与账户管理
在本次博客分享中,我们将深入了解一个集成了高级账户管理功能的交互式零售柜商品检测软件。该软件不仅能够实施精准的商品检测,还能为每位用户提供一套完整的个性化体验。通过PySide6构建的用户界面与SQLite数据库的结合使用,我们实现了一套全面的账户管理系统,用户可以通过它进行注册、登录、密码修改、头像设置以及注销等操作。
账户管理是软件的一个关键组成部分,它允许用户在私密的空间内保存个人设置和检测历史记录,从而使得用户体验更加个性化和安全。在用户首次使用软件时,他们将通过一个直观的注册界面创建新的账户,设置独一无二的用户名和密码,并可选择上传头像以定制个人资料。此外,用户能够随时更新他们的密码和头像,确保账户的个人化和安全性。
一旦登录,用户便可以访问软件的主要功能——零售柜商品检测。在这里,用户可以选择不同的输入源进行商品检测,包括上传的图片、视频文件,甚至是来自实时摄像头的视频流。主界面中不仅实时显示检测框、类别和置信度信息,还能处理和记录批量文件输入,实现了真正的多任务和多物体检测能力。
我们的设计理念是为用户提供一个既简便又高效的工具,不仅能够实现强大的目标检测功能,还能通过账户管理系统,为用户带来安全且无缝的操作体验。这不仅提升了用户对软件的信任和满意度,还大大增强了软件在实际零售场景中的应用价值。通过这些细心的设计,交互式零售柜商品检测软件为零售业的商家和顾客提供了一个可靠、易用且功能强大的解决方案,助力提升零售效率和顾客购物体验。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1xw4m1d7Qr/
在文件夹下的资源显示如下,下面的链接中也给出了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模型的零售柜商品检测软件,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的零售柜商品检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
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. ↩︎
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. ↩︎
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. ↩︎