摘要:本研究详述了一种采用深度学习技术的番茄新鲜程度检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别番茄新鲜程度检测。文章深入阐述了YOLOv8算法的机理,并附带了Python语言的实现代码、所需训练数据集,以及基于PySide6框架构建的用户界面(UI)。此外,系统还融合了SQLite数据库的用户管理功能,实现了一键切换YOLOv5/v6/v7/v8模型的便捷操作,以及提供了界面的自定义修改选项。本文目的是为番茄新鲜程度检测领域的研究人员以及深度学习初学者提供实用指导和资源。完整的代码库和数据集可通过文末提供的链接进行下载。本文结构如下:
文章目录
- 前言
- 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系列算法因其出色的实时检测能力而被广泛应用于农产品品质检测中。特别是最新版本的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设计友好的用户界面:本文详细介绍了如何使用PySide6库开发了一个直观、易用的用户界面,极大地提高了番茄新鲜程度检测系统的可访问性和用户体验。这一进步不仅使得非专业用户也能轻松进行高精度的番茄品质检测,同时也为YOLOv8算法在农业和食品工业领域的实际应用铺平了道路。
3.集成登录管理功能,提升系统安全性:本系统设计了登录管理功能,确保了使用过程的安全性和数据的保密性。这一措施不仅增强了系统的专业性,也为将来引入更多个性化服务和功能奠定了基础。 - 深入研究YOLOv8模型,优化检测性能:本文不仅介绍了YOLOv8算法的基本原理和应用过程,还对其性能进行了全面评估,包括精准度、召回率等关键指标的分析。此外,通过在不同环境和条件下测试模型,进一步验证了YOLOv8的稳定性和鲁棒性,为算法的优化和改进提供了有力的支持。
- 分享完整的数据集和代码资源:为了让读者能够更好地理解和应用YOLOv8算法在番茄新鲜程度检测中的操作,本文提供了一套完整的数据集和代码资源包。这不仅便于读者复现研究结果,更为进一步的研究和系统开发提供了实用的基础。
1.数据集介绍
在我们的最新研究项目中,我们专注于开发一套创新的番茄新鲜程度检测系统。这一系统旨在通过深度学习模型自动化地评估番茄的新鲜度,从而为食品质量控制提供一种快速、准确的方法。为了实现这一目标,我们精心构建了一个大规模的目标检测数据集,总共包含8931张图像,细分为6238张训练图像、1795张验证图像和898张测试图像。这一数据集的设计考虑到了现实世界中复杂多变的条件,以确保模型在各种不同环境下均能表现出色。
数据集的图片来源于多样化的场景,其中不乏室内、室外、不同光照条件下的图像,旨在模拟真实世界中的各种情况。图像中的番茄以不同的成熟度出现,且每一实例均有精确的标注框,辅以标签信息以指示其类别。为了让模型能够准确区分新鲜和不新鲜的番茄,我们特别标注了两类对象——新鲜番茄和腐烂番茄,分别用于训练模型的识别与分类能力。
在预处理阶段,所有图像均经过了标准化处理,这是为了保证输入到模型中的图像数据在大小和比例上的一致性。为了提高模型的泛化能力和鲁棒性,我们还对数据集实施了一系列的数据增强操作,包括随机旋转、缩放、剪裁和颜色调整。这些技术不仅增加了数据的多样性,还帮助模型学习到在现实环境中可能遇到的图像变化。
为了全面了解我们的数据集分布,我们进行了详细的统计分析。数据集分布图展示了新鲜与腐烂番茄的实例数量,以及这些实例在图像中的相对大小和位置分布。图中明显显示,新鲜番茄的实例数超过了腐烂番茄,这可能对模型的训练产生影响,因为模型在处理不平衡数据时可能会偏向于多数类。为了应对这一挑战,我们考虑了采用各种技术如数据重采样或生成对抗网络来增加少数类的样本数量,以平衡类别分布。
在分布图的下方,我们可以观察到对象中心点位置的分布情况,它们均匀分布在图像的各个位置。这意味着无论番茄在图像中的位置如何变化,模型都有很高的可能性学会识别。同时,对象的大小分布图显示了一个集中的趋势,大多数的番茄呈现中等尺寸,这可能会导致模型对特定大小范围内的番茄检测更为敏感。因此,未来在数据收集时,我们将特别关注尺寸多样性,确保模型能够识别不同大小的番茄。
每张图像都附带了详细的标签信息,这些标签定义了番茄的不同新鲜程度类别。我们根据番茄的外观、色泽、坚实度等特征,将它们分成了几个类别,每个类别都有一个唯一的标签。这些类别标签作为监督信号,在训练过程中指导模型准确识别和分类图像中的番茄。博主使用的类别代码如下:
Chinese_name = {"0": "0", "1": "1", "Fresh Tomato": "新鲜番茄", "Rotten Tomato": "腐烂番茄", "object": "物体"}
总而言之,我们的数据集是为高效和准确的番茄新鲜程度检测而精心设计的,其多样化的图像场景、详尽的标签信息、以及均衡的对象位置和大小分布,都为深度学习模型的。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行番茄新鲜程度检测的图片或视频,或者启动摄像头进行实时检测。在进行番茄新鲜程度检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8算法是目前先进的目标检测框架之一,其设计理念在于通过高效的网络结构实现快速而精准的目标检测。YOLOv8的网络架构采用了Neck和Head的分离设计,这意味着特征提取(Backbone)和目标检测(Head)两个过程被明确区分,从而优化了每个部分的性能。
在特征提取阶段,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)
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('datasets/TomatoDisease/tomato.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 = "TomatoDisease"
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模型进行训练的过程中,我们通过监控不同的损失函数和性能指标来评估模型的学习进度和性能。损失函数的变化趋势和最终的精确度评估对于理解模型的性能至关重要。本文将对训练过程中损失函数和性能指标的变化进行深入分析。
首先,从训练和验证的损失图像中,我们可以看到,随着训练次数的增加,模型的框损失(box_loss)、类别损失(cls_loss)和目标损失(obj_loss)整体呈现出下降趋势。这表明模型在学习过程中逐渐优化了对目标位置、类别和存在性的预测。在初始阶段,损失值下降较快,随着训练的进行,损失下降速度减缓,逐渐趋于平稳,显示出模型正在收敛。值得注意的是,在验证集上的损失波动性较大,这可能是由于模型在遇到验证集中较少见样本时的泛化能力不足造成的。
在评价指标方面,精度(precision)和召回率(recall)是判断模型性能的两个关键指标。在本次训练中,精度从一开始就迅速提升并保持在较高水平,这意味着模型能够准确地预测出目标对象的存在。同时,召回率经历了一个稳定上升的过程,表明模型对于数据集中目标对象的检测能力在不断提高,能够找到更多正确的目标。
平均精度(mAP)是另一个综合评估模型性能的重要指标,尤其是mAP@0.50(IOU=50%)和mAP@0.50-0.95(在IOU从50%到95%的范围内计算平均精度)。我们可以看到这两个指标随着训练的进行都表现出稳定的增长趋势,这表明模型对于不同大小和不同交叉并集比例下的目标检测均有良好的表现。mAP的稳步提升也意味着模型的整体性能在训练过程中持续改善。
在评估机器学习模型,尤其是目标检测模型的性能时,F1分数是一个重要指标,因为它综合考虑了模型的精确度和召回率。F1分数是精确度和召回率的调和平均,能够平衡两者之间的关系。理想的情况是,模型能够同时拥有高精确度和高召回率,但在实际情况中,通常需要在两者之间做出权衡。
从F1-Confidence曲线图中,可以观察到,随着置信度(Confidence)阈值的增加,F1 Score先增加后减少,这表明在一定的置信度区间内,模型的预测精确率和召回率达到了较好的平衡。对于新鲜番茄和腐烂番茄两个类别,F1 Score曲线都呈现了这种趋势,但两者的峰值出现在不同的置信度水平上,这可能是由于两个类别的样本数量、样本难度或者特征分布的不同造成的。
具体来看,曲线中显示“all classes F1 score”在置信度大约0.133时达到峰值0.42。这个最高点代表了模型对所有类别的综合分类性能的最佳平衡点。新鲜番茄类别的F1 Score在置信度较低时迅速上升并保持在较高水平,这表明对于新鲜番茄,即使模型的预测置信度不是特别高,它也能保持较好的分类效果。另一方面,腐烂番茄的F1 Score在置信度增加时提升得较慢,这可能意味着模型需要更高的置信度才能准确地分类腐烂番茄。
另外值得注意的是,在置信度接近1的极端情况下,所有类别的F1 Score都迅速降低,这通常意味着模型过于自信,只有当模型对其预测非常确定时才会进行分类,这导致了很多实际的正样本被错过,即召回率降低。在实际应用中,我们需要根据具体情况选择一个适当的置信度阈值,以确保模型既不会错过太多正样本,也不会产生过多的误判。
总体来看,YOLOv8在训练过程中表现出了良好的学习效果。损失函数的下降以及评价指标的提升均说明了模型在提高对番茄新鲜程度检测的识别能力方面取得了积极进展。然而,训练和验证损失之间的波动也提示我们需要继续监控模型以防过拟合,并可能需要通过调整训练策略来进一步提升模型在验证集上的表现,确保模型在实际应用中的鲁棒性和准确性。通过这种详细的分析,我们可以对模型的训练进程和最终性能有一个清晰的认识,并为未来的改进提供方向。
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.378 | 0.399 | 0.366 | 0.378 |
F1-Score | 0.41 | 0.42 | 0.41 | 0.42 |
(3)实验结果分析:
图表显示了在相同数据集上,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四种模型的mAP(平均精度)和F1-Score(F1分数)的比较结果。通过对这些性能指标的直观展示,我们可以对每个模型的性能有一个清晰的认识。
在平均精度方面,YOLOv6n以0.399的mAP表现最佳,紧随其后的是YOLOv5nu和YOLOv8n,这两者在mAP上的表现相同,均为0.378。相比之下,YOLOv7-tiny的表现略显逊色,其mAP为0.366。这一结果可能反映出YOLOv6n在处理我们的数据集时对目标的检测能力较强,可能得益于其算法改进和优化细节。
在F1分数方面,YOLOv6n和YOLOv8n共同领先,均达到0.42,而YOLOv5nu和YOLOv7-tiny则稍低,都为0.41。F1分数是精确率和召回率的调和平均,因此这一结果意味着YOLOv6n和YOLOv8n在精确率和召回率之间取得了更好的平衡。
根据上述结果,我们可以看出,尽管四种模型的性能差异不是特别大,但在选取适用于特定数据集的模型时,即使是微小的性能差异也可能对最终结果产生显著影响。尤其在需要平衡检测速度和精确度的实际应用场景中,这种细微的差异就更加重要了。因此,在选择模型时,应考虑实际应用需求,选择最适合特定场景的YOLO版本。
4.4 代码实现
在这篇博客中,我们将探讨如何结合YOLOv8检测器和PySide6框架,实现一个番茄新鲜程度检测系统。这个系统能够处理视频流,并实时展示检测到的番茄新鲜程度,为用户提供直观的视觉反馈。现在,让我们深入理解实现这一功能的代码逻辑。
(1)导入必要的模块和配置
首先,代码引入了必要的库和模块,如sys用于Python解释器的交互,time用于记录处理时间,cv2即OpenCV用于图像处理。QtWidgets和QtCore是用于构建GUI的PySide6组件,而QtFusion.widgets和QtFusion.handlers是为了方便创建和处理窗口以及媒体流。
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)定义类别和模型
代码片段展示了如何实例化检测模型,加载预训练权重,并创建颜色列表用于在UI中以不同颜色标识不同类别。此外,初始化了应用程序和主窗口,并创建了一个MediaHandler用于处理实时视频流。最终,程序进入主循环,开始处理来自默认摄像头的媒体流。
cls_name = ["0", "1", "新鲜番茄", "腐烂番茄", "物体"] # 定义类名列表
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/tomato-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
colors = get_cls_color(model.names) # 获取类别颜色
(3)创建主窗口
接下来,定义了MainWindow类,它是UI的主窗口,其中包含一个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函数中,代码首先调整捕捉到的图像大小以适应UI显示,然后通过model.preprocess对图像进行预处理,并通过model.predict进行模型推理,最终将检测结果以矩形框的形式绘制在图像上。这里的关键是使用了时间模块来记录并打印每帧处理的时间,以及drawRectBox函数来在图像上绘制检测框。
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控件上显示图像
随后,我们创建了QApplication和MainWindow对象,设置了视频流处理的帧率,并连接了新帧的处理函数。通过启动媒体处理并显示窗口,我们完成了从摄像头捕获视频、实时处理图像到图形界面呈现的整个流程。
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())
最后,我们通过展示主窗口并进入Qt应用程序的主循环,使得用户界面保持响应并能够实时更新。我们展示了如何使用先进的对象检测模型和现代GUI框架,搭建一个实时检测系统。详细的代码解释提供了从环境设置到有效显示检测结果的全面视角,旨在帮助读者更好地理解如何构建一个实用的番茄新鲜程度检测系统。
5. 番茄新鲜程度检测系统实现
在构建我们的交互式番茄新鲜程度检测系统时,不仅需要快速准确地处理视频流中的图像数据,还需要提供一个清晰易用的界面,让用户能够无缝地与之交互。我们的设计思路遵循了将复杂的功能模块化和简化的原则,通过将界面设计、媒体处理和深度学习模型融为一体,我们实现了这一目标。
5.1 系统设计思路
在我们的系统设计中,我们的设计理念是构建一个高效、直观且用户友好的界面,使用户能够无缝地与系统交互。整个系统被设计为一个紧密集成的框架,其中每个组件都旨在提升整体性能和用户体验。
(1)架构设计
系统设计采用的是一个层次化、模块化的架构,以提升整体的灵活性和可维护性。通过精心设计的MainWindow类,我们将用户交互、媒体流处理和深度学习模型有效地融合在一个统一的应用程序中。此外,为了增强各模块间的协作性能,系统特别采用了信号和槽机制来处理模块间的通信,这在Qt框架中是实现事件驱动编程的核心。
- 处理层(Processing Layer):处理层是系统的技术核心,承担着图像处理和模型推理的重要任务。通过YOLOv8Detector类,我们引入了一个强大的预训练模型,它能够高效地识别图像中的番茄并判断其新鲜程度。这一层是系统智能化的基础,它利用深度学习算法,自动化完成了以往需要大量人力进行的识别工作,不仅提升了准确率,也大幅提高了处理速度。
- 界面层(UI Layer):界面层则是系统与用户交互的前端,我们通过精心设计的Ui_MainWindow类来构建直观易用的用户界面。在这个层面,用户可以看到实时的图像处理结果,通过界面上的按钮和标签与系统进行交互。我们确保了界面的直观性和响应性,使得即使是没有技术背景的用户也能轻松上手,完成检测任务。
- 控制层(Control Layer):控制层起到了协调整个系统运作的作用,通过MainWindow类中的各种槽函数和方法响应用户的操作,如启动或停止视频流、调整模型设置等。此层面的设计采用了模块化的思路,保持了各个组件的独立性,使得后续的维护和升级变得更加容易。
综合这三个层面,我们的系统设计思路旨在打造一个既智能又人性化的应用。通过各层的紧密结合,我们确保了系统既能提供精确的检测结果,又能带给用户高效愉悦的操作体验。随着技术的发展,我们的系统设计还留有足够的空间用于进一步的功能扩展和优化,以适应未来可能的各种需求变化。
(2)系统流程
在本博客中,我们将讲述设计一个交互式番茄新鲜程度检测系统的全过程。本系统的核心设计理念是用户友好性,高效整合前沿的YOLOv8目标检测技术和直观的用户界面,以确保即使是非专业用户也能轻松使用该系统。在系统的设计中,我们特别强调了处理层、界面层和控制层的分离,旨在实现高效的模块间交互和数据流管理。
我们的系统首先通过MainWindow类的实例初始化,它不仅为用户提供了一个操作界面,还负责配置整个应用程序的相关参数。这样的设计使得用户能够通过一个清晰的界面来选择数据输入源,无论是实时的摄像头捕获、视频文件还是静态图像,都能够轻松接入并处理。
-
当用户启动应用程序时,系统会立即初始化一个MainWindow类的实例。这个实例是整个应用的核心,它负责设置用户界面、初始化参数,并确保所有所需资源都准备就绪。在用户界面上,操作者将被引导选择输入源,这可能是实时捕获的摄像头图像流、存储的视频文件,或是静态的图片文件。此步骤的设计关键在于灵活性,用户可以根据实际需求自由选择最适合的输入方式。
-
一旦输入源被选定,系统将激活媒体处理器,开始对输入数据进行处理。无论是配置摄像头,读取视频文件,还是加载图片文件,系统都会以最优化的方式执行,以保证后续流程的流畅性。处理器的设计允许系统轻松应对来自不同源的数据,无论是动态还是静态。
-
接下来,系统进入连续帧处理的循环。在预处理阶段,每一帧图像都会被调整大小、进行色彩空间的转换,以及标准化,以符合YOLO模型的输入规范。这个过程是自动化的,确保每一帧图像都能被模型准确解读。
-
随后,进入到检测与识别阶段。YOLOv8模型在此发挥其功能,通过分析预处理后的图像来检测其中的番茄,并判断其新鲜程度。模型的输出包括番茄的位置和新鲜程度类别,这一过程的精确度和效率是系统设计的亮点。
-
系统界面将随着检测结果的产生而实时更新。检测到的番茄将被矩形框标注,并在界面上动态显示类别。同时,系统还会在界面上展示检测的统计数据,这可能是以表格或条形图的形式进行的,为用户提供了丰富的信息和直观的数据分析。
-
此外,系统提供了丰富的交互操作。用户可以通过简单的点击来保存检测结果、访问作者信息、查看版本更新或通过筛选功能深入分析特定类别的结果。这一设计思路强调了用户体验,使得操作者可以轻松地与系统交互,执行各项任务。
-
最后,媒体控制是用户交互体验的另一重要组成部分。用户可以控制媒体的播放状态,例如启动或停止摄像头捕捉、控制视频的播放或停止分析静态图片。系统在这一环节的设计体现了对用户需求的深入理解,提供了灵活的媒体控制选项。
整个系统设计的思路是以用户为中心,旨在提供一个全面、易用且高效的番茄新鲜程度检测工具。从用户启动程序的那一刻起,到最终的检测结果呈现,每一步都旨在创造出一个无缝的用户体验,这也正是我们设计这一系统的初衷。
5.2 登录与账户管理
在本节中,我们将讨论一个综合性的番茄新鲜程度检测系统,该系统不仅在技术层面上实现了先进的多物体检测,而且在用户体验方面也进行了深入的设计。一个特别值得注意的特性是系统集成了一个完整的用户账户管理功能,旨在为用户提供一个安全、个性化的使用环境。
用户管理的实现基于PySide6框架结合SQLite数据库,它们共同构建了一个功能齐全的登录界面。这个界面不仅简洁易用,还集成了账户注册、密码修改、头像设置、账户注销和重新登录等一系列功能。每个用户在注册后都会拥有一个独立的账户,该账户允许用户在系统中保存个人的检测记录和个性化配置。
通过用户界面,操作者可以轻松完成账号的注册和登录流程,这是进入主功能区域的入口。我们理解到,在实际应用中,用户可能需要在不同时间或场合下使用系统,因此设计了密码修改和头像设置功能,以满足个性化的需求。如果用户决定不再使用系统,还可以进行账户注销操作。
这些账户管理功能不仅提供了便捷服务,更重要的是,它们增强了系统的安全性。用户的个人信息和检测记录都得到了妥善保护,只有在通过验证的登录后才能访问。这样的设计兼顾了易用性和隐私保护,使得用户在享受高效检测服务的同时,也能感受到数据安全的保障。
在主界面中,系统的实时检测功能展现了其先进的技术实力。无论是处理图片、视频文件,还是实时摄像头输入,系统都能快速识别番茄的新鲜程度,并以检测框、类别和置信度等形式直观展示结果。支持批量文件输入的能力更是为大规模检测提供了可能,显著提高了用户工作的效率。
综上所述,我们的系统不仅是一个技术产品,更是一个服务于用户的综合平台。它通过实时的检测功能,强大的用户管理系统,以及对个性化需求的深刻理解,满足了用户在现代农业生产和食品加工领域中对番茄新鲜程度检测的广泛需求。通过精心的设计和实现,我们相信这个系统能够成为用户日常工作中不可或缺的助手。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Rm411Z7nN/
在文件夹下的资源显示如下,下面的链接中也给出了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. ↩︎