基于深度学习的吸烟检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

news2024/11/23 21:20:47

摘要:本文深入研究了基于YOLOv8/v7/v6/v5深度学习模型吸烟行为检测系统,核心采用YOLOv8并整合了YOLOv7YOLOv6YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Streamlit的交互式Web应用界面设计。在Web网页中可以支持图像、视频和实时摄像头进行吸烟行为检测,可上传不同训练模型(YOLOv8/v7/v6/v5)进行推理预测,界面可方便修改。本文附带了完整的网页设计深度学习模型代码训练数据集的下载链接。

文章目录

  • 1. 网页功能与效果
  • 2. 绪论
    • 2.1 研究背景及意义
    • 2.2 国内外研究现状
    • 2.3 要解决的问题及其方案
      • 2.3.1 要解决的问题
      • 2.3.2 解决方案
    • 2.4 博文贡献与组织结构
  • 3. 数据集处理
  • 4. 原理与代码介绍
    • 4.1 YOLOv8算法原理
    • 4.2 模型构建
    • 4.3 训练代码
  • 5. 实验结果与分析
    • 5.1 训练曲线
    • 5.2 混淆矩阵
    • 5.3 YOLOv8/v7/v6/v5对比实验
  • 6. 系统设计与实现
    • 6.1 系统架构设计
    • 6.2 系统流程
  • 代码下载链接
  • 7. 结论与未来工作

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

网页版-基于深度学习的吸烟检测系统(YOLOv8/v7/v6/v5+实现代码+训练数据集)


1. 网页功能与效果

        (1)开启摄像头实时检测:本系统允许用户通过网页直接开启摄像头,实现对实时视频流中吸烟行为的检测。系统将自动识别并分析画面中的吸烟行为,并将检测结果实时显示在用户界面上,为用户提供即时的反馈。

在这里插入图片描述

        (2)选择图片检测:用户可以上传本地的图片文件到系统中进行识别。系统会分析上传的图片,识别出图片中,并在界面上展示带有标签和置信度的检测结果,让用户能够清晰地了解到每个状态。

在这里插入图片描述

        (3)择视频文件检测:系统支持用户上传视频文件进行检测。上传的视频将被系统逐帧分析,以识别和标记视频中每一帧的吸烟行为。用户可以观看带有检测标记的视频,了解视频中人物的变化。

在这里插入图片描述

        (4)择不同训练好的模型文件:系统集成了多个版本的YOLO模型(如YOLOv8/v7/v6/v5),用户可以根据自己的需求选择不同的模型进行识别。这一功能使得用户能够灵活地比较不同模型的表现,以选择最适合当前任务的模型。
在这里插入图片描述

        本系统还集成了一系列高级功能,提高了用户体验和系统的实用性:检测画面和原始画面的显示方式,允许用户选择同时显示检测结果和原始图像,或者单独显示任一种图像,以便于比较和分析;特定目标的单独标记和显示结果,用户可以通过下拉框选择特定的类型进行检测,系统将只显示选定类型的检测结果,使分析更加专注和高效;检测结果的页面表格显示,所有检测到的及其相关信息(如置信度和位置)会在页面上以表格形式展现,便于用户一目了然地查看;动态调整检测算法的阈值,用户可以实时调整置信度阈值和IOU阈值,以获得最佳的检测效果;检测结果导出到CSV文件,为了方便数据分析和记录,用户可以将检测结果以CSV格式导出;最后,导出标记的图像和视频结果功能使用户能将加工后的图像或视频保存为avi格式的文件,方便保存和分享。这些功能的集成使得本系统不仅在吸烟行为检测方面表现出色,同时也提供了丰富的数据处理和展示选项,满足了广泛的应用需求。


2. 绪论

2.1 研究背景及意义

        烟头乱扔问题一直是城市环境管理中的一大难题。不仅破坏了公共场所的卫生和美观,还可能引发火灾等安全事故,给社会带来了严重的负面影响。随着科技的进步,利用计算机视觉技术对烟头进行自动检测和识别,成为解决这一问题的有效途径。特别是近年来,深度学习在图像处理领域的突破性进展,为烟头检测提供了新的解决思路和技术支持。

        在国内外研究现状方面,目标检测算法如YOLO、SSD、Faster R-CNN等已被广泛应用于各种场景的目标检测任务中,取得了令人瞩目的成绩。其中,YOLO系列算法以其高速的检测能力和不错的准确率,尤其适合实时目标检测应用。自YOLOv1推出以来,每一代YOLO算法都在性能上进行了显著的改进,最新的YOLOv8在多个标准数据集上都展示了优越的性能。尽管如此,专门针对烟头这一小尺寸、易于与环境融合的目标进行检测的研究相对较少,且面临不少挑战,如模型的泛化能力、复杂背景下的检测准确率、实时性能等。

        本博客旨在探索基于YOLOv8及其他最新目标检测算法改进的烟头检测系统。我们将重点关注模型的优化、数据集的构建与扩充、检测性能的提升等方面,以解决在不同场景下准确、快速检测烟头的问题。此外,考虑到烟头检测系统的实际应用需求,我们还将探讨模型的轻量化和加速,以便于在边缘设备上部署。

        博客的主要贡献在于:首先,系统地回顾了烟头检测的研究背景及其社会意义,梳理了当前目标检测领域的技术进展,特别是YOLO系列算法的发展历程及其在烟头检测中的应用潜力。其次,通过分析现有研究的不足,明确了本研究需要解决的关键问题,并提出了相应的解决方案,包括算法改进、数据集优化和性能提升等。最后,通过一系列实验验证了所提出解决方案的有效性,并对未来烟头检测技术的发展趋势进行了展望。通过这些贡献,本博客不仅为烟头检测技术的研究和应用提供了有价值的参考,也为其他小目标检测任务的研究提供了借鉴。

