基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要:在零售行业的技术进步中,开发商品识别系统扮演着关键角色。本博文详细阐述了如何利用深度学习技术搭建一个高效的商品识别系统,并分享了一套完整的代码实现。系统采用了性能强劲的YOLOv8算法,同时对YOLOv7YOLOv6YOLOv5等早期版本进行了性能比较,着重分析了它们在mAPF1 Score等关键性能指标上的表现。文章深度剖析了YOLOv8算法的核心原理,并提供了相应的Python实现代码训练所需数据集,还集成了一个基于PySide6的用户友好界面。

该系统能够准确地识别各种商品,支持通过图像图片文件夹视频文件以及摄像头捕获进行检测。它还提供了柱状图分析识别框类别显示类型统计等多种功能,并允许用户调整置信度(Conf)交并比(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)系列算法的不断发展和优化,为商品识别系统的研究和实践提供了强大的技术支持。从YOLOv5到最新的YOLOv8,每一次迭代都在检测速度、准确率以及模型的鲁棒性上取得了显著的进步。这些技术的进步不仅提高了商品识别的效率和准确性,也使得系统能够更好地适应不同的应用场景和需求,为零售业的智能化转型提供了坚实的技术基础。

        YOLOv52由于其轻量化设计和高效性能,在商品识别任务中得到了广泛应用。YOLOv5的模型结构优化,特别是在小物体检测上的改进,使其在零售环境中表现出色。随后,YOLOv63引入了一系列创新,包括使用更高效的backbone和改进的注意力机制,进一步提升了模型的识别能力和速度,特别适用于处理大规模的零售商品数据库。YOLOv74则专注于提高模型的泛化能力和在多种场景下的稳定性,通过引入新的数据增强技术和自适应学习率调整策略,显著提高了模型在复杂零售环境中的表现。YOLOv85的推出,标志着商品识别技术的一个新的高度。它不仅在算法层面进行了优化,还在模型压缩和硬件适配方面做出了创新,使得YOLOv8能够在资源受限的设备上运行,极大地扩展了其在实际应用中的适用性。

        在数据集方面,传统的商品识别研究往往依赖于较为有限的数据集,如COCO和ImageNet,这些数据集虽然广泛应用于计算机视觉的多个领域,但在商品识别特定场景下可能不足以覆盖所有的商品类别和环境。近年来,随着零售行业对商品识别技术需求的增加,出现了更多专注于零售商品的数据集,如Open Images Dataset、Grozi-120和SKU-110K等,这些数据集提供了更多样化和具有挑战性的零售商品图片,为商品识别算法的训练和测试提供了更为丰富的资源。

        尽管商品识别技术已取得了显著进步,但仍面临一些挑战,包括但不限于商品外观多样性、识别环境复杂性以及实时性能要求等。商品的包装、大小、形状和颜色可能千差万别,且在不同的光照、背景和摆放位置下,识别难度会大幅增加。此外,为了满足实际应用中的实时性要求,如何在保证高识别准确率的同时提高算法的处理速度,也是当前研究中的一个重要挑战。

        随着计算机视觉和机器学习技术的不断进步,商品识别系统预计将向着更高的准确性、更快的处理速度以及更强的泛化能力方向发展。深度学习模型的优化、新型神经网络结构的探索,以及算法的硬件加速都是未来可能的发展方向。同时,随着零售行业数字化转型的加速,商品识别技术在智能零售、无人商店和在线购物等新兴应用场景中的作用将越来越重要,这也为商品识别技术的研究和应用提供了广阔的发展空间。

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

  1. 采用最新的YOLOv8算法进行商品识别:我们采用了业界领先的YOLOv8算法作为商品识别系统的核心,相较于之前的版本如YOLOv7、YOLOv6、YOLOv5等,YOLOv8在效率和准确性上都有显著提升。本文不仅详细阐述了YOLOv8算法的原理和优势,还通过实验对比展示了其与早期版本在商品识别任务上的性能差异。这一部分的深入探讨不仅为研究者提供了宝贵的实验数据和分析,也为从业者在选择适合的商品识别技术时提供了参考。
  2. 开发友好的用户界面:我们利用PySide6库成功设计并实现了一个美观且用户友好的商品识别系统界面。该界面不仅易于操作,还大大增强了用户体验,有助于推动YOLOv8算法及商品识别技术的广泛应用。
  3. 设计登录管理功能:系统中加入的登录管理功能,进一步提升了使用的安全性和可管理性,为将来添加更多个性化功能或进行用户数据分析留出了空间。
  4. 对YOLOv8算法进行深入研究:通过对YOLOv8模型的深入研究,本博客不仅关注于算法的应用,更进一步地评估了模型在各种环境和条件下的表现,如精准度、召回率等关键性能指标的分析。
  5. 提供完整的数据集和代码资源包:为了帮助读者更好地理解和应用YOLOv8及其前几代算法在商品识别系统中的实践,本文提供了详细的数据集和完整的代码资源包。这些资源不仅允许读者直接复现实验结果,还为进一步的研究和开发奠定了基础。

