摘要:开发植物叶片病害识别系统对于提高农业生产效率和作物健康管理至关重要。本篇博客详细介绍了如何利用深度学习构建一个植物叶片病害识别系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7、YOLOv6、YOLOv5的对比,给出了不同模型之间的性能指标如mAP、F1 Score等结果分析。文章深入讲解了YOLOv8算法的底层原理,提供了相应的Python代码、训练数据集,并封装成一个基于PySide6的美观UI界面。
系统能够精准地检测和分类图像中的植物叶片病害,支持通过图片、图片文件夹、视频文件及摄像头检测,包含热力图分析、标记框类别、类别统计、可调Conf、IOU参数、可视化结果显示等功能。另外,设计了基于SQLite数据库的用户注册登录管理界面、可点击按钮切换不同模型、可方便修改的UI界面。本文旨在为深度学习领域的新手提供一份实用指导和参考,完整的代码和数据集已在文章结尾提供链接,便于读者下载和使用。本文结构如下:
目录演示与介绍视频:https://www.bilibili.com/video/BV1UW421F78K/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuakpZy
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubm5Zy
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakpZr
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakpZs
前言
在全球化的农业生产背景下,植物健康管理成为确保食品安全和农业可持续发展的关键。植物叶片病害,尤其是叶片病害,对农作物的生长产生严重影响,不仅降低产量,还会损害作物的质量,给农业经济带来巨大损失。因此,及时准确地识别和处理植物叶片病害成为提高农业生产效率、保障粮食安全的重要手段。随着人工智能技术的快速发展,尤其是深度学习在图像识别领域的广泛应用,基于计算机视觉的植物叶片病害识别系统应运而生,为农业病害管理提供了一种高效、自动化的解决方案。
国内外关于植物病害识别的研究已取得显著进展。深度学习模型如Mask R-CNN、EfficientDet等也在植物病害识别领域展现出了强大的性能。近期的研究不仅聚焦于算法本身的改进,还包括数据集的丰富和优化、模型训练策略的创新以及多模态学习方法的探索,旨在提高系统的泛化能力和识别准确率。
随着YOLO(You Only Look Once)系列目标检测算法的出现和发展,已经提出了更高效、更精准的目标检测工具。从最早的YOLO[1],到YOLO9000[2],再到YOLOv4[3],YOLOv5等,这一系列的发展都在推动着目标检测技术的进步。在去年美团发布了YOLOv6[4],然后紧接着YOLOv7[5],到现在的YOLOv8[6],这个最新版本在许多方面都进行了优化与改进,如使用了更复杂的网络架构,更精细的预测机制,以及加入了对小目标的更好处理。
Swin Transformer是 一种基于Transformer的图像识别模型,通过引入了层次化的Transformer结构,以小的窗口进行局部自注意力计算,有效减少了计算资源的消耗。Swin Transformer在植物病害识别上的应用,展示了其在处理高分辨率农业图像时的高效性和准确性。
随着研究的深入,大量专门针对植物叶片病害的数据集被开发和公开,这些数据集涵盖了多种作物和病害类型,为模型训练和评估提供了宝贵资源。传统数据集通常规模较小,且病害类型单一,而最新的数据集如PlantVillage和Agricultural Disease Dataset则包含了数十种作物和上百种病害,且图像数量和质量都有显著提升。这些丰富的数据集不仅支持了模型的深度学习训练,还促进了复杂场景下病害识别能力的提升。
尽管取得了显著进展,植物叶片病害识别仍面临诸多挑战。首先,不同病害间的视觉特征差异微小,容易导致模型混淆;其次,实际应用中复杂的背景和光照条件对识别精度有较大影响;此外,模型的泛化能力和适应性仍需进一步提高。针对这些挑战,未来的研究趋势可能包括开发更为精确的特征提取技术、探索新的模型训练策略如迁移学习和弱监督学习,以及利用多模态数据提高识别的鲁棒性和准确性。
本博客通过集成最先进的YOLOv8算法,成功构建了一个高效准确的植物叶片病害识别系统。通过深入讲解算法原理、展示系统界面效果、提供代码实现,以及分享开发过程,本文旨在为读者提供一套完整的解决方案,以促进植物病害识别技术的研究与应用。本文的主要贡献可以总结如下:
- 采用YOLOv8进行精准识别:在植物叶片病害识别的研究领域中,本文首次采用了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期版本进行了详细的比较与对比分析。相较于前者,YOLOv8在检测速度、准确率和模型轻量化方面展现出显著优势,为植物叶片病害识别提供了一种更高效、更准确的技术路径。
- 利用PySide6开发友好界面:通过运用Python的PySide6库,本文开发了一个具有优良用户体验的植物叶片病害识别系统界面。该界面不仅直观易用,还支持快速识别,极大地提高了YOLOv8算法在实际应用中的可操作性和普及率。
- 集成登录管理功能,提升系统安全性:本系统特别设计了登录管理功能,确保了使用过程的安全性,并为后续添加更多个性化功能奠定了基础。这一创新不仅增强了系统的实用性,也提高了其商业应用潜力。
- 对YOLOv8模型进行深入研究:本文不仅在应用层面利用了YOLOv8算法,还对其性能进行了全面细致的分析和评估。包括精确度、召回率等关键性能指标的详细评测,及模型在不同环境下的适应性和稳定性分析,为该算法的进一步优化和应用提供了宝贵的参考信息。
- 提供完整的数据集和代码资源:为了让读者能够深入理解YOLOv8算法在植物叶片病害识别中的应用,并便于复现和扩展研究,本文提供了一套完整的数据集和代码资源包。这些资源覆盖了从模型训练到测试的全过程,极大地降低了读者在实际操作中的门槛,为相关领域的研究和开发工作提供了强有力的支持。
1.数据集介绍
在构建一个准确的植物叶片病害识别系统中,数据集的质量和结构是至关重要的。我们的研究依赖于一个精心策划和预处理的数据集,包含了2558张图像,这些图像被细分为2002张训练图像、311张验证图像以及245张测试图像。这样的分割是为了确保模型在各个阶段都能接触到独立的数据,以公正地评估其性能。在训练过程中,模型通过大量的样本学习识别病害;在验证阶段,调整模型的超参数以优化其性能;最终,在测试阶段,模型需要证明其在未知数据上的泛化能力。
所有的图像都经过了自动方向校正的预处理步骤,以消除由于设备拍摄角度不同而产生的变异,这一步骤对于后续的模型训练至关重要,因为它确保了模型学习到的是病害特征,而非由于方向偏差产生的噪音。此外,每张图像都被调整到了统一的800x800像素的分辨率,这不仅保证了输入数据的一致性,也为神经网络提供了方便,因为大多数深度学习模型在处理固定大小的图像时更为高效。
从数据集的分布图中,我们观察到了一些关键的模式和潜在的挑战。类别分布图显示了显著的不平衡,某些类别的实例远多于其他类别。而边界框的分布图揭示了大多数病害标注集中在图像的中心区域,这可能表明数据采集时存在偏差。此外,边界框大小分布图显示了病害的宽度和高度在图像上的变化情况,为我们提供了调整数据增强策略的线索。为了解决这些问题,我们可能需要采用图像旋转、缩放、色彩调整等数据增强技术来提升样本多样性,同时可能还需要对数据进行重采样或调整损失函数来减少类别不平衡对模型训练的影响。
在数据集的标注方面,我们采用了专家级别的精确标注,每个病害区域都被一个边界框所围绕,并且配有相应的类别标签。这种精细化的注释方法为模型训练提供了丰富的信息,使其能够在后续的应用中准确识别和分类各种植物病害。每张图像都经过了精确的标注,以确保模型能够从中学习到如何识别和分类不同的植物叶片病害。博主使用的标签及其对应的中文名称如下所示:
Chinese_name = {"Apple Scab Leaf": "苹果黑星病叶", "Apple leaf": "苹果叶", "Apple rust leaf": "苹果锈病叶",
"Bell_pepper leaf spot": "甜椒叶斑", "Bell_pepper leaf": "甜椒叶", "Blueberry leaf": "蓝莓叶",
"Cherry leaf": "樱桃叶", "Corn Gray leaf spot": "玉米灰斑病叶","Corn leaf blight": "玉米叶枯病",
"Corn rust leaf": "玉米锈病叶", "Peach leaf": "桃叶","Potato leaf early blight": "马铃薯早疫病叶",
"Potato leaf late blight": "马铃薯晚疫病叶", "Potato leaf": "马铃薯叶","Raspberry leaf": "覆盆子叶",
"Soyabean leaf": "大豆叶", "Squash Powdery mildew leaf": "南瓜白粉病叶","Strawberry leaf": "草莓叶",
"Tomato Early blight leaf": "番茄早疫病叶", "Tomato Septoria leaf spot": "番茄斑点病叶",
"Tomato leaf bacterial spot": "番茄细菌性斑点叶","Tomato leaf late blight": "番茄晚疫病叶",
"Tomato leaf mosaic virus": "番茄花叶病毒叶","Tomato leaf yellow virus": "番茄黄化病毒叶","Tomato leaf": "番茄叶",
"Tomato mold leaf": "番茄霉病叶","Tomato two spotted spider mites leaf": "番茄双斑蜘蛛螨叶",
"grape leaf black rot": "葡萄叶黑腐病","grape leaf": "葡萄叶"}
综上所述,我们精心准备的数据集不仅在数量上充足,更在质量上达到了专业标准。通过预处理和标注策略的细心设计,我们确保了数据集能够支持模型学习到可靠和鲁棒的植物病害识别能力。同时,我们也意识到了数据集存在的不足,并计划通过一系列策略来弥补,以期培养出最佳的识别系统。这份数据集不仅是对模型训练的支持,也是对整个植物病害识别研究领域的贡献。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行植物叶片病害检的图片或视频,或者启动摄像头进行实时检测。在进行植物叶片病害检时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8作为YOLO系列中的新一代算法,继承并优化了前代模型的众多特性,具备了更加卓越的性能和效率。它的核心原理在于直接在输出层进行预测,大大简化了目标检测流程,提高了速度和准确度,使其在实时应用中表现出色。
首先,YOLOv8沿用了YOLO系列一贯的端到端单一网络架构,这意味着它可以在单个前向传播过程中预测出图像中的目标位置和类别。这种设计减少了作为中间步骤的区域提议阶段,从而减少了计算量并提高了处理速度。相较于YOLOv5和YOLOv8的早期版本,YOLOv8在网络架构上做了进一步的优化,如结合了特征金字塔和路径聚合网络,这使得模型能够更有效地利用多尺度信息,增强了对小目标的检测能力。
在检测头的设计上,YOLOv8采用了一个更加高效的Baseline,它能够更精确地定位目标,并在计算资源有限的情况下仍然保持高性能。YOLOv8在目标定位的精确度上也做了重大的改进,引入了Anchor-Based和Anchor-Free的机制,结合了这两种目标检测方法的优点。它通过对Anchor点的位置进行优化,提高了对各种尺寸和形状目标的适应性,同时,通过引入Task-Aligned Assigner,它可以更智能地匹配预测框和真实框,减少了不必要的计算和复杂度。
进一步地,YOLOv8在损失函数的设计上也进行了改进。例如,它采用了CIoU损失来精确地衡量预测框和真实框之间的重叠度,这一改进使得模型在训练过程中能够更加关注于目标的几何属性。同时,它还利用了DFLloss,这是一种新的损失函数,能够更加准确地预测目标的类别和位置,尤其是在目标尺寸和形状多样性较大的情况下。
最后,YOLOv8在训练策略上也做出了创新。采用了Mosaic数据增强,它可以在一个图像中合成多个训练样本,提高了模型对复杂场景的适应性。这种方法可以极大地提升模型对不同尺寸、形状和背景的目标的泛化能力。同时,Mosaic增强也有助于模型在训练早期快速收敛,实现更高的准确度。
总而言之,YOLOv8通过一系列的技术革新,如CSP结构的引入、多尺度预测、改进的Head设计、以及复合损失函数的应用,为目标检测领域带来了新的突破。这些创新不仅提高了算法的性能,而且保持了适用于实时场景的高效率,使得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/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,这是目前最先进的目标检测算法之一,它以其快速和准确性而闻名。在本段博客内容中,我们将深入探讨如何设置和启动YOLOv8模型的训练过程。
首先,导入必要的模块和库是任何Python程序的起点。这里我们导入os模块来处理文件路径问题,torch库是PyTorch深度学习框架的核心,yaml用于读取数据配置文件。ultralytics提供的YOLO是一个功能强大的对象检测模型,而QtFusion.path中的abs_path函数则用于获取数据集配置文件的绝对路径。
import os
import torch
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
接下来,我们设置设备,优先使用CUDA加速(如果可用),否则使用CPU。这是为了确保模型可以在GPU上运行,从而大幅提高训练速度。
device = "cuda:0" if torch.cuda.is_available() else "cpu"
我们确保了以下代码只有在该模块作为主程序运行时才会执行,并定义了工作进程数和批次大小,这些是控制数据加载和批处理的重要参数。为了定位数据集的yaml配置文件,我们使用abs_path函数,并替换路径分隔符以适应不同操作系统的路径规则。这个yaml文件包含了关于数据集的重要信息,如类别、路径和数据划分等。
if __name__ == '__main__': # 确保该模块被直接运行时才执行以下代码
workers = 1
batch = 8
data_name = "PlantLeaf"
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)
# 读取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)
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 # 指定训练任务的名称
)
读取yaml文件并在需要时更新路径项是处理配置文件的常规操作。这一步骤确保了模型能够正确地定位到数据集的位置。在加载模型并准备进行训练之前,首先需要加载预训练权重。这里我们加载了yolov5nu.pt作为YOLOv5模型的权重,这是从UltraLytics提供的预训练模型开始的一个好起点。最后,我们使用train方法开始训练模型。这里指定了数据配置文件、设备、工作进程数、图像大小、训练周期和批次大小。name参数用于命名训练任务,便于后续的识别和参考。
在深度学习模型的训练过程中,监控损失函数和性能指标的变化对于了解模型的学习进度至关重要。通过对YOLOv8模型训练过程中的损失函数图像进行分析,我们可以对模型性能做出专业且详细的解读。
首先观察训练和验证过程中的损失函数图,我们可以看到,随着训练过程的进行,训练集上的定位损失(box_loss)、分类损失(cls_loss)和分布式焦点损失(dfl_loss)均呈现出明显的下降趋势。这表明模型在不断学习,其在识别物体边界框、分类及预测目标类别分布上的能力都在持续提高。特别是在训练初期,损失函数下降得最为迅速,这是因为模型从一个随机初始化状态开始,通过不断的迭代优化,逐步提升了对数据的拟合能力。
在验证集上,我们同样希望看到损失函数的下降,但趋势通常会比训练集上出现的更加波动。从图中我们可以看出,验证集上的损失函数在经历了初期的下降后,趋于稳定,并在一定范围内波动。这种波动可能是由于模型在遇到验证集上的未见样本时,其预测的不确定性较高。而损失值的稳定性表明模型在验证集上没有出现过拟合现象,保持了一定的泛化能力。
接着,我们分析模型的精确度(precision)和召回率(recall)这两个重要的性能指标。精确度指的是模型预测为正类别中真正为正类别的比例,而召回率则是指模型正确预测的正类别占所有真正正类别的比例。从图中可以看到,精确度和召回率在训练过程中呈现出波动上升的趋势,这说明模型在逐步学习如何更准确地预测正类别,并且能够捕捉到更多的正类别样本。
最后,我们关注平均精度均值(mAP)的两个指标,即[email protected]和[email protected]:0.95。[email protected]仅考虑IoU(交并比)阈值为0.5时的平均精度,而[email protected]:0.95则计算了在IoU阈值从0.5到0.95时的平均精度。这两个指标能够更全面地反映模型在不同严格度的匹配标准下的性能。从图中我们可以看到,随着训练的进行,[email protected]和[email protected]:0.95都有了显著的提高,尤其是[email protected]:0.95,它的提升表明模型在更为精细的目标检测任务上表现得越来越好。
在机器学习和深度学习模型的性能评估中,F1分数是一个非常重要的指标,它结合了精确度(Precision)和召回率(Recall)两个指标的信息。具体来说,F1分数是精确度和召回率的调和平均数,能够平衡二者的影响,为模型性能提供一个综合的衡量。在目标检测任务中,F1分数尤其重要,因为它直接反映了模型检测正确目标的能力。
首先,F1得分曲线图描绘了不同置信度阈值下模型的F1得分。F1得分是精确度和召回率的调和平均值,最高可达1,而0则是最低分,高F1得分表明了模型具有较好的精确度和召回率平衡性能。在曲线图中,我们看到对所有类别平均而言,F1得分最高点出现在置信度阈值约为0.317时,此时F1得分约为0.54。这一点标识了模型在预测植物叶片病害时,识别的可靠性与覆盖所有正例的能力之间的最优平衡。
细观图中的每一条灰色线,代表了不同类别的F1得分随置信度阈值的变化。可以观察到,各类别的F1得分变化趋势各不相同,有的类别在低置信度阈值时F1得分较高,这可能意味着模型对这些类别的预测较为敏感。而有些类别则需较高的置信度阈值才能达到较高的F1得分,这可能是因为这些类别更难以识别,或者训练数据中这些类别的样本较少,导致模型在这些类别上的预测不够准确。
此外,整体的F1得分随置信度阈值增加而逐渐降低,尤其是在置信度阈值高于0.5后下降更为显著。这表明随着置信度阈值的提高,模型趋向于更为谨慎地进行预测,即使牺牲了一些召回率也要保证精确度,这可能会导致错过一些正确的预测(即降低了召回率),特别是对于难以区分的类别。
综合以上分析,YOLOv8模型在植物叶片病害识别任务上表现出了可观的性能,但仍有提升空间。特别是在选择适当的置信度阈值以获得最佳的F1得分方面,可能需要更多的微调和优化。此外,对于那些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.614 | 0.599 | 0.592 | 0.625 |
F1-Score | 0.51 | 0.54 | 0.52 | 0.54 |
(3)实验结果分析:
在深度学习领域,尤其是在目标检测任务中,算法之间的比较通常涉及到多个性能指标,这有助于全面评估各个模型的性能。在本次实验中,我们使用了F1-Score和mAP两个度量指标来对比YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个版本的性能。以下是基于相同数据集上的实验结果分析。
首先,我们来看mAP,即平均精度均值,它反映了模型预测正确性的整体水平。在所有版本中,YOLOv8n以0.625的mAP得分最高,显示出在目标检测准确性方面的优势。其次是YOLOv5nu,mAP为0.614,紧随其后。YOLOv6n和YOLOv7-tiny的mAP得分稍低,分别为0.599和0.592。mAP的高低直接反映了模型在整个数据集上, across all classes and bounding boxes,的综合表现。YOLOv8n在mAP上的领先表明,其在综合识别各类目标上的能力最强,可能是由于其更先进的架构和优化技术。
再来看F1-Score,它是精确度和召回率的调和平均值,能够衡量模型对正类别的预测精准性和完整性。在此项指标上,YOLOv6n和YOLOv8n并列得分最高,都为0.54,表明它们在预测时具有较好的平衡性,能够在不错过正类别的同时,保持较低的误报率。YOLOv7-tiny以0.52的得分紧随其后,而YOLOv5nu则稍低,为0.51。这表明尽管YOLOv5nu在mAP上表现良好,但在实际的预测平衡性上,即精确度和召回率的综合考虑上,稍逊于YOLOv6n和YOLOv8n。
综合以上分析,我们可以得出结论,YOLOv8n在这一组实验中表现最为出色,无论是在整体的检测精度上,还是在预测的平衡性上。YOLOv6n在F1-Score上与YOLOv8n持平,但在mAP上略低,这可能意味着它在某些类别上的表现不如YOLOv8n。YOLOv7-tiny虽然是一个轻量级模型,但在这两个指标上的表现仍然相当不错,特别是考虑到它的计算效率。而YOLOv5nu虽然在mAP上表现良好,但在F1-Score上略低,这可能暗示其在某些情况下可能会有较多的假阳性预测。
通过这样的对比分析,我们可以更好地理解不同版本的YOLO模型在实际应用中可能的表现和适用场景。对于追求高精度的场景,YOLOv8n可能是最佳选择,而对于需要平衡精度、召回率和计算效率的应用,YOLOv6n和YOLOv7-tiny则是值得考虑的选项。这些见解对于在实际工程实践中选择合适的目标检测模型具有重要的指导意义。
4.4 代码实现
在当今人工智能的研究和应用中,目标检测技术尤其是在农作物病害检测领域,扮演着至关重要的角色。为了实现这一点,我们利用YOLOv8模型,这是目标检测领域的一种前沿技术,它以高准确率和快速处理能力而著称。本博客将向您详细介绍如何使用YOLOv8模型和Python进行实时视频流的目标检测,这不仅能为专业人士提供洞见,也为技术爱好者提供了实践的可能。
(1)导入必要的模块和配置
我们的代码首先导入了一系列必要的库。sys库用于处理运行时环境,time用于记录处理每一帧图像所需的时间,而cv2是OpenCV的Python接口,负责图像处理。除此之外,我们还使用了QtFusion和PySide6库来创建图形用户界面(GUI),这使得我们能够以更友好的方式展示检测结果。最后,我们导入了自定义的YOLOv8Detector类,这是我们进行目标检测的核心。
import sys # 导入sys模块,用于处理Python运行时环境的一些操作
import time # 导入time模块,用于处理时间相关的操作
import cv2 # 导入OpenCV库,用于处理图像和视频
from QtFusion.path import abs_path
from QtFusion.config import QF_Config
from QtFusion.widgets import QMainWindow # 从QtFusion库中导入FBaseWindow类,用于创建主窗口
from QtFusion.handlers import MediaHandler # 从QtFusion库中导入MediaHandler类,用于处理媒体数据
from QtFusion.utils import drawRectBox # 从QtFusion库中导入drawRectBox函数,用于在图像上绘制矩形框
from QtFusion.utils import get_cls_color # 从QtFusion库中导入get_cls_color函数,用于获取类别颜色
from PySide6 import QtWidgets, QtCore # 导入PySide6库的QtWidgets和QtCore模块,用于创建GUI和处理Qt的核心功能
from YOLOv8Model import YOLOv8Detector # 从YOLOv8Model模块中导入YOLOv8Detector类,用于进行YOLOv8物体检测
from datasets.PlantLeaf.label_name import Label_list
QF_Config.set_verbose(False)
(2)定义类别和模型
接下来,我们创建了一个YOLOv8Detector对象,这是我们检测模型的核心。通过加载预先训练好的模型权重,我们为即将到来的图像检测准备好了模型。
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之后,我们定义了键盘事件处理函数,使得用户可以通过按下'Q'键来退出应用程序。这提供了一个简单的交互机制来控制程序的运行。
class MainWindow(QMainWindow): # 定义MainWindow类,继承自FBaseWindow类
def __init__(self): # 定义构造函数
super().__init__() # 调用父类的构造函数
self.resize(850, 500) # 设置窗口的大小为850x500
self.label = QtWidgets.QLabel(self) # 创建一个QLabel对象,用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置QLabel的位置和大小
def keyPressEvent(self, event): # 定义键盘按键事件处理函数
if event.key() == QtCore.Qt.Key.Key_Q: # 如果按下的是Q键
self.close() # 关闭窗口
(4)主程序流程
frame_process函数是代码的核心部分,它负责处理每一帧图像。首先,我们调整图像的大小以适应窗口,然后使用YOLOv8Detector对象的preprocess方法对图像进行预处理,接着进行模型预测,并计算处理时间。最后,我们使用drawRectBox函数将检测到的目标绘制在图像上,这个函数还会根据类别ID显示不同的颜色。
def frame_process(image): # 定义帧处理函数,用于处理每一帧图像
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 # 计算预测所花费的时间
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对象,并配置了视频处理的相关参数。MediaHandler对象用于读取视频流,并在获取新帧时调用frame_process函数。通过这种方式,我们可以在视频流上实时展示目标检测的结果。最后,我们设置视频源并启动媒体处理,以及展示主窗口,开始Qt应用程序的主循环。这使得我们的应用程序具备了实时处理视频并展示目标检测结果的能力。
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
filename = abs_path("test_media/农作物病害检测.mp4", path_type="current") # 定义视频文件的路径
videoHandler = MediaHandler(fps=30) # 创建MediaHandler对象,设置帧率为30fps
videoHandler.frameReady.connect(frame_process) # 当有新的帧准备好时,调用frame_process函数进行处理
videoHandler.setDevice(filename) # 设置视频源
videoHandler.startMedia() # 开始处理媒体
# 显示窗口
window.show()
# 进入 Qt 应用程序的主循环
sys.exit(app.exec())
通过这段代码,我们展示了如何实现一个完整的目标检测应用程序。从模型的加载到最终的用户交互,这个过程体现了现代深度学习应用的开发模式,将先进的算法与用户友好的界面结合起来,以满足实际应用场景的需求。
5. 植物叶片病害检系统实现
在设计交互式植物叶片病害检与识别系统的过程中,系统的设计思路往往决定了其功能的强大与否以及用户体验的好坏。对于交互式植物叶片病害识别系统的设计,我们采纳了模块化和分层的架构原则,旨在打造一个既高效又易于使用的应用。
5.1 系统设计思路
在我们的系统设计中,我们将详细探讨设计一个交互式植物叶片病害识别系统的思路。我们的目标是创建一个易于使用的GUI应用程序,该应用程序能够利用深度学习模型识别和定位图像中的植物叶片病害。为了实现这一目标,我们采用了一个整合界面、媒体处理和模型预测的全面设计方案。
(1)架构设计
这个系统的核心在于MainWindow类,它是用户交互的主要接口,不仅负责展示结果,也处理用户的输入。我们通过细化功能划分,让每个部分都能单独工作,同时相互协作,确保整体系统的协同性和灵活性。在这样的设计下,每一次的图像处理和结果展示都能流畅无缝地进行,为用户提供了即时的反馈。
处理层是系统的核心,包括了YOLOv8Detector类和相关的图像处理方法。在这一层,我们利用YOLOv8算法的强大能力进行图像中病害的检测与识别。这不仅包括前端的图像预处理,以适配模型的输入要求,还包括后端的结果解析,将模型的输出转化为用户可以理解的信息。
界面层(UI Layer)通过Ui_MainWindow类构建,它定义了所有的用户交互元素,如按钮、标签和图像显示区域等。用户界面的设计既直观又简洁,确保用户能够轻松地进行操作,如加载图像、启动识别和查看结果等。界面层的设计也充分考虑了美学和用户体验,采用了现代化的UI元素和清晰的布局,使得操作直观并降低了用户的学习成本。
控制层(Control Layer)由MainWindow类负责,它是处理层与界面层之间的桥梁。控制层通过实现槽函数和其他控制方法,响应用户的各种操作,如按钮点击和键盘事件等。它控制媒体处理器的启动和停止,调用YOLOv8Detector进行识别,并将结果反馈到界面层,呈现给用户。此外,通过信号和槽机制,控制层还能实现模块间的实时通讯,确保数据的即时传递。
综上所述,我们的交互式植物叶片病害识别系统通过精心设计的架构,不仅在功能上达到了高效准确识别病害的目标,而且在用户体验上也兼顾了便捷和友好。这样的系统设计使得植物病害识别不再局限于专业人员,即使是非专业的用户也能轻松地进行操作和识别,从而拓展了系统的适用范围和实用价值。
(2)系统流程
在本篇博客中,我们将探讨如何使用先进的深度学习技术构建一个交互式植物叶片病害识别系统,流畅的用户体验和高效的处理流程是设计的核心。系统的旅程从创建MainWindow类的实例开始,这个实例不仅作为用户与应用程序交云的界面,而且也是处理管道的启动核心。用户被迎接以一个直观的界面,它提供了选择图像输入源的选项,无论是实时的摄像头图像流,还是本地的视频文件和静态图片。这种灵活性允许用户根据需要来选择最合适的输入方式。
-
一旦输入源被选定,我们的系统就会启动一个专门设计的媒体处理流程。这个流程包括了从配置摄像头到读取视频文件,再到加载图像文件的一系列步骤,确保不同类型的输入源都能够被准确和高效地处理。接下来,系统进入了一个连续的帧处理循环,这是实时目标检测的关键所在。
-
在预处理阶段,每一帧图像都会经过缩放、色彩空间转换和归一化等一系列步骤的处理,以适应YOLO模型的输入需求。然后,这些预处理过的图像会被送入YOLOv8模型,进行精准的植物叶片病害识别。模型的输出不仅包含病害位置,还可能包括病害类型等相关信息。这些信息在界面更新阶段将被用来实时更新界面,包括展示病害检测框和类型标签,并在界面中以表格或图形的方式展示检测统计数据。
-
用户在系统中的交互操作也是设计考虑的重点。系统界面提供了多种按钮,让用户可以执行各种操作,比如保存检测结果、查看帮助信息或者修改设置。此外,用户可以通过下拉菜单对检测结果进行筛选和分析,这增加了系统的互动性和实用性。
-
媒体播放的控制同样重要。用户可以根据需要控制视频的播放,或是暂停和恢复图像的分析过程。这种控制能力使得用户能够更为精准地检查和观察感兴趣的病害区域,或者在需要时中断处理过程进行其他操作。
总体而言,我们的交互式植物叶片病害识别系统以其高效的后端处理能力和用户友好的前端界面,为用户提供了一个强大且直观的工具,使得植物病害的识别和分析变得更加便捷和准确。这种设计不仅适用于专业的研究人员,也适合非专业用户,无论是在田间还是实验室都能够发挥出色的性能。
5.2 登录与账户管理
在这个数字化和个性化需求日益增长的时代,为用户提供一个安全且可定制的使用环境已经成为软件设计的重要组成部分。我们的交互式植物叶片病害识别系统在这一点上尤为突出,它不仅提供了强大的病害识别功能,还配备了完善的用户登录与账户管理系统,确保了每个用户都能拥有一个安全且私人的操作空间。
在本系统中,用户首先会遇到一个由PySide6设计的登陆界面,这是一个基于SQLite数据库的用户管理平台,既安全又方便。用户可以通过这个界面进行账户的注册,创建属于自己的账号。注册后,用户可以自行设置密码,并在需要时进行修改,这为用户的账户安全提供了保障。此外,系统还提供了头像设置功能,使得用户能够更个性化地定制自己的账户,增加了用户使用系统的愉悦感。
当用户完成账户的注册和个性化设置后,便可以进入到植物叶片病害识别的主界面。在这里,用户可以进行各种操作,如上传图片、处理视频文件或直接从摄像头捕捉图像进行实时病害识别。系统不仅能够展示实时的检测框和识别类别,还能显示每个检测对象的置信度,让用户对识别结果一目了然。
为了进一步增强用户体验,我们还设计了账户注销和重新登录的功能。用户在使用完毕后可以安全退出账户,保障个人信息和使用记录的安全。在下次使用时,用户可以重新登录进入自己的账户,所有的个性化设置和历史记录都将如初次使用时一样呈现。这为用户提供了极大的方便,尤其是在多用户共享设备的情境下,每个用户都可以依据个人习惯和需求,定制属于自己的使用环境。
此外,我们系统的设计不仅满足了单一用户的使用需求,还考虑到了多用户环境下的实时目标检测场景。用户可以根据自己的工作需求,导入不同的深度学习模型,处理不同类型的输入源,如图片、视频、实时摄像头捕捉的图像以及批量文件。这种设计大大提高了系统的适用性和灵活性,使得它能够满足各种不同环境下的实际应用需求。
总之,我们的交互式植物叶片病害识别系统不仅在技术层面上实现了精准和高效的病害识别,还在用户体验层面上提供了高度的定制化服务。通过这些细致的设计,我们相信系统能够为用户带来前所未有的便捷和安全的使用体验。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1UW421F78K/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuakpZy
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZubm5Zy
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakpZr
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakpZs
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的植物叶片病害检和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
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. ↩︎