摘要:开发番茄成熟度检测系统对于提高农业产量和食品加工效率具有重大意义。本篇博客详细介绍了如何利用深度学习构建一个番茄成熟度检测系统,并提供了完整的实现代码。该系统基于强大的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)系列算法,开发的番茄成熟度检测系统,标志着在这一领域的技术进步。这种系统能够实时、高效地识别不同成熟度阶段的番茄,从而为农业生产提供科学的指导和决策支持。
随着YOLO(You Only Look Once)系列目标检测算法的出现和发展,已经提出了更高效、更精准的目标检测工具。从最早的YOLO1,到YOLO90002,再到YOLOv43,YOLOv5等,这一系列的发展都在推动着目标检测技术的进步。YOLOv64通过引入更高效的网络架构和优化算法,进一步提高了目标检测的速度和准确率。随后,YOLOv75在此基础上加入了更先进的特征融合技术和自适应锚点匹配机制,显著提升了模型在复杂环境下的泛化能力和稳定性。YOLOv86则是在此之上,通过深度学习算法的细粒度优化,如自动学习的损失函数和动态数据增强技术,进一步提升了检测的准确性和模型的鲁棒性。
视觉变换器(ViT),作为一种基于自注意力机制的图像处理模型,通过对图像分块处理并将其视为序列数据,展示了与传统卷积神经网络(CNN)不同的视角和优势。ViT在处理大规模图像数据集时显示出了优异的性能,其对于图像中各部分的全局理解能力,使其在细粒度的图像识别任务中,例如精确区分不同成熟度阶段的番茄,具有潜在的应用价值。
注意力机制,尤其是在Transformer架构中的应用,通过赋予模型对图像特定部分的“关注”能力,极大地提升了模型对图像细节的识别能力。这一机制在处理复杂背景中的目标检测任务时表现出了巨大的潜力,使模型能够更加聚焦于与任务密切相关的图像区域,从而提高检测的准确率和效率。
除上述技术外,其他目标检测算法如Faster R-CNN、SSD(Single Shot MultiBox Detector)和Mask R-CNN等,通过不同的机制实现对图像中目标的精确识别和定位。这些算法各有特点,如Faster R-CNN在准确率上的优势、SSD在速度和效率上的平衡、Mask R-CNN在实例分割方面的应用能力,均为农业目标检测任务提供了多样化的技术选择。
近年来,研究者通过对这些算法的改进和优化,以及训练数据集的扩充和精细化,显著提升了农业目标检测的性能。然而,将这些先进技术应用于实际的农业生产中,尤其是在复杂多变的自然环境下进行高效的番茄成熟度检测,仍然面临着一系列技术挑战。这包括如何进一步提高算法的检测准确率和实时性,如何优化模型以适应不同的光照条件和背景干扰,以及如何降低系统的整体成本以便于大规模应用。
本博客通过详尽地探讨YOLOv8算法在番茄成熟度检测系统中的应用,为相关领域的研究者和技术实践者提供了一份宝贵的资源和深入的见解。本文的贡献不仅体现在采用先进的深度学习算法进行精确检测,还在于为读者呈现了一个结合了技术深度与实用性的全面研究。具体贡献如下:
- 采用最先进的YOLOv8算法:本文不仅引入了当前最先进的目标检测算法YOLOv8进行番茄成熟度的精确检测,而且还对比了该算法与其前版本YOLOv7、YOLOv6、YOLOv5的性能。通过这种对比,本文展示了YOLOv8在处理速度、准确率等关键性能指标上的显著优势,为番茄成熟度检测提供了更为高效和精准的技术方案。
- 利用PySide6实现友好的用户界面:通过采用PySide6库,本文成功开发了一个用户友好的界面,使得番茄成熟度检测变得更加直观和便捷。这一创新不仅提高了系统的可用性,也为推广YOLOv8算法及其在农业领域的应用奠定了基础。
- 集成登录管理功能:本文设计的登录管理功能,增强了系统的安全性,并为将来引入更多个性化服务提供了扩展性。这一设计思路体现了对用户体验的深入考虑,以及对系统可持续发展的前瞻性规划。
- 对YOLOv8模型的深入研究:本文不仅应用了YOLOv8算法,还对其性能进行了全面的评估和分析,包括精准度、召回率等关键指标的细致探讨。这种深入的技术研究为了解和优化YOLOv8算法提供了坚实的基础,对于促进该算法在农业视觉系统中的广泛应用具有重要意义。
- 提供完整的数据集和代码资源包:本文所提供的详细数据集和完整的代码资源包,极大地降低了技术门槛,使得读者能够轻松复现研究结果,并在此基础上进行进一步的研究和开发。这种开放的资源分享精神,不仅促进了学术交流,也为技术创新提供了动力。
1. 数据集介绍
在这个博客章节中,我们将详细介绍为番茄成熟度检测系统构建的专用数据集。我们的数据集涵盖了6371张精选图像,分布在训练集(5520张)、验证集(566张)和测试集(285张)中。这一数据集的规模确保了深度学习模型能够在多样化的数据上进行训练,学习到复杂的特征,从而提升其在实际应用中的准确度和鲁棒性。
数据集中的图像经过了仔细的预处理,包括自动校正像素数据的定向,并剥离了EXIF方向信息,保证图像的统一性和方向的一致性。为了适应YOLOv8算法的需求,所有图像都被调整到640x640像素的统一尺寸,虽然这一调整可能会导致形状的略微变形,但实验表明,深度学习模型能够适应这种变化,并从中学习到有效的特征。
在数据增强方面,我们采取了多项措施来提升模型的泛化能力。图像在处理过程中有50%的概率会进行水平翻转,以及有均等的概率进行90度的旋转(无旋转、顺时针、逆时针)。这样的随机性处理不仅模拟了现实世界中物体可能出现的各种方向,也使得模型在遇到不同方向的图像时能够保持稳定的检测性能。
通过对边界框分布的分析,我们发现数据集中的对象大多位于图像中心,这种集中趋势可能会使得模型在识别边缘区域的对象时效果不佳。因此,我们考虑引入图像平移等数据增强方法,以确保模型能够均衡地学习到图像各个部位的特征。此外,边界框的形状分布分析显示了图像中对象的高度和宽度比例偏向于宽型,这反映出数据集中的番茄多以水平方向拍摄。为了培养模型对各种形状边界框的识别能力,我们将在后续工作中引入不同比例的边界框,以进一步增强模型的适应性。
我们的数据集聚焦于三个主要类别:绿色未成熟番茄、红色成熟番茄和受损番茄。类别分布呈现出红色番茄数量最多,受损番茄次之,绿色番茄最少。这种不均匀的分布可能导致模型在训练过程中对红色番茄的识别能力更强。因此,我们可能需要在后续的研究中采用样本平衡技术,以避免模型对某一类别过度拟合。博主使用的类别代码如下:
Chinese_name = {"Green": "绿色", "Red": "红色", "damaged": "损坏"}
综合这些特点,本数据集不仅在数量上满足深度学习模型的训练需求,而且在质量上也进行了深思熟虑的设计。经过精细的预处理和增强,数据集能够支持番茄成熟度检测系统的开发,帮助模型在各种条件下都能准确判断番茄的成熟度。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行番茄成熟度检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLO(You Only Look Once)算法自从提出以来,就以其快速的检测速度和良好的实时性能,在目标检测领域引起了广泛的关注。YOLOv8作为这一系列算法的最新迭代版本,它在原有YOLOv7的基础上进行了一系列的创新和优化,致力于进一步提高目标检测的准确性和速度,同时减少计算资源的消耗。
YOLOv8沿用了YOLO系列的核心设计思想,即在单次前向传播过程中同时预测目标的类别和位置。它继承了YOLOv5的多尺度预测结构,通过不同尺寸的特征图来检测不同大小的对象,但在此基础上进行了关键的技术革新。YOLOv8通过引入更先进的网络架构,如ELAN(Efficient Layer Aggregation Network)和更复杂的损失函数,例如Distribution Focal Loss,进一步提升了检测的准确性。
在YOLOv8中,ELAN网络架构通过更高效的层级聚合机制,加强了不同尺度特征的信息融合。与传统的特征金字塔网络(FPN)相比,ELAN能够在保持网络深度和宽度的同时,更有效地促进了不同层级特征之间的交流,这有助于模型捕获更丰富的语义信息和细节特征。这种设计尤其对于检测小目标和在复杂背景中的目标具有显著优势。
另一方面,Distribution Focal Loss为YOLOv8带来了另一项创新。与传统的Focal Loss不同,它不仅关注于区分正负样本,而且还关注于正样本的概率分布。通过调整模型预测的概率分布,使其更接近实际的目标分布,从而减少了模型在学习中的不确定性,并增强了模型对不同类别目标的区分能力。
此外,YOLOv8在算法内部还采用了TaskAlignedAssigner,这是一种任务对齐分配器,它优化了目标与锚点(Anchor Boxes)之间的对齐过程。通过这种精细的锚点分配机制,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/val_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 模型训练
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect')
赋值data_name,获取数据集的yaml的绝对路径。
data_name = "TomatoRipeness"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
接着开始训练模型。其中指定了训练数据的配置文件路径,使用CPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8。
results = model.train(
data=data_path,
device='cpu',
workers=2,
imgsz=640,
epochs=100,
batch=8,
name='train_v8_' + data_name
)
在深度学习模型的训练过程中,损失函数的趋势和最终评价指标是评估模型性能的关键。通过对YOLOv8模型训练过程中的各项损失和性能指标的分析,我们可以深入理解模型的学习效果和优化空间。
首先,观察到训练过程中的边界框损失(box_loss)、分类损失(cls_loss)和分布式焦点损失(dfl_loss)均呈现出随着训练轮次增加而逐渐下降的趋势。这表明模型在识别物体位置、分类准确性以及预测分布上的性能都随着时间的推移而稳步提升。尤其值得注意的是,验证集上的损失下降趋势与训练集保持一致,这表明模型具有良好的泛化能力,并未出现过拟合现象。在分类损失中,我们可以看到经过100个训练轮次后,损失值稳定在一个较低的水平,这说明模型在区分不同类别上表现出了较高的准确性。而分布式焦点损失的下降更为显著,这种损失的降低直接关联到模型在预测目标类别概率分布时的精确度,其快速下降说明模型在这方面学习得相当有效。
再来看评价指标,精确度(precision)和召回率(recall)在训练过程中波动较大,但总体趋势是向上提升的。这种波动可能是由于模型在各个训练阶段对不同难度样本的学习效果不同所致。尽管如此,随着训练的深入,模型对于正样本的识别能力在提升,能够找到更多真正的目标物体,同时保持较少的误识别。
mAP(mean Average Precision)是综合考量模型识别精度和召回率的指标,尤其是mAP50和mAP50-95。mAP50指的是IOU(Intersection Over Union)阈值为0.5时的平均精度,而mAP50-95则考虑了从0.5到0.95不同IOU阈值下的平均表现。从mAP50和mAP50-95的趋势图中可以看出,模型在不同IOU阈值下的表现都呈现稳定提升的趋势,其中mAP50的增长较为明显。这表明模型在捕获目标的准确性方面做得很好,即使是在更严格的IOU阈值下,模型的表现也在稳步提高。
F1得分是一个重要的统计指标,用于衡量模型的精确度和召回率的平衡,特别是在数据集类别分布不均时。它是精确度和召回率的调和平均数,最高可能的F1得分为1(完美精确度和召回率),最低可能为0。通常,随着置信度阈值的增加,精确度会上升而召回率下降,F1得分则反映了这两个指标之间的平衡。
从曲线图中可以看出,模型在不同的置信度阈值下对三个类别(绿色、红色、受损)的检测表现。整体而言,当置信度较低时,模型的召回率较高,但随着置信度阈值的提高,F1得分呈现先升后降的趋势,这说明模型开始更加谨慎地标记正类,同时也遗漏了一些真实的正类。具体来看,绿色番茄在所有类别中F1得分最高,表明模型在检测绿色番茄方面拥有较好的精确度和召回率平衡。受损番茄的F1得分略低,这可能是由于受损番茄的特征比绿色和红色番茄更难以区分,导致精确度和召回率有所下降。红色番茄的F1得分最低,可能因为数据集中红色番茄的数量较多,使得模型在高置信度时过于保守,而错过了一些正确的红色番茄标记。
在整体性能上,所有类别的F1得分最高点出现在置信度大约为0.46时,这个点提供了一个平衡点,在这个置信度阈值下,模型达到了精确度和召回率的最佳平衡,这对于实际应用中的阈值设置具有指导意义。值得注意的是,曲线在置信度阈值较高时急剧下降,这表明随着置信度的提高,模型错过了越来越多的正类,精确度的提升并不能补偿召回率的显著下降。
总的来说,这些F1-Confidence曲线为我们提供了模型性能的深入视角,使我们能够找到最佳的置信度阈值以优化模型的整体性能。在实际应用中,我们可能需要根据实际情况调整置信度阈值,以确保在精确度和召回率之间取得最佳平衡,从而在确保检测准确性的同时最大限度地减少遗漏真实目标的风险。通过这种方式,我们的番茄成熟度检测系统将能够更加精准地辅助农业生产决策,提高整体效率和产出质量。
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.911 | 0.886 | 0.904 | 0.905 |
F1-Score | 0.80 | 0.79 | 0.83 | 0.81 |
(3)实验结果分析:
本次实验在相同的数据集上对比了YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个不同的算法版本。通过使用F1-Score和mAP(mean Average Precision)作为评价指标,我们可以深入了解每个版本在具体任务上的性能差异。
YOLOv5nu以0.911的mAP值领先,其次是YOLOv7-tiny和YOLOv8n,都达到了0.9以上的水平,而YOLOv6n的mAP值略低,为0.886。这说明在相同条件下,YOLOv5nu在整体检测精度上略胜一筹,而YOLOv7-tiny和YOLOv8n则表现出相近的精确度。然而,单单mAP值并不能全面反映模型的性能。F1-Score作为精确度和召回率的调和平均,能够提供更全面的性能评估。在这个指标上,YOLOv7-tiny以0.83的得分位居首位,显示了其在精确度和召回率的平衡上具有最佳表现。YOLOv8n以0.81的F1-Score紧随其后,而YOLOv5nu和YOLOv6n分别为0.80和0.79。这表明尽管YOLOv5nu在mAP值上略高,但在精确度和召回率的综合考虑上,YOLOv7-tiny表现更加出色。
总体来看,每个版本的YOLO算法都有其优势和不足。YOLOv5nu在mAP值上展现了较高的检测精度,但在F1-Score上则略逊于YOLOv7-tiny,后者在两个指标上都表现相当均衡,显示了其对于精确度和召回率的优秀把握。YOLOv8n虽然在mAP上与YOLOv7-tiny相近,但在F1-Score上略低,这可能是由于它在召回率上的表现不如YOLOv7-tiny。YOLOv6n虽然在两个指标上都是最低的,但它的表现仍然是可圈可点的。
在实际应用中,选择哪个版本的YOLO算法可能取决于具体的应用场景和需求。如果追求更高的检测精度,YOLOv5nu可能是更好的选择;而如果需要更好的精确度和召回率的平衡,YOLOv7-tiny可能是更优的选择。YOLOv8n作为最新的版本,在未来的优化和迭代中有望在各项指标上取得进一步的提升。因此,在做出决策时,我们需要根据任务的特点和性能需求,综合考量各个版本的优势和局限。
4.4 代码实现
在这一节中,我们将详细介绍如何利用YOLOv8检测算法的Python实现来识别和分类不同成熟度的番茄。此系统采用的是深度学习的方法,具体是通过调用YOLOv8模型来实现目标检测的任务。
(1)引入必要的库
首先,需要导入必要的Python库,如图像处理库OpenCV和用于创建图形用户界面的PySide6。同时,我们利用自定义的QtFusion模块来构建窗口和处理图像显示。我们使用random生成随机颜色,用于在图像上标记不同的类别。sys和time用于处理系统级别的操作和时间记录。
import random # 导入random模块,用于生成随机数
import sys # 导入sys模块,用于访问与Python解释器相关的变量和函数
import time # 导入time模块,用于处理时间
from QtFusion.config import QF_Config
import cv2 # 导入OpenCV库,用于处理图像
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建窗口
from QtFusion.utils import cv_imread, drawRectBox # 从QtFusion库中导入cv_imread和drawRectBox函数,用于读取图像和绘制矩形框
from PySide6 import QtWidgets, QtCore # 导入PySide6库中的QtWidgets和QtCore模块,用于创建GUI
from QtFusion.path import abs_path
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于加载YOLOv8模型并进行目标检测
QF_Config.set_verbose(False)
(2)设置主窗口
接着,我们定义了一系列的类和函数来构建应用程序的界面。MainWindow类继承自QMainWindow,提供了一个基本的窗口框架。在这个类中,我们设置了窗口大小和布局,并定义了按键事件的处理,例如按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)初始化检测模型和设备
随后,我们创建了YOLOv8Detector对象,并加载了预训练的模型。这是实现番茄成熟度检测的核心。我们定义了目标类别的名称,以及为每个类别分配了一个随机颜色,以便在图像上标记时能够区分。
cls_name = ["绿色", "红色", "损坏"] # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 为每个目标类别生成一个随机颜色
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/tomato-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
(4)番茄成熟度检测
最后,我们初始化了应用程序,并加载了待检测的图像。通过调用model.predict函数,我们对图像进行了预测,并使用drawRectBox函数在图像上绘制了检测到的目标的边界框和类别标签。
if __name__ == '__main__': # 如果当前模块是主模块
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
img_path = abs_path("test_media/TomatoRipeness_SIXU_A00012.jpg") # 定义图像文件的路径
image = cv_imread(img_path) # 使用cv_imread函数读取图像
image = cv2.resize(image, (850, 500)) # 将图像大小调整为850x500
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间(开始时间)
pred, superimposed_img = model.predict(pre_img) # 使用模型进行预测
t2 = time.time() # 获取当前时间(结束时间)
use_time = t2 - t1 # 计算预测所用的时间
det = pred[0] # 获取预测结果的第一个元素(检测结果)
# 如果有检测信息则进入
if det is not None and len(det):
det_info = model.postprocess(pred) # 对预测结果进行后处理
for info in det_info: # 遍历检测信息
# 获取类别名称、边界框、置信度和类别ID
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id']
label = '%s %.0f%%' % (name, conf * 100) # 创建标签,包含类别名称和置信度
# 画出检测到的目标物
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id]) # 在图像上绘制边界框和标签
print("推理时间: %.2f" % use_time) # 打印预测所用的时间
window.dispImage(window.label, image) # 在窗口的label上显示图像
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
以上代码展示了如何创建一个交互式的图形用户界面来展示YOLOv8检测模型的结果。从图像预处理、模型推理到最终的图像展示,整个流程旨在提供一个直观的方式来验证和展示我们的番茄成熟度检测系统的性能。
5. 番茄成熟度检测系统实现
在实现一款实时番茄成熟度检测系统时,我们设计的核心理念旨在打造一个直观、易操作且功能强大的用户界面,从而使得用户能够无缝地进行番茄成熟度的检测和分析。为了实现这一点,我们将整个系统构建为一个综合平台,其中精心设计的MainWindow类扮演着中心角色,不仅负责界面呈现,还协调后台的检测处理流程。
5.1 系统设计思路
MainWindow类的设计采纳了模块化的思想,确保了各个组件——无论是图像处理部分、用户交互界面,还是深度学习模型——都能独立运作,同时又能协同工作,共同完成复杂的番茄成熟度检测任务。这种设计不仅提高了系统的灵活性和可维护性,也使得将来的升级和功能扩展变得更加容易。
架构设计
我们的系统设计遵循了经典的MVC(Model-View-Controller)架构模式,将应用程序划分为三个核心组件:模型(Model)、视图(View)和控制器(Controller),分别对应我们的处理层、界面层和控制层。
- 处理层(Processing Layer):在处理层,我们部署了YOLOv8Detector类,这是一个强大的目标检测引擎,内置有预训练的深度学习模型。该模型经过专门训练,能够准确识别和分类不同成熟度阶段的番茄。它的处理能力是检测系统效能的关键,确保了在各种条件下都能获得高准确率的检测结果。
- 界面层(UI Layer):对于界面层,我们利用Qt框架设计了一个直观的UI,其中包括图像展示窗口、状态指示器和控制按钮。这个用户界面不仅美观,而且反应迅速,能够实时显示检测结果,为用户提供了一种互动体验,使得检测过程变得既简单又有趣。
- 控制层(Control Layer):在控制层,通过MainWindow类中的方法和槽函数来响应用户的输入,管理数据流动以及控制检测过程。例如,用户可以通过点击按钮来上传待检测的番茄图像,控制层将接收这一命令,调用处理层的检测功能,并将结果返回给界面层进行展示。这种事件驱动的设计模式,确保了用户操作的每一步都能得到系统的即时响应和反馈。
整体而言,番茄成熟度检测系统的设计思路是以用户为中心,力求在操作简便性和技术先进性之间找到完美平衡。无论是技术专家还是非专业用户,都能够轻松上手,利用这一系统来完成对番茄成熟度的准确检测。
系统流程
我们将深入了解系统的工作流程,这是确保用户能够高效且准确地检测不同成熟阶段番茄的关键。从启动应用程序到展示最终检测结果,每一步都经过精心设计,以提供最佳的用户体验和检测性能。以下是番茄成熟度检测系统的工作流程:
- 当用户启动我们的应用程序时,系统会实例化MainWindow类,这是整个应用的中心和用户的第一接触点。MainWindow类的实例化过程中,会设置好用户界面,并加载必要的配置参数。这个阶段是整个系统运行的起点,它不仅为用户提供了一个直观易懂的操作界面,还确保了系统后续流程的顺利执行。
- 用户在应用程序的界面中会看到多种选项来选择输入源,无论是实时摄像头捕捉的图像、本地视频文件还是图像文件。这为用户提供了灵活的选择,可以根据实际需要和场景来决定最合适的输入源。选择完输入源后,系统将根据用户的选择调用相应的媒体处理器和方法来处理数据,这可能涉及到摄像头配置的调整或是文件的加载等操作。
- 一旦输入源准备就绪,系统将进入一个连续的帧处理循环。首先是预处理阶段,系统会对输入的每一帧图像进行一系列预处理操作,包括调整尺寸和颜色空间转换等,以满足YOLO模型的输入要求。预处理后的图像将进入检测与识别阶段,这一阶段是核心,YOLOv8模型将对图像进行分析,准确检测出图中的番茄,并判断其成熟度。
- 随着检测结果的不断产出,界面将实时更新。用户将看到检测框标注在图像上的番茄位置,同时,成熟度类别也会清晰显示。此外,界面还会提供统计数据的视觉展示,如条形图或表格,使用户能够直观地了解检测结果的整体分布和详细信息。
- 用户交互是我们系统设计的另一个重要方面。界面中的按钮和控件允许用户执行多种操作,如保存结果、获取系统信息以及过滤特定结果等。这些交互功能不仅提高了用户的操作便利性,也使得用户能够更深入地分析和利用检测数据。
- 最后,媒体控制也是用户体验的一部分。用户可以根据需要控制输入源的播放状态,包括开始或停止实时捕捉、视频播放或暂停图像分析。这种控制能力为用户提供了操作的灵活性,并允许他们根据实际情况调整检测流程。
番茄成熟度检测系统的设计旨在通过简洁直观的界面、高效准确的检测流程和丰富的用户交互,为用户提供一个全面且高效的检测平台。无论是农业工作者还是研究人员,都可以依靠这个系统来提高番茄分类和成熟度检测的准确性与效率。
5.2 登录与账户管理
在我们的交互式番茄成熟度检测系统中,不仅将先进的深度学习技术应用于农业领域的实际问题,还为用户提供了一个全面的账户管理系统,确保了使用体验的个性化和数据管理的便利性。为了让每个用户都能拥有个性化的使用体验并方便地管理自己的数据,我们整合了一个完整的用户账户系统。
系统的登录和账户管理界面采用了PySide6框架构建,后端数据存储则依赖于SQLite数据库,这种轻量级的数据库足以满足我们的应用场景。用户首次使用系统时,可以通过用户友好的界面轻松注册新账户,创建个人的账户信息,包括设置密码和上传个人头像。此外,用户还能在任何时候修改密码、更新头像、注销账户或重新登录,所有这些操作都通过直观的图形用户界面完成。
这些账户管理功能不仅提升了系统的安全性,还增加了操作的便捷性。用户可以在自己的账户中保存检测结果,无论是图像、视频还是实时摄像头捕获的内容,都可以被系统记录下来,并且仅对本人开放。这样一来,用户就能够在任何时候回顾和分析自己之前的检测记录,无需担心数据丢失或是被他人访问。
主界面设计上,我们注重实用性与信息展示的清晰度。在进行番茄成熟度检测时,用户会在主界面中实时看到包括检测框、类别和置信度在内的详细信息。此外,系统支持多种输入方式,用户可以上传静态图片,也可以输入视频文件,甚至是实时的摄像头数据流。这些灵活的输入选项,使得系统能够适应不同用户的不同需求。
整体来看,我们的系统不仅仅是一个单一功能的应用程序,而是一个综合性的解决方案。通过精心设计的用户账户管理功能,我们的系统满足了用户在数据管理、个性化设置以及安全性方面的需求。无论是农业工作者想要分析作物成熟度,还是研究人员希望进行数据收集,番茄成熟度检测系统都能够提供一个可靠、高效和个性化的平台。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1ki421Z7G8/
在文件夹下的资源显示如下,下面的链接中也给出了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. ↩︎
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. ↩︎
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. ↩︎
Terven J, Cordova-Esparza D. A comprehensive review of YOLO: From YOLOv1 to YOLOv8 and beyond[J]. arXiv preprint arXiv:2304.00501, 2023. ↩︎