摘要:开发水果新鲜程度检测系统对于提高农业产量和食品加工效率具有重大意义。本篇博客详细介绍了如何利用深度学习构建一个水果新鲜程度检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7、YOLOv6、YOLOv5的对比,展示了不同模型间的性能指标如mAP、F1 Score等的分析。文章深入讲解了YOLOv8算法的原理,提供了相应的Python代码、训练数据集,并封装成一个基于PySide6的美观UI界面。
系统能够精准地检测和分类图像中的水果新鲜程度,支持选择图片、图片文件夹、视频文件以及开启摄像头检测,包含热力图分析、标记框类别、类别统计、可调Conf、IOU参数、可视化结果显示等功能。另外,设计了基于SQLite数据库的用户注册登录管理界面、可点击按钮切换不同模型、可方便修改的UI界面。本文旨在为深度学习新手提供实用指南,完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:
文章目录
- 前言
- 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界面+训练数据集)
前言
在当今社会,随着人们生活水平的提升,对食品安全和品质的要求也日益增高。特别是在水果这一日常食品领域,新鲜程度直接关系到食品的营养价值和消费者的健康安全。然而,由于水果在采摘、运输和储存过程中极易受到物理损伤和微生物侵害,导致品质下降,不仅影响消费体验,还可能引起食品安全问题。因此,开发一种高效、准确的水果新鲜程度检测系统,对于保障食品安全、减少经济损失具有重要的研究意义和应用价值。
随着人工智能技术的快速发展,尤其是深度学习在图像处理领域的广泛应用,为水果新鲜程度的非破坏性检测提供了新的解决方案。随着YOLO(You Only Look Once)系列目标检测算法的出现和发展,已经提出了更高效、更精准的目标检测工具。从最早的YOLO1,到YOLO90002,再到YOLOv43,YOLOv5等,这一系列的发展都在推动着目标检测技术的进步。
改进的YOLOv84算法引入了一种新的注意力机制,能够更准确地聚焦于水果的关键特征,如颜色、形状和纹理。这一改进通过动态调整网络权重,显著提高了对于不同类型和成熟度水果的识别率。此外,YOLOv8在处理速度上也有所优化,通过引入更高效的网络结构设计,实现了更快的检测速度,使其能够满足实时检测的需求。
数据集的建立和更新对于提高模型性能同样至关重要。近期,有研究团队构建了一个大规模的水果图像数据集,该数据集包含了从成熟到腐烂各个阶段的水果图片,为模型训练提供了丰富的数据资源。这一数据集的发布极大地促进了水果新鲜程度检测算法的研究和发展。
基于图卷积网络(GCN)和深度学习的水果新鲜程度检测方法。该方法首次将GCN应用于水果图像的特征提取,通过建模水果表面特征之间的复杂关系,有效提取了水果新鲜程度的关键指标。这种方法在多个公开的水果图像数据集上展示了优异的性能,尤其是在处理有明显缺陷或病害的水果图像时,展现了比传统CNN方法更高的准确性。
面对未来,水果新鲜程度检测技术仍面临诸多挑战。如何进一步提高检测的准确率、如何处理复杂背景下的检测问题、如何减少模型的计算资源消耗等,都是未来研究的重点方向。同时,随着物联网技术的发展,将这些高效的检测模型集成到智能农业生产和供应链管理系统中,实现实时监控和自动化管理,将会是未来发展的一个重要趋势。
本博客通过详尽地探讨YOLOv8算法在水果新鲜程度检测系统中的应用,为相关领域的研究者和技术实践者提供了一份宝贵的资源和深入的见解。本文的贡献不仅体现在采用先进的深度学习算法进行精确检测,还在于为读者呈现了一个结合了技术深度与实用性的全面研究。具体贡献如下:
- 采用最先进的YOLOv8算法:本研究通过采用YOLOv8算法,展现了在水果新鲜程度检测系统中相较于YOLOv75、YOLOv66、YOLOv5等早期版本的显著优势。YOLOv8不仅在检测速度和准确性上有所提升,而且在处理复杂场景和多种水果类型的检测上显示出更强的鲁棒性。本文深入解析了YOLOv8的算法原理,包括其架构的创新点、使用的技巧、以及在特定数据集上的表现,为读者提供了一个关于如何有效利用最新目标检测技术的实例。
- 利用PySide6实现的用户界面:通过使用PySide6库,本文展示了如何开发一个既美观又用户友好的水果新鲜程度检测系统界面。这一进步不仅使得系统的操作变得更加直观和便捷,而且大大降低了用户使用门槛,使得非专业人士也能轻松进行高精度的水果新鲜程度检测。
- 系统登录管理功能:本文设计并实现了一个安全的登录管理功能,确保了系统使用的安全性和个性化。这一功能不仅保护了用户的隐私,还为将来添加更多个性化服务和功能奠定了基础。
- 对YOLOv8模型的深入研究和性能评估:本文不仅介绍了YOLOv8算法的基本原理和应用,还对其性能进行了全面的评估,包括精确度、召回率以及在不同环境条件下的表现。这一部分的内容为读者深入理解YOLOv8算法的性能特点和应用范围提供了宝贵的信息,同时也为未来的算法优化和改进提供了实验数据和分析基础。
- 提供完整的数据集和代码资源包:为了促进学术共享和技术传播,本文提供了完整的数据集和代码资源包,使得读者可以轻松复现本研究的实验结果,并在此基础上进行进一步的研究和开发。这些资源的提供,大大降低了其他研究者和开发者在相同或相似项目中的工作量,有助于推动水果新鲜程度检测领域的技术进步和应用拓展。
1. 数据集介绍
在这个博客章节中,我们将详细介绍为水果新鲜程度检测系统构建的专用数据集。本研究精心构建了一个由1974张图像组成的数据集,这些图像被细致地划分为训练集(1326张)、测试集(211张)和验证集(437张)。这样的分布确保了模型在学习过程中能接触到足够的数据样本,并且能够通过独立的测试集和验证集对模型性能进行客观评估。
在预处理步骤中,我们对图像进行了自动方向校正,并剥离了EXIF信息中的方向属性,这一步骤对于来自不同设备的图像尤为关键,因为它消除了因设备差异而产生的方向偏差。接下来,所有图像都被统一调整到640x640像素的尺寸,采用了拉伸方法以适配算法的输入要求。虽然这种处理可能会造成一定程度的形状失真,但考虑到YOLOv8算法的容错性,这种失真对于模型的性能影响是可控的。
数据集的标签和类别信息经过精心设计,以反映各种水果在不同成熟度阶段的状态。这些类别标签是训练过程中的关键,它们使得模型能够学习并区分不同水果及其新鲜程度,这对于最终系统的实用性和可靠性至关重要。
通过对数据集分布的分析,我们可以观察到类别分布的不均匀性。如直方图所示,某些类别的样本数量远多于其他类别。这可能意味着模型在训练时对于样本多的类别能够学习得更充分,但也可能导致模型对于样本少的类别过拟合或识别能力不足。针对这一点,可能需要采取一些平衡技术,如数据增强或过采样,以提高模型在所有类别上的表现。
目标检测的边界框分布图展示了标注框在图像中的位置集中趋势。大多数对象的中心似乎聚集在图像的中间区域,这可能是由于在拍摄水果图像时的自然倾向。同时,我们也看到宽度和高度的分布,这为理解不同对象尺寸的变化提供了视角。这些分布信息对于调整检测算法中锚框的大小和比例具有指导意义。博主使用的类别代码如下:
Chinese_name = {"Apple Fresh": "新鲜苹果", "Apple Rotten": "腐烂苹果", "Apple Semifresh": "半熟苹果",
"Apple Semirotten": "半腐烂苹果", "Banana Fresh": "新鲜香蕉", "Banana Rotten": "腐烂香蕉",
"Banana Semifresh": "半熟香蕉", "Banana Semirotten": "半腐烂香蕉",
"Mango Fresh": "新鲜芒果", "Mango Rotten": "腐烂芒果", "Mango Semifresh": "半熟芒果",
"Mango Semirotten": "半腐烂芒果", "Melon Fresh": "新鲜瓜类", "Melon Rotten": "腐烂瓜类",
"Melon Semifresh": "半熟瓜类", "Melon Semirotten": "半腐烂瓜类",
"Orange Fresh": "新鲜橙子", "Orange Rotten": "腐烂橙子", "Orange Semifresh": "半熟橙子",
"Orange Semirotten": "半腐烂橙子", "Peach Fresh": "新鲜桃子", "Peach Rotten": "腐烂桃子",
"Peach Semifresh": "半熟桃子", "Peach Semirotten": "半腐烂桃子",
"Pear Fresh": "新鲜梨子", "Pear Rotten": "腐烂梨子", "Pear Semifresh": "半熟梨子",
"Pear Semirotten": "半腐烂梨子", "Ripe_Grape": "成熟葡萄", "Unripe_Grape": "未成熟葡萄"}
在综合考虑了数据集的规模、预处理步骤以及类别和边界框分布之后,我们可以得出结论,该数据集是一个全面且精心构建的资源,旨在支撑我们的水果新鲜程度检测系统。通过这个数据集,我们可以训练出一个能够识别和分类不同种类和新鲜程度的水果的强大模型,为实现自动化、高效、准确的水果质量监控提供坚实的基础。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行水果新鲜程度检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8\YOLOv5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法的原理在其深度学习架构的细节中体现得淋漓尽致,每个组成部分都为实现更精确、更快速的目标检测做出了贡献。ELAN网络结构的使用,提供了更高效的特征信息整合,这在某种程度上借鉴了特征金字塔网络(FPN)和路径聚合网络(PAN)的概念。这些网络能够有效地整合不同分辨率的特征图,增强了对于多尺度目标的识别能力,这对于检测不同大小的水果至关重要,尤其是当它们在图像中以不同的角度和距离出现时。
Distribution Focal Loss作为YOLOv8的创新点之一,它是对原始的Focal Loss的扩展。Focal Loss主要用于解决类别不平衡的问题,通过降低大量易分类样本的损失贡献,使得模型能够更多地关注那些难以分类的样本。而Distribution Focal Loss进一步优化了这一概念,它不仅关注于不同类别间的平衡,还专注于难易分类样本内部的平衡,以实现更精细的损失调整。
在YOLOv8中,锚框的概念得到了优化,通过引入TaskAlignedAssigner,算法能够更智能地分配锚框给合适的目标。这与传统的锚框(Anchor Boxes)分配策略不同,后者通常是基于固定的尺寸和比例,而TaskAlignedAssigner则提供了一种动态的分配机制,这有助于模型更精确地预测实际的目标框。在优化锚框策略的同时,YOLOv8还针对不同尺寸的目标引入了更为精细的特征学习策略。它通过调整不同尺寸目标的学习重点,来确保模型能够对小目标和大目标都有良好的检测性能。这对于水果新鲜程度检测系统来说尤其重要,因为系统需要能够准确识别从小草莓到大西瓜等各种尺寸的水果。
另一方面,Distribution Focal Loss为YOLOv8带来了另一项创新。与传统的Focal Loss不同,它不仅关注于区分正负样本,而且还关注于正样本的概率分布。通过调整模型预测的概率分布,使其更接近实际的目标分布,从而减少了模型在学习中的不确定性,并增强了模型对不同类别目标的区分能力。
此外,YOLOv8还引入了新颖的损失函数,例如Distribution Focal Loss,这种损失函数针对类别不平衡的问题进行了优化,通过调整损失值的分布,使得模型在训练过程中对小类别的目标给予更多的关注,从而提高了模型在实际应用中对于稀有目标的识别准确率。在YOLOv8中,每个预测的边界框都会包含目标的位置信息和类别概率,这是通过网络的最后一层来实现的,该层输出一个三维的张量,其中包含了边界框的坐标、对象置信度以及各类别的概率。YOLOv8通过这种紧凑的输出方式,大幅提升了检测的速度,同时也确保了较高的准确度。
总之,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/178.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算法,通过编写一系列精细的Python代码来训练我们的模型。这不仅涉及模型的初始化和参数设置,还包括对训练数据的准备和预处理。
首先,我们导入了必要的模块和库。os 和 yaml 用于操作文件和解析配置文件,而 YOLO 类是我们的模型核心,它来自 ultralytics 库,一个广受欢迎的开源库,用于训练和部署YOLO模型。我们还引入了一个自定义的 abs_path 函数,用于处理文件路径,确保无论在哪种操作系统上都能正确找到数据集和权重文件的路径。
import os
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
接着,我们定义了数据集的名称和配置文件的路径。为了使路径跨平台兼容,我们将路径转换为UNIX风格,这在不同的操作系统中保持了一致性。然后,我们读取了YAML配置文件,它包含了数据集的重要信息,如类别标签和图像路径。我们还更新了配置中的 path 键,以确保它指向正确的目录路径。
data_name = "Ripeness"
data_path = abs_path('datasets/Ripeness/ripeness.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
# 获取目录路径
directory_path = os.path.dirname(unix_style_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模型的实例,指定了预训练权重和任务类型。通过 model.train() 函数,我们开始了训练过程,指定了数据集配置文件、计算设备、工作进程数、图像大小、训练周期和批次大小等参数。我们还为训练任务指定了一个唯一的名称,这有助于在后续的过程中追踪和区分不同的训练实验。
workers = 1
batch = 8
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='0', # 指定使用CPU进行训练
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='0', # 指定使用CPU进行训练
workers=workers, # 指定使用2个工作进程加载数据
imgsz=640, # 指定输入图像的大小为640x640
epochs=100, # 指定训练100个epoch
batch=batch, # 指定每个批次的大小为8
name='train_v8_' + data_name # 指定训练任务的名称
)
整个代码块的设计显示了一个明确的训练流程:从数据准备到模型初始化,再到训练过程的执行。每一步都紧密相扣,确保了模型训练的稳健性和高效性。
在深度学习模型的训练过程中,损失函数的趋势和最终评价指标是评估模型性能的关键。通过对YOLOv8模型训练过程中的各项损失和性能指标的分析,我们可以深入理解模型的学习效果和优化空间。
首先,让我们从损失函数谈起。损失函数图通常被用来衡量训练过程中模型输出与真实值之间的偏差。我们看到,随着训练轮数的增加,训练集上的盒子损失(box_loss)、分类损失(cls_loss)和分布式焦点损失(dfl_loss)都有了显著的下降趋势,这表明模型在辨别目标物体的位置、识别类别以及处理难易样本上的表现越来越好。验证集上的损失也表现出下降趋势,尽管波动性更大,这是正常的现象,因为验证集上的数据模型未曾见过,波动性反映了模型对新数据的适应能力。
接下来,我们分析精度(precision)和召回率(recall)。精度是指模型正确预测的正样本占所有预测为正样本的比例,而召回率则衡量模型正确预测的正样本占所有实际正样本的比例。训练过程中,这两个指标在初始阶段迅速提升,随后稳定在较高水平,这说明模型的预测准确性和覆盖范围都达到了较好的水平。
对于平均精度(mAP),我们可以看到它分为两个级别:mAP@0.5和mAP@0.5-0.95。mAP@0.5考虑的是IoU(交并比)阈值为0.5时的表现,而mAP@0.5-0.95则是在0.5到0.95的不同IoU阈值上的平均表现。IoU是预测边界框和真实边界框重合度的评价指标。在这里,mAP@0.5保持在较高水平,显示了模型对于重叠较多的预测框有很好的识别能力;而mAP@0.5-0.95也随着训练逐步上升,表明模型在不同程度的边界框匹配标准下都表现出了良好的检测能力。
F1得分是一个重要的统计指标,用于衡量模型的精确度和召回率的平衡,特别是在数据集类别分布不均时。它是精确度和召回率的调和平均数,最高可能的F1得分为1(完美精确度和召回率),最低可能为0。通常,随着置信度阈值的增加,精确度会上升而召回率下降,F1得分则反映了这两个指标之间的平衡。
图中的F1-置信度曲线显示了在多个类别上模型预测置信度与F1分数之间的关系。每条细线代表一个类别的F1分数随置信度阈值变化的曲线,而粗蓝线则表示所有类别的平均F1分数。通常情况下,当置信度阈值提高时,模型的精确度会增加,因为模型只会在更加确信的情况下进行预测。然而,同时召回率可能会下降,因为模型可能会错过一些正确的预测。理想的曲线是在高精确度和高召回率之间取得平衡,从而达到较高的F1分数。
在图中可以看到,大多数类别的F1分数都在不同置信度阈值下变化,而平均曲线(粗蓝线)显示,在大约0.476的置信度阈值时,所有类别的平均F1分数达到了一个高点,大约是0.75。这表明模型在这一阈值下取得了预测的最佳平衡,既保证了相对较高的精确度又保持了可接受的召回率。换句话说,将置信度阈值设置为0.476时,模型在区分不同水果的新鲜程度时的综合性能是最佳的。
然而,我们也可以注意到,曲线在阈值较低时开始迅速上升,这意味着在较低的置信度阈值下,模型可能过于激进地标记正样本,导致许多错误的预测。随着阈值的增加,曲线逐渐趋于平稳,并在一个点达到最大值后开始下降。这个下降表明随着阈值继续增加,模型变得过于保守,错过了许多正确的预测,从而降低了召回率。
总结来说,通过分析F1-置信度曲线图,我们可以了解模型在不同置信度阈值下的性能变化,并确定一个最佳阈值,以便于在实际应用中取得最佳的预测效果。
4.3 YOLOv5、YOLOv6、YOLOv7和YOLOv8对比
(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是精确率(Precision)和召回率(Recall)的调和平均值。精确率是指模型正确识别的正例与所有识别为正例的案例之比,而召回率是指模型正确识别的正例与所有实际正例之比。F1-Score对于不平衡的数据集或者需要同时考虑精确率和召回率的任务特别重要。
- mAP(Mean Average Precision):mAP是衡量模型在多个类别上平均检测准确度的指标。它计算了模型在所有类别上的平均精度,是目标检测领域中常用的性能度量。
名称 | YOLOv5nu | YOLOv6n | YOLOv7-tiny | YOLOv8n |
---|---|---|---|---|
mAP | 0.826 | 0.815 | 0.782 | 0.813 |
F1-Score | 0.77 | 0.74 | 0.71 | 0.75 |
(3)实验结果分析:
本次实验,我们采用了两个核心指标:mAP和F1-Score,对YOLO系列的四个不同版本进行了对比分析。这些版本分别是YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n。mAP指标反映了模型对于不同置信阈值下的平均精确度,而F1-Score则综合考虑了模型的精确度和召回率,两者共同为我们提供了模型性能的全面视图。
在mAP指标上,YOLOv5nu以0.826的得分位居首位,其高分可能源于模型的结构和特征提取能力,这使得它在检测多变尺寸的水果时具有较高的准确性。相较之下,YOLOv6n和YOLOv8n的mAP分别为0.815和0.813,它们的表现相对接近,表明这些新一代的模型在保持精度的同时,可能更注重于速度或者其他性能指标的优化。YOLOv7-tiny的mAP为0.782,相对较低,这可能是因为作为一个“tiny”版本,它在模型尺寸和计算效率上做了妥协,牺牲了一定的准确度以换取更快的运行速度,这在计算资源有限的应用场景中是有利的。
当我们转向F1-Score,YOLOv5nu同样以0.77的得分显示了其在精确度和召回率上的良好平衡,这意味着它不仅能够准确地标记出水果的新鲜程度,还能够捕捉到大部分的正样本。YOLOv8n的F1-Score为0.75,表现出色,这可能得益于它在处理类别不平衡和复杂场景中的优化。而YOLOv6n和YOLOv7-tiny的F1-Score略低,这可能是由于这些模型在处理本项目中的特定类型的数据或特定场景下的表现有限。
综合以上分析,YOLOv5nu在这项任务中展现了较为全面的优势,这可能得益于其均衡的模型结构和对数据集特性的良好适应性。而YOLOv8n虽然在mAP上略逊一筹,但其F1-Score的表现依然强劲,显示了其作为最新版本的模型,在保持准确度的同时,也许在其他方面如推断速度或模型大小上做了优化。YOLOv6n和YOLOv7-tiny在某些特定场景或特定任务中可能更加合适,例如在对速度要求较高或计算资源受限的环境中。因此,在选择模型时,我们应该基于具体任务的需求和资源的可用性来做出决策。
4.4 代码实现
在这一节中,我们将深入探讨如何使用深度学习模型YOLOv8实时检测水果的新鲜程度。为了达到这一目的,我们需要建立一个能够处理视频流并实时显示结果的系统。在这个过程中,我们编写了一段精细的Python代码,用于实现从摄像头获取视频流、利用YOLOv8进行目标检测,以及将结果展示在用户界面上。
(1)引入必要的库
首先,代码的核心是建立一个主窗口界面,该界面可以实时显示摄像头捕获的图像,并在图像上叠加检测结果。我们通过PySide6库构建GUI,并使用QtFusion的MediaHandler类来处理视频流,这个类能够以高帧率捕获视频,并且发送信号以便在新的帧准备就绪时进行处理。
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类,用于物体检测
QF_Config.set_verbose(False)
(2)设置主窗口
在 MainWindow 类中,我们为窗口设置了尺寸,并创建了一个QLabel来显示图像。为了让用户能够交互,我们定义了键盘事件处理,当用户按下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() # 关闭窗口
(3)图像帧处理
接下来,我们定义了 frame_process 函数,这个函数是视频流处理的核心。每个捕获的帧都会被传递到这个函数中,它先调整图像大小以适应界面,然后使用预加载的YOLOv8模型对图像进行预测。我们使用自定义的函数 drawRectBox 来在图像上绘制检测到的边界框和类别标签。在处理函数中,我们还计算并打印出了处理每帧所需的时间,这对于评估系统性能至关重要。此外,我们使用 dispImage 方法将处理后的图像显示在主窗口的标签上。为了使检测结果直观且易于理解,我们定义了一个颜色列表 colors,每个类别对应一个颜色。通过 get_cls_color 函数获取颜色,我们能够以不同颜色突出显示不同类别的检测结果。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred, superimposed_img = 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)水果新鲜程度检测
最后,我们初始化YOLOv8检测器并加载了预训练的权重。创建了应用程序和主窗口实例,并将视频处理器与 frame_process 函数连接起来,确保每一帧视频都能被处理。随后,我们启动视频流处理,并显示主窗口,进入主事件循环。
cls_name = ["新鲜苹果", "腐烂苹果", "半熟苹果", "半腐烂苹果", "新鲜香蕉", "腐烂香蕉", "半熟香蕉", "半腐烂香蕉",
"新鲜芒果", "腐烂芒果", "半熟芒果", "半腐烂芒果", "新鲜瓜类", "腐烂瓜类", "半熟瓜类", "半腐烂瓜类",
"新鲜橙子", "腐烂橙子", "半熟橙子", "半腐烂橙子", "新鲜桃子", "腐烂桃子", "半熟桃子", "半腐烂桃子",
"新鲜梨子", "腐烂梨子", "半熟梨子", "半腐烂梨子", "成熟葡萄", "未成熟葡萄"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/ripeness-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
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())
通过上述介绍,我们不仅展示了代码的功能和如何组织实现,还突出了YOLOv8模型在实时图像处理中的应用。这些代码段的结合为我们的水果新鲜程度检测系统提供了强大的后台支持,确保了系统可以准确、高效地运行。
5. 水果新鲜程度检测系统实现
在实现一款实时水果新鲜程度检测系统时,系统设计思路的核心在于打造一个集成化、高效且用户友好的交互平台。为了实现这个目标,我们的设计理念以可用性和技术的先进性为基础,紧密结合了界面友好度、处理效率和准确性三大核心要素。
5.1 系统设计思路
MainWindow类的设计采纳了模块化的思想,确保了各个组件——无论是图像处理部分、用户交互界面,还是深度学习模型——都能独立运作,同时又能协同工作,共同完成复杂的水果新鲜程度检测任务。这种设计不仅提高了系统的灵活性和可维护性,也使得将来的升级和功能扩展变得更加容易。
架构设计
我们的系统设计遵循了经典的MVC(Model-View-Controller)架构模式,将应用程序划分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),分别对应我们的处理层、界面层和控制层。
- 处理层(Processing Layer):处理层是系统的技术核心,它利用YOLOv8Detector类实现的先进深度学习模型,对捕获到的视频流进行实时分析,以识别和分类不同新鲜程度的水果。这一层的设计关注于算法的性能优化,确保检测过程既准确又迅速。
- 界面层(UI Layer):界面层是用户与系统互动的桥梁。在这一层,我们注重用户体验的设计,通过图形用户界面提供直观的操作和反馈。界面上的元素不仅需要简洁易用,还需要能够清晰地展示检测结果,让用户能够一目了然地了解水果的状态。我们利用现代UI设计理念,确保操作的流畅性和界面的美观性。
- 控制层(Control Layer):控制层则是整个系统的指挥中心,它负责响应用户的输入,控制数据流向和处理流程。通过精心设计的槽函数和事件处理机制,控制层管理着从用户输入到模型预测再到结果展示的全过程。这一层的设计考虑了系统的响应时间和稳定性,以确保在连续的操作中保持高效和准确。
整个系统的设计采用模块化思想,各个层次之间通过明确定义的接口和协议进行通信,这样既保证了系统组件的独立性,也保证了整个系统的协同工作效率。我们通过细致的测试和用户反馈,不断优化系统的性能和用户体验。
系统流程
我们将深入了解系统的工作流程,这是确保用户能够高效且准确地检测水果新鲜程度的关键。从启动应用程序到展示最终检测结果,每一步都经过精心设计,以提供最佳的用户体验和检测性能。以下是水果新鲜程度检测系统的工作流程:
- 用户在启动应用程序后,系统立即实例化MainWindow类,这个类不仅负责渲染用户界面,还初始化了所有必要的参数,确保用户可以毫不迟疑地开始他们的操作。这个主窗口就是用户与系统交互的中心枢纽,通过它,用户可以选择不同的输入源来开始新鲜程度的检测任务。
- 用户界面的设计简洁直观,无论是实时摄像头捕获的图像,还是已录制的视频文件,亦或是静态图片,用户都可以轻松选择。这一选择的自由度为用户提供了极大的便利,使得系统不仅限于单一的使用场景。输入源一经确定,系统即调用媒体处理器和相关方法对数据进行处理,包括摄像头的配置、视频文件的读取或图像文件的加载。
- 随后,系统进入到连续帧处理的关键阶段。每一帧图像首先经过预处理,包括调整图像尺寸、色彩空间转换等,以符合YOLO模型的输入要求。接着,这些图像被送入经过精心训练的YOLOv8模型中,模型准确地检测出水果的位置并识别其新鲜程度。得益于YOLOv8的高效性,这一过程几乎在实时完成,保证了用户能够即时获得反馈。
- 系统界面的实时更新设计是为了确保用户能够直观地观察到检测的结果。检测框的绘制和类别的标注在界面上清晰展示,同时,相关的检测统计数据也通过表格或图表形式呈现。这些实时更新的视觉元素增强了系统的交互性,并提供了即时的反馈,使用户能够迅速做出决策或调整策略。
- 我们的系统还为用户提供了丰富的交互操作选项。用户可以保存检测结果,以备后续分析或报告。系统的帮助菜单提供了对作者和版本信息的查询,而筛选功能则允许用户专注于特定类别的检测结果,进一步分析和探索数据。除此之外,媒体控制功能也使得用户可以随时启动或停止媒体流,无论是摄像头的实时捕捉还是视频的播放,都可以自如控制。
水果新鲜程度检测系统的的系统设计理念是以用户为中心,通过高效的处理层、直观的界面层以及灵活的控制层,使得用户可以在无缝的交互体验中完成从图像捕获到新鲜程度检测的全过程。这不仅体现了技术的先进性,更展示了我们对用户需求的深刻理解和承诺。
5.2 登录与账户管理
在当前的数字化时代,对于任何智能系统来说,账户管理和个性化体验已经成为用户界面设计中不可或缺的一部分。我们的水果新鲜程度检测系统充分认识到这一点,因此特别设计了一套完善的用户登录与账户管理功能,以增强用户体验并提供更多的个性化选项。
利用PySide6强大的跨平台特性和SQLite数据库的轻量级优势,我们构建了一个简洁而直观的用户登录界面。这个界面不仅为首次使用系统的用户提供了注册选项,还为已注册用户提供了一系列的账户管理工具,包括密码修改、头像设置、账户注销等。这些工具的设计考虑到了用户操作的便捷性与安全性,确保了用户能够在一个安全的环境中管理自己的个人信息。
注册和登录功能是用户进入系统的第一步。一旦登录,用户就可以进入主界面,开始使用水果新鲜程度检测的各项功能。我们的系统支持多种输入源,用户可以上传图片、视频文件,或直接从实时摄像头进行捕获,系统还支持批量文件处理,以便用户能够高效地进行大规模的水果新鲜程度检测。
用户在使用过程中的所有检测记录和设置都与其账户绑定,这意味着用户可以随时返回系统,查看或继续之前的工作。个性化的头像设置和账户信息都是为了增强用户的归属感,让每个用户都感到系统是为他们量身打造的。
通过这些设计,我们的水果新鲜程度检测系统不仅能够实现复杂的深度学习模型导入,完成对多种水果新鲜程度的识别和检测,而且还能够提供一个高度个性化和安全的用户环境。系统主界面中实时显示的检测框、类别和置信度信息,以及账户管理界面中的多项功能,共同构成了一个功能强大、用户友好的智能检测平台。这样的系统设计不仅满足了用户在实时目标检测场景下的需求,也提升了用户的整体使用满意度,使得水果新鲜程度检测系统不仅是一款技术产品,更是一个能够理解和服务于用户的智能伙伴。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Yj421Z7ov/
在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时水果新鲜程度检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的水果新鲜程度检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
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. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎
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. ↩︎
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. ↩︎