1. 数据集介绍

        在商品识别系统的开发过程中,构建一个高质量的数据集是实现高效检测模型的基石。本研究采用了一套包含8834张图片的数据集,旨在通过实际零售环境中的商品图像,精确训练出能够准确识别各类商品的深度学习模型。数据集被细致地划分为7690张训练图像、1004张测试图像以及140张验证图像,以保障模型在不同阶段的评估与优化可以有针对性地进行。

在这里插入图片描述

        每张图像经历了彻底的预处理,以保证数据输入的一致性和质量。通过自动定向处理和EXIF信息的清除,每张图片被标准化至统一的方向,避免因为图片朝向不同而产生的识别误差。接着,为了适应神经网络的输入需求,所有图片都被调整至640x640像素的分辨率,尽管这一过程可能引入了一定的形状失真,但也为模型提供了一定的形状变化容忍性,从而增强其在实际应用中的鲁棒性。

        进一步地,我们对数据集的标注进行了深入分析。从所提供的分布图中可见,数据集包含50个不同的类别,各类别间的实例数量分布呈现多样化特征。有些类别的实例数量众多,而有些则相对较少,这种不平衡性是在实际商业环境中经常会遇到的情况,因此模型必须能够处理类别不平衡的数据。此外,标注的边界框集中度图表明,大部分商品在图像中的位置趋于集中,这可能是由于商品在商店的货架上排列有序造成的。同时,商品的高度和宽度的分布情况显示了商品在尺寸上的多样性,这对模型的尺度不变性提出了要求。

在这里插入图片描述

        通过对数据集的这种详尽分析,我们确保了模型能够在不同情况下保持高性能。在接下来的实验中,这些分析结果将被用于指导模型训练的过程,如通过过采样或权重调整来处理类别不平衡问题,以及通过数据增强来提高模型对不同商品尺寸的适应性。博主使用的类别代码如下:

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"}

        总的来说,这个经过精心准备和详细标注的数据集,不仅为开发高效商品识别模型提供了良好的基础,也为后续的研究提供了丰富的实验资源。通过细致的预处理步骤和深入的数据分析,我们为商品识别技术的发展做出了坚实的贡献,并期待在实际应用中取得显著的性能表现。

2. 系统界面效果

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

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述


3. YOLOv8算法原理

        YOLOv8模型作为目前最新一代的目标检测模型,继承了YOLO系列的核心设计理念,同时引入了创新的架构和技术以提高性能和效率。YOLO(You Only Look Once)系列自从推出以来,就以其高速的检测速度和良好的实时性能赢得了广泛的认可。

        YOLOv8作为当今最先进的目标检测算法之一,在设计和实现上都显示出了显著的创新。其核心在于如何快速且准确地对输入图像中的物体进行检测,其架构可分为三个主要组成部分:Backbone、Neck和Head。