2.2 国内外研究现状

        随着深度学习技术的广泛应用,在吸烟行为检测方面,国内外学者提出了多种基于深度学习的检测算法,显著提高了检测的准确性和效率。近年来,YOLO系列算法因其高效的检测速度和较好的准确率,成为了研究的热点。YOLO1系列作为实时目标检测的代表算法,经历了从YOLOv1到YOLOv8的发展历程。其中,YOLOv4和其后的版本在性能上取得了显著提升。YOLOv4通过引入更多的数据增强技术、更深的网络结构和新的特征融合策略,大幅提高了检测的准确度和速度。随后,YOLOv52在易用性和速度上进一步优化,尽管它并非官方版本,但因其出色的性能和广泛的社区支持成为了业界的热点。YOLOv63和YOLOv74分别围绕模型的轻量化和进一步的性能提升进行设计,特别是在小目标检测上的表现。而最新的YOLOv85则在此基础上进一步强化了模型的泛化能力和检测效率,使其在吸烟行为检测等复杂场景中表现更加出色。

        目标检测技术,尤其是深度学习方法,在近年来取得了巨大的进步,这些进展极大地促进了吸烟行为检测等应用领域的发展。从YOLOv52、YOLOv63、YOLOv74、YOLOv85到Transformer-based[^6]模型如ViT,再到其他高效算法如RetinaNet、Faster R-CNN、DETR,以及最新的Glod-YOLO和MMDetection等,每种方法都在不断突破性能的极限,提供了更准确、更快速的识别能力。

        在当前的公共卫生领域,吸烟行为的监控与管理日益成为关键议题。公共场所的无烟环境建设不仅是提升公众健康水平的重要措施,也是现代城市文明的重要体现。因此,精准有效地检测吸烟行为,尤其是在不允许吸烟的区域,对于执行公共卫生政策和促进健康生活方式具有重要意义。
在这里插入图片描述

        随着人工智能技术的飞速发展,基于计算机视觉的行为识别技术为吸烟行为的自动检测提供了新的解决方案。特别是近年来,YOLO(You Only Look Once)系列算法在实时物体检测领域取得了显著的成就,其快速高效的特点使得基于YOLO算法的吸烟行为检测系统成为可能。从YOLOv5到最新的YOLOv8,每一代的升级都带来了检测速度和准确率的提升,这对于需要实时处理大量监控视频数据的吸烟行为检测具有重大意义。

        国内外学者针对吸烟行为检测进行了广泛研究,并取得了一系列进展。这些研究不仅包括吸烟行为的检测算法研究,也涉及到数据集的构建、模型的训练和优化策略等多个方面。近期的研究成果表明,通过结合深度学习技术,尤其是卷积神经网络(CNN)和YOLO系列算法的应用,可以大幅提升吸烟行为检测的准确率和效率。

        本博客旨在探索基于YOLOv8/v7/v6/v5的吸烟行为检测系统的设计和实现。我们将详细介绍系统的整体架构,包括数据准备、模型训练、性能评估和应用部署等关键环节。通过对比不同版本的YOLO算法,在实际应用中选择最适合的模型,旨在为公共场所提供一个高效、准确的吸烟行为自动检测解决方案,以支持公共健康政策的执行和促进健康生活方式的普及。我们相信,这项工作不仅对学术界有重要贡献,对于促进公共健康、提高社会治理水平也具有重要的实践意义。

        为了确保本研究的科学性和前瞻性,我们参考了至少5篇最新的相关研究文献,确保了本文在理论和技术上都紧跟国际研究的最前沿。这些参考文献不仅涵盖了YOLO算法的最新进展,也包括了吸烟行为检测领域的重要研究成果,为我们的研究提供了宝贵的理论支持和技术参考。

        通过本博客的介绍,我们希望能够为广大研究人员和技术开发者提供一份关于基于YOLOv8/v7/v6/v5的吸烟行为检测系统的研究指南和实践参考

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        在开发基于YOLOv8/v7/v6/v5的吸烟行为检测系统时,我们面临的核心挑战和解决方案如下:

  1. 检测准确性与实时性的平衡
            吸烟行为检测系统的主要目标是实现对吸烟行为的高准确度识别与实时处理。鉴于吸烟行为可能在各种环境下发生,包括不同的光照条件、复杂的背景以及吸烟者的多样姿态,系统需要能够准确地识别这些行为的细微特征。我们通过引入最新的YOLO版本,如YOLOv8,它通过优化算法结构和计算流程,实现了更高的检测速度和准确率,以满足实时检测的需求。

  2. 模型的环境适应性和泛化能力
            环境的多样性对吸烟行为检测系统提出了巨大挑战。系统需要有良好的环境适应性和泛化能力,以保证在各种环境条件下都能维持高识别准确率。为了解决这一问题,我们采用了数据增强、迁移学习等技术,通过在多样化的数据集上训练模型,提高了模型的鲁棒性和泛化能力。

  3. 交互式Web应用界面的设计与实现
            为了使用户能够方便地使用吸烟行为检测系统,我们开发了一个基于Streamlit的交互式Web应用。这个Web应用不仅支持图像和视频的上传检测,还能接入实时摄像头进行实时监测。用户界面通过CSS进行美化,确保了直观性和功能性。用户可以轻松切换不同的模型文件,测试不同版本的YOLO模型(YOLOv8/v7/v6/v5)对检测效果的影响。

  4. 深度学习模型的集成与性能优化
            为了集成并优化YOLOv8/v7/v6/v5等多个版本的模型,我们采用了PyTorch作为主要的技术框架。通过细致地调整模型参数、优化训练流程,并利用高效的计算资源,我们成功提升了模型的性能。此外,我们还针对不同的使用场景和需求,对模型进行了定制化的优化,以达到最佳的检测效果。

  5. 系统的可扩展性与维护性
            考虑到未来可能的技术进步和需求变化,我们在系统设计时就充分考虑了可扩展性和维护性。系统架构设计允许轻松集成新的模型或功能,同时保证了代码的可读性和可维护性。我们使用PyCharm作为开发IDE,利用其强大的代码管理和调试功能,确保了开发过程的高效和系统的稳定运行。

        通过以上解决方案的实施,我们的吸烟行为检测系统不仅在技术层面上实现了创新,也为用户提供了便捷的操作体验和强大的功能,有望在公共卫生领域发挥重要作用。

