摘要:博客深入介绍了基于YOLOv8/v7/v6/v5的零售柜商品识别系统,采用了YOLOv8作为主要的检测框架,并整合了YOLOv7、YOLOv6、YOLOv5算法,进行具体的性能指标对比。博客中详细介绍了国内外在零售柜商品检测领域的研究现状、如何处理数据集、算法原理、以及模型构建与训练的代码实现。本文设计一个基于Streamlit的交互式Web应用界面,界面支持图像、视频以及实时摄像头进行商品识别。用户可以通过该界面上传不同的训练模型(YOLOv8/v7/v6/v5)进行推理预测,同时界面的布局和功能设置都可以方便地进行修改和定制。博客附带了完整的网页设计、深度学习模型代码和训练数据集的下载链接,以便于大家进行学习和研究。
文章目录
网页版-零售柜商品识别系统(YOLOv8/YOLOv7/YOLOv6/YOLOv5+实现代码+训练数据集)
1. 网页功能与效果
(1)开启摄像头实时检测:本系统允许用户通过网页直接开启摄像头,实现对实时视频流中商品的检测。系统将自动识别并分析画面中的商品,并将检测结果实时显示在用户界面上,为用户提供即时的反馈。
(2)选择图片检测:用户可以上传本地的图片文件到系统中进行商品检测。系统会分析上传的图片,识别出图片中的商品,并在界面上展示带有商品标签和置信度的检测结果,让用户能够清晰地了解到每个商品状态。
(3)选择视频文件检测:系统支持用户上传视频文件进行商品检测。上传的视频将被系统逐帧分析,以识别和标记视频中每一帧的商品。用户可以观看带有商品检测标记的视频,了解视频中商品的变化。
(4)选择不同训练好的模型文件:系统集成了多个版本的YOLO模型(如YOLOv8/v7/v6/v5),用户可以根据自己的需求选择不同的模型进行商品检测。这一功能使得用户能够灵活地比较不同模型的表现,以选择最适合当前任务的模型。
在本章节中,我们详细介绍了基于YOLOv8/v7/v6/v5的商品检测系统的交互式Web应用界面及其核心功能。实时摄像头商品检测允许用户开启摄像头进行即时的商品识别,极大地提高了在零售和仓储管理中的实用性。对于需要分析静态图像或视频的情况,系统提供了图片和视频文件检测功能,用户可通过简单的操作上传本地文件并快速获取检测结果。考虑到不同的应用场景可能需要不同版本的YOLO模型,我们加入了模型选择功能,让用户能够根据实际需求灵活选择YOLOv8/v7/v6/v5中的任一版本进行检测。
为了优化用户体验,本系统支持检测画面展示功能,允许检测结果与原始画面同时或单独显示,并提供了一个下拉框以便用户可以单独标记并展示特定目标的检测结果。所有的检测结果都会在页面上的一个表格中结果展示与保存,其中详细列出了每个识别对象的类别和置信度等信息。用户还可以根据需求动态调整检测算法的置信度阈值和IOU阈值,以获得最佳的检测效果。此外,为了方便用户记录和分析,系统提供了一个功能,允许一键将检测结果导出为csv文件。最后,对于需要保存检测画面的场景,系统还支持将标记后的图片、视频、摄像头画面结果导出为avi格式的图像文件。
我们的Web应用通过采用简洁直观的用户界面设计,结合下拉菜单、滑块、按钮等UI元素,确保了功能操作的直观易懂。整个商品检测过程无需复杂配置,用户仅需几步简单操作即可完成从文件选择到结果导出的全过程,无论是商业应用还是个人使用,本系统都能满足广泛的商品检测需求,同时提升用户的交互体验和系统的检测效率。
2. 绪论
2.1 研究背景及意义
随着零售行业的数字化转型,零售柜商品检测技术成为了这一过程中不可或缺的一部分。零售柜商品检测,简而言之,就是利用计算机视觉技术来识别和分类图像或视频中的商品项目。这项技术在零售、库存管理、自动结账系统等众多领域都有广泛的应用,它不仅能提高效率,降低人工成本,还能增强消费者体验。随着深度学习技术的快速发展,基于YOLO(You Only Look Once)系列算法的商品检测在准确率和检测速度上都取得了显著的提升。
近年来,深度学习在目标检测领域的应用取得了突破性进展,尤其是YOLO系列算法因其高效的实时检测能力而备受关注。YOLOv8,通过优化网络结构和训练策略,进一步提高了检测速度和准确性。这对于需要实时处理大量图像和视频数据的商品检测系统来说,是一个巨大的进步。近期的研究表明,通过引入注意力机制、改进的损失函数和数据增强技术,可以有效地提高模型的泛化能力和检测性能。
在国内外,商品检测技术的研究不断深入,众多研究人员和机构致力于探索更高效、更准确的检测方法。一些研究聚焦于算法的优化和创新,比如通过深度学习模型的集成、多尺度检测和跨域学习来提高检测的准确性和鲁棒性。另外,随着数据集的不断更新和扩充,训练出的模型能更好地理解和识别多样化的商品项目,这对于提高商品检测系统的实用性和可靠性至关重要。
面对如此迅速发展的技术,行业也提出了新的需求和挑战。例如,如何在保证高准确性的同时实现高效的实时检测,如何处理复杂背景下的商品检测,以及如何提高模型在不同场景下的泛化能力。为了解决这些问题,研究者和工程师们不断探索,比如优化算法的计算效率,设计更为复杂的网络结构,以及采用更先进的训练技术。
2.2 国内外研究现状
近年来,零售柜商品检测技术在算法优化、网络结构创新以及性能提升等方面取得了显著的进展。基于深度学习的目标检测算法,特别是YOLO系列,在实现高效准确的商品检测方面扮演着核心角色。YOLOv5、YOLOv71、YOLOv72、YOLOv8,不断地在速度和准确性之间寻找最优平衡,通过引入更复杂的网络结构和更有效的训练机制来提高检测性能。
YOLOv8通过改进网络架构和优化损失函数,显著提高了对小物体的检测能力,这对于商品检测尤为重要。同时,研究者通过引入自注意力机制和特征融合技术,进一步增强了模型的特征提取能力,这使得模型在复杂背景下的商品检测表现更加出色。
Transformer3模型在自然语言处理领域取得的巨大成功激发了将其应用于计算机视觉的兴趣。ViT(Vision Transformer)通过将图像切割成多个小块(patch)并将它们输入到Transformer模型中,展示了与CNN模型相媲美甚至更好的性能,尤其是在需要全局理解的复杂场景中。注意力机制,作为Transformer模型的核心,也被广泛应用于其他目标检测模型中,以增强模型对图像重要部分的关注能力。
在经典的目标检测框架中,Faster R-CNN4通过引入区域建议网络(RPN)大大提高了检测速度,而RetinaNet解决了类别不平衡问题,引入了Focal Loss来提高模型对难以检测目标的识别能力。DETR(Detection Transformer)和之后的进化版本如Deformable DETR进一步将Transformer架构与目标检测任务结合,通过直接预测目标的方式,避免了复杂的预处理步骤和后处理步骤,实现了更加简洁和高效的检测流程。
Glod-YOLO通过全局优化目标检测的局部特征提取,显著提高了对小目标的检测能力。而MMDetection5作为一个开放源代码的目标检测工具箱,支持多种最新的检测模型,为研究人员和开发者提供了一个灵活且强大的平台来探索和实验不同的目标检测算法。
2.3 要解决的问题及其方案
2.3.1 要解决的问题
在构建基于YOLOv8/v7/v6/v5的商品检测系统时,我们面对的挑战及其解决方案是多方面的,旨在提供一个高效、准确、且用户友好的商品识别工具。本系统特别注重实现高准确度的检测与实时处理能力、环境适应性和模型泛化能力、直观高效的用户交互界面,以及优秀的数据处理与存储效率。此外,考虑到未来的技术进步和需求变化,系统的可扩展性和维护性也是设计中的关键考量。
-
商品检测的准确性和速度:考虑到商品的多样性及其在实际环境中的表现,系统需要能够准确快速地识别不同商品的细微特征差异。YOLOv8作为核心模型,结合YOLOv7、v6、v5的优点,通过深度学习的技术框架PyTorch实现,提供了实时处理的同时保持高准确率的能力。多模型的比较与集成进一步增强了系统在不同场景下的应用灵活性和准确性。
-
环境适应性和模型泛化能力:商品在不同的光照、背景及天气条件下的检测挑战着模型的泛化能力。通过引入先进的数据增强技术和在多样化数据集上进行训练,本系统的模型能够适应各种环境变化,提高准确性。
-
用户交互界面的直观性和功能性:基于Streamlit的网页设计,结合CSS美化,提供了一个直观且功能丰富的用户界面。用户可以轻松开启摄像头实时检测、选择图片或视频进行检测、切换不同的模型文件,以及调整检测算法的参数,所有这些都在一个易于导航的界面中实现。
-
数据处理能力和存储效率:在处理大量图像和视频数据的同时,系统采用了高效的数据处理流程和优化的存储解决方案。这确保了识别的实时性,并提高了长期数据管理和查询的效率。
-
系统的可扩展性和维护性:采用模块化的设计和最新的软件工程实践,确保了系统易于维护和升级。这为未来集成新技术、添加新功能或支持更多商品检测提供了强大的灵活性。
2.3.2 解决方案
针对构建基于YOLOv8/v7/v6/v5的商品检测系统的复杂需求,我们细化了一系列的技术策略和解决方案,确保系统既能高效准确地完成商品检测任务,同时也提供用户友好的操作界面和强大的数据处理能力。以下是我们的具体解决方案:
- 深度学习模型的选择和优化
- 模型架构:我们采用了YOLOv8作为主要的深度学习模型,考虑到其在速度和准确度之间的优秀平衡。YOLOv8的高效性特别适用于实时商品检测任务,而YOLOv7、v6、v5的集成则进一步增强了系统的适用性和准确性,满足不同场景的需求。
- 数据增强:为了增强模型的泛化能力,我们采用了一系列数据增强技术,如随机裁剪、缩放、旋转、色彩调整等,这些技术能够模拟商品在多变环境下的表现,从而提高模型对实际应用场景的适应性。
- 迁移学习:利用在大规模数据集上预训练的模型作为基础,通过迁移学习技术,对特定于商品的小型数据集进行微调。这不仅加快了模型的训练速度,也提高了识别性能。
- 技术框架和开发工具
- PyTorch框架:我们选择PyTorch作为开发深度学习模型的主要框架,得益于其提供的灵活编程环境和强大的GPU加速能力,PyTorch极大地加速了模型的开发和迭代过程。
- Streamlit网页设计:基于Streamlit框架设计的网页应用,使得构建交互式Web界面变得简单而高效。结合CSS进行美化,提升了用户界面的视觉效果和操作体验。
- PyCharm开发环境:使用PyCharm作为主要的集成开发环境(IDE),它提供了代码编写、调试和测试的全面支持,大大提高了开发效率和代码质量。
- 功能实现和系统设计
- 多输入源支持:系统设计支持多种输入源,包括静态图片、视频文件和实时摄像头捕获,以适应不同使用场景的需求。
- 模型切换功能:实现了用户可以动态选择和切换不同预训练模型的功能,增加了系统的灵活性和适用范围。
- 参数调整与结果展示:用户可通过界面调整检测算法的参数,如置信度阈值和IOU阈值,并在网页上实时查看检测结果和分析报告。
- 数据处理和存储策略
- 高效数据处理:采用PyTorch的数据加载器和预处理机制,确保了数据处理的高效性,满足了实时商品检测的需求。
- 智能数据存储:设计了高效的数据存储方案,对识别结果和历史数据进行智能组织和索引,方便用户进行查询和分析。
2.4 博文贡献与组织结构
在这篇关于基于YOLOv8/v7/v6/v5的商品检测系统的博客中,我们深入探讨了一系列与商品检测技术相关的核心方面。通过详尽的文献综述、严谨的数据集处理、精选的算法比较与优化、以及基于Streamlit的友好网页界面设计,本文力图为读者提供一个全面且深入的视角,以理解和应用最新的商品检测技术。以下是本文的主要贡献:
-
全面的文献综述:我们提供了一篇综合性的文献综述,涵盖了目前商品检测领域内广泛使用的算法,如YOLOv8/v7/v6/v5,以及其他相关技术的进展,为读者提供了一个坚实的学术和技术基础。
-
精确的数据集处理:详细介绍了数据集的选择、预处理和增强方法,这对于提升模型训练的效果和准确性至关重要。我们分享的技术细节和策略,可以帮助读者更好地理解如何处理和利用数据集,以优化商品检测性能。
-
算法选择与优化:通过比较YOLOv8/v7/v6/v5等算法的性能,本文不仅展示了每种算法的优势和局限,还详述了如何针对特定的商品检测任务进行算法选择和优化。
-
友好的网页界面设计:基于Streamlit,我们设计了一个美观且用户友好的网页界面,使得非技术用户也能轻松地进行商品检测。界面设计的细节和实现逻辑为开发者提供了实用的参考。
-
算法效果的对比分析:本文不仅介绍了YOLO系列算法在商品检测任务上的应用,还提供了一系列实验结果,对比了不同算法版本之间的性能差异,为读者选择适合自己需求的模型提供了依据。
-
完整的资源分享:分享了完整的数据集、预处理代码、模型训练与推理代码等资源,使得读者能够实际操作和体验商品检测技术,从而加深理解和应用。
后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在商品检测中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在商品检测任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的商品检测系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。
3. 数据集处理
在本研究中,我们致力于开发一个基于YOLOv8/v7/v6/v5算法的高效商品检测系统。为了实现这一目标,我们构建了一个包含5422张图片的综合数据集,该数据集被划分为训练集、验证集和测试集,其中包含3796张训练图片,1084张验证图片,以及542张测试图片。这样的分布确保了模型在训练过程中有充分的数据量来学习识别各种商品,并通过验证集和测试集对模型的泛化能力和性能进行了准确评估。博主使用的类别如下:
Chinese_name = {"Complan Classic Creme": "经典奶油",
"Complan Kesar Badam": "藏红花杏仁",
"Complan Nutrigro Badam Kheer": "杏仁布丁",
"Complan Pista Badam": "开心果杏仁",
"Complan Royal Chocolate": "皇家巧克力",
"EY AAAM TULSI TURMERIC FACEWASH50G": "芒果洗面奶",
"EY ADVANCED GOLDEN GLOW PEEL OFF M. 50G": "金色面膜50G",
"EY ADVANCED GOLDEN GLOW PEEL OFF M. 90G": "金色面膜90G",
"EY EXF WALNUT SCRUB AYR 200G": "核桃磨砂200G",
"EY HALDICHANDAN FP HF POWDER 25G": "檀香粉25G",
"EY HYD-EXF WALNT APR SCRUB AYR100G": "核桃杏仁磨砂100G",
"EY HYDR - EXF WALNUT APRICOT SCRUB 50G": "核桃杏仁磨砂50G",
"EY NAT GLOW ORANGE PEEL OFF AY 90G": "橙子面膜90G",
"EY NATURALS NEEM FACE WASH AY 50G": "印楝洗面奶",
"EY RJ CUCUMBER ALOEVERA FACEPAK50G": "黄瓜面膜",
"EY TAN CHOCO CHERRY PACK 50G": "巧克力樱桃面膜",
"EY_SCR_PURIFYING_EXFOLTNG_NEEM_PAPAYA_50G": "印楝木瓜面膜",
"Everyuth Naturals Body Lotion Nourishing Cocoa 200ml": "可可乳液",
"Everyuth Naturals Body Lotion Rejuvenating Flora 200ml": "植物乳液",
"Everyuth Naturals Body Lotion Soothing Citrus 200ml": "柑橘乳液",
"Everyuth Naturals Body Lotion Sun Care Berries SPF 15 200ml": "防晒浆果乳液",
"Glucon D Nimbu Pani 1.KG": "柠檬水",
"Glucon D Regular 1.KG": "常规",
"Glucon D Regular 2.KG": "常规2KG",
"Glucon D Tangy orange 1.KG": "浓橙",
"Nutralite ACHARI MAYO 300g-275g-25g-": "泡菜蛋黄酱",
"Nutralite ACHARI MAYO 30g": "泡菜蛋黄酱小",
"Nutralite CHEESY GARLIC MAYO 300g-275g-25g-": "芝士蒜蛋黄酱",
"Nutralite CHEESY GARLIC MAYO 30g": "芝士蒜蛋黄酱小",
"Nutralite CHOCO SPREAD CALCIUM 275g": "巧克力涂酱",
"Nutralite DOODHSHAKTHI PURE GHEE 1L": "纯酥油",
"Nutralite TANDOORI MAYO 300g-275g-25g-": "炭烤蛋黄酱",
"Nutralite TANDOORI MAYO 30g": "炭烤蛋黄酱小",
"Nutralite VEG MAYO 300g-275g-25g-": "素蛋黄酱",
"Nycil Prickly Heat Powder": "痱子粉",
"SUGAR FREE GOLD 500 PELLET": "无糖金500粒",
"SUGAR FREE GOLD POWDER 100GM": "无糖金粉100G",
"SUGAR FREE GOLD SACHET 50 SUGAR FREE GOLD SACHET 50": "无糖金小包",
"SUGAR FREE GOLD SACHET 50": "无糖金小包50",
"SUGAR FREE GRN 300 PELLET": "无糖绿300粒",
"SUGAR FREE NATURA 500 PELLET": "无糖自然500粒",
"SUGAR FREE NATURA DIET SUGAR 80GM": "无糖自然瘦糖80G",
"SUGAR FREE NATURA DIET SUGAR": "无糖自然瘦糖",
"SUGAR FREE NATURA SACHET 50": "无糖自然小包",
"SUGAR FREE NATURA SWEET DROPS": "无糖自然甜滴",
"SUGAR FREE NATURAL DIET SUGAR 80GM": "无糖自然瘦糖80G",
"SUGAR FREE NATURA_ POWDER_CONC_100G": "无糖自然粉100G",
"SUGAR FREE_GRN_ POWDER_CONC_100G": "无糖绿粉100G",
"SUGARLITE POUCH 500G": "糖精袋500G"}
针对数据集,我们采取了一系列预处理措施,以优化训练过程和提高模型性能。所有图片均经过自动定向处理,以保证图像的正确朝向,并剔除了EXIF信息中的定向标记,这有助于消除因图片方向变化带来的潜在混乱。为了适配深度学习模型的输入需求,每张图片都被调整为640x640像素的统一大小。这种统一尺寸的处理不仅有利于保持网络结构的一致性和简化计算流程,还能够确保在不同尺寸的图像中特征提取的有效性。
通过对数据集分布的细致分析,我们发现标签类别的分布呈现多样化的情况。如所展示的数据集分布图中所示,我们可以看到类别分布的直方图、边界框位置分布的热图,以及边界框的宽高比分布图。这些分析图表明,数据集中商品实例在类别上分布广泛,且在图像中的位置分布相对均匀。这种均衡的分布有助于防止模型过分偏向于数据集中的某些特定类别或区域,从而提升了模型在不同环境和不同商品上的检测能力。边界框宽高比的分布也显示了商品在形状上的多样性,这对于训练模型以准确识别不同形状和大小的商品是至关重要的。
总而言之,我们精心构建和处理的数据集是本研究工作的基础,它不仅支撑了模型训练和评估的需求,还为深入探索商品检测算法提供了丰富的素材。
4. 原理与代码介绍
4.1 YOLOv8算法原理
YOLOv8作为目标检测领域的一项重要进展,其算法原理体现了最新的技术革新和性能优化。这一模型不仅在传统的YOLO架构上做出了改进,还引入了多项新技术以提高检测的准确性和速度。
首先,YOLOv8通过引入更加精细的网络架构设计,增强了模型对小目标的识别能力,同时也提高了对背景噪声的抑制能力。特别是,它采用了多尺度特征提取技术,能够捕获不同大小目标的特征。这一特征对于血细胞等细小目标的检测尤其重要,因为它们在图像中的表现可能非常微小,易于被忽视。而YOLOv8通过在不同层次上进行特征融合,能够提升对这些细小目标的检测效率。
在损失函数的设计上,YOLOv8采用了创新的 ‘Distribution Focal Loss’,这是一种针对分类误差的改进。传统的Focal Loss主要是为了解决分类任务中的类别不平衡问题,而’Distribution Focal Loss’则进一步,通过调整分类概率分布来优化。这种新型的损失函数不仅能够更加精确地反映类别之间的差异,还可以有效减少模型在面临不平衡数据时的过拟合现象。
YOLOv8还采用了Task Aligned Assigner,这是一种新颖的任务对齐分配机制。它通过对标注框与预测框之间的对齐程度进行评分,来决定哪些标注框应当被分配给特定的锚点。Task Aligned Assigner的引入有效减少了标注与预测之间的误差,提升了模型的准确性。
在模型的训练过程中,YOLOv8的设计者还特别考虑了训练数据的质量和效率问题。这一方面体现在如何更有效地利用训练数据来提升模型性能。YOLOv8采用了一系列数据增强技术来模拟各种可能的检测场景,增强模型在复杂环境下的泛化能力。数据增强技术的应用,使得YOLOv8能够在多样化的数据上获得更稳定和鲁棒的学习效果。
综上所述,YOLOv8在网络架构、损失函数设计、标注框分配机制以及数据增强技术等多个方面都进行了创新和优化,这些改进让它在目标检测领域的表现超越了以往的版本。YOLOv8不仅能够提供高精度的检测结果,而且在处理速度和稳健性方面也表现出色,为实时目标检测系统的实现和应用提供了强有力的技术支持。
4.2 模型构建
在这一部分,我们将深入探讨用于构建商品检测模型的关键代码段,重点介绍代码的功能以及如何协同工作以实现高效的商品检测。下面是代码的详细解读:
首先,代码的基础构建在一系列重要的Python库之上。使用cv2即OpenCV库,一个开源的计算机视觉和机器学习软件库,为我们处理图像和视频提供支持。接下来,我们利用torch,这是一个灵活的深度学习研究平台,它提供了丰富的API来支持模型的设计、训练和验证。QtFusion.models中的Detector类是一个抽象基础类,用于定义商品检测模型应有的行为。我们还引入了datasets.label_name中的Chinese_name字典,这使得模型识别出的类别可以与人类友好的中文名称相关联。最后,从ultralytics包中,我们引入了YOLO类和select_device功能,分别用于加载YOLO模型和确定模型运行的硬件环境,无论是在CPU还是GPU上。
import cv2
import torch
from QtFusion.models import Detector
from datasets.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device
在代码中,device变量用于定义模型训练和推理将使用的计算设备。如果GPU可用(torch.cuda.is_available()),则使用GPU加速计算;如果不可用,回退到CPU。ini_params字典包含了模型运行的配置参数,例如对象检测的置信度阈值(conf)和非极大值抑制(Non-Maximum Suppression, NMS)的IOU阈值(iou)。这些参数可以在模型预测时调整,以优化模型的性能。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
ini_params = {
'device': device,
'conf': 0.25,
'iou': 0.5,
'classes': None,
'verbose': False
}
然后,我们定义了count_classes函数,count_classes函数为我们提供了对检测到的商品类别进行计数的能力,这有助于我们了解数据集中每个类别的分布情况,以及模型在不同类别上的表现。
def count_classes(det_info, class_names):
count_dict = {name: 0 for name in class_names}
for info in det_info:
class_name = info['class_name']
if class_name in count_dict:
count_dict[class_name] += 1
count_list = [count_dict[name] for name in class_names]
return count_list
在YOLOv8v5Detector类的实现中,我们首先在初始化函数中定义了模型和图片处理所需的参数。通过设置设备类型,我们为模型提供了在不同硬件上运行的灵活性。同时,置信度和IOU(交并比)阈值的设置对于调节模型预测的严格性至关重要——置信度决定了模型有多确信一个检测框内确实包含某个对象,而IOU阈值则用于在非极大值抑制过程中判断两个检测框是否指向同一个对象。
class YOLOv8v5Detector(Detector):
def __init__(self, params=None):
super().__init__(params)
self.model = None
self.img = None
self.names = list(Chinese_name.values())
self.params = params if params else ini_params
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())))
def preprocess(self, img):
self.img = img
return img
def predict(self, img):
results = self.model(img, **ini_params)
return results
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
def set_param(self, params):
self.params.update(params)
load_model函数中实现了模型的加载过程。这里我们调用select_device函数选择最适合的计算设备,并将YOLO模型加载到指定的设备上。模型的加载不仅包括了权重和结构,还包括了为模型预热的过程,这是一种优化技术,通过先在模型上运行一些虚拟数据来提升实际运行时的效率。随后,我们看到predict函数负责将预处理后的图像送入模型进行预测。这个函数是实现商品检测的核心,它使用我们之前加载和预热的模型来对输入图像进行处理,并返回检测结果。后处理过程在postprocess函数中实现,该函数解析模型的预测结果,提取和格式化边界框信息和类别置信度。每个预测结果都被转换成一个字典,包含了类别名称、边界框坐标、置信度分数以及类别ID,便于进一步的分析和可视化。
整个代码结构清晰地分为了模型的加载、图像的预处理、预测以及预测结果的后处理,体现了实际深度学习应用中的典型流程。该流程确保了从输入原始图像到最终的手势检测结果的转换,既高效又易于理解和修改。
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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
环境设置与模型加载:我们的代码从导入操作系统接口库os开始,这对文件路径操作至关重要。接着,引入torch,标志着我们的训练将依赖于PyTorch深度学习框架——当前深度学习领域的主要力量之一。与此同时,yaml库的引入让我们能够解析和写入YAML格式的配置文件,这种格式因其可读性和简洁性而在机器学习项目中广泛使用。YOLO类的引入意味着我们将使用Ultralytics提供的YOLO实现,这是基于YOLO的最新研究改进的高效版本。而QtFusion.path模块中的abs_path函数保证了我们能够处理相对和绝对路径,这在项目中管理文件时是一个常见需求。
import os
import torch
import yaml
from ultralytics import YOLO # 用于加载YOLO模型
from QtFusion.path import abs_path # 用于获取文件的绝对路径
在选择运行训练任务的设备时,代码考虑了如果可用,首选GPU(因为torch.cuda.is_available()为True时,device设置为"0",即第一个GPU设备)。GPU用于加速深度学习的训练过程,但如果不可用,它会回退到CPU。
device = "0" if torch.cuda.is_available() else "cpu"
数据集准备:工作进程数和批次大小是影响数据加载和训练效率的重要参数。较少的工作进程可能导致数据加载成为瓶颈,而较小的批次大小可能导致硬件资源利用不充分。在这里,我们选择了一个工作进程和每批8个样本的设置,这是出于避免GPU内存溢出的考虑。通过构建数据配置文件的路径,这里我们看到了一个考虑跨平台兼容性的细节:路径分隔符被统一为UNIX风格(正斜杠),这有助于避免Windows和UNIX系统间的差异。
workers = 1 # 工作进程数
batch = 8 # 每批处理的图像数量
data_name = "GoodsRecognition"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current')
unix_style_path = data_path.replace(os.sep, '/')
读取并解析YAML文件中的数据配置是准备训练的前置步骤,这通常包含了关于数据集结构和路径的信息。这些信息对于训练的成功执行至关重要,因为它们告诉训练流程数据在哪里,以及如何获取。更新YAML文件以确保path正确反映了数据所在的位置,确保当YAML文件被移动或者数据目录变更时,配置仍然有效。
directory_path = os.path.dirname(unix_style_path)
with open(data_path, 'r') as file:
data = yaml.load(file, Loader=yaml.FullLoader)
if 'path' in data:
data['path'] = directory_path
with open(data_path, 'w') as file:
yaml.safe_dump(data, file, sort_keys=False)
训练模型:最后,代码使用YOLO类来加载预先训练好的YOLOv8权重。随后,通过调用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 # 指定训练任务的名称
)
这段代码展示了如何利用ultralytics YOLO库中的高级接口简化模型训练流程。用户只需要提供相关参数,便可以轻松开始模型的训练工作,而无需手动编写繁琐的训练循环和数据管理代码。
5. 实验结果与分析
5.1 训练曲线
在对YOLOv8模型进行训练的过程中,对损失函数和性能指标的分析是理解模型学习效果的关键。从训练损失图像中,我们可以获得模型训练的直观反馈。图像呈现了几个关键指标的变化,包括训练与验证的损失,以及精度和召回率等性能度量。
观察训练和验证损失图,即train/box_loss、train/cls_loss、train/obj_loss和相应的验证损失图val/box_loss、val/cls_loss、val/obj_loss,我们可以看到随着训练周期(epoch)的增加,损失函数的值稳步下降并趋于平稳。这表明模型在学习过程中逐步提高了对商品检测任务的理解,并且能够更加准确地预测目标的类别和位置。损失函数值的下降同时在训练集和验证集上出现,这意味着模型没有出现过拟合现象,即模型并没有仅仅记住训练数据,而是真正学习到了通用的特征。另外,平滑处理的结果线(smooth)显示了损失函数随训练周期变化的平滑趋势,有助于我们识别和忽略可能的噪声和异常值。平滑曲线的稳定性进一步印证了模型训练过程的健壮性。
在性能度量方面,metrics/precision和metrics/recall指标的图表展示了模型在正样本识别上的性能。精确度图表显示了模型在确定正样本时的准确程度,而召回率图表则反映了模型在识别所有正样本上的表现。两个指标均随着训练周期的增加而显著提高,接近1.0的值,说明模型具有很高的检测精度和覆盖率。
最后,metrics/mAP50和metrics/mAP50-95图表展现了模型的平均精度(mAP)。mAP是目标检测中的标准性能指标,其中mAP@0.5衡量的是在50%IOU阈值时模型的性能,而mAP@0.5:0.95则是在IOU从50%至95%的阈值范围内计算得出的平均精度。这两个指标的高值表明模型在各种重叠阈值下都能保持较高的性能,强调了模型对于不同大小和形状目标的鲁棒检测能力。
综上所述,通过损失和性能指标的详细分析,我们可以得出结论,YOLOv8模型在训练过程中显示出了优秀的学习能力和高度的泛化性。随着损失函数值的减少,以及精度和召回率的提高,模型展现了对商品检测任务的高度精确和可靠性。
5.2 PR曲线图
Precision-Recall (PR) 曲线是评估分类模型性能的重要工具,特别是在数据集中存在类别不平衡的情况下。通过图示,我们可以分析模型在所有类别上的平均精确度(mAP)。
从图中可见,精确度(Precision)指模型预测为正样本的实例中真正为正样本的比例,而召回率(Recall)则是指模型正确识别的正样本数量占所有真实正样本数量的比例。理想情况下,我们希望模型能够同时达到高精确度和高召回率,但在实际应用中这两个指标往往是一种权衡。
可以看出大部分曲线位于高精确度和高召回率的区域,这表示模型在大多数情况下能够同时保持高精确度和高召回率。曲线下方的阴影部分反映了模型在不同召回率水平下的精确度变化范围,而蓝色实线则显示了平均表现趋势。在曲线右端,我们注意到即使召回率接近1.0时,精确度也维持在一个相对高的水平,这表明模型能够识别出几乎所有的正样本,同时保持较少的误判。
此外,曲线上方的横线标记了模型在IOU为0.5时的平均精确度(0.972 mAP@0.5),这是一个异常高的结果,说明模型在这一标准下有着卓越的识别能力。在目标检测任务中,mAP@0.5是一个常用的评估标准,它表明即便是在较低的IOU阈值下,模型也能够展现出优异的检测性能。
综合这些观察结果,我们可以得出结论,该商品检测模型表现出了极高的识别准确性和可靠性。其高mAP值指出,在大多数情况下,即使在不同的置信阈值下,模型都能保持一致的高性能。这种高性能的检测模型对于实际应用来说至关重要,特别是在需要精确识别和准确分类大量商品的零售业务场景中。
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.911 | 0.874 | 0.885 | 0.882 |
F1-Score | 0.77 | 0.82 | 0.84 | 0.85 |
(3)实验结果分析:
在本次商品检测任务的实验中,我们对YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个模型的性能进行了细致的比较和分析。实验结果从两个关键性能指标——平均精度均值(mAP)和F1-Score——出发,为我们提供了关于模型性能的直观认识。
首先,从mAP指标来看,YOLOv5nu以0.911的分数领先其他版本,表明其在我们的商品检测任务中能够以较高的置信度准确检测出不同的商品。mAP是反映模型检测准确性的重要指标,YOLOv5nu的表现优异可能得益于其网络结构和训练过程中的优化策略,这使得它能够更好地学习和区分商品图像中的特征。
在F1-Score的比较中,YOLOv8n以0.85的分数位居第一,显示了它在精确率和召回率之间取得了最佳平衡。F1-Score是精确率和召回率的调和平均数,当一个模型在避免漏检和误检之间取得较好平衡时,其F1-Score较高。YOLOv8n可能在训练过程中更有效地避免了过拟合,或者其使用的数据增强技术更适合处理我们数据集中的多样性。
尽管YOLOv6n在mAP上的表现略逊于YOLOv5nu和YOLOv7-tiny,但其F1-Score表现出色,达到了0.82。这可能是因为YOLOv6n的设计更侧重于提高模型在识别正样本时的准确性,尤其是在不平衡数据集中。YOLOv7-tiny虽然在mAP和F1-Score上的表现都不错,但其较小的模型尺寸和计算效率更适合需要快速检测的场景。
不同版本的YOLO在设计和实现时有着不同的侧重点,YOLOv5nu可能在网络架构上做了优化以适应我们的数据集,而YOLOv8n可能在处理数据时采用了更高效的策略。每个版本的性能表现还受到了训练数据集、超参数设置、训练时长等多种因素的影响。在实际应用中,我们需要根据任务的具体需求、资源限制以及性能要求来决定使用哪个版本的YOLO模型。而对于模型开发者而言,这些结果提示了在模型设计和训练策略上可能需要进一步的优化与调整。
6. 系统设计与实现
6.1 系统架构概览
在这篇博客中,我们将深入剖析基于YOLO系列算法的商品检测系统的系统架构设计。我们的设计理念是构建一个易于操作、高效准确且具有良好用户体验的系统,该系统能夜快速识别并记录各类商品信息。以下是我们系统架构的主要组成部分:
-
模型加载与预处理:系统的架构核心是YOLOv8v5Detector类。该类利用预先训练的YOLO模型参数(通常是
.pt
文件),来初始化并执行商品识别任务。YOLOv8v5Detector内部封装了图像处理与推理预测的全过程,其中**load_model
**方法负责加载模型权重,确保模型能够被正确地应用于后续的检测任务。 -
配置管理:用户界面的交互由Detection_UI类负责管理,它集成了整个系统的用户交互逻辑。通过侧边栏配置,用户可以自主设定模型参数(包括**
model_type
、conf_threshold
和iou_threshold
),以调整检测的准确度和灵敏度。用户还可以上传自己的模型文件,系统会通过load_model_file
**方法加载并使用这些自定义模型进行检测。 -
图像和视频处理:针对不同的输入源——摄像头、图片文件或视频文件,
Detection_UI
类中的process_camera_or_file
方法负责处理这些输入。这包括从摄像头捕获实时图像、读取并解码上传的文件,以及调用模型进行手势识别。 -
结果展示与日志记录:检测结果的记录和展示通过ResultLogger和LogTable类来实现。ResultLogger类用于实时更新和展示检测结果,而LogTable类则为结果提供了持久化存储的能力,允许用户保存和回顾历史检测数据。
-
UI设计:在整个系统设计中,我们还贯彻了颜色的随机分配策略来提高检测结果的辨识度。系统为每个检测到的类别动态分配了颜色,这一过程是通过Detection_UI类中的**
colors
**属性进行管理的 -
实时更新和反馈:系统设计了进度条和动态更新机制,通过
st.progress
和st.image
等Streamlit组件,实时反馈模型处理进度和结果,提高了用户的交互体验。
6.2 系统流程
在我们的基于YOLOv8/v7/v6/v5的商品检测系统中,整个检测流程体现了精细的设计思路和对用户体验的深刻理解。下面,我们将以程序流程图的形式,详细介绍这一系统流程的各个步骤。
-
系统初始化:
- 加载模型:系统启动时,
YOLOv8v5Detector
类的实例化过程中调用load_model
方法,加载训练好的YOLO模型权重。 - 随机颜色生成:为了区分不同的商品类别,系统为每个类别分配了随机颜色,存储在
colors
数组中。
- 加载模型:系统启动时,
-
界面设置:
- 页面配置:通过
setup_page
方法配置页面布局和标题。 - 侧边栏配置:使用
setup_sidebar
方法在侧边栏中提供模型设置、置信度和IOU阈值的调整滑动条。
- 页面配置:通过
-
用户交互:
- 文件上传:用户可以上传自定义的图片或视频文件,或者选择实时摄像头捕获的画面。
- 模型选择:用户可以选择使用默认模型或上传自定义模型文件。
-
检测执行:
- 处理输入源:依据用户的选择,
process_camera_or_file
方法决定是处理来自摄像头的实时画面还是上传的文件。 - 图像预处理:调整图像大小以符合模型的输入要求,并执行其他必要的图像处理步骤。
- 模型预测:输入预处理后的图像到YOLO模型,获取检测结果。
- 处理输入源:依据用户的选择,
-
结果展示与记录:
- 检测结果展示:
frame_process
方法展示每一帧的检测结果,包括绘制边界框和显示标签。 - 结果记录:
ResultLogger
类记录检测结果,并使用LogTable
类将结果保存到CSV文件。
- 检测结果展示:
-
用户反馈:
- 结果筛选与显示:用户可以在侧边栏中使用下拉菜单筛选特定目标,系统将通过
toggle_comboBox
方法显示选中目标的详细信息。 - 动态结果更新:系统实时更新检测结果,并在界面中呈现。
- 结果筛选与显示:用户可以在侧边栏中使用下拉菜单筛选特定目标,系统将通过
-
系统结束:
- 停止检测:用户可以随时通过“停止”按钮结束检测流程。
- 日志保存:
LogTable
类在系统结束时保存所有的检测日志,并提供导出功能。
此检测流程的设计充分考虑了用户操作的便利性、系统的实时响应和结果的准确记录。无论是在技术深度还是操作易用性上,我们都力求为用户提供一个满意的使用体验。通过这样的流程设计,不仅能够快速定位和识别各类商品,还能为用户留下详尽的检测记录,助力用户在后续进行数据分析和管理决策。
代码下载链接
如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:
资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷
演示及项目介绍视频:https://www.bilibili.com/video/BV1RJ4m1L7MR/
完整安装运行教程:
这个项目的运行需要用到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的深度学习模型在商品检测领域的应用,成功开发了一个集成了这些前沿算法的商品检测系统。通过精确的算法对比与优化,我们不仅显著提高了商品检测的准确性和实时性,而且利用Streamlit构建了一个直观、美观且用户友好的Web应用,极大地简化了用户的商品检测流程,以适应实际应用场景的需求。
通过严格的实验验证,本研究提出的方法在商品检测的准确率和处理速度方面均表现出色。此外,文章详尽地提供了完备的数据集处理流程、模型训练与预测的代码,以及基于Streamlit的系统设计与实施细节,为其他研究人员和开发者提供了极大的便利,便于复现和进一步研究。
尽管在商品检测领域已取得显著成果,但考虑到任务的复杂性,我们仍面临一些挑战和改进空间。未来工作的方向包括:
- 模型优化:我们将继续深入挖掘网络架构和优化策略,例如运用神经网络架构搜索(NAS)技术,以进一步提升模型的性能和计算效率。
- 多模态融合:考虑引入语音、文本等其他模态的信息,运用多模态学习的方法进行商品检测,实现对场景的全方位理解。
- 跨域适应性:为了提升模型在不同人群和环境下的适应性,我们计划研究跨文化、跨年龄组的商品检测技术,并采用领域自适应技术增强模型的泛化能力。
- 用户交互体验:我们旨在进一步改善系统的用户界面和交互设计,使之更加符合人性化和智能化的趋势,满足更广泛用户的需求。
- 实际应用拓展:我们也计划将商品检测技术推广至更多实际应用场景,如在线教育、远程会议、智能客服等,发掘其在社会和经济领域的广泛价值。
商品检测作为一个充满活力的研究领域,随着技术的不断革新和应用领域的持续扩展,未来基于深度学习的商品检测系统无疑将在人机交互、社会安全、医疗健康等更多领域扮演关键角色,为社会发展带来更深远的影响。
Yusof, Najiha‘Izzaty Mohd, et al. “Assessing the performance of YOLOv5, YOLOv6, and YOLOv7 in road defect detection and classification: a comparative study.” Bulletin of Electrical Engineering and Informatics 13.1 (2024): 350-360. ↩︎
Zhao, Dewei, et al. “A Small Object Detection Method for Drone-Captured Images Based on Improved YOLOv7.” Remote Sensing 16.6 (2024): 1002. ↩︎
Bietti, Alberto, et al. “Birth of a transformer: A memory viewpoint.” Advances in Neural Information Processing Systems 36 (2024). ↩︎
Qin, Han, et al. “An Improved Faster R-CNN Method for Landslide Detection in Remote Sensing Images.” Journal of Geovisualization and Spatial Analysis 8.1 (2024): 2. ↩︎
Eijnden, J., et al. “The first mm detection of a neutron star high-mass X-ray binary.” arXiv preprint arXiv:2308.06021 (2023). ↩︎