在这里插入图片描述

        在Backbone部分,YOLOv8继承并改进了前代YOLO系列算法中的Darknet架构。它使用了CSPDarknet53作为基础网络架构,通过引入CSPNet(Cross Stage Partial Networks)的设计,即在传统的Darknet53结构中,将每个卷积层的特征分为两部分,一部分直接穿过网络,另一部分则进入后续的层进行处理。这种设计可以有效地减少计算量,同时保持或提高网络的性能。而YOLOv8在此基础上做出了进一步的优化,提高了特征提取的效率和精度。

        Neck部分负责提取不同尺度的特征,并进行特征融合。YOLOv8沿用并改进了YOLOv5引入的PAN(Path Aggregation Network)结构,该结构与FPN(Feature Pyramid Networks)相结合,旨在聚合不同层级的特征,以提高检测的精度。YOLOv8通过SPPF(Spatial Pyramid Pooling Fusion)增强了对不同尺度特征的聚合能力,通过多尺度特征的融合,大大提高了模型对于不同尺寸物体的检测能力。

        在Head部分,YOLOv8进行了显著的改进,尤其是在Anchor设计方面。不同于YOLOv5的Anchor-based设计,YOLOv8采用了Anchor-free的设计理念,摒弃了传统的固定大小的Anchor,减少了模型在训练过程中对于Anchor大小调整的依赖。这一设计的优点在于简化了模型,并减少了预设的复杂性。此外,YOLOv8引入了新的损失函数,即DFL(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/1.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 模型训练

        在本博客中,我们将深入探索使用YOLOv8构建高效的商品识别系统。本节将分步介绍如何通过代码来实现这一目标,讲解每一段代码的功能与它在整个训练过程中的作用。

        首先,为了处理数据和模型,我们引入必要的库。os和yaml用于操作文件系统和处理配置文件,而YOLO类从ultralytics库中引入,作为构建和训练模型的基础。

import os
import yaml
from ultralytics import YOLO  # 导入YOLO模型
from QtFusion.path import abs_path

        接着,我们定义了数据集的名称,并通过自定义的abs_path函数计算出了数据集配置文件的绝对路径。为了确保路径的一致性和跨平台兼容性,我们将路径转换为UNIX风格。

workers = 1
batch = 8

data_name = "ProductSorting"
data_path = abs_path('datasets/ProductSorting/product.yaml', path_type='current')  # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')

# 获取目录路径
directory_path = os.path.dirname(unix_style_path)')

        为了使用这些配置信息,我们打开并读取YAML文件,它包含了训练所需的数据集配置,如类别标签和图像路径。代码确保了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方法,我们传递了一系列参数来指导训练过程,如数据配置文件的路径、计算资源设备、工作进程数、输入图像的大小、训练周期(epochs)和批次大小。

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=100,  # 指定训练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=100,  # 指定训练100个epoch
    batch=batch,  # 指定每个批次的大小为8
    name='train_v8_' + data_name  # 指定训练任务的名称
)

        在深度学习模型的训练过程中,损失函数的变化趋势是评估模型性能的重要指标之一。从提供的图像中,我们可以对YOLOv8模型在商品识别任务上的训练过程进行详细的分析。

        首先观察到的是,训练过程中的边界框损失(train/box_loss)、分类损失(train/cls_loss)和置信度损失(train/df1_loss)随着训练周期的增加而稳定下降。这说明模型在对目标的位置、所属类别以及存在的置信度进行预测时越来越准确。损失函数的下降趋势表明模型正在学习到有效的特征,并在逐步优化参数。

        在验证集上的损失(val/box_loss、val/cls_loss、val/df1_loss)显示了更多的波动,这是模型在遇到未见过的数据时表现的不确定性。尽管如此,损失的整体趋势依然是下降的,表明模型具有一定的泛化能力。特别是验证集的分类损失稍高,这可能是由于类别不平衡或某些类别相比其他类别更难学习造成的。

在这里插入图片描述

        在性能指标方面,精度(precision)和召回率(recall)保持在较高水平,显示了模型在识别商品方面的可靠性。在目标检测中,精度是指模型正确识别目标的能力,而召回率是指模型识别出所有正类样本的能力。这两个指标的高值表明,模型不仅能够正确识别大多数正类样本,而且误识别为负类样本的情况很少。mAP(mean Average Precision)指标,特别是mAP@0.5和mAP@0.5-0.95,稳定在较高水平,进一步证明了模型对于不同置信度阈值下的鲁棒性。

        F1分数是衡量模型精确度和召回率的综合指标,它在机器学习领域被广泛用于评价分类模型的表现。F1分数的最大值为1,表示完美的精确度和召回率,而最小值为0,则表示模型性能极差。