2.3.2 解决方案

  1. 深度学习模型的选择和优化
    模型架构:选择YOLOv8/v7/v6/v5作为核心的深度学习模型组合,针对不同的害虫种类和检测场景进行优化。这些模型在速度和准确度之间提供了出色的平衡,并通过版本迭代不断优化,使其非常适合于复杂的吸烟行为检测任务。
    数据增强:利用丰富的数据增强技术,如随机裁剪、缩放、旋转、色彩调整等,以及GANs生成的合成图像,来模拟多样化的环境条件下的害虫图像,从而提升模型的泛化能力和对复杂场景的适应性。
    迁移学习:采用在大规模图像数据集上预训练的模型作为起点,通过迁移学习技术进行微调,专注于吸烟行为的特定检测任务。这样可以加速模型训练过程,并显著提高识别性能。

  2. 技术框架和开发工具
    PyTorch框架:使用PyTorch作为深度学习框架,它为模型的开发、训练和推理提供了灵活和强大的支持。PyTorch的动态计算图和丰富的API能够加速实验过程,便于快速迭代和优化。
    Streamlit网页设计:基于Streamlit构建交互式Web应用界面,使用户可以轻松上传图像、视频进行害虫检测,或通过摄像头实现实时监控。Streamlit的简洁API和数据可视化功能,为开发美观、功能丰富的用户界面提供了强大支持。
    CSS美化:利用CSS对Streamlit应用进行风格定制和美化,提高用户界面的美观度和用户体验。通过CSS,可以调整布局、颜色、字体等元素,使界面更加直观和友好。

  3. 功能实现和系统设计
    多输入源支持:设计系统以支持多种输入源,包括图像文件、视频流和实时摄像头捕获,以适应不同的农业监测和害虫检测场景。
    模型切换功能:实现用户可自由切换不同预训练模型的功能,增加系统的灵活性和适用范围。这使得用户可以根据实际需求选择最合适的模型进行害虫检测。

  4. 数据处理和存储策略
    高效数据处理:利用PyTorch的高效数据加载器和预处理机制,结合多线程和GPU加速技术,确保数据处理的高速性能,满足实时检测的需求。
    智能数据存储:设计高效且可扩展的数据存储方案,对检测结果和历史数据进行有效组织,便于用户进行查询、分析和回溯。

  5. 性能优化和系统测试
    性能调优:通过模型和系统性能分析,识别性能瓶颈并进行针对性优化,如模型精简、硬件加速等,以保证系统的高效运行。
    全面测试:进行全面的系统测试,包括功能测试、性能测试和用户体验测试,确保系统的稳定性、准确性和可靠性。

通过实施上述策略,我们的目标是开发一个准确、高效且用户友好的吸烟行为检测系统,能够在多种使用场景下满足用户的需求,同时提供强大的数据处理能力和良好的用户体验。

2.4 博文贡献与组织结构

        本文综合探讨了基于YOLOv8/v7/v6/v5等深度学习模型的吸烟行为检测系统,不仅提供了该领域的详细文献综述,还深入分析了数据集处理方法、算法选择理由、以及如何使用Streamlit开发美观且用户友好的Web界面。此外,文章还比较了YOLOv7、v6、v5等算法在害虫检测任务上的性能,并提供了完整的数据集和代码资源包,以便于读者理解、复现和进一步研究。以下是本文的主要贡献:

  1. 文献综述:提供了关于吸烟行为检测领域的最新研究进展,包括但不限于YOLO系列算法的应用、其他相关深度学习算法的探索、数据集的开发和处理技术等。

  2. 数据集处理:详细介绍了数据集的收集、预处理和增强方法,旨在提升模型训练的效率和检测准确率。

  3. 算法选择和优化:深入分析了选择YOLOv8、v7、v6、v5等算法的理由,包括它们在速度、准确性和适用性方面的优势,并讨论了对这些模型的定制化改进,以适应吸烟行为检测的特殊需求。

  4. Streamlit网页设计:基于Streamlit框架,设计并实现了一个美观、直观且功能丰富的Web应用界面,支持图像、视频和实时摄像头输入,用户可以轻松切换不同的模型进行害虫检测。

  5. 算法性能对比:通过对YOLOv7、v6、v5等不同版本的算法在相同数据集上的检测效果进行对比,提供了关于算法选择的有价值见解。

  6. 资源分享:提供了完整的数据集和代码资源包,包括模型预训练文件、训练和预测的代码,以促进知识共享和技术传播。

        后续章节的组织结构如下: 绪论:介绍研究背景、目的和本文的主要贡献;算法原理:详细介绍YOLOv8/v7/v6/v5等算法的工作原理及其在吸烟行为检测中的应用;数据集处理:讨论使用的数据集及其预处理、增强方法。代码介绍:提供模型训练和预测的详细代码说明,包括环境搭建、参数配置和执行步骤。实验结果与分析:展示不同模型在吸烟行为检测任务上的实验结果,并进行比较分析。系统设计与实现:介绍基于Streamlit的吸烟行为检测系统的设计与实现细节。结论与未来工作:总结本文的研究成果,并讨论未来的研究方向和潜在的改进空间。


3. 数据集处理

        在构建用于烟头检测的数据集时,我们仔细考虑了多个方面以确保其质量和多样性,从而为训练高性能模型提供了良好的基础。我们的数据集由总共4791张图像组成,其中4408张用于训练模型,358张用于验证模型性能,以及25张用于最终测试。这样的分布保证了模型能在广泛的数据上学习,并在独立的测试集上公正地评估其性能。博主使用的类别如下:

Chinese_name = {'Smoking': "吸烟"}
Label_list = list(Chinese_name.values())

        在预处理阶段,所有图像首先应用了自动方向校正,以确保图像的方向统一,从而减少模型训练过程中的复杂性。随后,所有图像被拉伸至640x640像素,这是一种常见的做法,可以使模型输入的尺寸标准化,同时也满足了YOLO等目标检测算法的输入需求。在类别映射方面,原始的6个类别经过重新映射,最终确定为4个类别,并且舍弃了2个类别。这种简化可以帮助模型更专注于烟头的检测,同时减少由于类别不平衡带来的训练难度。至于数据增强,我们选择不应用任何增强处理。这一决定是基于当前数据集的多样性和实际应用场景的考虑,目的是让模型能更好地学习和适应真实世界的变化。此数据集的标签系统简洁明了,只包含一个类别“吸烟”(Smoking),其中文名称为“吸烟”,所有的标签都已经转换为这个类别。这简化了模型的输出层,并使得模型专注于检测烟头这一单一目标。

        通过以上的数据集构建策略,我们确保了模型能在真实世界条件下达到高准确度和良好的泛化能力。在接下来的博客部分中,我们将进一步探讨如何利用这些数据集来训练和评估基于YOLOv8的烟头检测模型。

