基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的农作物害虫检测系统(深度学习模型+UI界面+训练数据集)
摘要:开发农作物害虫检测系统对于提高农业生产效率和作物产量具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个农作物害虫检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间的性能指标,如mAP、F1 Score等。文章深入解释了YOLOv8的原理,提供了相应的Python代码、训练数据集,并集成了一个基于PySide6的界面。
系统能够精准检测和分类农作物表面的各种害虫目标,支持通过图片、图片文件夹、视频文件及摄像头进行检测,包含柱状图分析、标记框类别、类别统计、可调Conf、IOU参数和结果可视化等功能。还设计了基于SQLite的用户管理界面,支持模型切换和UI自定义。本文旨在为深度学习初学者提供实用指导,代码和数据集见文末。本文结构如下:
@
演示与介绍视频:https://www.bilibili.com/video/BV11t421L79s/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmptq
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuclJ9x
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZyTkpZs
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUlphw
前言
在当今全球化的农业生产中,农作物害虫的有效管理是确保粮食安全和提高作物产量的关键因素。害虫不仅直接损害作物,导致减产,还可能传播各种病毒和疾病,增加农药使用量,从而影响环境和人类健康。因此,开发高效、精确的农作物害虫检测系统显得尤为重要。随着人工智能和计算机视觉技术的飞速发展,尤其是深度学习算法的应用,为农作物害虫检测提供了新的解决方案。其中,YOLO[1](You Only Look Once)系列算法因其高效和准确性在害虫检测领域得到了广泛应用。YOLO算法能够实时处理图像数据,快速准确地识别和定位图像中的害虫,极大提高了害虫监测的效率和准确度。
YOLOv5[2]作为一种轻量级且高效的目标检测模型,在农作物害虫检测领域表现出了卓越的性能。研究者通过对YOLOv5模型进行微调,使其更适合于检测小型和密集的害虫,显著提高了检测的准确性和速度。此外,随着YOLOv6和YOLOv7的推出,这些版本在模型架构和检测机制上进行了进一步的优化,如引入了更先进的特征提取网络和注意力机制,以提高对害虫细微特征的识别能力。
YOLOv8[3]继续沿袭YOLO系列的高效实时检测特性,引入了更深的网络架构和改进的损失函数,以提高对小型和模糊害虫的识别能力。通过采用更加精细的特征融合策略和针对性的数据增强方法,YOLOv8在多个农作物害虫数据集上展现出了优异的性能,特别是在处理高密度害虫和小目标检测方面的能力得到了显著提升。
除了YOLO系列,Transformer模型也在害虫检测领域展现出了巨大的潜力。基于Transformer的视觉模型,如ViT(Vision Transformer),通过引入自注意力机制,能够捕获图像中的长距离依赖关系,从而提高模型对害虫形态和大小变化的适应性。一项研究利用ViT模型在复杂背景下的农作物害虫检测中取得了比传统卷积神经网络更高的准确率,证明了Transformer架构在处理视觉任务中的有效性。
另外,基于图卷积网络(GCN)的方法也开始被应用于害虫检测,尤其是在处理害虫间相互关系和作物环境中的上下文信息时。GCN通过在图结构数据上进行卷积操作,能够有效地捕获害虫与其周围环境之间的复杂交互,从而提高检测的准确性和鲁棒性。
然而,尽管取得了显著的进展,农作物害虫检测系统仍面临诸多技术挑战,如在复杂环境下的害虫识别准确性、小型害虫的检测难度、算法的实时性能优化等。未来的研究趋势可能集中在算法的进一步优化、多模态数据融合技术的应用、以及模型的轻量化和硬件优化上,以适应移动设备和边缘计算设备,实现更广泛的现场应用。
本博客的核心工作在于基于最先进的YOLOv8算法构建了一个先进的农作物害虫检测系统。通过细致地介绍算法原理、展示系统界面、提供代码实现,并分享开发过程,本文旨在为读者提供一份全面的指南,以促进农作物害虫检测技术的研究和应用。本文的主要贡献总结如下:
- 采用先进的YOLOv8算法:我们不仅采用了最新的YOLOv8算法来构建农作物害虫检测系统,还详细比较了YOLOv8与其前身YOLOv7[4]、YOLOv6[5]、YOLOv5等算法在效率和精准度方面的性能。这一比较为研究社区提供了宝贵的参考,显示了YOLOv8在农作物害虫检测方面的优越性能。
- 利用PySide6实现友好的用户界面:本文深入探讨了如何利用Python的PySide6库开发一个美观、用户友好的农作物害虫检测系统界面。通过提供直观便捷的操作方式,该系统极大地促进了YOLOv8算法在实际应用中的普及和应用,同时推动了技术的实际落地。
- 集成登录管理功能:系统设计中融入了登录管理功能,旨在提高系统的安全性,并为将来引入更多个性化功能奠定基础。这一设计思路不仅提升了用户体验,还为系统的后续升级和功能扩展提供了可能。
- 深入研究YOLOv8模型性能:本文不仅应用了YOLOv8算法进行农作物害虫检测,还对其性能进行了深入分析,包括精确度、召回率等关键指标的评估,以及模型在不同环境和条件下的性能分析。这些研究为深入理解YOLOv8算法提供了全面的视角,并为算法的进一步优化提供了坚实的基础。
- 提供完整的数据集和代码资源:为了让读者能够更好地理解和应用YOLOv8及其前身版本在农作物害虫检测系统中的操作,本文提供了包含训练和测试所需的完整数据集以及系统实现的完整代码资源包。通过这些资源,读者可以轻松复现实验结果,并在此基础上开展进一步的研究和开发工作。
1.数据集介绍
在构建高效的农作物害虫检测系统时,一个详细标注和均衡分布的数据集是至关重要的。本研究使用的数据集含有6971张图像,这些图像被分配为6084张训练图像,770张验证图像,以及117张测试图像。这样的分布确保了模型在学习过程中能接触到足够多的样本,同时留有独立的数据用于验证和测试模型的泛化能力,确保其在未知数据上也能保持良好表现。
数据集的图像经过了精心的预处理和增强。每张图像都被调整到640x640像素,确保了输入到模型中的图像尺寸一致,这对于保持训练过程中的稳定性非常重要。为了提高模型的鲁棒性和适应性,我们对数据集应用了两种常见的图像增强技术:一是以50%的概率进行水平翻转,二是进行了-15到+15度的随机旋转。这些变换不仅扩充了数据集,还增加了模型对于害虫在不同方向和角度下的识别能力。
通过对数据集分布的分析图可知,我们的数据集包括多个不同的害虫类别,从常见的蚜虫、叶螨到更为特殊的害虫如白粉虱和夜蛾,确保了害虫检测系统能覆盖广泛的害虫种类。数据集中的害虫实例分布较为均匀,有利于避免模型在训练时出现过于偏向某一类害虫的情况,这也有助于提升模型在实际应用中的准确性和可靠性。
进一步的分布分析揭示了害虫标注的位置和大小信息。从标注的边界框中我们可以观察到,大多数害虫出现在图像的中心位置,这与农作物害虫实际出现的情况相吻合。边界框的大小分布图显示,大部分害虫在图像中占据的面积较小,这对检测算法提出了更高的要求,因为模型必须能够精确识别图像中的小目标。此外,博主使用的类别代码如下:
Chinese_name = {"Hellula undalis": "小菜蛾", "Leaf Webber": "叶网蛾", "ash weevil": "灰象甲", "blister beetle": "水泡甲虫",
"fruit fly": "果蝇", "fruit sucking moth": "吸果蛾","helicoverpa": "棉铃虫", "leucinodes": "茄果螟",
"mealy bug": "粉虱","pieris": "菜粉蝶","plutella": "小菜蛾","root grubs": "根蛆","schizaphis graminum": "禾谷缢管蚜",
"uroleucon compositae": "合头菊蚜","whitefly": "白粉虱"}
综上所述,本研究提供的数据集不仅丰富了农作物害虫检测的数据资源,也为如何构建和评估一个高效的害虫检测系统提供了实际的案例和有力的证据。通过本文所述的预处理和增强手段,以及对数据分布的分析,研究人员和实践者可以更好地理解如何处理和利用这类数据,为实现精准农业和保障粮食安全做出贡献。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行农作物害虫检测的图片或视频,或者启动摄像头进行实时检测。在进行农作物害虫检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
YOLOv8作为最新一代的目标检测算法,继承并优化了YOLO系列算法的诸多特性,其中包含了一系列的创新和改进。YOLOv8的设计思想着重于提升检测精度,加快处理速度,并且在处理大规模数据集时具有更好的稳定性。以下是YOLOv8原理的详细介绍:
YOLOv8在继承了YOLO系列算法的基础上,引入了一系列新的网络架构优化。这些优化保留了YOLO系列算法的快速检测特性,并且通过精心设计的网络结构,进一步提升了模型的性能。YOLOv8优化了前作YOLOv7中的CSPDarknet53网络架构,这是一种结合了跨阶段部分网络(CSP)的设计理念和Darknet53网络的结构,它强调了特征的重用和计算效率,从而在提升模型性能的同时,也减少了计算资源的消耗。
YOLOv8的创新之处也体现在其损失函数的设计上,它引入了一种改进的分配器——TaskAlignedAssigner,这是一个自适应的方法,它可以根据预测结果和真实标签之间的对齐程度来调整损失。这种方法使得算法能更准确地学习到目标的大小、形状和类别,而不仅仅是简单地学习到害虫的存在。此外,YOLOv8还引入了Distribution Focal Loss来改善类别不平衡问题,这是一种更为精细化的损失函数,可以更好地处理那些在数据集中出现较少,但对检测结果影响较大的少数类别。
在性能优化方面,YOLOv8通过更智能的方式进行特征提取和特征融合,确保了模型在处理更加复杂的场景时,仍然能够保持高效和准确。它采用了更为高级的注意力机制来强调重要特征,并通过精心设计的网络路径来减少计算资源的浪费。这种设计允许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/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框架来训练一个YOLOv8模型,以便在农作物害虫检测系统中使用。这段代码的核心思想是利用YOLOv8的强大功能,结合专为害虫检测准备的数据集,进行深度学习模型的训练。接下来,我们将一步步深入解析这段代码。
首先,我们需要引入必要的Python模块。这包括os模块以处理文件路径,torch用于深度学习操作,以及yaml用于解析配置文件。此外,我们还导入了YOLO类,这是我们将要用于训练的主要工具。接着,我们设置训练运行的设备,自动检测是否有可用的CUDA设备,如果没有,则使用CPU。
import os
import torch
import yaml
from ultralytics import YOLO # 导入YOLO模型
from QtFusion.path import abs_path
device = "cuda:0" if torch.cuda.is_available() else "cpu"
然后,我们定义了工作进程的数量和批次大小,这些参数直接影响数据加载和模型训练的速度。我们还定义了数据集的名称,并构建了数据集配置文件的路径。我们接下来对配置文件进行了读取和处理,确保了模型可以找到正确的数据集路径。
workers = 1
batch = 8
data_name = "InsectPest"
data_path = abs_path(f'datasets/{data_name}/{data_name}.yaml', path_type='current') # 数据集的yaml的绝对路径
unix_style_path = data_path.replace(os.sep, '/')
紧接着的代码段负责读取YAML配置文件,并进行必要的修改以适配我们的数据路径。这些细节操作确保了模型训练中数据的正确加载。
# 获取目录路径
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)
在读取了配置文件之后,我们加载了预训练的YOLOv8模型,并开始了训练过程。model.train()函数被用来启动训练,我们传入了数据集的路径、设备、工作进程数量、图像大小、训练周期数以及批次大小等参数。
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 # 指定训练任务的名称
)
在博客的这一部分中,我们展示了从数据准备到模型训练的整个过程。通过这一详细的步骤介绍,读者可以了解如何使用YOLOv8模型进行深度学习训练,特别是在农作物害虫检测这一实际应用领域。
在深度学习模型的训练过程中,损失函数和评价指标的分析是至关重要的。通过观察这些图像,我们可以了解模型在训练过程中的表现及其对数据的学习效果。下面,我们将对YOLOv8模型在训练时的损失函数图像进行详细分析。
首先,损失函数图表展示了模型在训练和验证阶段的表现。对于训练损失,我们看到train/box_loss、train/cls_loss和train/obj_loss随着训练周期的增加而显著下降,这表明模型在边界框定位、类别识别和目标检测方面的性能都在不断提升。这种下降趋势表明模型的预测与真实标签之间的误差正在减小,模型正在逐渐学会如何从输入图像中准确识别和定位害虫。
在验证损失中,我们观察到与训练损失类似的下降趋势,val/box_loss、val/cls_loss和val/obj_loss也都表现出了下降的趋势,这进一步表明模型在未见过的数据上也具有良好的泛化能力。这是非常重要的,因为这意味着模型不仅能在训练数据上表现良好,也能在新的、未知的数据上取得好的结果。值得注意的是,验证损失的下降趋势平滑且逐渐趋于稳定,这表示模型在训练过程中没有出现过拟合的现象。
接下来,我们分析模型的精确度和召回率。从metrics/precision和metrics/recall的图表中可以看出,模型的精确度和召回率都随着训练的进行而逐步提升,最终达到了非常高的水平。精确度的提升意味着模型在识别害虫时越来越少地产生误报,而召回率的提升则意味着模型漏检害虫的情况在减少。在害虫检测的应用中,高召回率尤为重要,因为漏检可能会导致害虫问题的延误处理。
最后,metrics/mAP50和metrics/mAP50-95图表显示了模型在不同置信度阈值下的平均精确度(mAP)表现。mAP是目标检测领域中最常用的性能评估指标之一,mAP50表示在IoU(交并比)阈值为0.5时的mAP,而mAP50-95表示在IoU从0.5到0.95的范围内的平均mAP。这两个指标的稳步提升表示模型在害虫检测任务上具有很高的准确性,能够在不同的检测难度上保持稳定的性能。
在使用机器学习模型,尤其是深度学习模型对目标进行分类时,评估模型性能的一个重要指标是F1分数。F1分数是精确度和召回率的调和平均,能够平衡这两者之间的关系,特别适合于那些正负样本分布不平衡的情况。下图为博主训练农作物害虫检测的F1曲线图。
从图中我们可以看到,各个类别的F1分数在不同的置信度阈值下变化明显。在置信度较低时,大多数类别的F1分数较高,这是因为当模型对自己的预测较不自信时,它会产生更多的正类预测,从而提高召回率,但这通常也伴随着较低的精确度。随着置信度阈值的提高,模型变得更加保守,只有当模型对预测较有信心时才会预测正类,这提高了精确度,但召回率可能下降,导致F1分数降低。最佳的F1分数通常出现在两者之间的某个平衡点,对于这个特定的数据集来说,平均而言,在约0.512的置信度阈值时,所有类别的F1分数达到了0.89的高值,这是一个相对较好的结果,显示了模型在综合精确度和召回率方面的强大性能。
进一步观察,每个害虫类别的F1分数曲线呈现不同的趋势,这反映了模型对于不同害虫的检测能力。例如,某些类别在较低的置信度阈值时F1分数就已经很高,而其他类别则需要更高的置信度阈值才能达到较高的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.925 | 0.918 | 0.884 | 0.918 |
F1-Score | 0.88 | 0.88 | 0.84 | 0.89 |
(3)实验结果分析:
在本次对比分析中,我们关注的是在相同数据集上,YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n这四个版本的性能对比。通过对两个关键性能指标——mAP和F1-Score的观察,我们可以获得每个版本在害虫检测任务上的性能表现。
首先,从mAP指标来看,YOLOv5nu以0.925的成绩表现最优,这表明在检测任务中,它能以较高的准确度检测出更多的害虫。紧随其后的是YOLOv6n和YOLOv8n,两者在mAP上的成绩相同,均为0.918,表现出几乎相同的高准确度。相比之下,YOLOv7-tiny的mAP为0.884,虽然略低,但考虑到它的“tiny”版本更注重速度和模型大小,这仍然是一个可接受的性能表现。
在F1-Score方面,评估模型在精确度和召回率之间的平衡性能时,YOLOv8n以0.89的分数领先,这反映了它在区分害虫与非害虫之间,以及减少漏检和误检方面的优势。YOLOv5nu和YOLOv6n在这一指标上表现相同,均为0.88,也体现了较好的平衡性。而YOLOv7-tiny的F1-Score为0.84,与mAP一致,显示在保持较快速度的同时,牺牲了一些性能。
综合来看,YOLOv5nu和YOLOv8n在性能上表现更为出色,尤其是YOLOv8n在F1-Score上的细微优势可能对于那些要求更高准确性的应用场景来说至关重要。YOLOv6n在保持与YOLOv5nu相似的性能同时,可能在其他方面如速度或模型大小上有所优化。而YOLOv7-tiny作为一个轻量化版本,其性能自然不如其他版本,但在需要快速处理的场景下,可能是一个更合适的选择。通过这样的对比分析,我们可以根据实际应用的需求和限制,选择最适合的YOLO版本来部署我们的害虫检测系统。
4.4 代码实现
在本篇博客文章中,我们将深入探讨如何使用YOLOv8模型结合Python和Qt进行实时的农作物害虫检测。我们的目标是创建一个交互式的桌面应用程序,它能够通过摄像头捕获视频流,并利用深度学习模型实时识别并标注出视频中的害虫。这不仅展示了YOLOv8模型的实时检测能力,而且也为农业害虫监测提供了一个现代化的解决方案。
(1)导入必要的模块和配置
我们的代码首先导入了必要的模块,sys库用于接入与Python解释器相关的变量和函数,这对于构建应用程序是必须的。time库允许我们记录操作的时间,这对于评估模型预测的速度非常有用。cv2是OpenCV库的Python接口,它提供了一系列强大的图像处理功能。而QtWidgets和QtCore模块则是创建图形用户界面(GUI)的基础,用于布局和事件处理。
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.InsectPest.label_name import Label_list
QF_Config.set_verbose(False)
(2)创建主窗口
接下来,我们定义了MainWindow类,这是我们应用程序的主窗口。它继承自QMainWindow类,并设置了窗口大小以及一个用于显示图像的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() # 关闭窗口
(3)图像帧处理
frame_process函数是我们应用程序的核心。它首先调整摄像头捕获的图像大小,然后将图像传递给模型进行预处理和预测。预测完成后,使用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控件上显示图像
(4)农作物害虫检测
初始化部分涵盖了模型加载、颜色设置、窗口创建和视频流处理的初始化。YOLOv8模型通过YOLOv8Detector类被加载并准备用于检测。MediaHandler负责处理视频流,将每一帧图像送入frame_process函数。
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) # 获取类别颜色
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())
在这个应用程序中,每当有新的视频帧准备好时,frameReady信号都会触发frame_process函数,实现了一个实时的农作物害虫检测系统。通过整合深度学习模型和图形界面,我们提供了一个用户友好且功能强大的工具,帮助农业工作者更好地监控和管理。
5. 农作物害虫检测系统实现
在构建我们的交互式农作物害虫检测与识别系统时,我们的设计理念是打造一个集成化、高效和用户友好的桌面应用程序。该系统不仅能够实时检测并标注出害虫,还能提供一个直观的用户界面以便于监控和操作。
5.1 系统设计思路
在我们的系统设计中,我们充分考虑了实际的农业场景需求,目标是为农业工作者提供一个强大的辅助工具,帮助他们在日常工作中提高害虫管理的效率和准确性。
(1)架构设计
系统的核心是MainWindow类,它是用户交互的主要界面。这个类不仅包含了图形界面元素的布局,如显示视频流的标签,还负责协调用户指令与后端处理逻辑之间的交互。这样的设计允许用户通过简单的操作,如按钮点击或键盘输入,就能操控整个检测流程,从视频播放到实时农作物害虫检测的展示。
在架构设计上,我们将系统分为三个核心层次。首先是处理层,它是系统的“大脑”,由YOLOv8Detector类构成,这个深度学习模型经过预训练,可以识别和定位图像中的害虫。模型的处理速度和准确度是该系统能否成功运行的关键。
其次是界面层,它是用户与系统互动的“面孔”,通过Qt框架构建的UI提供了一系列直观的交互元素,包括实时视频显示、检测结果概览以及快捷操作按钮。用户可以通过这些元素实时监控检测情况,调整模型参数,或者对特定害虫进行标注和记录。
最后是控制层,它是连接处理层与界面层的“桥梁”,通过MainWindow类中实现的方法,响应用户操作,控制视频流的播放与停止,以及将检测结果实时显示在界面上。
整个系统的设计强调模块化和低耦合,确保了各个部分可以独立进行更新和维护,同时也便于未来功能的扩展。例如,如果未来出现了新的害虫种类或者改进的检测模型,我们可以轻松地在不影响其他部分的前提下,更新处理层的内容。此外,信号和槽机制在系统中发挥着至关重要的作用,这种机制允许我们以事件驱动的方式来处理用户的操作和系统的响应,大大提高了程序运行的效率和用户操作的便捷性。
通过这样的系统设计思路,我们期望打造出一个既能满足实时监控需求,又能为用户提供高效害虫管理工具的农作物害虫检测系统,为现代农业的智能化发展贡献力量。
(2)系统流程
在本博客中,我们将详细探讨交互式农作物害虫检测系统的整体工作流程和用户交互体验。该系统以MainWindow类为核心,通过精心设计的用户界面和背后强大的图像处理及机器学习模型,提供了一种创新的农作物害虫监测方案。
-
当用户启动应用程序时,MainWindow类的实例被创建,这是整个应用的起点。该实例初始化应用程序的界面和相关参数,为用户提供一个交互的操作平台。用户首先会看到一个简洁直观的界面,可以在此选择输入源。输入源可以是实时捕捉的图像,这对于田间害虫监测至关重要;也可以是视频文件或静态图片,便于用户在不同的场景下使用系统。
-
用户选定输入源后,系统会调用媒体处理器来捕捉和处理数据。这个过程可能包括配置摄像头,读取视频文件或加载图像文件。准备好媒体输入源后,系统会进入连续帧处理的循环。首先,是预处理阶段,系统对每一帧图像进行必要的预处理,以确保图像数据满足YOLO模型的输入要求,这通常包括图像缩放、色彩空间转换等步骤。
-
紧随其后的是检测与识别阶段,此时预处理后的图像将被送入先进的YOLOv8模型中。模型精确地识别图像中的害虫并输出位置信息。这一阶段是整个系统的核心,它直接决定了害虫监测的准确性和效率。
-
随着检测结果的不断产出,界面会实时更新。用户可以看到每个害虫被检测框圈选出来,并标明类别。系统还将在界面上展示检测统计数据,这些数据可能以表格或图表的形式展示,便于用户一目了然地掌握检测情况。
-
系统的交互操作设计也十分人性化,用户可以利用界面按钮来执行多种操作,如保存当前的检测结果,查询系统的帮助文档,以及筛选分析特定类别的害虫。此外,媒体控制功能让用户可以方便地控制视频播放状态,比如启动或暂停摄像头捕捉,这对于现场操作尤为重要。
总之,交互式农作物害虫检测系统通过结合实时视频处理技术和深度学习模型,不仅提高了害虫监测的准确性和效率,还通过直观的用户界面大大提升了用户体验。这样的系统设计思路充分展现了技术与实际应用的紧密结合,为农业害虫管理领域带来了新的解决方案。
5.2 登录与账户管理
在本博客中,我们将深入探讨一个结合了用户账户管理和实时图像处理功能的农作物害虫检测系统。该系统不仅能够准确快速地进行害虫识别,还提供了个性化的用户体验,从而大大提高了用户的使用便利性和安全性。
系统的启动流程非常直观。用户首先会进入一个由PySide6构建的登陆界面,这是一个精心设计的入口,为用户提供了账户注册、登录和账户管理等选项。这个登录系统背后由SQLite数据库支持,能够安全地存储用户信息,包括头像、用户名和加密的密码等。这样每个用户就能拥有一个安全的个人空间,在这里他们可以存储检测结果和个人设置,同时还能够修改密码和头像,甚至注销账户。
一旦登录,用户将被引导至主界面,那里集成了多种深度学习模型,包括我们的YOLOv8,为多目标识别和检测提供支持。这个强大的界面不仅实时显示检测框、类别和置信度等信息,还支持多种输入形式,包括图片、视频、实时摄像头捕捉和批量文件输入。用户可以通过这个界面实时地观察和记录检测结果,而这一切都在用户的账户管理保护之下进行。
我们系统的设计理念是为用户提供一个综合的解决方案,不仅仅是一个农作物害虫检测工具。系统的每个部分都围绕着提升用户体验进行设计,让用户能够在一个安全、可靠且易于操作的环境中,有效地管理害虫检测任务。无论是在家庭农场还是大规模的农业生产中,该系统都能够满足用户在实时害虫监测场景下的各种需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV11t421L79s/
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZyUmptq
YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/ZZuclJ9x
YOLOv7项目完整资源:https://mbd.pub/o/bread/ZZyTkpZs
YOLOv6项目完整资源:https://mbd.pub/o/bread/ZZyUlphw
在文件夹下的资源显示如下,下面的链接中也给出了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. ↩︎
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. ↩︎
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. ↩︎
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. ↩︎