在这里插入图片描述

        从曲线图中可以看到,大部分类别的F1分数随着置信度阈值的增加而先增后减,而在某个置信度点达到最高峰值。这种现象指出,模型对于大多数类别的商品具有较高的识别能力,但同时也揭示出选择最优置信度阈值的重要性。如果阈值过低,虽然模型能识别出更多的正样本(即召回率高),但也会导致较多误报(即精确度低)。相反,如果阈值过高,则会错过一些正样本(即召回率低),即使精确度较高。

        曲线中标注的“all classes 0.85 at 0.563”指出,在0.563的置信度阈值时,所有类别的平均F1分数达到了0.85,这是一个非常高的分数,表明模型整体上能够达到优秀的平衡点,即在精确度和召回率之间取得了良好的折中。

         然而,我们也注意到一些曲线的波动比较大,这可能表明模型在某些类别上的性能不够稳定。这种不稳定性可能源于样本数量不足、类内变异性大或者这些类别在数据集中的表现差异性。此外,某些商品类别的F1分数曲线在高置信度区间下急剧下降,这可能是由于这些类别的样本在训练集中较为稀缺或者模型对这些类别的特征学习不够充分。

         综上所述,通过F1分数的深入分析,我们可以对模型的性能有一个全面的了解。这样的分析对于进一步优化模型参数,提升模型在具体类别上的识别能力至关重要。

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.9110.8740.8850.882
F1-Score0.770.820.840.85

(3)实验结果分析

        在深度学习领域,持续的算法迭代和更新是提升模型性能的关键途径。我们通过在相同的数据集上实施一系列实验,旨在比较和评估不同版本的YOLO模型——包括YOLOv5nu、YOLOv6n、YOLOv7-tiny以及YOLOv8n——在商品识别任务上的性能。实验的设计和目的是为了明确各版本模型在准确性和检测效率上的差异,以便为实际应用提供更具指导性的见解。

        首先,我们来看mAP,这是衡量目标检测模型准确性的重要指标,它考虑了检测准确度与召回率。在我们的实验中,YOLOv5nu以0.911的mAP分数领先,显示出它在识别商品上具有非常高的准确性。然而,这并不意味着YOLOv5nu在所有方面都是最优的。YOLOv6n的mAP略低,为0.874,这表明它在准确性方面略逊一筹。YOLOv7-tiny和YOLOv8n的mAP分数分别为0.885和0.882,这两者非常接近,但都没有超过YOLOv5nu。

在这里插入图片描述

        然后,我们观察F1-Score,它是精确度和召回率的调和平均,是衡量模型整体性能的指标。在F1-Score上,我们看到了不同的排名情况。YOLOv8n以0.85的得分位居首位,其次是YOLOv7-tiny的0.84和YOLOv6n的0.82,而YOLOv5nu的得分最低,为0.77。YOLOv8n在这个指标上的领先表明,尽管在mAP上略低于YOLOv5nu,它却能在召回率上取得更好的表现,也就是说,在没有增加过多误检的情况下,YOLOv8n能识别出更多的正类样本。

        通过对比这些数据,我们可以得出几个结论。首先,YOLOv5nu在准确性上表现最好,但它在F1-Score上的表现却是最差的,这可能是因为YOLOv5nu在某些类别上有较多的误检,从而影响了其F1-Score。其次,虽然YOLOv6n和YOLOv7-tiny在mAP上有所差距,但它们在F1-Score上的表现却相对较好,这意味着它们在召回率上做得比较好。最后,YOLOv8n虽然在mAP上不是最优的,但它在F1-Score上的最高得分说明了它在平衡精确度和召回率方面的优势。

       总的来说,没有哪一个模型在所有指标上都是最优的。每种版本的YOLO算法都有其独特的优点和不足。因此,在选择算法时,我们应根据实际的应用场景和需求来决定。例如,如果我们更重视准确性以避免误检,那么YOLOv5nu可能是更好的选择;而如果我们需要尽可能地识别出所有可能的商品,即使可能包含一些误检,那么YOLOv8n可能是更适合的。