在这里插入图片描述

        为了增强模型的泛化能力和适应性,我们对数据集中的图像进行了一系列的预处理和增强操作。预处理包括图像大小的调整和像素值的归一化,而增强处理则包含了一系列旨在模拟不同光照和环境条件的技术,如随机裁剪、旋转、缩放和色彩调整。这些步骤不仅提高了模型对变化环境的适应性,也有助于减少过拟合,确保在实际应用中的稳健性。

在这里插入图片描述

        分析这幅图表,我们可以得出关于目标检测数据集中烟头标注分布的有价值信息。首先,左上方的红色单一块显示出所有实例都属于“烟头”这一类别,这强调了数据集的单一目标特性。

        在右上方的图中,我们看到了目标(烟头)的边界框相对于整个图像的分布密度图。边界框中心点的密度较高,显示了图像中心有大量烟头的集中,这表明烟头在图像中往往位于中央位置。

        左下方的图展示了烟头在图像中的位置分布,横坐标x和纵坐标y表示烟头中心点的相对位置。从图中可以观察到,烟头中心点分布比较均匀,没有明显的集中趋势,这意味着烟头在图像中的位置具有很好的多样性。

        最后,右下方的图揭示了烟头边界框的宽度和高度的分布。可以看到,大多数烟头的宽度和高度都集中在较小的范围内,但也有一些较大的烟头存在。这显示了烟头尺寸在数据集中的变化范围,对于训练一个能够识别不同尺寸烟头的模型是有帮助的。

        从这些分析中,我们可以得出以下结论:

  1. 数据集中烟头的类别单一,这使得我们能够集中资源和注意力在提高烟头检测的精确性上。

  2. 烟头的分布表明,算法需要能够识别位于图像任何位置的烟头,这就要求模型有很好的平移不变性。

  3. 烟头尺寸的多样性表明,模型需要能够适应不同大小的目标,这对于实际应用是必要的,因为烟头在现实世界中的大小是多变的。

        通过对这些分布的理解,我们可以优化目标检测模型的训练过程,例如,可以在训练时应用一些技术,如平移、缩放和翻转,来增加模型对烟头位置和尺寸的鲁棒性。同时,这些分布也为我们如何设计和改进检测算法提供了重要的线索。在博客的这一部分,我们可以深入探讨这些分析对模型设计和训练策略的具体影响。

4. 原理与代码介绍

4.1 YOLOv8算法原理

        Ultralytics公司于2023年初发布YOLOv8模型,相较于2020年发布的YOLOv5模型,YOLOv8模型将C3模块(CSP Bottleneck with 3 convolutions)改进成C2f模块(CSP Bottleneck with 2 convolutions),C3模块和C2f模块结构如下图(a)所示。图中CBS(Convolutions Bn SiLU)模块由基础卷积(Conv)、批量归一化(BN)和激活函数(SiLU)组成。C2f模块采用了多分支流设计,为模型提供了更丰富的梯度信息,强化了模型的特征提取能力,提高网络的学习效率。

在这里插入图片描述

        YOLOv8模型仍然采用anchor free方法,降低检测过程中正样本框数量,并提升处理速度。此外,模型结合了GFL(generalized focal loss)损失计算策略,将Detect模块由YOLOv5中的耦合头改进成解耦头,如上图(b)所示。解耦头将分类任务和回归任务分开进行,避免了两个任务之间的干扰,理论上能够提高模型的训练效率。传统的YOLO系列算法的耦合头输出三类信息,而YOLOv8模型中的解耦头仅输出分类和回归信息。分类信息的输出通道数等于类别数,输出的内容综合了分类信息和置信度信息。回归信息的输出通道数等于4 reg_max(Regression maximum),输出内容为回归框在最大回归范围上的概率分布。

        YOLOv8采用了动态标签匹配策略,增加了正样本框选择的灵活度。在损失计算方面,YOLOv8除了计算分类和回归损失外,还引入了DFL(distribution focal loss)损失。DFL损失利用交叉熵的思想,通过将预测框回归至标签框的上下整数范围内,优化模型训练。

4.2 模型构建

        接下来详细介绍构建用于吸烟行为检测的深度学习模型的代码结构和功能。这一过程包括模型的初始化、加载、预处理、预测以及结果的后处理等关键步骤。首先,代码通过导入必要的库和模块开始。cv2是OpenCV库,广泛应用于图像处理和计算机视觉任务。torch是PyTorch深度学习框架,用于构建和训练模型。Detector是一个抽象基类,定义了检测器应有的基本功能和结构。YOLO类专门用于加载和运行YOLO模型,而select_device函数用于根据是否有可用的CUDA设备来选择运行模型的设备(GPU或CPU)。

import cv2
import torch
from QtFusion.models import Detector
from datasets.EmotionData.label_name import Chinese_name
from ultralytics import YOLO
from ultralytics.utils.torch_utils import select_device

        接着,设置了模型运行的初始参数ini_params,这包括设备类型、置信度阈值、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函数用于统计每个类别的检测数量。它接受检测信息和类别名称列表作为输入,并返回一个与类别名称列表相对应的计数列表。这个功能对于分析模型在不同类别上的表现非常有用。

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类是整个检测流程的核心。该类继承自Detector基类,提供了加载模型、图像预处理、执行预测和后处理检测结果等方法。在初始化时,该类接受一个参数字典,并用于设置模型的运行参数。load_model方法负责加载指定路径的预训练YOLO模型,并进行必要的设备选择和模型预热。preprocess方法对输入图像进行预处理,以适应模型的输入要求。predict方法执行识别的预测过程,而postprocess方法则处理模型的输出,将其转换为易于理解和使用的格式,例如将检测到的标注在图像上。

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)

        最后,set_param方法允许动态更新检测参数,如置信度阈值和IOU阈值,这为用户提供了更大的灵活性和控制能力,以优化检测结果。

        这部分代码构建了一个完整的吸烟行为检测流程,从加载预训练的YOLO模型到执行检测,并处理检测结果,提供了一套完备的解决方案。通过细致的功能设计和参数设置,这个系统能够高效且准确地识别图像或视频中的吸烟行为,满足不同场景下的应用需求。

4.3 训练代码

        在本篇博客中,我们将探讨如何使用YOLOv8模型来训练一个吸烟行为检测系统。这一过程不仅涉及到深度学习模型的加载和初始化,还包括数据集的准备以及训练参数的配置。以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:

