摘要:本篇文章深入探讨了如何利用深度学习技术开发一个用于检测稻田虫害的系统,并且分享了完整的实现过程和资源代码下载。该系统采用了当前的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法,对其进行了性能对比,包括mAP、F1 Score等关键指标。文中详尽阐述了YOLOv8的工作原理,并附上了相关的Python实现代码和训练用数据集,同时整合了一个基于PySide6的图形用户界面。
该系统能够准确地识别和区分不同的稻田虫害类型,支持通过图片、图片集、视频文件以及实时摄像头来进行检测,功能包括柱状图分析、识别标记、类别计数、可调节的置信度、IOU阈值以及结果展示等。此外,还开发了一个基于SQLite的用户管理系统,允许用户切换模型和自定义界面。文章的目的是为深度学习的入门者提供一个实践指南,代码和数据集详见文末附录。本文结构如下:
文章目录
- 前言
- 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)系列算法,以其高效的检测速度和良好的识别准确性,在图像识别领域展现出强大的竞争力。最近的研究表明,基于YOLOv5及其后续版本(如YOLOv6、YOLOv7、YOLOv8)的模型在多个领域,包括农业虫害检测中,都取得了显著的性能提升12。
此外,最新的研究也在不断探索YOLO算法的改进方向,包括网络结构优化、训练策略调整和数据增强技术等,以进一步提高模型的检测性能3。同时,新兴的深度学习框架和技术,如Transformer在图像识别任务中的应用,也为稻田虫害检测提供了新的思路和可能性4。
尽管深度学习技术在稻田虫害检测方面取得了显著进步,但在实际应用中仍面临多种技术挑战,例如模型的泛化能力、对复杂背景的适应性、以及实时处理大规模数据的能力等5。此外,高质量数据集的缺乏也是限制模型性能提升的一个重要因素。因此,构建更加全面、标注准确的数据集,以及设计更加鲁棒、高效的算法模型,是当前研究的热点和趋势。
本博客在稻田虫害检测领域的研究中作出了独特且重要的贡献,不仅推动了先进的YOLOv8算法在农业虫害检测中的应用,还为从业者和研究者提供了一套完整的实验和开发资源。以下是本文的五大主要贡献:
- 引入最先进的YOLOv8算法:本文首次将YOLOv8算法应用于稻田虫害检测领域,通过与YOLOv7、YOLOv6、YOLOv5等先前版本的比较,展现了YOLOv8在效率和精准度方面的显著优势。这一研究不仅丰富了稻田虫害检测的技术手段,也为该领域的研究者和从业者提供了新的思路和工具。
- 开发友好的用户界面:利用PySide6库,本文成功开发了一个既美观又易于操作的稻田虫害检测系统界面。该界面的设计旨在降低技术门槛,使得非专业人士也能轻松地进行虫害检测,从而促进了YOLOv8算法的广泛应用。
- 增加登录管理功能:通过设计登录管理功能,本文的稻田虫害检测系统在提升安全性的同时,也为将来添加更多个性化功能留出了空间。这一功能的引入,不仅增强了系统的实用性,也提高了用户的使用满意度。
- 深入研究YOLOv8模型性能:本文不仅应用了YOLOv8算法,还对其性能进行了全面的评估,包括精准度、召回率等关键性能指标的测试,以及在不同条件下的表现分析。这些研究成果为进一步优化YOLOv8算法,提高稻田虫害检测的准确性和效率提供了重要的理论依据。
- 提供完整的数据集和代码资源:为了帮助读者更好地理解和实践,本文提供了一套完整的数据集和代码资源包。这些资源不仅方便读者复现文中的实验结果,还为稻田虫害检测的进一步研究和开发打下了坚实的基础。
1. 数据集介绍
在构建智能化稻田虫害检测系统的道路上,我们所依赖的数据集成为了确保准确性和实用性的基石。本研究中使用的数据集,不仅在规模上表现出色,涵盖了总计5229张图像,其中包含4178张训练图像、546张验证图像和505张测试图像,而且在质量上也严格把关,确保了实验结果的可靠性和系统的实用性。
我们在图像预处理阶段采取了标准化操作,以确保输入模型的图像在大小和比例上保持一致性。针对稻田环境的特点,我们还对数据集进行了细致的增强处理,包括随机旋转、缩放、剪裁以及色彩变换等,以充分模拟多变的自然条件。这些步骤不仅增加了数据集的多样性,还强化了模型对于实际田间情况的适应能力,从而提高了模型在实际应用中的泛化性和准确度。
数据集中的图像涵盖了六种主要的稻田害虫,包括褐飞虱、绿飞虱、卷叶螟、水稻飞虱、二化螟和稻瘿蚊。每一种害虫都配有精确的边界框标注,确保了训练过程中标签的准确性。此外,通过细致的类别实例分布分析,我们发现褐飞虱在数据集中的实例最多,这与它们在实际稻田中的高发性相吻合,而其他害虫的分布数量也充分反映了它们对稻作的潜在威胁。
通过深入分析数据集中害虫的位置分布,我们注意到大量害虫实例倾向于出现在图像中心。这一特点对于算法的设计至关重要,我们需要确保模型不仅能识别中心位置的目标,也能对图像边缘区域的害虫给予足够的关注。此外,边界框的大小分布分析揭示了一个重要的现象:大部分害虫目标相对较小,这可能会给识别算法带来挑战,特别是在害虫与背景之间的对比度不高时。
我们还注意到在数据集中存在着一定程度的边界框重叠现象,这种情况可能导致在同一区域的害虫被重复识别。这要求我们在算法设计时加入适当的处理机制,以区分和准确识别重叠区域内的多个目标。同时,这也提示我们在未来的数据采集和标注工作中,需要更加细致地处理这一问题,以避免数据集偏差。
边界框大小的分布显示出相对较小且一致的尺寸,这暗示着害虫目标在图像中占据的空间较小,可能增加了识别的难度,这对于模型设计来说是一个重要的考量因素。此外,边界框的高度与宽度分布图为我们优化锚框参数提供了有价值的信息。博主使用的类别代码如下:
Chinese_name = {'brown-planthopper': "褐飞虱", "green-leafhopper": "绿叶蝉",
"leaf-folder": "卷叶螟", "rice-bug": "水稻飞虱", "stem-borer": "稻杆螟", "whorl-maggot": "稻纵卷叶螟"}
总之,我们详细介绍了稻田虫害检测系统的数据集,并深入分析了其结构和特征。通过这些细致的准备工作,我们为手势识别模型的训练打下了坚实的基础,为后续的模型优化和实验评估提供了宝贵的资源。这份工作的细节不仅有助于本研究,也可能对那些从事相关领域研究的同行提供参考。
2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。
(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行稻田虫害检测的图片或视频,或者启动摄像头进行实时检测。在进行检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。
(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。
(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。
3. YOLOv8算法原理
在探讨YOLOv8算法的原理时,我们首先需要理解YOLO(You Only Look Once)系列算法的核心理念,即在单次前向传播过程中同时进行目标的定位和分类。这种一步到位的检测方式使得YOLO算法在速度和效率上有着显著的优势。YOLOv8作为这一系列中的最新迭代,不仅继承了前代YOLO算法的这些优点,而且在结构设计和性能上都有了显著的改进,从而进一步提升了检测的准确性和速度。
YOLOv8算法的结构可以分为三个主要部分:Backbone(主干网络)、Neck(连接网络)和Head(检测头)。在Backbone部分,YOLOv8采用了CSP(Cross Stage Partial networks)结构,这种结构有效地平衡了模型的学习能力和参数量。CSP结构通过部分跨阶段连接,促进了梯度的直接传播,这对于深层网络的学习是极为有益的。它还减少了计算量,因为它允许网络在少量的参数下进行更深层次的特征学习。
Neck部分则是负责提取不同尺度特征并进行融合的关键模块。YOLOv8的Neck部分利用了SPP(Spatial Pyramid Pooling)结构和FPN(Feature Pyramid Networks)技术。SPP能够提取多尺度的上下文信息,这对于检测不同尺寸的目标至关重要。而FPN采用了一个自顶向下的结构,将高层的语义信息传递到低层,从而实现了从粗到细的特征融合。
在Head部分,YOLOv8采取了自适应标签分配(adaptive label assignment)策略,这是一种更为灵活的标签分配方式,允许模型根据目标的不同特性自动调整标签。这意味着算法能够根据目标的大小、形状以及其在图像中的上下文信息,动态地选择最合适的锚点,这种策略能够有效地减少标签分配误差,提升模型的性能。
YOLOv8还引入了AutoML技术,在算法的设计和优化过程中自动寻找最优的模型参数和结构。这种技术可以减轻手动调参的工作量,确保了YOLOv8在不同的检测场景下都能达到最佳性能。此外,YOLOv8还支持云端训练和边缘计算,使得算法可以在资源受限的设备上进行训练和推断,同时还可以利用云端的强大计算能力进行大规模的训练任务。
综上所述,YOLOv8通过其独特的结构设计,不仅继承了YOLO系列的高速检测特性,而且还通过CSP网络结构和先进的特征融合技术,显著提升了对于各种尺寸目标的检测能力。这些技术的融合使得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/1.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 模型训练
在这部分博客内容中,我们将深入探讨一个使用PyTorch框架和Ultralytics YOLO库进行模型训练的实际案例。通过解析提供的代码,我们将一探究竟,看看如何利用这些强大的工具来训练一个稻田虫害检测模型。
代码的核心逻辑是首先设置好训练环境,然后加载预训练的YOLO模型,并在此基础上进行进一步的训练以适应我们的特定任务——在这里是稻田虫害检测。这个过程涉及到许多细节,包括数据路径的设置、模型参数的配置以及训练过程的初始化。
首先,代码通过import语句导入必要的Python包,包括操作系统接口os、PyTorch库torch、YAML文件解析库yaml以及Ultralytics的YOLO模型。紧接着,我们设置设备变量device,这样模型就可以在GPU上进行训练(如果可用),这是深度学习训练过程中提升速度的关键。
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和一个批次大小batch。然后,我们设置了数据集名称data_name和数据集配置文件的路径data_path,这里使用了一个辅助函数abs_path来确保获取到文件的绝对路径。
workers = 1
batch = 8
data_name = "RicePaddyPest"
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配置文件,并根据当前的目录结构对其进行了更新,确保了模型训练时引用的路径是正确的。
# 读取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.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 # 指定训练任务的名称
)
在稻田虫害检测领域,对训练过程的损失函数进行分析是至关重要的。它不仅反映了模型学习的状况,还指示了模型的性能可能存在的问题。
首先,从图表中我们可以观察到,随着训练次数(epochs)的增加,所有类型的损失函数——包括边界框损失(box_loss)、分类损失(cls_loss)以及目标损失(obj_loss)——均呈现出下降趋势,这表明模型在逐渐学习到如何准确预测害虫的位置、大小和分类。特别是,验证集上的损失函数也显示出相似的下降趋势,这表示模型具有良好的泛化能力,不仅在训练数据上表现良好,也能在未知数据上保持较高的预测准确性。
评价指标方面,精确度(precision)和召回率(recall)两个图表显示了训练过程中的逐步提升,精确度的增长表示模型在识别害虫时越来越少地产生误报,而召回率的提升则表明模型能够捕捉到更多的正类实例。mAP(平均精确度均值)对于目标检测模型的性能评估至关重要,mAP50和mAP50-95分别表示IoU阈值为0.5和0.5到0.95时的评价结果。这些图表中mAP值的上升趋势表明了模型整体识别准确度的增强,特别是mAP50-95的持续增长,说明模型在不同IoU阈值下都保持了较高的性能。
观察这些图表,可以得出模型训练的效果总体上是积极的,损失函数的下降和评价指标的提升说明模型正在有效地学习。然而,也需注意训练过程中任何突然的损失增加或评价指标下降,这可能表明学习率的设置不合理或模型出现了过拟合现象。为了维持模型的训练效果和预测性能,适时调整学习率、增加数据集的多样性以及应用适当的正则化技术可能是必要的。
在深度学习模型的评估过程中,精确度-召回率(Precision-Recall,简称PR)曲线是衡量模型性能的重要工具,特别是在目标检测任务中,它能够揭示模型对于不同类别目标检测能力的细致情况。根据提供的PR曲线图,我们可以对YOLOv8模型在稻田虫害检测任务上的性能进行专业分析。
从曲线图中可以看出,在低置信度阈值时,所有类别的F1分数较高,随着置信度阈值的提高,F1分数先是保持稳定后逐渐下降。这个趋势表明,当模型对其预测非常自信时,可能会错过一些正确的预测(即假阴性增加),从而降低了召回率。反之,在低置信度时,模型生成更多正预测,包括一些不准确的(即假阳性增加),从而提高了召回率但牺牲了精确度。
在各个害虫类别中,我们可以看到褐飞虱(brown planthopper)的F1分数在整个置信度范围内几乎始终领先于其他类别,这表明模型在检测此类害虫时具有很高的准确性和可靠性。这可能归因于数据集中该类别样本的丰富性和/或其特征在图像中的显著性。其他类别如绿飞虱(green leafhopper)、叶夹(leaf folder)和水稻水象甲(rice bug)的F1曲线显示出类似的性能,而茎蛀虫(stem borer)和鞘蛆(whorl maggot)的性能略低。
整体来看,所有类别的整体F1分数(蓝色曲线)达到了0.91的峰值,当置信度阈值大约为0.386时。这个最优阈值为我们在实践中应用模型时提供了重要的参考:太低的置信度可能会导致过多的误报,而太高的置信度可能会遗漏正确的预测。因此,选取一个合理的置信度阈值对于在实际应用中平衡精确度和召回率、达到最优的害虫检测性能至关重要。
总之,通过仔细分析这些损失和评价指标的趋势,我们能够对模型的学习进度和性能做出客观的评估,并据此指导后续的训练策略调整,从而优化模型在稻田害虫检测任务上的表现。
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.927 | 0.945 | 0.875 | 0.937 |
F1-Score | 0.90 | 0.91 | 0.84 | 0.91 |
(3)实验结果分析:
在我们的稻田虫害检测系统研究中,对比了YOLO系列中的四个不同版本的性能:YOLOv5nu、YOLOv6n、YOLOv7-tiny、YOLOv8n。通过在同一数据集上进行严格的实验,并使用F1-Score和mAP这两个关键的度量指标,我们对每个模型的性能进行了细致的分析。
YOLOv6n在我们的评估中表现最佳,其mAP值达到了0.945,这显示了其在平均精度方面的卓越性能。YOLOv5nu的mAP值为0.927,略低于YOLOv6n,而YOLOv8n的mAP为0.937,紧随其后。YOLOv7-tiny的mAP值为0.875,相比其他版本较低,这可能是由于“tiny”版本旨在减少模型大小和计算需求,因此在某些性能方面作出了妥协。
在F1分数方面,YOLOv6n和YOLOv8n都达到了0.91的高分,这表明它们在精确度和召回率方面取得了很好的平衡。YOLOv5nu的F1分数稍低,为0.90,而YOLOv7-tiny的F1分数为0.84,这与其在mAP评分中的表现相一致。
综上所述,YOLOv6n和YOLOv8n在整体性能上优于其他两个版本,它们在高精度的目标检测任务中具有显著优势。而YOLOv5nu也表现出了强大的性能,尽管略低于v6和v8版本。YOLOv7-tiny在资源受限的情况下仍然能够提供可接受的性能,但若计算资源允许,选择v6或v8版本可能会更为合适。
这些分析结果为研究人员选择合适的YOLO版本提供了数据支持,同时也为未来在目标检测技术上的研究和应用提供了指导。通过这些算法的持续迭代和改进,我们可以期待在稻田虫害检测等实际应用中取得更加准确和高效的结果。
4.4 代码实现
在现代计算机视觉领域,将深度学习模型应用于实时图像处理任务已成为一项重要技术。本博客将重点介绍如何通过YOLOv8模型实现稻田虫害检测的完整过程。此任务不仅涉及模型的准确性,还包括用户界面的交互性和友好性,以便于用户能够直观地观察和评估模型的检测结果。
(1)引入必要的库
在这段代码中,我们导入了必要的库和模块。QMainWindow用于创建主窗口界面,MediaHandler用于处理视频流,drawRectBox用于在图像上绘制矩形框,get_cls_color用于为不同的类别分配颜色,YOLOv8Detector是我们将使用的YOLO模型的类,而Label_list包含了我们检测目标的标签名称。
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类,用于物体检测
from datasets.RicePaddyPest.label_name import Label_list
QF_Config.set_verbose(False)
(2)初始化模型
我们定义了一个类别名称列表cls_name,它包含了我们要检测的所有对象的名称。然后,我们加载预训练的YOLOv8模型并获取每个类别的颜色。这些颜色将用于在最终的图像上区分不同的对象。
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类中,我们定义了一个新窗口,并设置了窗口的尺寸和一个QLabel,用来显示图像。QLabel的大小与窗口一致,这确保了图像能够充满整个窗口。
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函数是我们处理视频流中每一帧图像的函数。我们首先调整图像大小以适应我们的窗口,然后对其进行预处理,以便YOLOv8模型可以对其进行预测。我们还计算了模型预测所需的时间,以便我们可以评估模型的推理速度。
def frame_process(image): # 定义frame_process函数,用于处理每一帧图像
image = cv2.resize(image, (850, 500)) # 调整图像的大小
pre_img = model.preprocess(image) # 对图像进行预处理
t1 = time.time() # 获取当前时间
pred = 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控件上显示图像
最后,我们创建了一个YOLOv8Detector对象,并加载了预训练的模型权重。我们还为每个类别名称分配了颜色,以便在图像中以不同颜色高亮显示不同的害虫类别。
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应用程序并创建了窗口。我们配置了MediaHandler来捕获视频流,每捕获一帧,就调用frame_process函数。然后,我们开始处理媒体流,并显示窗口,进入应用程序的主循环,等待用户操作,如关闭程序。
5. 稻田虫害检测系统实现
在实现一款实时稻田虫害检测系统时,我们深入考虑了用户体验和操作便捷性。系统设计思路的核心是将高效的目标检测能力与直观的用户界面(UI)紧密结合,以确保即使是非技术用户也能轻松地使用系统。为此,我们设计了一个综合架构,其中MainWindow类扮演了控制中心的角色,协调处理层和界面层的交互。
5.1 系统设计思路
MainWindow类的主要目标是提供一个用户友好的交互式稻田虫害检测系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。
架构设计
我们的系统设计思路以三层架构为核心:处理层、界面层和控制层。在我们的系统设计中,重点放在了确保各个组件能够协同工作,同时保持足够的模块独立性,以便于未来的维护和升级。
- 处理层(Processing Layer):系统的核心功能由一个预训练的YOLOv8Detector模型提供支持。这个模型经过专门的训练,可以准确地识别图像中的害虫。模型的预测速度和准确性对于实时检测系统至关重要,因此我们采用了YOLOv8,这是目前速度和准确性平衡得很好的模型之一。通过处理层,系统能够实时分析来自摄像头的视频流,并进行快速的害虫检测。
- 界面层(UI Layer):为了确保用户能够轻松操作我们的系统,我们设计了一个友好的图形用户界面。这个界面不仅展示了实时视频流和检测结果,还包括了用户可交互的控件,如启动和停止检测的按钮、显示检测统计信息的标签等。界面的直观设计使得用户无需深入了解背后复杂的图像处理技术,即可便捷地使用系统。
- 控制层(Control Layer):控制层作为中介,协调用户界面和后端处理的交互。通过在MainWindow类中实现的槽函数和方法,控制层响应用户的操作,比如开始检测、结束检测等,并相应地控制模型的行为,如激活或关闭视频流的分析。此外,控制层还负责处理由YOLOv8Detector返回的检测结果,更新UI以反映最新的检测信息。
整个系统的设计遵循了模块化和响应性的原则。不同的组件——如模型预测、图像显示、用户响应——都被封装在独立的模块中,并且能够通过Qt的信号和槽机制高效地交互。这种架构设计不仅确保了代码的清晰和可维护性,也为未来增加新功能或改进现有功能提供了便利。
系统流程
在构建交互式稻田虫害检测系统时,我们采纳了一个以用户为中心的系统设计思路。该系统由几个核心组件构成,包括用户界面(UI)、媒体处理器和目标检测模型。我们的目标是创建一个高效、直观且易于使用的系统,使得自动驾驶技术的复杂性对于最终用户来说变得透明。
- 当用户启动应用程序时,系统立即开始构建用户界面——这是通过实例化MainWindow类来完成的。MainWindow类承担着界面初始化的任务,将所有必要的控件布置到用户界面中,并设置了一系列参数来保证应用程序能够顺利运行。通过这个窗口,用户可以轻松地访问所有功能。
- 用户界面提供了一个简洁而直观的环境,使得用户能够毫不费力地选择输入源。无论是希望使用摄像头实时监控稻田,还是分析已有的视频或图像文件,用户都可以通过几次点击轻松完成选择。这种灵活性确保了系统能够广泛应用于多种场景。
- 输入源确定后,系统则调用媒体处理器,对接收到的数据流进行处理。这个过程包括配置摄像头、读取视频文件或加载图像文件,取决于用户选择的输入类型。随后,系统会连续不断地处理捕获到的帧数据,这是一个循环的流程,具体包括:
- 预处理阶段:系统会对输入的图像进行预处理,这通常包括缩放、色彩空间转换和归一化等步骤。这些预处理步骤对于后续的模型预测至关重要,因为它们确保图像数据满足YOLOv8模型的输入需求。
- 检测与识别阶段:预处理后的图像数据将被送入精心训练的YOLOv8模型中进行处理。这个模型能够精确地识别图像中的稻田害虫,并提供害虫的位置信息。检测结果以框的形式呈现,并标注害虫的类别。
- 界面更新阶段:随着检测结果的出现,用户界面会实时更新。它不仅展示了害虫的检测框和类别,还包括检测统计数据的动态展示,如条形图和表格,增强了用户体验。
- 交互操作:用户可以通过界面的按钮进行多种操作,例如保存检测结果的图像,或者访问关于系统的信息。通过下拉菜单,用户还可以筛选特定类别的害虫,以便进行更深入的分析。
- 媒体控制:用户还可以控制媒体播放的状态,包括开始或停止摄像头的捕捉、视频播放或对静态图像的分析。
整个系统设计思路的关键在于,它不仅能够提供高效准确的害虫检测,还能通过友好的用户界面提供高度的操作便利和灵活性,从而使得它能够适应不同用户的需求,并广泛应用于农业害虫监测领域。通过这种方式,我们希望将这一先进技术带给更广泛的用户,帮助他们提高工作效率,并促进农业的可持续发展。
5.2 登录与账户管理
在构建稻田虫害检测系统的过程中,账户管理功能起到了至关重要的作用,它不仅确保了用户数据的安全性,也提供了个性化的用户体验。利用PySide6的强大功能以及SQLite数据库的便捷性,我们设计了一套完整的用户登录界面,并实现了注册、密码管理、个人化设置等功能。
我们深知,在实际使用场景中,每个用户都有自己的特定需求和偏好设置。因此,我们为用户提供了注册功能,通过注册,用户可以创建一个属于自己的账户,在系统中保存个人的检测历史和偏好设置。这个过程涉及到用户信息的输入、验证和数据库的写入操作,确保了用户信息的安全性和隐私性。
账户创建之后,用户可以通过登录界面进入系统。登录过程中,系统会对用户输入的密码进行安全校验,保证账户的安全性。登录成功后,用户可以进入主界面,开始稻田虫害的检测工作。我们的系统支持多种输入方式,无论是图片、视频文件还是来自实时摄像头的流媒体,用户都能通过简单的操作进行检测,并获取实时的检测结果,包括害虫的检测框、类别和置信度信息。
用户个性化的管理也是我们系统的一个亮点。用户可以在账户管理界面中修改密码、设置个人头像,甚至注销账户。这些操作简单便捷,让用户能够根据自己的需求定制个性化的使用体验。
此外,我们的系统还具备了强大的检测和识别功能。不仅能够导入和应用各种深度学习模型,还能实现高效准确的多物体检测。无论是单张图片的快速识别,还是视频流的连续检测,系统都能够自如应对,满足用户在实时目标检测场景下的各种需求。
综上所述,我们的稻田虫害检测系统不仅在技术层面上做到了高效和精准,而且在用户体验层面也提供了高度的个性化和便捷性。这种综合考虑技术和用户需求的系统设计,使得我们的系统不仅适用于科研工作者和技术人员,也同样适用于一线农业工作者和普通用户,从而更好地服务于农业生产的实际需求。
下载链接
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:
完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1am411d7p8/
在文件夹下的资源显示如下,下面的链接中也给出了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模型的实时稻田虫害检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的稻田虫害检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎
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. ↩︎
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. ↩︎