4.4 代码实现

        在本篇博客中,我们致力于将复杂的深度学习模型应用于实际的零售环境中,以便于用户能够轻松、高效地识别商品。这一系统不仅嵌入了最新的YOLOv8模型,还集成了用户友好的图形界面,使得商品识别变得直观且便捷。

(1)引入必要的库
        首先,我们导入必要的Python模块,这是为了确保系统具备处理视频流、图像处理、用户界面交互以及文件路径管理等多方面的能力。引入sys和time模块允许我们与Python运行时环境交互,并进行时间相关的操作,而cv2库提供了丰富的图像处理功能。QtFusion和PySide6则是构建我们图形界面的基础。

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类是我们系统用户交互界面的核心,它继承自Qt的QMainWindow类。在这个类中,我们初始化了GUI窗口,并设置了相应的界面元素,例如用于显示图像的标签。我们还定义了键盘事件处理,以便用户可以通过按键操作来控制程序,比如按下’Q’键以退出应用程序。

class MainWindow(QMainWindow):  # 定义MainWindow类,继承自FBaseWindow类
    def __init__(self):  # 定义构造函数
        super().__init__()  # 调用父类的构造函数
        self.resize(640, 640)  # 设置窗口的大小为850x500
        self.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)图像帧处理
        为了处理视频中的每一帧图像并应用YOLOv8模型进行商品检测,我们定义了frame_process函数。该函数首先对图像进行大小调整,以适应模型输入的要求。接着,使用模型对图像进行预测,并计算处理时间,最终将检测结果绘制在图像上展示。通过绘制不同的颜色边界框和标签,我们可以在图像上清晰地标示出不同类别的商品。

def frame_process(image):  # 定义帧处理函数,用于处理每一帧图像
    image = cv2.resize(image, (850, 500))  # 将图像的大小调整为850x500
    pre_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']  # 获取类别名称、边界框、置信度和类别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对象并加载预训练权重来完成的。此外,定义了一个类别名称列表,这有助于在后续处理中正确标注各个检测到的商品。整个应用程序是通过QApplication实例来运行的,我们创建了MainWindow的一个实例来作为应用程序的主窗口。使用MediaHandler对象来处理视频流,当新的图像帧准备好时,通过信号连接机制调用frame_process函数进行处理,从而实现了实时视频流的商品检测。

cls_name = ["经典奶油", "藏红花杏仁", "杏仁布丁", "开心果杏仁", "皇家巧克力", "芒果洗面奶", "金色面膜50G",
            "金色面膜90G", "核桃磨砂200G", "檀香粉25G", "核桃杏仁磨砂100G", "核桃杏仁磨砂50G", "橙子面膜90G",
            "印楝洗面奶", "黄瓜面膜", "巧克力樱桃面膜", "印楝木瓜面膜", "可可乳液", "植物乳液", "柑橘乳液",
            "防晒浆果乳液", "柠檬水", "常规", "常规2KG", "浓橙", "泡菜蛋黄酱", "泡菜蛋黄酱小", "芝士蒜蛋黄酱",
            "芝士蒜蛋黄酱小", "巧克力涂酱", "纯酥油", "炭烤蛋黄酱", "炭烤蛋黄酱小", "素蛋黄酱", "痱子粉",
            "无糖金500粒", "无糖金粉100G", "无糖金小包", "无糖金小包50", "无糖绿300粒", "无糖自然500粒",
            "无糖自然瘦糖80G", "无糖自然瘦糖", "无糖自然小包", "无糖自然甜滴", "无糖自然瘦糖80G",
            "无糖自然粉100G", "无糖绿粉100G", "糖精袋500G"]  # 定义类名列表

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/20-商品识别.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类,它是整个应用的核心,将用户界面(UI)、媒体处理和目标检测模型紧密集成。在设计过程中,我们确保了各个功能模块能够独立运行,并且相互协作,提供一个无缝的用户体验。

在这里插入图片描述