超参数设置说明
学习率(lr00.01决定了模型权重调整的步长大小,在训练初期有助于快速收敛。
学习率衰减(lrf0.01控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。
动量(momentum0.937加速模型在正确方向上的学习,并减少震荡,加快收敛速度。
权重衰减(weight_decay0.0005防止过拟合,通过在损失函数中添加正则项减少模型复杂度。
热身训练周期(warmup_epochs3.0初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。
批量大小(batch16每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。
输入图像大小(imgsz640模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

        环境设置与模型加载:首先,导入必要的库和模块:

import os
import torch
import yaml
from ultralytics import YOLO  # 用于加载YOLO模型
from QtFusion.path import abs_path  # 用于获取文件的绝对路径

        这里,torch是PyTorch深度学习框架,用于模型的训练与推理。yaml用于处理数据集的配置文件。YOLO类用于加载和训练YOLO模型。

        接下来,根据系统是否支持CUDA,自动选择使用GPU或CPU作为训练设备:

device = "0" if torch.cuda.is_available() else "cpu"

        数据集准备:定义训练过程中使用的基本参数:

workers = 1  # 工作进程数
batch = 8  # 每批处理的图像数量

        指定数据集名称,并构建配置文件的路径。这里使用了abs_path函数,确保无论当前工作目录在何处,都能正确找到配置文件的路径:

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

        为确保数据集路径的正确性,在读取配置文件后,将数据集的路径设置为配置文件所在目录的路径:

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)

        训练模型:加载预训练的YOLOv8模型。这里指定了模型权重文件的路径,并将任务类型设置为detect,表示我们将使用模型进行目标检测:

model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect')

        最后,开始训练模型。在train方法中,我们详细指定了训练的参数,包括数据集配置文件的路径、训练使用的设备、工作进程数、输入图像的大小、训练周期以及每批次的大小:

results2 = model.train(
    data=data_path,
    device=device,
    workers=workers,
    imgsz=640,
    epochs=120,
    batch=batch,
    name='train_v8_' + data_name
)

        通过上述过程,我们成功地配置并启动了吸烟行为检测模型的训练任务。YOLOv8作为一个强大的目标检测框架,为我们的训练任务提供了良好的支持,使得训练过程既高效又方便。在训练完成后,我们将得到一个针对吸烟行为检测任务优化过的模型,它将能够准确识别和分析图像中的吸烟行为,为后续的应用提供强大的技术支撑。


5. 实验结果与分析

5.1 训练曲线

        采用以上代码进行训练,得到的训练过程曲线如下,展示了使用YOLOv8模型在吸烟行为检测任务上的训练过程中各项指标的变化情况。这些指标包括了训练和验证阶段的各种损失函数,以及精确度、召回率和平均精度(mAP)的指标。

在这里插入图片描述

        首先,训练集和验证集的边界框损失(box_loss)呈现了持续下降的趋势,说明模型在定位烟头的能力上逐渐增强。虽然验证集上的box_loss有些波动,但整体稳定在较低水平,这表明模型具有不错的泛化能力。

        类别损失(cls_loss)同样显示了减小的趋势,这表示模型在区分烟头与其他类别上越来越精确。训练集上cls_loss的下降更为平滑,验证集上虽然有波动,但总体上仍然维持在较低的水平。

        方向损失(df1_loss)指的是模型预测边界框方向的准确性,从图中我们可以看到,该损失值在训练和验证过程中都稳步下降,并在后期趋于平稳,这表明模型在学习烟头的方向属性方面取得了很好的效果。

        精确度(precision)和召回率(recall)是衡量模型性能的两个重要指标。精确度反映了模型对烟头的检测准确性,而召回率反映了模型捕捉烟头的能力。从图中可以看出,训练过程中两者都逐渐提升,而且后期曲线趋于平稳。这说明模型在识别和定位烟头方面取得了较好的平衡。

        通过细致的训练过程分析,我们不仅可以了解模型性能的当前状态,还可以基于这些信息调整训练策略,以期在实际应用中取得更好的检测效果。这些训练曲线为我们提供了宝贵的直观视图,使我们能够对模型的训练过程有一个全面的把握。在博客中,我们将这些分析细节融入到对YOLOv8模型训练效果的整体评估中,为读者提供对模型性能深入理解的基础。

5.2 混淆矩阵

        混淆矩阵是评估分类模型性能的重要工具,尤其是在害虫检测这样的多类别问题中,它能帮助我们深入理解模型在各个类别上的预测准确性。从您提供的混淆矩阵中,我们可以观察到模型在多数类别上的性能表现。
在这里插入图片描述

        在模型评估过程中,混淆矩阵是衡量分类模型性能的重要工具,尤其是在目标检测任务中,它能够清晰地显示模型在预测不同类别上的准确性。从提供的混淆矩阵可以看出,我们的模型在烟头检测任务上的表现。

        首先,我们注意到混淆矩阵的主对角线,即“cigarette”预测为“cigarette”和“background”预测为“background”的数值。对角线上的数值越接近1,表明模型的预测越准确。在本例中,“cigarette”预测为“cigarette”的比率为0.88,而“background”预测为“background”的比率达到了完美的1.00。这意味着模型能够非常准确地区分背景和烟头,对背景的识别几乎没有误差。

        然而,模型在将“cigarette”正确分类时还存在一定的改进空间,因为有12%的烟头被误判为背景(如图中左下角的0.12所示)。这可能是由于烟头与背景的融合度较高或者烟头尺寸过小,导致模型难以识别。

        此外,混淆矩阵中没有显示“background”被错误分类为“cigarette”的情况,这是一个积极的信号,表明模型在区分非烟头目标时表现出色,没有将其他对象误识别为烟头。

        综上所述,模型在背景的检测上表现完美,在烟头的检测上也显示出了较高的准确性,但还有进一步优化的空间。针对烟头被误判为背景的情况,我们可能需要考虑进一步调整模型,或者对烟头的特征进行更细致的学习。可能的策略包括增强烟头的图像特征学习,比如通过改进网络结构来增加对小目标的敏感性,或者使用数据增强技术来扩展烟头样本的多样性。此外,也可以探索更高级的损失函数,专门针对较难检测的烟头样本进行优化。通过这些方法,我们期望在未来能够将烟头的识别率提高至与背景同等的准确度。

5.3 YOLOv8/v7/v6/v5对比实验

(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.8700.9020.8250.895
F1-Score0.840.890.800.87

(3)实验结果分析
在这里插入图片描述

        在我们的实验设计中,我们旨在评估和比较YOLO系列中的不同版本——YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n——在相同数据集上的性能。实验的目的是为了确定哪一个算法版本在烟头检测任务上表现最佳。实验设置是统一的,以保证公平性,其中包括相同的训练和评估环境、统一的预处理步骤以及相同的训练周期。

        度量指标方面,我们选用了F1-Score和mAP(mean Average Precision)两个指标。F1-Score是精确率和召回率的调和平均,是衡量模型精确性和完整性的重要指标。而mAP则考虑了不同置信度阈值下模型的平均精度,是目标检测领域常用的性能评价指标。这两个指标共同为我们提供了一个全面的视角来评估各个模型版本的性能。

        实验结果显示,YOLOv6n在这两个指标上均表现最佳,其mAP达到了0.902,F1-Score为0.89。YOLOv8n的表现紧随其后,mAP和F1-Score分别为0.895和0.87。YOLOv5nu的表现虽然略低,但也十分可观,其mAP为0.870,F1-Score为0.84。YOLOv7-tiny在四者中的表现最差,mAP为0.825,F1-Score为0.80。这些结果意味着随着YOLO版本的更新,模型的性能在多数情况下得到了提升,尽管某些轻量级版本(如YOLOv7-tiny)可能在精度上有所妥协,以便在速度或其他资源限制的场景中使用。

        通过以上分析,我们可以得出结论,随着算法的不断迭代和优化,YOLO系列在目标检测任务上的效果越来越好,能够更有效地处理复杂的实际应用场景。这对于未来选择合适的目标检测算法,以及进一步改进和定制算法以适应特定应用需求提供了有价值的参考。 ​


6. 系统设计与实现

6.1 系统架构设计

        本系统旨在提供一个实时的吸烟行为检测平台,它能够通过摄像头捕获或上传的文件进行检测,并实时显示检测结果。系统架构设计围绕三个主要部分展开:用户界面(UI)、检测引擎、结果展示与记录。这三个部分协同工作,提供一个流畅且互动性强的用户体验。

在这里插入图片描述

在博客的“系统架构设计”部分,我们详细阐述了基于YOLOv8/v7/v6/v5的烟头检测系统的构成,以及它是如何提供高效、准确的烟头检测服务的。本系统采用模块化设计,易于理解、维护和扩展。下面是一些关键组件和它们的作用:

  1. 核心检测引擎YOLOv8v5Detector 类是我们系统的检测引擎,负责加载预训练的深度学习模型,执行图像预处理、预测以及后处理。这里是其加载模型的示例代码:
self.model = YOLOv8v5Detector()
self.model.load_model(model_path=abs_path("weights/emotion-yolov8n.pt", path_type="current"))
  1. 用户界面管理Detection_UI 类管理用户界面,并处理用户输入。它设置了页面布局、侧边栏选项,并调用不同的方法来执行用户的命令。初始化页面和侧边栏配置如下:
def setup_page(self):
    st.set_page_config(page_title=self.title, page_icon="🚀", initial_sidebar_state="expanded")

def setup_sidebar(self):
    self.model_type = st.sidebar.selectbox("选择模型类型", ["YOLOv8/v5", "其他模型"])
    # 更多配置...
  1. 输入管理:根据用户选择,process_camera_or_file 方法处理来自摄像头或文件的输入。对于实时摄像头输入,这个方法会打开一个视频流;对于文件输入,它会读取上传的图片或视频。
def process_camera_or_file(self):
    if self.selected_camera != "未启用摄像头":
        cap = cv2.VideoCapture(int(self.selected_camera))
        # 视频流处理逻辑...
    elif self.uploaded_file is not None:
        # 图片文件处理逻辑...
    elif self.uploaded_video is not None:
        # 视频文件处理逻辑...
  1. 检测过程与结果展示frame_process 方法对输入的图像进行逐帧处理,调用模型预测并绘制结果。toggle_comboBoxsetupMainWindow 方法负责更新和显示结果,管理主窗口的布局和用户交互。
def frame_process(self, image, file_name):
    # 图像处理与模型预测逻辑...

def toggle_comboBox(self, frame_id):
    # 显示指定帧的检测结果逻辑...

def setupMainWindow(self):
    # 主窗口布局与交互逻辑...
  1. 日志记录LogTable 类负责记录检测结果,并提供功能将结果导出到CSV文件。
self.logTable = LogTable(self.saved_log_data)
self.logTable.add_log_entry(file_name, name, bbox, conf, use_time)
self.logTable.save_to_csv()

通过上述的设计,我们的系统能够将深度学习的强大功能以一种用户友好的方式呈现。用户可以轻松上传图片或视频,甚至实时检测,系统会自动进行烟头检测并展示结果。这一切都是为了让复杂的深度学习技术更加贴近日常应用,为公共环境的卫生和安全做出贡献。

6.2 系统流程

        下面是按照程序流程步骤,每一步骤都是根据代码中的类和方法设计的,目的就是为了给大家提供一个清晰、高效的操作流程,以确保用户能够轻松使用系统并获取准确的检测结果。结合代码细节的介绍如下:

在这里插入图片描述
在我们的烟头检测系统中,整体流程经过精心设计,以确保每一步都能高效、准确地完成。现在,我们将以流程化的方式介绍这一系统的工作原理。

  1. 初始化设置:系统启动时,首先会执行 Detection_UI 类的 __init__ 方法。这一步骤中,系统会加载必要的类别标签和对应颜色,设置页面布局和标题,并初始化一系列配置参数,如模型类型、置信度阈值和IOU阈值。

  2. 模型配置:在侧边栏中,用户可以通过 setup_sidebar 方法设置模型参数,包括选择模型类型、调整置信度阈值和IOU阈值、以及上传自定义模型文件。其中,模型类型选择和文件上传选项对应于用户交互的 st.sidebar.selectboxst.sidebar.file_uploader

  3. 输入源选择:用户需要选择数据输入源,可以是实时摄像头、图片文件或视频文件。根据所选的输入类型,系统会通过 process_camera_or_file 方法读取输入数据,并根据用户的选择使用不同的处理方式。

  4. 检测执行:一旦数据输入源确定,系统就会调用 frame_process 方法来处理和预测图像帧的内容。这包括图像的预处理、模型预测和后处理。在此过程中,模型会加载已经训练好的权重,执行实时的烟头检测。

  5. 结果展示与记录:检测完成后,frame_process 方法会返回处理后的图像、检测信息和选择信息列表。系统会通过 toggle_comboBox 方法来显示特定帧的检测结果。同时,所有检测结果会记录在 LogTable 中,并且可以通过 setupMainWindow 方法在主窗口展示。

  6. 用户交互:用户可通过 setupMainWindow 中配置的按钮执行诸如开始检测、停止检测、导出结果等操作。此外,用户还可以通过下拉框 selectbox_target 在侧边栏中筛选特定的检测目标。

  7. 日志保存与导出:系统会把检测的结果和日志通过 LogTable 类记录下来,并且可以通过按下“导出结果”按钮,将这些信息保存到CSV文件中。

整个流程紧密集成,确保了用户在操作过程中的方便性,同时也保障了检测过程的准确性和效率。通过这样的设计,我们的烟头检测系统能够满足不同场景下的需求,帮助实现更清洁、安全的公共环境。


代码下载链接

        如果您希望获取博客中提及的完整资源包,包含测试图片、视频、Python文件(*.py)、网页配置文件、训练数据集、代码及界面设计等,可访问博主在面包多平台的上传内容。相关的博客和视频资料提供了所有必要文件的下载链接,以便一键运行。完整资源的预览如下图所示:

在这里插入图片描述

        资源包中涵盖了你需要的训练测试数据集、训练测试代码、UI界面代码等完整资源,完整项目文件的下载链接可在下面的视频简介中找到➷➷➷

演示及项目介绍视频:https://www.bilibili.com/video/BV1Pj421R7PK/

在这里插入图片描述

完整安装运行教程:

        这个项目的运行需要用到Anaconda和Pycharm两个软件,下载到资源代码后,您可以按照以下链接提供的详细安装教程操作即可运行成功,如仍有运行问题可私信博主解决:

  1. Pycharm和Anaconda的安装教程:https://deepcode.blog.csdn.net/article/details/136639378;

        软件安装好后需要为本项目新建Python环境、安装依赖库,并在Pycharm中设置环境,这几步采用下面的教程可选在线安装(pip install直接在线下载包)或离线依赖包(博主提供的离线包直接装)安装两种方式之一:

  1. Python环境配置教程:https://deepcode.blog.csdn.net/article/details/136639396(2,3方法可选一种);
  2. 离线依赖包的安装指南: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的深度学习模型在吸烟行为检测领域的应用,成功开发了一个结合了这些先进算法的吸烟行为检测系统。我们对多个版本的YOLO模型进行了细致的比较和系统优化,旨在提升吸烟行为检测的准确性和实时性。此外,本研究还通过Streamlit搭建了一个直观、美观且用户友好的Web应用,使用户能够轻松地上传图片和视频进行吸烟行为检测,从而在实际应用中展现了其显著的实用价值。

        在经过一系列详尽的实验验证后,我们的系统在吸烟行为检测的准确性和处理速度上都表现出色。本文进一步提供了完整的数据处理流程、模型训练和预测的代码,以及基于Streamlit的系统设计和实现细节,为后续研究者和开发者复现研究成果和参考实践提供便利。尽管已经取得显著成果,但鉴于吸烟行为检测的复杂性,我们认识到还存在诸多挑战和提升空间。因此,在未来的工作中,我们计划从以下几个方向进行深入探索:

  1. 模型优化:我们期望继续探索更高效的网络结构和优化策略,如神经网络架构搜索(NAS),以进一步提升模型的检测性能和运行效率。

  2. 多模态融合:考虑到吸烟行为可能与环境因素相关,我们打算采用多模态学习方法,结合图像以外的其他信息,如环境的音频、温湿度等数据,为检测提供更全面的背景信息。

  3. 跨域适应性:为了增强模型的通用性,我们计划研究跨场景的吸烟行为检测,通过领域自适应技术增强模型在不同环境和光照条件下的适应能力。

  4. 用户交互体验:我们致力于进一步优化Web应用的界面和交互设计,确保用户无论在何种设备上都能获得流畅且高效的操作体验。

  5. 实际应用拓展:本研究的最终目标是推动吸烟行为检测技术的社会应用,比如在公共场所进行自动监控以维护无烟环境,或者在健康领域辅助戒烟过程。

        综上所述,随着相关技术的不断进步和应用领域的拓展,基于深度学习的吸烟行为检测技术有望在未来在更广泛的领域产生积极影响,特别是在智能监控和公共健康领域。


  1. Liu C, Tao Y, Liang J, et al. Object detection based on YOLO network[C]//2018 IEEE 4th information technology and mechatronics engineering conference (ITOEC). IEEE, 2018: 799-803. ↩︎

  2. Zhu X, Lyu S, Wang X, et al. TPH-YOLOv5: Improved YOLOv5 based on transformer prediction head for object detection on drone-captured scenarios[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 2778-2788. ↩︎ ↩︎

  3. Sun Z, Chen B. Research on Pedestrian Detection and Recognition Based on Improved YOLOv6 Algorithm[C]//International Conference on Artificial Intelligence in China. Singapore: Springer Nature Singapore, 2022: 281-289. ↩︎ ↩︎

  4. Zhao H, Zhang H, Zhao Y. Yolov7-sea: Object detection of maritime uav images based on improved yolov7[C]//Proceedings of the IEEE/CVF winter conference on applications of computer vision. 2023: 233-238. ↩︎ ↩︎

  5. Aboah A, Wang B, Bagci U, et al. Real-time multi-class helmet violation detection using few-shot data sampling technique and yolov8[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2023: 5349-5357. ↩︎ ↩︎

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HDLbits 刷题 --Conditional

学习: Verilog has a ternary conditional operator ( ? : ) much like C: (condition ? if_true : if_false) This can be used to choose one of two values based on condition (a mux!) on one line, without using an if-then inside a combinational always block. …

MyBatis强大的动态Sql功能

1.动态不定增加 根据需求 , 动态的拼接SQL 。 用户有的信息是必须输入,但有的不是必须进行输入 比如在填写注册信息的时候,有时候密码是一定要填写的,而银行卡号不是必须填写的 1)注解方式 测试类中 : 使用 if 标签 可以实现动…

SAP 销售订单BOM使用场景简介

SAP系统中通常会存在很多的BOM类型,有生产订单BOM、销售订单BOM、WBSBOM、标准BOM这几类。 订单BOM >= 销售BOM >= 标准BOM 订单BOM:通常是根据标准BOM基础上由PMC去调整一个物料的用量等,根据生产订单的BOM 销售BOM:根据销售订单号+行项目号创建的BOM,是根据特定…

定时器与晶振时钟、中断系统、定时中断

定时器 简介: C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用。 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时&#xff0…

一维数组oj练习(4)

又是一维数组的练习.... 小A的学号在数组中可以看成a[k]&#xff0c;在判断谁大于a[k]。大于的数用sum来统计&#xff0c;最后输出。 #include<cstdio> int a[10010],n,k,sum; int main(){scanf("%d %d",&n,&k);for(int i1;i<n;i){scanf("%d…

uniapp开发安卓跟ios所遇问题集合

Android平台配置CPU类型 一般勾选armeabi-v7a跟arm64-v8a就好了 armeabi-v7a 第7代及以上的ARM处理器&#xff08;ARM32位&#xff09;&#xff0c;市面上大多数手机使用此CPU类型。arm64-v8a 第8代、64位ARM处理器&#xff08;ARM64位&#xff09;&#xff0c;最近两年新发的…

实现顺序表的增删查改

现在让我们探索数据结构这个美妙的世界吧&#xff01; 概念介绍 线性表是具有相同特性的数据元素的有限序列。线性表是一种在实际运用中广泛运用的线性结构&#xff0c;如线性表&#xff0c;栈&#xff0c;队列&#xff0c;字符串等。 顺序表的本质是数组&#xff0c;实现了…

微信小程序使用icon图标

原因&#xff1a; 微信小程序使用fontawesome库使用icon图标&#xff0c;网上有很多教程&#xff0c;按照网上说法制作&#xff0c;引入到微信小程序中&#xff0c;但是验证成功&#xff0c;只能使用部分图标&#xff0c;结果不尽如人意。后面使用阿里巴巴开源iconfont来使用ic…

DBU-Net:用于乳腺超声图像中肿瘤分割的双分支U形网络

DBU-Net&#xff1a;用于乳腺超声图像中肿瘤分割的双分支U形网络 摘要引言材料和方法概述所提出的方法 DBU-Net Dual branch U-Net for tumor segmentation in breast ultrasound images 摘要 乳腺超声医学图像通常具有低成像质量沿着不清楚的目标边界。这些问题使得医生在诊断…

VSCode调试C++

1、环境准备 1.1、g的安装与使用 1.1.1、安装 方式一&#xff1a;Xcode安装 苹果的开发集成工具是Xcode.app&#xff0c;其中包含一堆命令行工具。 在 App store 可以看到其大小有好几个G&#xff0c;有点大。 方式二&#xff1a;Command Line Tools 安装 Command Line Too…

Ai音乐大师演示(支持H5、小程序)独立部署源码

Ai音乐大师演示&#xff08;支持H5、小程序&#xff09;独立部署源码

【开发问题】为什么Java写文件时文件名中带有“*”会写入失败呢?

前言&#xff1a;在开发过程中&#xff0c;可能会遇写文件的问题。当我们写文件时&#xff0c;文件名中可能会带“*”号。这时候可能会导致写文件失败。 比如有一段写文件的代码&#xff1a; public static void createFile(String filename, byte[] content) {FileOutputStr…

蓝桥杯刷题-四平方和

四平方和 代码&#xff1a; from copy import deepcopy n int(input()) maxn int(5e6) 10 dic dict() for a in range(maxn):if a * a > n:breakfor b in range(a,maxn):if a * a b * b > n:breakif dic.get(a*ab*b) is None:dic[a*ab*b] (a,b) ans [maxn for _ …

情感视频素材在哪找?8个视频素材大全网站

在追求创意表达的道路上&#xff0c;每一位视频创作者都是一名勇敢的探险家&#xff0c;不断寻找那些能够点亮作品、让故事生动起来的珍贵资源。无论你的目标是打动人心、传达信息&#xff0c;还是简单地分享生活&#xff0c;以下八个视频素材网站将为你的每一个项目提供无尽的…

【C++第三阶段】模板类模板通用数组实现案例

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 模板怎么使用模板函数模板注意事项普通函数与函数模板的区别普通函数与函数模板调用规则函数模板限制 类模板类模板语法类模板与函数模板区别类模板中成员函数创建时机类模板对象做函…

Linux网络协议栈从应用层到内核层④

文章目录 1、网卡接受数据2、网络设备层接收数据3、ip层接受数据4、tcp层接受数据5、上层应用读取数据6、数据从网卡到应用层的整体流程 1、网卡接受数据 当网卡收到数据时&#xff0c;会触发一个中断&#xff0c;然后就会调用对应的中断处理函数&#xff0c;再做进一步处理。…

WSL安装与使用

开启之后&#xff0c;会提示你重启电脑才能使配置生效&#xff0c;我们重启即可。 电脑重启后&#xff0c;打开Microsoft Store搜索WSL&#xff0c;既可以看到支持的操作系统&#xff0c;我们选择Ubuntu即可&#xff0c;我们选择第一个就可以。 随后我们打开&#xff0c;发现报…

【WebKit架构讲解】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

开源知识管理和协作平台:插件丰富,主题精美 | 开源日报 No.209

logseq/logseq Stars: 27.8k License: AGPL-3.0 logseq 是一个注重隐私的开源平台&#xff0c;用于知识管理和协作。 提供强大的知识管理、协作、PDF 标注和任务管理工具支持多种文件格式&#xff0c;包括 Markdown 和 Org-modeWhiteboard 功能可使用空间画布组织想法&#x…

vue源码解析——vue如何将template转换为render函数

Vue 将模板&#xff08;template&#xff09;转换为渲染函数&#xff08;render function&#xff09;是 Vue 编译器的核心功能&#xff0c;它是 Vue 实现响应式和虚拟 DOM 的关键步骤。在 Vue 中&#xff0c;模板&#xff08;template&#xff09;是开发者编写的类似 HTML 的代…