基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的草莓成熟度检测系统详解(深度学习模型+UI界面+Python代码+训练数据集)
摘要:本研究介绍了一个使用深度学习技术对草莓成熟度进行检测的系统,它采用了最新的YOLOv8算法,以及YOLOv7、YOLOv6、YOLOv5等前版本的算法,并对它们进行了性能对比。该系统能够在不同媒介上——如图像、视频文件、实时视频流和批量文件中——准确识别草莓的成熟度。文章详细解释了YOLOv8算法的工作原理,并提供了相应的Python实现代码、所需训练数据集,以及基于PySide6的用户界面设计代码的下载。
此外,该系统集成了SQLite数据库进行用户登录注册管理,并支持轻松切换YOLOv5、YOLOv6、YOLOv7、YOLOv8模型,以及用户界面的自定义修改功能。本研究旨在为草莓成熟度检测和深度学习领域的研究人员及初学者提供有价值的指导和资源。文末链接处可下载完整的代码和数据集。本文结构如下:
演示与介绍视频:https://www.bilibili.com/video/BV1tt421L7CK/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZ5u
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmphx
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZucmppx
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUk5Zq
前言
在当今的农业生产与食品加工行业中,提高产品质量控制的精确度和效率已成为核心竞争力之一。草莓作为一种广受欢迎的水果,其成熟度直接影响到果实的口感、营养价值以及市场价值。然而,由于草莓成熟度的评估往往涉及到色泽、大小、形态等多方面的因素,传统依赖人工经验的检测方法不仅耗时耗力,而且结果主观性强,难以保证评估的一致性和准确性。随着人工智能技术的飞速发展,尤其是深度学习在图像识别领域的突破,为解决上述问题提供了新的思路和方法。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152340535-257457899.jpg)
首先,YOLO系列算法因其出色的实时检测能力而被广泛应用于农产品品质检测中。特别是最新版本的YOLO算法,通过改进网络结构和优化训练技巧,显著提升了检测的准确性和速度。例如,YOLOv8通过引入更高效的特征提取网络和更加复杂的目标检测机制,大幅度提高了在复杂场景下的检测性能[1]。此外,针对小目标检测的改进也使得YOLOv8在农产品检测领域表现出色,能够更准确地识别和分类不同新鲜程度的草莓。同时,研究者们也在探索使用卷积神经网络(CNN)和生成对抗网络(GAN)等其他深度学习模型来进一步提升草莓成熟度检测的性能。例如,一些研究通过结合CNN和长短期记忆网络(LSTM),以学习和预测草莓在不同存储条件下的成熟度变化[2]。这种方法能够基于时间序列数据提供更准确的预测,对于指导草莓的存储和运输具有重要意义。除了YOLO系列,其他深度学习算法如SSD(Single Shot MultiBox Detector)和Faster R-CNN也在草莓成熟度检测领域得到了应用。这些算法各有优缺点,例如,Faster R-CNN在准确性方面表现优异,但速度较慢,而SSD则在速度上有明显优势。最近的研究尝试通过算法融合或改进,结合这些算法的优点,进一步优化草莓成熟度检测的性能[3]。
面对复杂多变的检测环境,提高模型的鲁棒性和泛化能力成为当前研究的一个重点。一些研究尝试通过数据增强、迁移学习等方法来提升模型在未见环境下的性能[4]。例如,通过对训练数据进行随机旋转、缩放、裁剪等操作,可以增加模型对于图像变形和遮挡的鲁棒性。
最后,随着计算技术的进步,研究者们也在探索更加高效的模型压缩和加速技术,以便在资源受限的设备上部署高性能的检测模型[5]。这对于在田间等实际应用环境中实时监测草莓成熟度具有重要意义。
本博客通过深入研究并实践基于YOLOv8算法的草莓成熟度检测系统,不仅展现了系统的实际应用效果,而且详细讲解了算法原理,并分享了系统的开发过程和代码实现。我们希望通过本文的分享,能够为广大研究者和从业者提供有价值的见解和实用的工具,进而推动草莓成熟度检测技术的发展。本文的主要贡献可以总结如下:
- 采用最先进的YOLOv8算法进行草莓成熟度检测:本文不仅介绍了如何运用当前最新的目标检测算法—YOLOv8进行草莓成熟度的检测,而且还对比了YOLOv7、YOLOv6、YOLOv5等早期版本的效果。与传统的深度学习模型相比,YOLOv8在效率和精确度方面都有显著的提升,为草莓成熟度检测提供了一种更加高效和准确的解决方案。
- 利用PySide6实现友好的用户界面:通过使用Python的PySide6库,本文开发了一个具有良好用户界面的草莓成熟度检测系统。该系统的友好界面大大降低了用户的操作难度,使得草莓成熟度检测变得更加直观和便捷,从而促进了YOLOv8算法的广泛应用。
3.集成登录管理功能,提升系统安全性:本系统设计了登录管理功能,要求用户在使用系统前进行登录操作。这一设计不仅增强了系统的安全性,也为将来引入更多个性化功能奠定了基础。 - 对YOLOv8模型进行深入研究:本文详细研究了YOLOv8算法在草莓成熟度检测中的应用,包括模型的精确度、召回率等关键性能指标的评估,以及模型在不同环境和条件下的表现分析。这些研究工作不仅帮助我们更全面地理解YOLOv8算法的性能,也为算法的进一步优化和改进提供了重要依据。
- 提供完整的数据集和代码资源包:为了便于读者更好地理解和应用YOLOv8及其前几个版本的算法在草莓成熟度检测中的操作,本文提供了一套完整的数据集和代码资源包。这些资源不仅包括用于模型训练和测试的详细数据集,还包括实现草莓成熟度检测系统的完整代码。通过这些资源,读者可以轻松复现实验结果,并在此基础上进行进一步的研究和系统开发。
1.数据集介绍
在深入研究草莓成熟度自动化检测系统的过程中,构建并分析一个综合性的数据集是实现高效精确识别的基础。我们精心策划的数据集包含了3713张高分辨率图像,涵盖了草莓成长周期中各个阶段的成熟度。这些图像分布在3426张训练集、215张验证集和72张测试集中,旨在通过训练、评估和测试各种深度学习模型来最大限度地提升草莓成熟度检测的准确性和鲁棒性。
图像中的草莓目标被精准地标注了不同的成熟度等级。通过这些丰富的标签,我们的模型能够学习并准确识别从未成熟到完全成熟的草莓。为了适应复杂多变的应用场景,图像数据不仅来自于多种光照和背景条件,而且在图像预处理和增强阶段,我们采用了一系列技术手段,如随机旋转、缩放、剪切和颜色变换等操作,以增强模型对各种条件的适应性和泛化能力。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152345972-1950881715.jpg)
通过分析我们的数据集分布,我们进一步了解了数据的内在特性。数据集的实例分布显示,未成熟的草莓数量最多,而转变中的草莓数量最少。这种不均匀的分布可能会导致模型在某些类别上的识别能力不足,因此我们可能会采用数据增强或过采样技术来解决这一问题,以确保各类别数据足够丰富,模型训练更加均衡。
此外,我们数据集的分布热图揭示了大部分草莓目标集中在图像的中心区域,而目标位置的分布图则展示了一定的集中趋势,这些分析结果对我们进行数据增强和设计模型架构时提供了宝贵的指导。了解边界框的高度和宽度比例分布,也使我们能够更精确地调整模型的锚框尺寸和比例,进一步提高了检测的准确度。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152352837-1152007730.jpg)
每张图像都附有相应的标签信息,标签定义了图像中草莓的成熟度等级,形成了明确的分类标准。我们定义了一系列细致的类别来反映草莓从未成熟到完全成熟的不同阶段。通过这种方式,我们确保了模型可以准确地识别和区分不同成熟度的草莓,为最终用户提供了直观且可靠的分类结果。博主使用的类别代码如下:
Chinese_name = { "raw": "未熟草莓","ripe": "成熟草莓", "turning": "变质草莓"}
综上所述,我们所建立的草莓成熟度检测数据集不仅在数量上充足,而且在质量上优良,且经过了深思熟虑的预处理和增强,以支持从事此类研究的学者和技术开发者。通过公开这一数据集,我们期望能够推动技术在实际农业生产中的应用,同时激发更多创新思维,推动相关领域科技的快速发展。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152410248-2078628046.gif)
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行草莓成熟度检测的图片或视频,或者启动摄像头进行实时检测。在进行草莓成熟度检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152414645-1644239646.gif)
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152419806-123071323.gif)
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152433117-2122896637.png)
3. YOLOv8算法原理
YOLOv8算法是目前先进的目标检测框架之一,其设计理念在于通过高效的网络结构实现快速而精准的目标检测。YOLOv8的网络架构采用了Neck和Head的分离设计,这意味着特征提取(Backbone)和目标检测(Head)两个过程被明确区分,从而优化了每个部分的性能。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152445438-348772701.jpg)
在特征提取阶段,YOLOv8继承并发展了YOLOv5和YOLOv7的设计思想,采用CSPNet结构作为其Backbone,CSPNet的优势在于减少计算重复性,同时保持了丰富的渐进式特征。这种结构通过跨阶段部分网络(CSP)的方式,降低了计算量并改进了特征传播效率。这一点在处理大量图像数据时特别重要,因为它能够有效地减少计算资源消耗,同时保持或提升检测性能。
YOLOv8的Neck部分采用了SPP(Spatial Pyramid Pooling)和FPN(Feature Pyramid Networks)的结合,这在多尺度目标检测中尤为关键。SPP能够在不同尺度下提取有效的上下文信息,而FPN通过多尺度特征融合增强了模型对不同大小目标的检测能力。SPP通过最大池化操作捕获不同尺度的特征,而FPN则通过自顶向下和自底向上的路径加强了特征之间的连接。
在Head部分,YOLOv8采取了一种被称为Decoupled-Head的方法,这种方法将分类和定位两个任务分开处理,有助于提升模型在这两个方面的专注度和准确性。相较于传统的设计,Decoupled-Head的方法通过分离这两个任务来减少它们之间的相互干扰,从而提高了整体的检测性能。
YOLOv8还引入了Anchor-Free的机制,这是目标检测领域中的一项创新。与传统依赖Anchor Box的方法不同,Anchor-Free机制允许模型直接预测目标的中心点和边界框,减少了对先验框的依赖,这使得模型更加灵活,也简化了训练过程。
此外,YOLOv8在损失函数上也进行了创新,采用了Distribution Focal Loss和CIoU Loss。Distribution Focal Loss对于不平衡数据分布具有更好的鲁棒性,它能够减少易分样本对损失函数的贡献,更专注于难以识别的样本。CIoU Loss则更加关注边界框的几何精度,不仅考虑了预测框和实际框的重叠面积,还考虑了它们的中心点距离和形状相似度,这有助于在边界框回归任务中获得更高的精度。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行草莓成熟度检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO
接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current"))
然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/test.png")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img)
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152457247-274440286.png)
4.2 模型训练
这里我们开始训练和测试自己的数据集,在cmd终端或pycharm中运行run_train_model.py进行训练,以下是训练过程中的结果截图。YOLOv8的损失函数是其性能的关键部分,它指导模型学习如何准确地检测和分类对象。
以下表格详细介绍了YOLOv8模型训练中使用的一些重要超参数及其设置:
超参数 | 设置 | 说明 |
---|---|---|
学习率(lr0 ) |
0.01 | 决定了模型权重调整的步长大小,在训练初期有助于快速收敛。 |
学习率衰减(lrf ) |
0.01 | 控制训练过程中学习率的降低速度,有助于模型在训练后期细致调整。 |
动量(momentum ) |
0.937 | 加速模型在正确方向上的学习,并减少震荡,加快收敛速度。 |
权重衰减(weight_decay ) |
0.0005 | 防止过拟合,通过在损失函数中添加正则项减少模型复杂度。 |
热身训练周期(warmup_epochs ) |
3.0 | 初始几个周期内以较低的学习率开始训练,逐渐增加到预定学习率。 |
批量大小(batch ) |
16 | 每次迭代训练中输入模型的样本数,影响GPU内存使用和模型性能。 |
输入图像大小(imgsz ) |
640 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在本节,我们将深入探讨如何使用YOLOv8算法训练一个高效的草莓成熟度检测系统。我将分享实际的代码实现过程,并对关键步骤进行详细的分析。
首先,我们从导入必要的库开始。使用Python的os和yaml库来处理文件路径和配置文件,并引入YOLO模型,这是我们训练过程中的核心。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
然后,我们设置了数据集的路径,这通过abs_path函数完成,它将相对路径转换为绝对路径,确保无论我们在哪里运行代码,路径都是正确的。这对于跨平台的项目至关重要,因为不同操作系统的文件路径表示方式可能不同。
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)
接下来,我们读取了配置文件中的内容,并根据需要对其进行了修改。这一步是为了确保配置文件中的path键正确地指向了我们的数据集路径。
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类来加载预训练的YOLO模型。这里我们加载了YOLOv5nu的权重,这一步骤是为了使用这些预训练的权重作为我们训练的起点,这可以大大加快训练速度并提高最终模型的性能。
workers = 1
batch = 8
data_name = "StrawberryRipeness"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
results = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v5_' + data_name # 指定训练任务的名称
)
在准备好数据和模型之后,我们开始了训练过程。train方法被用来指定了许多重要的训练参数,如数据集路径、计算设备、工作进程数、输入图像的尺寸、批次大小以及训练周期数。
model = YOLO(abs_path('./weights/yolov8n.pt'), task='detect') # 加载预训练的YOLOv8模型
results2 = model.train( # 开始训练模型
data=data_path, # 指定训练数据的配置文件路径
device='cpu', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
最后,我们重复了相同的训练步骤,但这次使用YOLOv8的权重。代码展示了如何加载另一个预训练模型YOLOv8并进行训练,这显示了如何灵活地在不同版本的YOLO模型之间进行切换。
在对YOLOv8模型进行训练的过程中,我们通过监控不同的损失函数和性能指标来评估模型的学习进度和性能。损失函数的变化趋势和最终的精确度评估对于理解模型的性能至关重要。本文将对训练过程中损失函数和性能指标的变化进行深入分析。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152508983-1790512950.png)
首先,观察训练和验证集上的box损失(代表模型预测的边界框与真实边界框之间的差异),我们可以看到,随着迭代次数的增加,训练集和验证集的box损失都呈现出明显的下降趋势,并且验证集的损失曲线在经过初期波动后逐渐平稳。这表明模型在边界框定位方面的性能随着训练逐渐提升,且没有出现过拟合的迹象,因为验证集的损失与训练集的损失保持在相近水平。
分类损失(cls_loss)反映了模型在分类草莓成熟度方面的表现。与box损失类似,分类损失也显示出随着训练的进行而逐渐降低的趋势,这表明模型在区分不同成熟度等级的能力上有所增强。平滑的曲线(smooth)进一步验证了损失下降的稳定性,说明模型在识别草莓成熟度的准确性上取得了进展。
对于目标检测模型,定位损失(dfl_loss)也是一个重要的指标,它直接影响到模型预测边界框的精度。在训练和验证集上的定位损失均稳步降低,且趋向于收敛,这进一步证明了模型在检测草莓的位置方面的能力随着训练的进行而增强。
精确度(precision)和召回率(recall)是评估检测模型性能的两个关键指标。精确度代表模型预测为正的样本中真正为正的比例,而召回率表示模型正确识别的正样本占所有真正的正样本的比例。从图中可以看出,两者都随着训练的进行而有所提高,且召回率的提升尤为显著,这意味着模型在不漏检真实目标的同时,保持了较高的识别精度。
最后,评估检测模型性能的另两个重要指标是mAP50和mAP50-95。mAP50指标衡量了在IoU(交并比)阈值为0.5时模型的平均精度,而mAP50-95则计算了在IoU从0.5到0.95的所有阈值上模型平均精度的平均值。两个指标均随着训练的进行而提高,且mAP50-95的提升尤为显著,这表明模型在各种严格性条件下的检测性能均得到了显著增强。
在评估机器学习模型,尤其是目标检测模型的性能时,F1分数是一个重要指标,因为它综合考虑了模型的精确度和召回率。F1分数是精确度和召回率的调和平均,能够平衡两者之间的关系。理想的情况是,模型能够同时拥有高精确度和高召回率,但在实际情况中,通常需要在两者之间做出权衡。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152516835-285824421.png)
从F1-Confidence曲线图中,可以观察到,各个成熼度类别的F1得分曲线呈现出不同的形状和高度,这表明模型对于不同成熟度阶段草莓的识别能力存在差异。特别地,‘ripe’(成熟)类别的曲线在大部分置信度区间内都高于其他两个类别,这意味着模型在识别成熟草莓方面表现出较高的精确度和召回率的平衡性。相比之下,‘raw’(未成熟)类别的曲线在置信度较低时起始得分较高,但随着置信度的增加,F1得分下降得更快。这可能暗示模型在低置信度阈值下产生了较多的正样本预测,但这些预测中包含了更多的误判。
‘turning’(转变中)类别的F1得分曲线低于其他两个类别,表现出一种不同的趋势。该类别的F1得分在中等置信度阈值下达到峰值,而在过低或过高的置信度下性能下降,这可能是因为‘turning’阶段的草莓在特征表现上既非未成熟也非完全成熟,导致模型在这个类别上的预测不够确定。
另外,所有类别综合的F1得分在置信度约0.48时达到峰值0.79。这是一个重要的发现,因为它指示了模型在整体上达到最佳平衡的置信度阈值。在实际应用中,我们可以根据这一点来调整模型的预测阈值,以便在避免过多误判的同时,最大化正确识别草莓的数量。
综上所述,通过对这些关键性能指标的综合分析,我们可以得出结论,YOLOv8模型在训练过程中表现出色,各项指标均显示出模型在边界框定位、成熟度分类以及整体检测精度方面有明显的提升。这些结果表明,该模型对草莓成熟度检测任务具有很好的适应性和高效的学习能力,是一个可靠的选择。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(1)实验设计:
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152532172-1710660283.png)
本实验旨在评估和比较YOLOv5、YOLOv6、YOLOv7和YOLOv8几种模型在车型目标检测任务上的性能。为了实现这一目标,博主分别使用使用相同的数据集训练和测试了这四个模型,从而可以进行直接的性能比较。该数据集包含各种车型的图像。本文将比较分析四种模型,旨在揭示每种模型的优缺点,探讨它们在工业环境中实际应用的场景选择。
模型 | 图像大小 (像素) | mAPval 50-95 | CPU ONNX 速度 (毫秒) | A100 TensorRT 速度 (毫秒) | 参数数量 (百万) | FLOPs (十亿) |
---|---|---|---|---|---|---|
YOLOv5nu | 640 | 34.3 | 73.6 | 1.06 | 2.6 | 7.7 |
YOLOv8n | 640 | 37.3 | 80.4 | 0.99 | 3.2 | 8.7 |
YOLOv6N | 640 | 37.5 | - | - | 4.7 | 11.4 |
YOLOv7-tiny | 640 | 37.4 | - | - | 6.01 | 13.1 |
(2)度量指标:
- F1-Score:F1-Score是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.807 | 0.811 | 0.809 | 0.816 |
F1-Score | 0.78 | 0.78 | 0.80 | 0.79 |
(3)实验结果分析:
图表显示了在相同数据集上,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四种模型的mAP(平均精度)和F1-Score(F1分数)的比较结果。通过对这些性能指标的直观展示,我们可以对每个模型的性能有一个清晰的认识。
从图中我们可以看出,YOLOv8n在mAP上表现最佳,达到了0.816,而YOLOv6n也紧随其后,mAP为0.811。这说明YOLOv8n在平均精度上稍微优于其他模型,反映了其在检测草莓成熟度时的整体准确性和可靠性。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152549209-1037656620.png)
在F1-Score上,YOLOv7-tiny以0.80的成绩领先,显示出在精确率和召回率的平衡上具有一定的优势,这对于实际应用中减少误检和漏检尤为重要。而YOLOv5nu和YOLOv6n的F1-Score则相同,为0.78,说明它们在精确度和召回率的综合表现上略低于YOLOv7-tiny和YOLOv8n。
通过优化坐标轴的显示范围,我们进一步强调了这些差异,即使它们在数值上非常接近。这样的视觉优化使得各模型间的性能比较更为明显,有助于研究者和开发者在选择合适的模型时做出更明智的决策。总体而言,这些结果为我们提供了关于不同YOLO版本性能的宝贵洞察,可以为未来的研究方向和实际应用的选择提供指导。
4.4 代码实现
在这篇博客中,我们将探讨如何结合YOLOv8检测器和PySide6框架,实现一个草莓成熟度检测系统。这个系统能够处理视频流,并实时展示检测到的草莓成熟度,为用户提供直观的视觉反馈。现在,让我们深入理解实现这一功能的代码逻辑。
(1)导入必要的模块和配置
首先,系统依赖于几个关键的Python库。sys模块让我们可以操作Python解释器,而time模块帮助我们在处理过程中插入时间戳,以监控操作的时效性。图像处理是通过cv2库,即OpenCV实现的,它是进行图像和视频处理中不可或缺的工具。而整个用户界面是通过PySide6和QtFusion库构建的,这两个库能让我们创建一个既美观又功能强大的窗口应用。
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于获取当前时间
import cv2 # 导入OpenCV库,用于图像处理
from QtFusion.widgets import QMainWindow # 从QtFusion库导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库导入MediaHandler类,用于处理媒体流
from QtFusion.utils import drawRectBox, get_cls_color # 从QtFusion库导入drawRectBox函数,用于在图像上绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块导入YOLOv8Detector类,用于物体检测
from datasets.StrawberryRipeness.label_name import Label_list
QF_Config.set_verbose(False)
(2)定义类别和模型
在主函数中,我们实例化了YOLOv8Detector模型,并加载了预训练权重。同时,我们还为每个类别定义了独特的颜色以便于在图像中标注不同的对象。我们通过MediaHandler来处理视频流,并将每一帧图像送入frame_process函数中进行处理。
cls_name = Label_list # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
我们定义了MainWindow类,这是应用程序的中心,负责初始化GUI并设置窗口属性。在这个窗口中,一个QLabel被用来展示处理后的图像。窗口中还包含了事件处理功能,比如keyPressEvent方法,使得用户可以通过按键进行交互,例如按Q键退出应用。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel对象的几何形状
def keyPressEvent(self, event): # 定义keyPressEvent函数,用于处理键盘事件
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的键是Q键
self.close() # 关闭窗口
(4)主程序流程
在frame_process函数中,每一帧图像都会被预处理,模型会在这些图像上进行预测,并返回预测结果。我们在这里进行时间统计,从而评估模型的推理时间。如果模型检测到目标,它还会对这些结果进行后处理,并在图像上画出矩形框和类名标签。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
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控件上显示图像
最终,通过设置一系列信号和槽,系统能够实现实时视频流的处理,并在GUI中实时展示结果。当一切准备就绪后,我们通过调用app.exec()进入Qt应用程序的主循环,等待用户的交互。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数
videoHandler.setDevice(device=0) # 设置设备为0,即默认的摄像头
videoHandler.startMedia() # 开始处理媒体流
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
5. 草莓成熟度检测系统实现
在构建我们的交互式草莓成熟度检测系统时,不仅需要快速准确地处理视频流中的图像数据,还需要提供一个清晰易用的界面,让用户能够无缝地与之交互。我们的设计思路遵循了将复杂的功能模块化和简化的原则,通过将界面设计、媒体处理和深度学习模型融为一体,我们实现了这一目标。
5.1 系统设计思路
在我们的系统设计中,我们的设计理念是构建一个高效、直观且用户友好的界面,使用户能够无缝地与系统交互。整个系统被设计为一个紧密集成的框架,其中每个组件都旨在提升整体性能和用户体验。
(1)架构设计
系统设计采用的是一个层次化、模块化的架构,以提升整体的灵活性和可维护性。通过精心设计的MainWindow类,我们将用户交互、媒体流处理和深度学习模型有效地融合在一个统一的应用程序中。此外,为了增强各模块间的协作性能,系统特别采用了信号和槽机制来处理模块间的通信,这在Qt框架中是实现事件驱动编程的核心。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152606425-953607107.png)
- 处理层(Processing Layer):处理层是系统的基础,包含了用于草莓成熟度检测的YOLOv8Detector类。该类是构建在强大的YOLOv8模型之上,通过加载预训练的权重,我们的系统能够准确识别不同成熟度阶段的草莓。此外,我们在处理层中实现了一系列的图像预处理和后处理功能,以适应实时视频流中的各种场景变化,确保检测结果的稳定性和准确性。
- 界面层(UI Layer):界面层则是用户交互的前端,它由PySide6库中的各种小部件构成,例如标签用于显示实时的视频流和检测结果,按钮用于用户触发特定操作。界面设计简洁直观,确保了用户能够无需深入了解背后的技术细节即可操作系统。此层的设计考虑了用户的操作习惯和使用便利性,使得用户能够集中于草莓成熟度的检测结果,而不是操作复杂性。
- 控制层(Control Layer):控制层则充当了用户指令与系统响应之间的桥梁,利用了Qt框架强大的信号和槽机制。MainWindow类响应用户的操作,控制媒体流的捕获与处理,以及模型预测的执行。通过这种设计,任何时候用户的操作都能够转化为系统的响应,无论是开始视频流,还是执行草莓成熟度的实时检测。
总之,通过精心的系统设计,我们将先进的物体检测技术与用户友好的界面相结合,为用户提供了一个功能强大且易于使用的草莓成熟度检测系统。用户可以在没有任何技术背景的情况下,轻松地对草莓进行成熟度评估,这对于农业生产者来说是一个极具价值的工具,不仅可以提高生产效率,还能提升产品质量。
(2)系统流程
在本博客中,我们将讲述设计一个交互式草莓成熟度检测系统的全过程。本系统的核心设计理念是用户友好性,高效整合前沿的YOLOv8目标检测技术和直观的用户界面,以确保即使是非专业用户也能轻松使用该系统。在系统的设计中,我们特别强调了处理层、界面层和控制层的分离,旨在实现高效的模块间交互和数据流管理。
我们的系统首先通过MainWindow类的实例初始化,它不仅为用户提供了一个操作界面,还负责配置整个应用程序的相关参数。这样的设计使得用户能够通过一个清晰的界面来选择数据输入源,无论是实时的摄像头捕获、视频文件还是静态图像,都能够轻松接入并处理。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152617565-2098789570.png)
-
选择输入源后,系统将立即调动其内置的媒体处理器进行数据的获取和处理。在这个环节,可能包括对摄像头的实时配置调整、视频文件的读取处理或是对静态图像文件的加载解析。这一切都是为了将输入数据转化为适合后续步骤处理的格式。
-
媒体源一旦就绪,系统随即进入到一个持续的帧处理循环中。在这一循环中,我们系统的预处理功能首先对图像进行标准化处理,以确保图像数据符合YOLOv8模型的要求。这个过程中可能包括调整图像尺寸、转换色彩空间或进行数据归一化等。紧接着,预处理后的图像数据会被送入精心训练的YOLOv8模型中进行分析,模型凭借其强大的深度学习能力,能够迅速识别出图像中的草莓并判断其成熟度。
-
随着模型分析的结果生成,我们的界面将被实时更新以显示最新的检测信息。用户将能看到包含成熟度等级的检测框出现在草莓的图像上,同时,检测的统计数据也将以图表或表格的形式被展示出来。这不仅仅增加了用户体验的丰富性,也使得用户能够直观地理解和评估模型的性能。
4.此外,系统还允许用户通过交互式操作进行更多的操作,比如保存结果、查询系统信息或通过特定的用户界面元素进行结果筛选和深入分析。用户可以随时启动或停止媒体的捕获和播放,完全掌控整个检测过程。通过这样高度灵活和响应的设计,我们的系统不仅仅是一个工具,更是一个与用户沟通的桥梁,让用户成为分析过程中的主导者。
整个系统设计的思路是以用户为中心,旨在提供一个全面、易用且高效的草莓成熟度检测工具。从用户启动程序的那一刻起,到最终的检测结果呈现,每一步都旨在创造出一个无缝的用户体验,这也正是我们设计这一系统的初衷。
5.2 登录与账户管理
在构建草莓成熟度检测系统时,我们充分考虑到了用户的个性化需求和数据安全性,因此设计了一个完备的用户登录与账户管理系统。该系统基于PySide6实现了用户界面,而后端数据存储则依赖于SQLite数据库,这一组合不仅保证了系统的轻量级和高效性,还确保了用户数据的安全可靠。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152628794-1927819806.png)
用户首次使用时,可以通过我们的注册界面轻松创建一个新账户,过程中需要填写基本信息并设置密码,同时还可以上传个人头像,使得用户体验更为个性化。注册后,用户可利用自己的账户信息登录系统,进入主界面开始草莓成熟度的检测工作。我们的系统提供了一个直观的操作界面,用户在进行检测的同时,还可以查看实时更新的检测框、类别以及置信度等关键信息。
账户管理方面,用户可以在登录状态下修改自己的密码,更新头像,甚至注销账户,所有这些操作都可以在用户界面中简单完成。这为用户提供了完整的个性化设置选项,可以根据个人偏好和需求定制系统设置,增强了用户对系统的控制感。
此外,我们的系统还支持多种输入源,包括图片、视频、实时摄像头捕获的画面以及批量文件输入。这些输入选项提供了极大的灵活性,使用户能够在各种场合下,便捷地进行成熟度检测。系统能够处理实时的数据流,并将检测结果实时记录下来,便于用户后续的查看和分析。
![](https://img2024.cnblogs.com/blog/1974721/202403/1974721-20240310152640805-1716153551.png)
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
![](https://img2024.cnblogs.com/blog/1974721/202402/1974721-20240223172556334-254454142.png)
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1tt421L7CK/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmZ5u
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubmphx
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZucmppx
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUk5Zq
在文件夹下的资源显示如下,下面的链接中也给出了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,复制离线依赖包至项目目录下进行安装,另外有详细安装教程:(1)Pycharm软件安装教程;(2)Anaconda软件安装教程;(3)Python环境配置教程;
离线依赖安装教程:https://www.bilibili.com/video/BV1hv421C7g8/
离线依赖库下载链接:https://pan.baidu.com/s/1y6vqa9CtRmC72SQYPh1ZCg?pwd=33z5 (提取码:33z5)
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8模型的草莓成熟度检测系统,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的草莓成熟度检测结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 779-788. ↩︎
Redmon J, Farhadi A. YOLO9000: better, faster, stronger[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2017: 7263-7271. ↩︎
Bochkovskiy A, Wang C Y, Liao H Y M. Yolov4: Optimal speed and accuracy of object detection[J]. arXiv preprint arXiv:2004.10934, 2020. ↩︎
Li C, Li L, Jiang H, et al. YOLOv6: A single-stage object detection framework for industrial applications[J]. arXiv preprint arXiv:2209.02976, 2022. ↩︎