架构设计
        我们构建的架构体现了模块化设计,其中包括处理层、界面层和控制层,每层都有其独立的职责。

  • 处理层(Processing Layer):处理层承担了系统的数据处理和分析工作。通过集成了YOLOv8Detector,一个强大的预训练模型,我们能够对输入的图像进行快速且精准的物体检测,这是整个商品识别系统的核心。
  • 界面层(UI Layer):界面层作为用户与系统互动的直接接口,我们使用Qt框架构建了一套直观的用户界面。这个界面包含了丰富的交互元素,允许用户方便地加载视频流,并实时查看模型的识别结果。界面的设计考虑到了用户体验,确保操作的简洁性和直观性,降低了用户的学习成本。
  • 控制层(Control Layer):控制层则是沟通处理层和界面层的桥梁。它通过MainWindow类实现的槽函数和控制方法,响应用户的指令,控制数据流向和处理逻辑。此外,我们利用了Qt强大的信号和槽机制,实现了异步处理和模块间的紧密协作,这样确保了系统的高响应性和良好的用户体验。

在这里插入图片描述

        整个设计旨在实现一个模块化的系统,各个组件可以独立工作,同时又能无缝协作。这种设计不仅使得系统的扩展性和维护性大大提升,也为用户提供了一个功能全面、操作便捷的商品识别工具。

系统流程
        本篇文章专注于介绍一个交互式商品识别系统的流程设计。该系统通过集成最先进的目标检测算法YOLOv8,为用户提供了一个高效且直观的工具,以增强对工作场所安全的监控。

在这里插入图片描述

  1. 整个设计旨在实现一个模块化的系统,各个组件可以独立工作,同时又能无缝协作。这种设计不仅使得系统的扩展性和维护性大大提升,也为用户提供了一个功能全面、操作便捷的商品识别工具。
  2. 应用程序的界面设计直观而清晰,它允许用户轻松选择他们希望分析的媒体类型——无论是摄像头捕获的实时图像,还是预录制的视频文件,甚至是静态图片。这种设计使得系统能够灵活应对各种应用场景,无论是零售店内的实时监控还是离线的商品库存分析。
  3. 选择了输入源后,系统将调用一个专门的媒体处理器来读取和配置数据流。对于摄像头,这可能包括调整分辨率和帧率;对于视频文件,则涉及解码和缓冲技术;而对于静态图片,则需要确保正确的格式和大小。这一处理过程是自动的,确保了用户在这一阶段的操作尽可能简单。
  4. 一旦媒体输入源准备好,系统就会进入一个连续的帧处理循环。在预处理阶段,每帧图像都会被调整和转换以满足YOLOv8模型的输入要求。随后,这些图像被送入我们精心训练的YOLOv8模型中,模型将利用其深度学习能力进行快速而准确的商品检测和识别。
  5. 检测和识别结果产生后,界面会实时更新以反映最新的信息。检测框、商品类别标注以及相关的统计数据都会即时展现在用户面前,使得用户可以直观地理解当前场景下商品的分布和状态。此外,用户还可以通过界面的按钮来保存结果、获取帮助信息,或使用下拉菜单来筛选和深入分析特定类别的商品。
  6. 最后,系统提供了丰富的媒体控制选项。用户可以根据需要,随时开始或暂停视频分析,或是控制摄像头的捕获状态。这一环节的设计充分考虑了实际操作中的灵活性需求,让用户能够根据实时场景变化做出响应。

        整体而言,商品识别系统通过其人性化的设计、强大的功能以及优秀的用户界面,为零售商、仓库管理员或任何需要商品识别服务的用户提供了一套完整的解决方案。这一系统不仅能够显著提升商品管理的效率和准确性,也极大地简化了用户的操作流程。

5.2 登录与账户管理

        在当今的信息时代,安全性和个性化成为了软件系统设计中不可或缺的部分。本系统不仅重视商品识别的核心功能,更在用户体验上下足了功夫,通过实现登录与账户管理,为用户提供了一个既安全又个性化的操作平台。

