摘要:开发高效的植物病害检测系统对于提升农业生产效率和作物健康管理意义重大。本篇博客详细阐述了如何运用深度学习技术构建一个植物病害检测系统,并提供了完整的实现代码。该系统基于先进的YOLOv8算法,对YOLOv7、YOLOv6、YOLOv5进行了性能对比,包括mAP、F1 Score等关键指标的分析。文章深入解释了YOLOv8算法的原理,提供了相应的Python代码和训练数据集,并设计了一个基于PySide6的用户友好UI界面。
系统能够准确检测和分类图像中的植物病害,支持通过图片、文件夹、视频文件或实时摄像头输入进行检测,功能包括热力图分析、标记框类别、类别统计、可调Conf、IOU参数、结果可视化等。此外,还包含了基于SQLite的用户注册登录管理界面,允许通过按钮切换不同模型和自定义UI界面。本文旨在为深度学习新手提供实用指南,文章末尾附有代码和数据集下载链接,便于读者下载和应用。本文结构如下:
目录演示与介绍视频:https://www.bilibili.com/video/BV1Mr421W788/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuakpdw
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakpdp
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakpdq
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakpdr
前言
在当今世界,农业生产面临诸多挑战,其中之一便是植物病害的及时检测与管理。随着全球人口的增长,对粮食的需求日益增加,而植物病害的发生频率和破坏力则直接威胁到农作物的产量和质量,进而影响到食品安全和农业可持续发展。据估计,植物病害每年造成全球农作物产量的损失高达20%至40%。因此,发展高效、准确的植物病害检测系统不仅对于减少经济损失、保障粮食安全具有重要意义,也是推动农业科技进步和实现精准农业管理的关键。
传统的植物病害检测方法主要依赖于农业专家的经验和人工观察,这不仅耗时耗力,而且难以实现大规模监测和早期检测。随着人工智能技术,特别是深度学习技术的飞速发展,基于图像识别的植物病害检测技术已经成为研究的热点。YOLO(You Only Look Once)系列模型作为深度学习领域的先进算法,以其快速、准确的检测性能引起了广泛关注。从YOLOv5到YOLOv8,每一代的升级都在性能、速度和准确度上有了显著提升。此外,其他最新的深度学习算法,如Transformer和Capsule Networks,也在植物病害检测领域显示出了潜力。这些技术的进步不仅提高了检测的精度和效率,也大大扩展了植物病害检测的应用范围,如无人机监测、智能温室管理等。
YOLOv5[1],作为系列中的一个重要版本,因其优秀的平衡性能和速度而被广泛应用于植物病害检中。随后,YOLOv6[2]和YOLOv7[3]的发布,通过改进网络结构和训练策略,进一步提高了检测的准确率和速度。YOLOv8[4]在植物病害检测中的应用表现出了前所未有的效率和准确性。YOLOv8通过改进网络架构、优化训练策略和引入更高效的特征融合技术,显著提升了对小物体的检测性能,这对于识别尺寸不一的植物病害尤为重要。
数据集的发展是推动植物病害检测技术进步的另一个重要因素。与早期的数据集相比,最新的数据集不仅在规模上有了显著扩展,而且在多样性、复杂性和标注质量上也有了大幅提升。例如,PlantVillage数据集是目前最广泛使用的植物病害图像数据集之一,包含了多种作物和病害类型的高分辨率图像。此外,为了适应复杂的田间环境,新的数据集开始包含从无人机和移动设备捕获的图像,这些图像更接近实际应用场景中的条件。
尽管如此,植物病害检测系统的研究和应用仍面临着多方面的技术挑战,如算法的泛化能力、实时性能的进一步提升、以及在复杂环境下的适应性等。此外,如何将这些高级算法有效集成到农业生产的实际应用中,实现智能化、自动化的植物病害管理,也是未来研究的重要方向。
未来的发展趋势可能集中在几个方面:一是算法方面,如何通过新的网络架构或训练策略进一步提升模型的准确性和泛化能力;二是数据集方面,开发更加多样化、全面的数据集,以及利用弱监督学习或半监督学习技术减少对大量标注数据的依赖;三是实际应用方面,如何将这些技术更好地集成到智能农业系统中,实现自动化的植物病害监测和管理。
本博客通过深入探讨基于YOLOv8算法构建的植物病害检测系统,不仅展示了系统界面的效果,详细讲解了算法原理,提供了代码实现,还分享了系统的开发过程。我们希望通过这一全面的分享,能够为读者提供有价值的见解,激发更多的相关研究。本文的主要贡献可以概括为以下几点:
- 采用最先进的YOLOv8算法进行植物病害检测系统的开发:本文详细介绍了如何利用当前最新的目标检测算法—YOLOv8,进行高效准确的植物病害检测,相较于早期的深度学习模型如CNN和ResNet等,YOLOv8在效率和精准度方面展现出显著优势。通过与YOLOv7、YOLOv6、YOLOv5等算法的结果对比,本文为相关领域的研究者和从业者提供了新的研究思路和实践手段。
- 利用PySide6实现用户界面友好的植物病害检测系统:本文探讨了如何使用Python的PySide6库,开发一个直观便捷的植物病害检测系统界面,该界面的设计不仅提升了用户体验,而且促进了YOLOv8算法在实际应用中的推广。
- 集成登录管理功能,增强系统安全性:本系统设计了登录管理功能,要求用户完成登录后才能使用,这不仅增强了系统的安全性,也为未来添加更多个性化功能奠定了基础。
- 深入研究YOLOv8模型的性能:本文不仅应用了YOLOv8算法进行植物病害检测,还对该算法的性能进行了深入研究,包括精准度、召回率等关键指标的评估,以及在不同环境条件下的表现分析,为YOLOv8算法的优化和改进提供了重要的参考。
- 提供完整的数据集和代码资源包:为了让读者能够更好地理解和应用YOLOv8/ v7/v6/v5算法在植物病害检测中的操作,本文提供了包括训练和测试用的详细数据集以及完整的代码实现。这些资源使读者能够直接复现实验结果,并在此基础上进行进一步的研究和开发。
1.数据集介绍
在深度学习和机器视觉领域,构建一个高效准确的目标检测系统,数据集的质量和结构是成功的关键。我们的研究专注于植物病害检测,这不仅对于科研具有重要意义,而且在实际的农业生产中发挥着至关重要的作用。为此,我们构建和维护了一个包含5150张图像的丰富数据集,专门用于训练和测试我们的植物病害检测系统。这个数据集被精心划分为4420张训练图像、366张验证图像和364张测试图像,以确保模型的泛化能力和稳定性。
在预处理阶段,我们对图像进行了自动方向校正,并剥离了EXIF方向信息,以保证数据的一致性,这对于后续的模型训练是非常必要的。所有图像都被统一调整至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系列中的最新成员,是目前最先进的目标检测算法之一。它在前代YOLOv5的基础上进行了多项重要的技术革新和性能优化,使其在速度、准确度、鲁棒性以及易用性方面都有了显著的提升,成为了植物病害检测等多种视觉识别任务的首选模型。
在YOLOv8的设计中,首先值得注意的是其继承并优化了YOLO系列的基本架构,实现了更高效的特征提取和目标定位能力。与YOLOv5相比,YOLOv8在网络结构上进行了一系列的创新,如引入了新的激活函数和归一化层,这些变化使得模型可以更好地捕捉到图像中的复杂特征,从而在各种复杂场景下提供更为准确的检测结果。
YOLOv8的另一个显著改进是在训练策略上。它采用了一系列新颖的技术来优化训练过程,如Task-Aligned Assigner技术,这一技术通过对训练任务和标签分配过程进行优化,有效提高了模型对目标的分类和定位能力。此外,YOLOv8还引入了DFL(Dynamic Focal Loss),这是一种新型的损失函数,它可以动态地调整对不同目标的关注程度,尤其是在存在类别不平衡的数据集中,这一机制能够显著提升小目标的检测性能。
在实际应用中,YOLOv8还融入了Mosaic数据增强技术,该技术通过在训练早期阶段将多个训练图像拼接在一起,为模型提供更多样化的输入,增强了模型的泛化能力。这种数据增强技术特别适用于那些样本多样性很重要的任务,比如植物病害检测,因为它可以模拟出更多样的病害外观和背景环境,提高模型在实际应用中的鲁棒性。
YOLOv8继承并改进了YOLOv7引入的CSP结构,这种结构通过将特征图分割成两部分,一部分通过网络进行前向传播和反向传播,而另一部分则直接连接到后面的层。这种设计减少了计算量并提高了特征的利用效率。YOLOv8在CSP的基础上进一步优化,增加了新的网络连接策略,使其在特征提取上更为高效。
综上所述,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/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 | 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。 |
在构建深度学习模型的过程中,代码的编写是实现理论到实际应用的重要一环。在本段博客中,我们将探讨如何使用Python和PyTorch框架,结合UltraLytics的YOLO实现,来训练一个植物病害检测模型。这一过程不仅涉及到模型的加载和训练,还包括了数据集的配置和路径管理等细节。下面,我们将逐行解析这个过程的关键代码部分。
首先,导入必要的模块和库是任何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 = "PlantsDisease"
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)和分布式焦点损失(df1_loss)的变化。边界框损失负责对模型预测的边界框与真实边界框之间的差异进行惩罚,分类损失则处理类别预测的正确性,而分布式焦点损失则是对于难以分类样本的一种更细致的损失函数。在训练初期,这些损失值通常较高,因为模型还未学习到足够的特征。随着训练进展,我们期望看到这些损失值逐渐下降,这表明模型在逐渐改善其预测。图中展示的趋势符合这一预期:损失值在训练过程中持续下降,最终趋于稳定,这是模型正常收敛的标志。
对于性能指标,精确度(precision)和召回率(recall)是衡量模型性能的关键指标。精确度表示模型预测为正的样本中真正为正的比例,而召回率则衡量模型能够正确识别的正样本的比例。从图中我们可以看出,模型的精确度和召回率在训练过程中呈现出上升的趋势,这意味着模型在不断学习如何更准确地检测和分类图像中的目标。
mAP(mean Average Precision)是衡量目标检测模型性能的一个综合指标,通常包括[email protected]和[email protected]两个水平,分别代表在不同的IoU(Intersection over Union)阈值下模型性能的评估。[email protected]更为宽容,只要预测的边界框与真实边界框的IoU超过0.5就认为是正确的,而[email protected]则覆盖了从0.5到0.95的所有阈值,是一个更严格的评估。图中的mAP值随着训练逐步提升,并在一定的训练周期后达到平稳状态,这表明模型具有良好的检测能力,并且对于不同的IoU阈值具有较为稳定的表现。
在机器学习和深度学习模型的性能评估中,F1分数是一个非常重要的指标,它结合了精确度(Precision)和召回率(Recall)两个指标的信息。具体来说,F1分数是精确度和召回率的调和平均数,能够平衡二者的影响,为模型性能提供一个综合的衡量。在目标检测任务中,F1分数尤其重要,因为它直接反映了模型检测正确目标的能力。
首先,F1曲线显示了在不同置信度阈值(Confidence)下的模型性能。曲线上的每个点反映了在特定置信度阈值下模型的F1分数。在曲线的开始部分,随着置信度阈值的增加,F1分数迅速上升,这意味着模型在较低置信度时将很多不准确的预测视为正样本,导致了较低的精确度和较高的召回率。随着置信度阈值的提高,模型开始更加谨慎地标记正样本,因此精确度提高了,但召回率可能会略有下降。
曲线的顶部,也就是F1分数达到峰值的位置,表示了模型在精确度和召回率之间达到最佳平衡的置信度阈值。在这个案例中,最大的F1分数约为0.62,对应的置信度阈值约为0.358。这个最大值指出,在此阈值下,模型对于判断目标是否正确的置信度和其实际性能之间达到了最佳的平衡。
然而,在峰值之后,随着置信度阈值的继续增加,F1分数开始下降,这表明模型变得过于保守,错过了一些正确的目标(即漏检),导致召回率下降。在置信度接近1的极端情况下,尽管模型的精确度可能很高(因为几乎所有标记为正的预测都是正确的),但由于漏检太多,召回率会非常低,因此F1分数降低。此外,曲线图中还展示了多条线,可能代表不同类别或不同实验条件下的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.629 | 0.623 | 0.613 | 0.636 |
F1-Score | 0.61 | 0.60 | 0.60 | 0.62 |
(3)实验结果分析:
首先,我们注意到mAP,即平均精度均值,它反映了模型在不同置信度阈值下的平均表现。在我们的实验中,YOLOv8n以0.636的mAP得分最高,这表明它在整体检测精度上优于其他版本。YOLOv5nu紧随其后,得分为0.629,而YOLOv6n和YOLOv7-tiny的表现稍逊一些,分别为0.623和0.613。mAP作为一个整体性能的指标,更高的分数意味着模型具有更好的检测能力和更高的可靠性。
另一个重要的指标是F1-Score,它是精确度和召回率的调和平均数,能够综合考虑模型检测正确性和完整性。在这一指标上,YOLOv8n同样以0.62的得分领先,这进一步证实了它在检测性能上的优势。其他三个模型的F1-Score相对较接近,分别为0.61、0.60和0.60,这说明它们在精确度和召回率的平衡上表现相似。
从这些数据我们可以得出结论,随着YOLO系列的发展,新版本的模型在性能上确实有所提升。YOLOv8n在我们的实验中表现最佳,不仅在整体检测准确性上(mAP)领先,而且在检测的准确性和完整性的平衡上(F1-Score)也具有优势。YOLOv5nu作为较早的版本,仍然显示出强大的性能,而YOLOv6n和YOLOv7-tiny则提供了相对较为均衡的性能。
这样的性能对比对于实践者来说极为重要。它不仅为选择合适的模型提供了数据支持,而且也展示了在不同场景下可能需要权衡的性能指标。例如,在对精确度要求更高的应用场景下,YOLOv8n可能是更佳的选择,而在对计算资源有限制的环境中,较轻量的YOLOv7-tiny可能会更加合适。
综上所述,模型选择应基于具体的应用需求和环境限制,而这些实验数据为我们提供了进行合理选择的依据。通过这些综合评估指标,我们能够更全面地理解每个模型的优势和局限,从而为实际应用中的模型部署和优化提供指导。
4.4 代码实现
在这篇博客中,我们将深入探讨如何使用YOLOv8模型来构建一个植物病害检测系统。我们将通过一段Python代码,一步步展示从模型加载到实时检测的整个过程。这段代码不仅集成了深度学习和计算机视觉的核心技术,而且利用了PySide6创建了用户友好的界面。
(1)导入必要的模块和配置
首先,我们导入了几个关键的Python模块,包括用于图像处理的OpenCV库,以及构建图形用户界面(GUI)所需的PySide6模块。通过这些工具,我们可以对图像进行读取和处理,同时为用户提供一个交互窗口。
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模型并进行目标检测
from datasets.PlantsDisease.label_name import Label_list
QF_Config.set_verbose(False)
在代码中,我们使用QtFusion库,这是一个封装了Qt功能的库,它提供了创建现代化窗口和控件的方法。
(2)定义类别和模型
接下来,我们创建了一个YOLOv8Detector对象,这是我们检测模型的核心。通过加载预先训练好的模型权重,我们为即将到来的图像检测准备好了模型。
cls_name = Label_list # 定义类名列表
colors = [[random.randint(0, 255) for _ in range(3)] for _ in range(len(cls_name))] # 为每个目标类别生成一个随机颜色
model = YOLOv8Detector() # 创建YOLOv8Detector对象
model.load_model(abs_path("weights/best-yolov8n.pt", path_type="current")) # 加载预训练的YOLOv8模型
(3)创建主窗口
我们定义了一个MainWindow类,这是我们应用程序的主窗口。在这个类中,我们设置了窗口的大小,并添加了一个QLabel组件来展示检测结果。为了使应用程序能够响应用户的操作,我们还定义了keyPressEvent方法来处理键盘事件
class MainWindow(QMainWindow): # 自定义主窗口类
def __init__(self): # 构造函数
super().__init__() # 调用父类构造函数
self.resize(850, 500) # 设置窗口大小
self.label = QtWidgets.QLabel(self) # 创建标签用于显示图像
self.label.setGeometry(0, 0, 850, 500) # 设置标签位置和大小
def keyPressEvent(self, event): # 键盘事件处理
if event.key() == QtCore.Qt.Key.Key_Q: # 按下Q键时
self.close() # 关闭窗口
(4)主程序流程
随后,进入主函数中,我们选择了一张测试图像,并使用了cv_imread来读取图像,这是一个适配不同编码格式的图像读取函数。读取之后,我们将图像大小调整到模型所需的640x640像素,并对其进行预处理。随后,我们开始对图像进行实时检测。通过记录开始和结束时间,我们可以计算出模型进行预测的耗时。模型的predict方法返回了预测结果和叠加在原图上的图像。
if __name__ == '__main__': # 如果当前模块是主模块
app = QtWidgets.QApplication(sys.argv) # 创建QApplication对象
window = MainWindow() # 创建MainWindow对象
img_path = abs_path("test_media/PlantsDisease_SIXU_A00027.jpg") # 定义图像文件的路径
image = cv_imread(img_path) # 使用cv_imread函数读取图像
image = cv2.resize(image, (640, 640)) # 将图像大小调整为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()))
检测结果会包含诸如类别名称、边界框、置信度等信息。我们使用drawRectBox函数在图像上绘制这些边界框和标签,并为每个检测到的对象分配一个随机颜色。最后,我们将处理后的图像展示在GUI上,并将应用程序的执行流交给Qt的事件循环。
通过这段代码,我们展示了如何实现一个完整的目标检测应用程序。从模型的加载到最终的用户交互,这个过程体现了现代深度学习应用的开发模式,将先进的算法与用户友好的界面结合起来,以满足实际应用场景的需求。
5. 植物病害检系统实现
在设计交互式植物病害检与识别系统的过程中,我们采取了一个模块化和层次化的方法,以确保系统既高效又易于维护。我们的系统设计思路是围绕用户体验来构建的,旨在提供一个直观、响应迅速的用户界面,同时在后台执行复杂的图像处理和目标检测任务。
5.1 系统设计思路
在我们的系统设计中,我们将详细探讨设计一个交互式植物病害检测系统的思路。我们的目标是创建一个易于使用的GUI应用程序,该应用程序能够利用深度学习模型识别和定位图像中的植物病害。为了实现这一目标,我们采用了一个整合界面、媒体处理和模型预测的全面设计方案。
(1)架构设计
在开发交互式植物病害检与识别系统的过程中,我们的核心理念是将高效的图像识别技术与直观的用户界面(UI)相结合,从而提供一个即插即用的解决方案,它能够快速且准确地识别各种植物病害。此系统设计采用了模块化的架构,每一部分都承担着特定的职责,确保整个系统既高效又易于维护。
在我们的系统中,界面的简洁性和直观性至关重要,因此在界面层,我们设计了一系列用户交互元素,使得用户能够轻松上传图像、开始检测过程,并查看检测结果。界面的设计不仅仅是为了美观,更多的是为了提升用户体验,减少操作复杂性,确保用户能够在没有技术背景的情况下也能顺利使用系统。
为了实现图像中植物病害的准确检测,我们在处理层引入了YOLOv8Detector类,这是一个封装了YOLOv8模型的处理器,能够处理输入的图像并输出检测结果。这个预训练的模型经过大量数据的训练,已经具备了高精度识别植物病害的能力。在检测过程中,系统会将图像传递给这个处理器,然后快速返回包含了病害类型和位置信息的结果。
在控制层,我们设计了一系列槽函数,这些函数响应界面层的用户操作,如“检测”按钮的点击事件。控制层会指挥处理层执行图像的检测任务,并将结果反馈给界面层,更新界面上的信息显示。我们利用PySide6的信号和槽机制来实现这种层间的通信,这种机制不仅使得代码的组织更加清晰,还提高了各个模块间的数据处理效率。
通过这种分层的设计,我们的系统不仅提高了代码的可读性和可维护性,而且也增强了系统的稳定性和扩展性。用户可以直观地进行植物病害检测,而开发者也可以在不影响用户体验的情况下,轻松地对模型和界面进行升级和维护。这样的设计思路确保了我们的系统能够适应未来技术的发展,同时也满足了当前用户对于高效率和高准确率检测系统的需求。
(2)系统流程
在本篇博客中,我们将探讨如何使用先进的深度学习技术构建一个交互式植物病害检测系统。这个系统能够实时地识别和定位图像中的植物病害,并通过友好的用户界面显示结果,从而为用户提供一个全面的解决方案。
-
系统的入口是MainWindow类的实例化,它负责加载用户界面和初始化必要的参数配置。界面的设计直观易懂,允许用户方便地选择图像输入源。输入源的灵活性是这个系统的一大亮点,用户可以从实时摄像头捕获、视频文件或是本地图像库中选择。这为用户在不同场景下的需求提供了广泛的选择。
-
一旦输入源被选定,系统就会激活对应的媒体处理器,这些处理器负责图像的获取和预处理。这一阶段是为了确保输入的数据符合YOLOv8模型的要求,通过对图像进行缩放、色彩空间转换和归一化等操作,为后续的检测阶段做好准备。
-
当媒体输入源被准备好后,系统进入到连续帧处理的环节。在这个环节中,每一帧图像都会经过预处理,然后被送入YOLOv8模型进行精确的植物病害检测和识别。利用深度学习的强大能力,模型能够识别出图像中的病害特征,并给出具体的类别和位置信息。
-
随着结果的生成,系统的界面会实时更新,不仅展示了检测框和类别标签,还会在界面上的图表或条形图中展示出检测结果的统计数据。这样的实时反馈使得用户可以直观地观察系统的性能,并能够根据检测结果进行进一步的操作。
-
用户交互是这个系统的另一个重要特点。系统提供了多种交互按钮和菜单,用户可以通过这些功能保存结果、查询系统信息,甚至是筛选和分析特定的检测数据。此外,媒体控制选项让用户能够按需暂停和恢复图像捕获或分析,提供了更高的操作灵活性。
综上所述,交互式植物病害检测系统通过精心设计的用户界面和强大的后端算法,实现了从数据输入到结果输出的全过程自动化,极大地降低了用户操作的复杂性,提高了检测的效率和准确性。它不仅能够帮助用户快速识别和处理植物病害问题,而且其设计理念和流程对于未来类似系统的开发提供了宝贵的参考。
5.2 登录与账户管理
在当今信息化时代,账户管理与数据安全变得尤为重要。我们的植物病害检测系统深刻理解到这一点,并在系统中集成了一套完善的用户登录与账户管理功能。这个功能不仅保证了用户数据的安全性,也极大地提升了用户体验。
系统的账户管理是基于PySide6——一个强大的Python库,以及SQLite——一个轻量级的数据库系统构建的。这一结合不仅保障了系统的稳定性和数据的安全性,同时也使得界面操作直观且响应迅速。用户首次使用系统时,可以通过简单的注册流程创建自己的账户。注册过程设计得既简洁又包含必要的安全性考量,如密码强度验证等。
一旦完成注册,用户就能通过登录界面访问系统的主要功能。登录界面的设计旨在为用户提供一个简单、无缝的入口,进而进入到植物病害检测的核心功能。此外,账户管理系统还支持用户在使用过程中更新个人信息,如修改密码、设置个性化头像,以及在需要时注销账户。这些细节的考虑使得每个用户都能拥有一个个性化且安全的使用环境,他们可以在其中保存个人的检测记录和偏好设置。
而在主界面中,用户可以体验到实时的植物病害检测,系统能够处理图片、视频、实时摄像头捕获的图像以及批量文件输入,并展示包括检测框、类别和置信度在内的详细信息。所有这些功能都紧密结合,确保用户能够无缝地在注册、登录、检测和管理个人账户之间切换,从而优化整个用户的操作流程。
这样的系统设计允许用户专注于植物病害的检测任务,而不必担心个人数据的安全问题。无论是在家庭农场还是在工业农业环境中,用户都能依赖这个系统来帮助他们监测和管理植物健康。账户管理系统的加入,不仅让用户能够保留自己的操作历史,还能够让管理者在需要时进行审计和监督。这种设计思想和实现,不仅提高了系统的实用性和安全性,还为未来可能的拓展提供了坚实的基础。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1Mr421W788/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/mbd-ZZuakpdw
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuakpdp
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZuakpdq
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZuakpdr
在文件夹下的资源显示如下,下面的链接中也给出了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等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的植物病害检和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Wu W, Liu H, Li L, et al. Application of local fully Convolutional Neural Network combined with YOLO v5 algorithm in small target detection of remote sensing image[J]. PloS one, 2021, 16(10): e0259283. ↩︎
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. ↩︎
Talaat F M, ZainEldin H. An improved fire detection approach based on YOLO-v8 for smart cities[J]. Neural Computing and Applications, 2023, 35(28): 20939-20954. ↩︎