首页 > 其他分享 >基于深度学习的番茄新鲜度检测系统(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

基于深度学习的番茄新鲜度检测系统(网页版+YOLOv8_v7_v6_v5代码+训练数据集)

时间:2024-04-03 21:12:07浏览次数:27  
标签:新鲜度 训练 检测 模型 系统 YOLOv8 v7 番茄

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

目录

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

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频https://www.bilibili.com/video/BV19q421w77G/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZ2akppw
YOLOv8和v5项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Zm5hu
YOLOv7项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Zm5tv
YOLOv6项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2akpZq

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


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模型因其快速、准确的特点,被广泛应用于车辆检测、行人识别、工业缺陷检测等多个领域。YOLOv5、YOLOv6、YOLOv7、YOLOv8等版本的相继推出,不断在速度和准确性上进行优化和改进。这些模型的成功应用为农业图像处理技术的发展提供了新的动力和可能。

        除了YOLO系列,还有其他深度学习算法如Faster R-CNN、SSD等也在图像识别领域展现了不俗的性能。然而,YOLO系列因其独特的单次检测机制,在处理速度上有着明显优势,更适合实时或近实时的农业图像处理应用。

        在番茄新鲜度检测研究中,通过对比YOLOv8/v7/v6/v5等不同版本的性能,可以为实际应用选择最合适的模型。此外,针对特定的应用场景和要求,还可以对模型进行微调和优化,以提高检测的准确度和效率。例如,通过增加数据集的多样性和质量,使用数据增强技术,改进网络结构或调整训练策略等方法,都可以进一步提升模型的表现。

        本研究不仅关注于算法本身的改进和优化,也涉及到数据集的构建、性能评估指标的选择以及实际应用场景的适用性分析。通过构建高质量、多样化的番茄图像数据集,采用合适的性能评估指标,可以更准确地反映模型的实际应用效果。此外,结合实际应用场景对模型进行测试和评估,可以确保研究成果能够满足农业生产实际需求。

2.2 国内外研究现状

        近年来,目标检测技术在算法优化、网络结构创新以及性能提升等方面取得了显著的进展。基于深度学习的目标检测算法,特别是YOLO系列,在实现高效准确的目标检测方面扮演着核心角色。YOLOv5、YOLOv7[1]、YOLOv7[2]、YOLOv8,不断地在速度和准确性之间寻找最优平衡,通过引入更复杂的网络结构和更有效的训练机制来提高检测性能。

        YOLOv8通过改进网络架构和优化损失函数,显著提高了对小物体的检测能力,这对于目标检测尤为重要。同时,研究者通过引入自注意力机制和特征融合技术,进一步增强了模型的特征提取能力,这使得模型在复杂背景下的检测表现更加出色。

        Transformer[3]模型在自然语言处理领域取得的巨大成功激发了将其应用于计算机视觉的兴趣。ViT(Vision Transformer)通过将图像切割成多个小块(patch)并将它们输入到Transformer模型中,展示了与CNN模型相媲美甚至更好的性能,尤其是在需要全局理解的复杂场景中。注意力机制,作为Transformer模型的核心,也被广泛应用于其他目标检测模型中,以增强模型对图像重要部分的关注能力。

        在经典的目标检测框架中,Faster R-CNN[4]通过引入区域建议网络(RPN)大大提高了检测速度,而RetinaNet解决了类别不平衡问题,引入了Focal Loss来提高模型对难以检测目标的识别能力。DETR(Detection Transformer)和之后的进化版本如Deformable DETR进一步将Transformer架构与目标检测任务结合,通过直接预测目标的方式,避免了复杂的预处理步骤和后处理步骤,实现了更加简洁和高效的检测流程。

        Glod-YOLO通过全局优化目标检测的局部特征提取,显著提高了对小目标的检测能力。而MMDetection[5]作为一个开放源代码的目标检测工具箱,支持多种最新的检测模型,为研究人员和开发者提供了一个灵活且强大的平台来探索和实验不同的目标检测算法。

2.3 要解决的问题及其方案

2.3.1 要解决的问题

        在开发基于YOLOv8/v7/v6/v5的番茄新鲜度检测系统时,我们面临着一系列的技术挑战和需求,这些需求不仅关乎模型的准确性和效率,还涵盖了用户体验和系统的可扩展性等多个方面。以下是针对本系统要解决的关键问题及相应解决方案的详细说明:

  1. 番茄新鲜度检测的准确性与实时性
            番茄新鲜度的准确检测是系统的核心,需要针对不同新鲜阶段的番茄,识别其颜色变化、形态特征等细微差异。同时,鉴于实际应用场景中对实时性的高要求,系统需要能够快速处理图像和视频数据。我们采用了最新的YOLOv8模型作为主体,并将YOLOv7、v6、v5作为辅助模型进行集成,通过对比分析不同模型在特定条件下的表现,选择最适合的模型进行部署。

  2. 环境变化下的稳定性与泛化能力
             在实际应用中,系统可能会面临多变的环境条件,如不同光照、背景干扰等。这要求模型具备强大的泛化能力,能够适应不同的检测环境。通过扩充和多样化训练数据集,以及采用先进的数据增强技术,可以有效提升模型在多变环境下的表现。此外,定期对模型进行迭代更新,也是保持系统稳定性的关键措施。

  3. 用户交互界面的易用性
             为了提高用户体验,我们基于Streamlit框架设计了友好的Web交互界面。用户可以通过简单的操作上传图像或视频,实时查看番茄新鲜度检测结果。界面支持多种模型文件的切换,用户可以根据需要选择不同的检测模型。此外,界面采用CSS进行美化,确保操作的直观性和界面的美观性。

  4. 数据处理与存储的高效性
            鉴于系统需要处理大量的图像和视频数据,我们优化了数据流处理机制,采用高效的数据编码和压缩技术减少存储占用,同时保证了数据处理的速度。数据的存储和管理采用了高性能的数据库系统,确保数据的安全性和快速查询。

  5. 系统的可扩展性与维护性
             系统设计充分考虑了未来的可扩展性,采用模块化设计,使得新增检测模型或更新现有模型变得更加容易。系统的维护和更新通过自动化脚本实现,确保了系统的长期稳定运行。

        通过上述解决方案的实施,我们的系统不仅能够准确、快速地进行番茄新鲜度检测,还能够在不同的环境条件下保持良好的性能。用户友好的交互界面和高效的数据处理机制进一步提升了系统的实用性和可靠性。此外,系统的设计保证了未来的可扩展性和易维护性,为系统的持续发展奠定了坚实的基础。

2.3.2 解决方案

        为了构建一个高效且准确的基于YOLOv8/v7/v6/v5的番茄新鲜度检测系统,我们计划采取以下综合性的技术方案:

  1. 深度学习模型的选择与优化

    • 模型架构:我们将采用YOLOv8作为主体模型,以其卓越的速度和准确性作为系统的核心。考虑到不同场景下的应用需求,我们还将集成YOLOv7、v6、v5模型,为用户提供多种选择,以适应不同的精度和速度需求。
    • 数据增强:为了提升模型在各种环境条件下的泛化能力,我们将应用多样的数据增强技术,包括但不限于随机裁剪、旋转、颜色抖动等,以增强模型对于光照变化、遮挡等情况的适应性。
    • 迁移学习:利用预训练的YOLO模型作为基础,通过迁移学习对特定的番茄数据集进行微调,从而加速训练过程并提高检测精度。
  2. 技术框架和开发工具的选择

    • PyTorch框架:选用PyTorch作为深度学习的主要框架,凭借其灵活性和强大的GPU加速能力,加快模型训练和推理过程。
    • Streamlit for Web UI:采用Streamlit构建交互式Web应用界面,使用户能够轻松上传图片、视频并实时查看番茄新鲜度检测结果。Streamlit的简洁高效使得开发周期大大缩短,迅速实现产品原型。
    • PyCharm IDE:使用PyCharm作为开发IDE,利用其丰富的开发工具和插件生态,提高开发效率和代码质量。
  3. 系统设计与功能实现

    • 多输入源支持:系统将支持多种数据输入源,包括图像文件、视频流以及实时摄像头捕获,以满足不同用户场景的需求。
    • 模型切换功能:用户可根据需求选择使用YOLOv8、v7、v6或v5进行新鲜度检测,系统将提供界面上的模型切换功能,增强用户体验和系统的灵活性。
    • 界面美化与交互设计:利用CSS对Streamlit默认界面进行美化,提升用户交互体验。同时,确保界面布局直观、操作简便,方便用户快速上手。
  4. 数据处理与存储策略

    • 高效数据处理:结合PyTorch的数据预处理和加载机制,实现高效的数据处理流程,确保系统的响应速度。
    • 智能数据存储:设计合理的数据存储方案,对检测结果进行有效组织,便于用户查询和分析历史数据。
  5. 性能优化与系统测试

    • 性能调优:定期对系统进行性能评估,识别并优化瓶颈,通过技术手段如模型剪枝、量化等降低模型复杂度,提升运行效率。
    • 全面测试:进行包括单元测试、集成测试和性能测试在内的全面系统测试,确保系统的稳定性和可靠性。

2.4 博文贡献与组织结构

        本文详细介绍了开发基于YOLOv8/v7/v6/v5的番茄新鲜度检测系统的全过程,从任务背景、技术选择到系统实现和结果分析,旨在为相关领域的研究人员和开发者提供一个全面的参考框架。主要贡献可以总结如下:

  1. 文献综述:我们对当前深度学习在图像处理特别是在农业领域内的应用进行了广泛的文献回顾,特别是集中在基于YOLO系列模型的研究进展,为本系统的研究提供了理论基础。

  2. 数据集处理:详细介绍了番茄新鲜度检测所使用的数据集的收集、预处理和增强过程。通过数据增强等技术提高了模型的泛化能力,为准确识别不同新鲜阶段的番茄奠定了基础。

  3. 算法选择与优化:深入探讨了选择YOLOv8/v7/v6/v5作为基础模型的原因,以及如何针对番茄新鲜度检测任务对这些模型进行优化。通过实验比较,展示了不同版本的YOLO模型在本任务中的表现和适用性。

  4. 友好的用户界面设计:借助Streamlit框架,设计了一个既美观又易于使用的Web界面,用户可以方便地上传图像或视频进行实时检测,也可以切换不同的YOLO模型进行预测。

  5. 实验结果与分析:全面对比了YOLOv7、v6、v5等算法在番茄新鲜度检测任务上的效果,通过实验数据和图表直观展示了每个模型的性能。

  6. 资源共享:提供了完整的数据集和代码资源包下载链接,方便读者复现实验结果,或在此基础上进行进一步的研究和开发。

        接下来的博客章节将按照以下结构进行组织:

  • 绪论:介绍研究背景、动机以及研究的意义和目标。
  • 算法原理:详细讲解YOLOv8/v7/v6/v5等深度学习模型的原理和特点,以及为什么它们适用于本系统的任务。
  • 数据集处理:描述数据集的收集、预处理、增强等步骤,以及如何构建适用于模型训练的数据集。
  • 代码介绍:提供模型预测与训练的详细代码说明和注释,帮助读者理解系统的实现细节。
  • 实验结果与分析:展示不同模型在番茄新鲜度检测任务上的实验结果,并进行分析和讨论。
  • 系统设计与实现:介绍基于Streamlit设计的Web界面的开发过程,包括界面设计、功能实现和用户交互。
  • 结论与未来工作:总结本文的研究成果,并展望未来可能的研究方向和系统改进的可能性。

        通过这样的组织结构,本文旨在为读者提供一个从理论到实践的全面指导,帮助理解和实现一个基于深度学习的番茄新鲜度检测系统。


3. 数据集处理

        本研究使用的是一组精心准备的番茄图像数据集,总数达到8931张,其中训练集包含6238张图像,用于训练模型以识别和分类不同新鲜度的番茄。验证集含1795张图像,用于评估模型在训练过程中的性能,并进行调优。测试集由898张图像组成,用以测试模型的最终性能,确保其在未见过的数据上同样表现出色。

Chinese_name = {"0": "0", "1": "1", "Fresh Tomato": "新鲜番茄", "Rotten Tomato": "腐烂番茄", "object": "物体"}

        数据集的处理细节如下:

        训练集:拥有6238张图像,是模型学习识别和分类番茄的基础。这一部分数据涵盖了丰富的场景和番茄新鲜度状态,以确保模型的泛化能力。

        验证集:1795张图像,用于在训练过程中验证模型的准确性,帮助避免模型的过拟合,并在模型开发过程中提供反馈。

        测试集:含898张图像,这部分数据在整个模型训练过程中不会被使用,仅在最终测试模型性能时使用,以评估模型对新数据的识别能力。

        预处理和增强处理:所有图像在输入模型前都经过了严格的预处理和增强处理,包括归一化、调整大小以符合模型输入要求等。数据增强包括随机旋转、翻转、缩放等,以模拟现实世界中的各种变化,提高模型对不同条件的适应性。

        标签和类别:数据集中的每个番茄图像都有相应的标签,分为两个主要类别:“新鲜番茄”和“腐烂番茄”,此外还有“物体”类别标签用于标记数据集中的其他物体。这些类别用于训练模型进行准确分类。

        在当今的教育场景中,番茄新鲜度的智能检测系统扮演着越来越重要的角色,它们不仅能够辅助教师管理教室秩序,还能够在紧急情况下快速做出响应。本研究项目致力于开发一个基于YOLOv8/v7/v6/v5深度学习模型的番茄新鲜度检测系统,以高效率和高准确度自动检测教室内的人员信息。为了达到这一目标,构建了一个全面且专业的数据集,这是系统准确性的基石。

        这一数据集共收集了8557张图像,精心分为训练集、验证集和测试集。具体来说,训练集包含了5990张图像,是用于模型训练的主要部分;验证集包含了1712张图像,主要用于在训练过程中调整模型参数;测试集含855张图像,用于评估模型的最终表现。这种划分方法确保了模型能在未见过的数据上也表现出色,从而保证了模型的泛化能力。

        针对这些图像,我们实施了一系列预处理步骤,确保了输入数据的一致性和质量。每张图像都经过自动方向校正以及移除了EXIF方向信息,确保了图像的正确显示方向。此外,所有图像都被重新调整到416x416的尺寸,虽然这一步骤可能导致一些图像的比例失衡,但这对于统一模型输入尺寸是必要的。在深度学习中,输入的统一性对于训练一个稳健的模型来说至关重要。

        为了进一步提升模型的表现,我们在数据集上实施了一系列的增强处理,包括随机变换和色彩调整等,这不仅提升了模型对于光照变化和其他环境因素的鲁棒性,同时也扩大了数据的多样性,从而提升了模型的泛化能力。

        在我们的番茄新鲜度检测数据集中,分布图为我们提供了数据集的多个视角分析。首先,从类别分布的条形图可以看出,“新鲜番茄”类别的实例数远多于“腐烂番茄”和其他类别,这意味着我们的模型将有更多的机会学习到新鲜番茄的特征。然而,这也可能引入类别不平衡的问题,需要通过采样策略或权重调整来缓解。

        对于“腐烂番茄”较少的问题,可能需要考虑对该类别进行过采样或增加其在损失函数中的权重,以确保模型不会偏向于识别较多的“新鲜番茄”。对于标记为“0”和“1”的类别,由于实例数较少,我们可以推断这些可能是标注数据时的特殊类别或噪声,应在进一步分析后决定是否将它们包含在训练过程中。

        接下来,边界框尺寸分布的密度图显示了目标的大小分布情况。从图中可以看出,大多数目标的宽度和高度集中在中等比例范围内,这表明我们的数据集中的目标尺寸相对一致。这对于训练过程是有利的,因为模型可以更容易地学习到目标的通用特征。然而,也存在一些较小和较大的目标,这要求我们的模型能够识别和检测不同尺寸的番茄。

        最后,边界框位置的热点图显示出目标在图像中的位置偏好。我们可以观察到一个明显的趋势,即大部分目标位于图像的中央区域。这可能是由于在采集数据时的偏好设置,也可能反映了真实世界中物体的分布模式。在这种情况下,我们可能需要对数据集进行增强,以确保目标检测模型不会忽视图像边缘区域的目标。

        综上所述,这个数据集为构建一个健壮的番茄新鲜度检测模型提供了一个坚实的基础。通过分析数据集的分布,我们能够更好地理解和预测模型训练过程中可能出现的挑战,并据此制定相应的策略来优化模型的性能。


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 模型构建

        在这一部分,我们将深入探讨用于构建检测模型的关键代码段,重点介绍代码的功能以及如何协同工作以实现高效的目标检测。下面是代码的详细解读:

        
在撰写“代码介绍”部分的博客内容时,我们将分析和介绍上述提供的模型构建代码。这部分代码是基于YOLO(You Only Look Once)深度学习算法构建番茄新鲜度检测系统的关键组成部分。以下是代码的详细介绍:

        首先,导入必要的库和模块:

import cv2  # 用于处理图像和视频的OpenCV库
import torch  # PyTorch深度学习框架
from QtFusion.models import Detector, HeatmapGenerator  # QtFusion库中的模型抽象基类
from datasets.label_name import Chinese_name  # 中文类别名称映射
from ultralytics import YOLO  # YOLO模型相关操作
from ultralytics.utils.torch_utils import select_device  # 设备选择工具

        代码中使用cv2处理图像,torch进行模型操作,QtFusionultralytics为构建YOLO模型提供工具。

        接着,设置了初始参数ini_params,包含设备类型、置信度阈值、IOU阈值等:

device = "cuda:0" if torch.cuda.is_available() else "cpu"  # 选择运行设备,优先GPU
ini_params = {
    'device': device,
    'conf': 0.25,
    'iou': 0.5,
    'classes': None,
    'verbose': False
}

        这些参数对于检测算法的性能至关重要,决定了模型在实际运行时的行为和准确度。定义了count_classes函数,用于统计每个类别的检测数量:

def count_classes(det_info, class_names):
    ...

该函数接受检测信息和类别名称列表,返回每个类别的计数。随后,定义了YOLOv8v5Detector类,它继承自Detector抽象基类,并进行了如下定制:

class YOLOv8v5Detector(Detector):
    def __init__(self, params=None):
        ...
    def load_model(self, model_path):
        ...
    def preprocess(self, img):
        ...
    def predict(self, img):
        ...
    def postprocess(self, pred):
        ...
    def set_param(self, params):
        ...

YOLOv8v5Detector类重写了模型加载load_model、图像预处理preprocess、预测predict、后处理postprocess和参数设置set_param等方法,实现了从加载模型到输出检测结果的完整流程。

  • load_model方法负责加载预训练的YOLO模型,选择运行设备,并将类别名称转换为中文。
  • preprocess方法用于图像的预处理。
  • predict方法执行模型预测。
  • postprocess方法处理预测结果,将边界框、置信度、类别名称等信息格式化。

        最后,set_param方法允许动态更新检测参数,使得模型可以在不同的配置下运行,这在实际应用中非常有用,如调整置信度阈值以适应不同的场景需求。通过这段代码,我们可以看到番茄新鲜度检测系统在技术层面的高度定制化,它不仅采用了当前深度学习中的先进算法,还通过细致的函数定义,实现了针对特定应用场景的优化。这些优化包括算法的参数调整、中文化处理以及对检测流程的详细控制,确保了系统在实际教室环境中的有效性和可靠性。
        整个代码结构清晰地分为了模型的加载、图像的预处理、预测以及预测结果的后处理,体现了实际深度学习应用中的典型流程。该流程确保了从输入原始图像到最终的手势检测结果的转换,既高效又易于理解和修改。

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模型进行训练的过程中,对损失函数和性能指标的分析是理解模型学习效果的关键。从训练损失图像中,我们可以获得模型训练的直观反馈。图像呈现了几个关键指标的变化,包括训练与验证的损失,以及精度和召回率等性能度量。

        在分析YOLOv8模型在番茄成熟度检测任务上的训练和验证损失函数图像时,我们可以从以下几个关键指标得出结论:

        首先,从训练集和验证集的框损失(box_loss)来看,随着训练过程的进行,损失稳定下降,表明模型在识别物体边界框方面的性能逐渐提升。初期较高的损失表明模型刚开始学习,随着学习的深入,模型能更准确地定位番茄的位置。

        接着观察分类损失(cls_loss),我们同样看到了明显的下降趋势,这说明模型在区分新鲜番茄和腐烂番茄方面的能力随着训练逐步增强。训练和验证损失的下降趋势一致,表明模型在未见过的数据上也有良好的泛化能力。

        目标损失(obj_loss)也显示出了下降趋势,表明模型在训练过程中对物体的置信度判断越来越准确。

        在评价指标方面,我们看到精度(precision)在训练初期迅速上升并稳定在较高水平,这意味着模型在区分不同类别时的判别能力非常高。相似的,召回率(recall)的提高说明模型能够检测到的正样本数量增加,少有遗漏。

        重要的是,平均精度(mAP@50和mAP@50-95)在训练过程中稳步上升,最终趋于平稳。mAP@50较高,说明模型在较宽松的IOU阈值下性能优秀,而mAP@50-95的提高则表明模型在更严格的条件下同样表现出色。这两个指标的提高说明模型在整体上具有很好的检测性能。

        综合以上分析,YOLOv8模型在番茄成熟度检测任务上的表现是正面且稳健的。损失函数的下降趋势和评价指标的提升都表明模型训练是成功的。模型不仅能够准确识别出番茄的位置,而且能够有效区分新鲜和腐烂的番茄,且在验证集上的表现也显示出良好的泛化能力。这些结果预示着模型在实际应用中应具有良好的表现,能为番茄成熟度的自动化检测提供可靠的技术支持。

5.2 PR曲线图

        精确率-召回率(Precision-Recall,PR)曲线是评估目标检测模型性能的重要工具之一,它反映了模型在不同置信度阈值下的精确度和召回率的关系。精确率代表检测出的正确番茄数占总检测出的番茄数的比例,而召回率则是指检测出的正确番茄数占真实总番茄数的比例。

        通过分析提供的PR曲线图,我们可以获得模型在各个类别上的性能指标。图中,曲线越接近右上角,表示模型的性能越好。具体来说,新鲜番茄和腐烂番茄的PR曲线靠近右上角,显示出较高的精确率和召回率,这表明模型能够有效区分这两个类别,识别出大部分的正样本,且错误识别的情况相对较少。在实际应用中,这意味着系统在检测新鲜和腐烂番茄时具有较高的准确性和可靠性。

        具体数值上,新鲜番茄的精确率较高,达到0.781,而腐烂番茄的精确率也相对较高,为0.764。这一结果再次印证了模型在区分不同成熟度番茄方面的强大能力。然而,类别0和1的性能较差,精确率仅为0.177和0.169,这可能是由于这些类别的样本数量不足或者类别内部差异性较大导致的。值得注意的是,“object”类别的精确率为0,这可能意味着该类别在训练集中样本过少或者模型未能学习到有效特征,需要对这一部分进行进一步的数据收集和模型优化。

        整体来看,模型的平均精确率([email protected])为0.378,这个指标是所有类别在IOU阈值为0.5时的平均精确率。尽管某些类别的表现不佳拉低了整体平均值,但主要类别——新鲜番茄和腐烂番茄的高性能还是让这个模型在实际应用中具有很好的潜力。

        总结来说,模型在新鲜和腐烂番茄检测任务上表现出色,但在其他类别上需要进一步的数据和模型优化。对于实际应用,我们需要关注整体的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.378 0.399 0.366 0.378
F1-Score 0.41 0.42 0.41 0.42

(3)实验结果分析

       在本节中,我们将对YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四种模型在相同数据集上的性能进行深入分析和比较。我们将介绍实验的背景和目的,然后对模型间的性能指标进行对比,最后对实验结果进行详细分析。

       在这项关于番茄成熟度检测的研究中,我们深入比较了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个版本的模型。通过使用同一数据集进行训练和评估,我们得到了每个模型的mAP(mean Average Precision)和F1-Score,这两个指标对于评估目标检测模型的性能至关重要。

       mAP是一种广泛用于目标检测任务的性能指标,它计算了不同置信度阈值下平均精度的平均值。在我们的任务中,YOLOv6n以0.399的mAP得分领先,这意味着在多个置信度阈值下,YOLOv6n相比其他模型更加精准地检测并定位了番茄。其次是YOLOv5nu和YOLOv8n,二者的mAP相同,为0.378,而YOLOv7-tiny的mAP最低,为0.366。

       F1-Score是精确度和召回率的调和平均,它是一种在单一阈值下考虑精确度和召回率平衡的指标。YOLOv6n和YOLOv8n在F1-Score上都达到了0.42,这表明它们不仅准确地识别出了目标,而且检测到的目标数量也较多。YOLOv5nu和YOLOv7-tiny的F1-Score稍低,为0.41。

       从实验结果来看,YOLOv6n的整体性能最为出色,这可能是由于其在网络架构上的优化以及对检测任务的特定适配。YOLOv6n的网络可能更适合处理我们数据集中的特征,如番茄的纹理、颜色和形状变化。而YOLOv7-tiny,虽然是一个轻量级的网络,但它的表现略逊色,这可能是因为轻量级模型通常会牺牲一些准确性以换取更快的速度和更小的模型大小。然而,在实际应用中,轻量级模型的快速检测能力可能更加重要。

       综上所述,选择最合适的模型需要根据具体的应用场景和需求来决定。如果我们的重点是在较低计算资源下快速检测,YOLOv7-tiny可能是一个更合适的选择。但如果我们追求更高的检测精度和准确性,YOLOv6n可能是最佳选择。我们的研究为选择和优化番茄成熟度检测模型提供了宝贵的数据支持和洞见。未来工作可以探索更多的模型变种,进一步优化模型结构和训练过程,以在速度和准确性之间找到最佳平衡。


6. 系统设计与实现

6.1 系统架构概览

        在这篇博客中,我们将深入剖析基于YOLO系列算法的目标检测系统的系统架构设计。我们的设计理念是构建一个易于操作、高效准确且具有良好用户体验的系统,该系统能夜快速识别并记录各类目标信息。以下是我们系统架构的主要组成部分:

  1. 模型加载与预处理:系统的架构核心是YOLOv8v5Detector类。该类利用预先训练的YOLO模型参数(通常是.pt文件),来初始化并执行目标识别任务。YOLOv8v5Detector内部封装了图像处理与推理预测的全过程,其中load_model方法负责加载模型权重,确保模型能够被正确地应用于后续的检测任务。

  2. 配置管理:用户界面的交互由Detection_UI类负责管理,它集成了整个系统的用户交互逻辑。通过侧边栏配置,用户可以自主设定模型参数(包括model_typeconf_thresholdiou_threshold),以调整检测的准确度和灵敏度。用户还可以上传自己的模型文件,系统会通过load_model_file方法加载并使用这些自定义模型进行检测。

  3. 图像和视频处理:针对不同的输入源——摄像头、图片文件或视频文件,Detection_UI类中的process_camera_or_file方法负责处理这些输入。这包括从摄像头捕获实时图像、读取并解码上传的文件,以及调用模型进行手势识别。

  4. 结果展示与日志记录:检测结果的记录和展示通过ResultLoggerLogTable类来实现。ResultLogger类用于实时更新和展示检测结果,而LogTable类则为结果提供了持久化存储的能力,允许用户保存和回顾历史检测数据。

  5. UI设计:在整个系统设计中,我们还贯彻了颜色的随机分配策略来提高检测结果的辨识度。系统为每个检测到的类别动态分配了颜色,这一过程是通过Detection_UI类中的colors属性进行管理的

  6. 实时更新和反馈:系统设计了进度条和动态更新机制,通过st.progressst.image等Streamlit组件,实时反馈模型处理进度和结果,提高了用户的交互体验。

6.2 系统流程

        在我们的基于YOLOv8/v7/v6/v5的目标检测系统中,整个检测流程体现了精细的设计思路和对用户体验的深刻理解。下面,我们将以程序流程图的形式,详细介绍这一系统流程的各个步骤。

1. **系统初始化**: - **加载模型**:系统启动时,`YOLOv8v5Detector` 类的实例化过程中调用 `load_model` 方法,加载训练好的YOLO模型权重。 - **随机颜色生成**:为了区分不同的目标类别,系统为每个类别分配了随机颜色,存储在 `colors` 数组中。
  1. 界面设置

    • 页面配置:通过 setup_page 方法配置页面布局和标题。
    • 侧边栏配置:使用 setup_sidebar 方法在侧边栏中提供模型设置、置信度和IOU阈值的调整滑动条。
  2. 用户交互

    • 文件上传:用户可以上传自定义的图片或视频文件,或者选择实时摄像头捕获的画面。
    • 模型选择:用户可以选择使用默认模型或上传自定义模型文件。
  3. 检测执行

    • 处理输入源:依据用户的选择,process_camera_or_file 方法决定是处理来自摄像头的实时画面还是上传的文件。
    • 图像预处理:调整图像大小以符合模型的输入要求,并执行其他必要的图像处理步骤。
    • 模型预测:输入预处理后的图像到YOLO模型,获取检测结果。
  4. 结果展示与记录

    • 检测结果展示frame_process 方法展示每一帧的检测结果,包括绘制边界框和显示标签。
    • 结果记录ResultLogger 类记录检测结果,并使用 LogTable 类将结果保存到CSV文件。
  5. 用户反馈

    • 结果筛选与显示:用户可以在侧边栏中使用下拉菜单筛选特定目标,系统将通过 toggle_comboBox 方法显示选中目标的详细信息。
    • 动态结果更新:系统实时更新检测结果,并在界面中呈现。
  6. 系统结束

    • 停止检测:用户可以随时通过“停止”按钮结束检测流程。
    • 日志保存LogTable 类在系统结束时保存所有的检测日志,并提供导出功能。

        此检测流程的设计充分考虑了用户操作的便利性、系统的实时响应和结果的准确记录。无论是在技术深度还是操作易用性上,我们都力求为用户提供一个满意的使用体验。通过这样的流程设计,不仅能够快速定位和识别各类目标,还能为用户留下详尽的检测记录,助力用户在后续进行数据分析和管理决策。


代码下载链接

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

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

演示与介绍视频https://www.bilibili.com/video/BV19q421w77G/
YOLOv8/v7/v6/v5项目合集下载https://mbd.pub/o/bread/mbd-ZZ2akppw
YOLOv8和v5项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Zm5hu
YOLOv7项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2Zm5tv
YOLOv6项目完整资源下载https://mbd.pub/o/bread/mbd-ZZ2akpZq

完整安装运行教程:

        这个项目的运行需要用到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界面设计细节,为后续研究者和开发人员复现及参考提供了极大的便利。

        尽管目前成果显著,但番茄成熟度检测作为一个动态且复杂的任务,依然存在许多挑战和提升空间。未来的工作将从以下几个方向进行深入研究:

  • 模型优化:继续探索深层网络结构和优化策略,如运用神经网络架构搜索(NAS)技术,以进一步提高模型性能和计算效率。
  • 算法创新:考虑开发新的算法或改进现有算法,提高模型在各种环境条件下的鲁棒性,尤其是在不同光照和背景噪声条件下。
  • 用户体验:进一步改善Web应用的用户界面和交互设计,提升用户体验,使系统更加友好和易于操作。
  • 应用扩展:探索系统在农业生产、仓储物流、零售等更多实际应用场景的拓展,以实现商业价值和社会效益的最大化。

        综上所述,基于YOLO系列模型的番茄成熟度检测技术将为农业智能化、食品安全监管等领域带来创新的解决方案,有望在未来实现更广泛的应用和社会价值。


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

  2. Zhao, Dewei, et al. "A Small Object Detection Method for Drone-Captured Images Based on Improved YOLOv7." Remote Sensing 16.6 (2024): 1002. ↩︎

  3. Bietti, Alberto, et al. "Birth of a transformer: A memory viewpoint." Advances in Neural Information Processing Systems 36 (2024). ↩︎

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

  5. Eijnden, J., et al. "The first mm detection of a neutron star high-mass X-ray binary." arXiv preprint arXiv:2308.06021 (2023). ↩︎

标签:新鲜度,训练,检测,模型,系统,YOLOv8,v7,番茄
From: https://www.cnblogs.com/deeppython/p/18094930

相关文章