在这里插入图片描述

        我们的系统通过整合了PySide6框架的高效GUI编程和SQLite的轻量级数据库技术,打造了一个用户登录界面,确保每位用户都能拥有一个专属的操作环境。在用户登录界面,我们提供了账户注册功能,允许新用户创建自己的账号;密码修改功能,保证用户可以在必要时更新自己的登录凭证;头像设置,让用户的个性化需求得到满足;以及账户注销功能,确保用户在不需要使用系统时,能够安全地退出。

        当用户通过这一界面登录后,便可以进入到我们功能强大的商品识别主界面。在这里,用户的操作不仅限于商品识别,更包括对识别结果的保存和管理。无论是图片、视频文件、实时捕捉的摄像头图像还是批量文件,系统都能提供稳定而精准的识别服务,并实时显示包括检测框、类别及置信度在内的详细信息。

在这里插入图片描述

        此外,系统的个性化设置也不仅限于登录界面。在主界面中,用户的个性化需求得到了进一步的体现——不仅可以实时监控识别过程,还能对识别结果进行详尽的分析和筛选。用户还可以根据自己的需要对系统设置进行调整,使系统更加符合个人的操作习惯。

        通过这样的系统设计,我们的商品识别系统既展现了技术上的先进性,又在实用性和人性化设计上达到了新的高度。用户在享受智能识别带来的便捷的同时,也能感受到系统对于个人隐私和个性化需求的尊重。

下载链接

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

在这里插入图片描述

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

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

在这里插入图片描述

    在文件夹下的资源显示如下,下面的链接中也给出了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. 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. ↩︎

  2. 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. ↩︎

  3. 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. ↩︎

  4. 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. ↩︎

  5. 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. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/453340.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

web项目抢购模块测试

web项目抢购模块测试 抢购模块(先测后台,再测前台)流程抢购用例编写测试点--后台抢购用例编写测试点--前台用例设计 面试题1: 当你发现研发实现的结果与需求不一致时怎么办? 需求评审的时候:需要确认所有输入类型的校验是针对单独的输入框做的还是在最终提交时校验 抢购模块 需…

深入挖掘C语言之——联合

目录 联合的定义 联合的特点 联合的应用场景 在C语言中,联合(Union)是一种特殊的数据结构,它允许在同一内存地址存储不同类型的数据。与结构体(Struct)不同的是,联合中的所有成员共享同一块内…

算法(结合算法图解)

算法简介简单查找二分查找法 选择排序内存的工作原理数组和链表数组选择排序小结 递归小梗 要想学会递归,首先要学会递归。 递归的基线条件和递归条件递归和栈小结 快速排序分而治之快速排序合并排序时间复杂度的平均情况和最糟情况小结 散列表散列函数缓冲小结性能…

科研三维模型高精度三维扫描服务3d逆向测绘建模工业产品抄数设计

三维抄数技术在科研三维模型的应用已经日益广泛,其高精度、高效率的特点使得科研工作者能够更快速、更准确地获取和分析数据。这一技术的核心在于通过专业的三维扫描仪对实物进行高精度测量,再将这些数据转化为三维数字模型,为后续的研究提供…

深入浅出计算机网络 day.2 概论⑤ 计算机网络的性能指标

请等一等, 用一个完整的春天 捣碎麦田 —— 24.3.10 一、计算机网络的性能指标 上 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 常用的八个计算机网络性能指标 速率 比特(bit)是计算机中数据量的基本单位,一个比特…

智能商品管理系统:驱动零售盈利型的数据利器

在数字化浪潮席卷全球的今天,零售业正面临着前所未有的变革。智能商品管理系统作为零售业的“数据利器”,正在以其强大的数据分析能力和智能化的管理手段,助力零售企业实现盈利增长和业务创新。 智能商品管理系统通过集成大数据、云计算、人…

MySQL教程-安装与卸载

MySQL官网 https://www.mysql.com MySQL 官方提供了两种不同的版本: 社区版 MySQL Community Server,免费,但不提供任何技术支持商业版 MySQL Enterprise Server,收费,官方可提供技术支持 本教程采用MySQL的社区版作…

零基础如何入门ai编程?小白必看!

当我们谈到人工智能编程时,很多人可能会感到有些困惑和无措。但是,其实只要有一定的学习兴趣和基础知识,任何人都可以开始学习AI编程。本文将为零基础的读者介绍如何入门AI编程,并提供详细的步骤。 ▶ 第一步:理解人工…

深入理解 Vuex:从基础到应用场景

前言 在之前的文章中,我们已经对 Vue.js 有了一定的了解。今天我们要对Vue官方的状态共享管理器Vuex进行详细讲解,将其基本吃透,目标是面对大多数业务需求; 一、介绍 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用…

【Power Apps】响应式布局与布局容器

做响应式布局之前要先把这里关掉呦。 这里我可能要先简单说一下什么是响应式布局,说白了就是咱们做出来的应用的界面可以根据当前窗口的大小来自适应地调整内部组件的大小、位置等属性,这样我们只需要做一套页面,就可以既在桌面端使用&#x…

linux-MDK can电机带导轨

确保接线正确,这个带导轨的电机需要24V的电压 $ ls /dev //查看端口是什么$ sudo slcand -o -s6 /dev/ttyACM0 can0 //将端口封装为can0 $ sudo ip link set can0 up //打开端口 按照电机说明书,按照需要的指令计算检验和&#xf…

【C语言】tcp_transmit_skb

一、__tcp_transmit_skb讲解 这个函数 __tcp_transmit_skb() 是 Linux 内核中 TCP/IP 协议栈的一部分,负责处理传输控制协议(TCP)数据包的发送。具体来说,这个函数将 TCP 头部添加到一个没有任何头部信息的 socket buffer (sk_bu…

食药物质创新 赋能中式滋补健康产业发展交流会圆满结束

3月5日,“食药物质创新 赋能中式滋补健康产业发展交流会”在山东国际会展中心召开。本次会议由中国生物发酵产业协会主办,浙江科技大学、未名太研生物科技(绍兴)有限公司承办,汇乐达供应链服务(常州)有限责任公司支持。本次论坛旨在加强行业创…

C语言--从零开始的扫雷游戏

C语言--从零开始的扫雷游戏 1. 游戏说明2. 总体代码3. 详细讲解3.1 菜单部分3.2 游戏主体部分3.2.1 总体分析3.2.2 棋盘初始化3.2.3 棋盘展示3.2.4 设置地雷3.2.5 扫雷阶段3.2.6 统计雷个数的代码3.2.7 使用迭代的方式进行展开:3.2.8 扫雷部分主体代码 4. 总结 1. 游…

SpringBoot(源码解析 + 实现底层机制)

文章目录 1.搭建SpringBoot底层机制开发环境1.创建maven项目2.使用Git管理项目(可以略过)1.创建一个github存储库2.克隆到本地,复制文件夹的内容3.粘贴到idea项目文件夹,将其作为本地仓库与远程仓库关联 3.pom.xml 引入父工程和场…

【算法积累】辗转相除法

【算法积累】辗转相除法,python实现两种 辗转相除法(又称欧几里得算法)减法(不常用)代码实现执行结果 辗转相除法代码实现执行结果 辗转相除法(又称欧几里得算法) 又称欧几里得算法&#xff0c…

使用Python将多个pdf指定页整合到一个pdf文件中

在工作的一些场景中,有时需要我们将多个pdf文件中的内容提取出来,比如有10个pdf文件,我们要统一打印pdf文件的第一页或者最后一页… 需求分析 我们需要批量提取PDF文件中的任意一页,可以是第一页也可以是中间某一页,…

【C++算法模板】图的存储-邻接矩阵

文章目录 邻接矩阵洛谷3643 图的存储 邻接矩阵 邻接矩阵相比于上一篇博客邻接表的讲解要简单得多 数据结构,如果将二维数组 g g g 定义为全局变量,那默认初始化应该为 0 0 0 ,如果题目中存在自环,可以做特判, m e …

微信小程序云开发教程——墨刀原型工具入门(常用组件)

引言 作为一个小白,小北要怎么在短时间内快速学会微信小程序原型设计? “时间紧,任务重”,这意味着学习时必须把握微信小程序原型设计中的重点、难点,而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…