首页 > 编程语言 >基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的玉米病虫害检测系统(Python+PySide6界面+训练代码)

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的玉米病虫害检测系统(Python+PySide6界面+训练代码)

时间:2024-02-22 14:55:36浏览次数:27  
标签:YOLOv7 YOLOv6 Python 检测 模型 YOLOv8 图像 病虫害 玉米

摘要:本文介绍了一种基于深度学习的玉米病虫害检测系统系统的代码,采用最先进的YOLOv8算法并对比YOLOv7、YOLOv6、YOLOv5等算法的结果·,能够准确识别图像、视频、实时视频流以及批量文件中的玉米病虫害。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于PySide6的用户界面(UI)。该系统实现了对图像中玉米病虫害的准确识别和分类,并包含了基于SQLite的登录注册管理、一键更换YOLOv5/v6/v7/v8模型以及界面自定义修改等功能。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考,完整代码资源文件以及数据集可以在文末的下载链接中获取。本文结构如下:

YOLOv8/v5项目完整资源:https://mbd.pub/o/bread/mbd-ZZuWmp1r
YOLOv7项目完整资源:https://mbd.pub/o/bread/mbd-ZZuXkppx
YOLOv6项目完整资源:https://mbd.pub/o/bread/mbd-ZZuXlpZp
YOLOv8/v7/v6/v5项目合集:https://mbd.pub/o/bread/ZZuXlpZv


前言

        玉米作为全球最重要的粮食作物之一,其产量和质量直接关系到全球粮食安全和农业经济的稳定。然而,病虫害的发生严重威胁到玉米的生产,导致产量减少和品质降低,这对农业生产者和整个粮食供应链构成了巨大的挑战。传统的病虫害检测方法依赖于人工目视检查或者简单的化学测试,这些方法不仅效率低,而且准确率有限,难以满足大规模和实时监测的需求。随着人工智能和机器视觉技术的发展,尤其是深度学习算法的进步,基于YOLO[1](You Only Look Once)系列算法的病虫害检测技术已经成为研究的热点。YOLO算法因其高速的检测速度和较高的准确率,特别适合于实时病虫害检测应用。

        最初的YOLO算法通过将检测任务视为单一的回归问题来直接预测物体类别和位置,大大提高了检测速度。随后,该算法的多个版本迭代,如YOLOv3和YOLOv4,不断优化模型架构和训练过程,提高了检测的准确性和效率。到了YOLOv5[2]及其后的版本,更是在模型轻量化、速度和准确度等方面取得了平衡,使得它们可以更好地应用于实时病虫害检测。

        除了YOLO系列之外,还有其他深度学习模型在玉米病虫害检测方面也表现出了优异的性能。例如,Faster R-CNN[3]作为一种经典的区域建议网络,虽然速度不如YOLO系列,但在准确度上具有一定的优势,特别是在处理高分辨率图像时。同样,Mask R-CNN[4]在病虫害检测任务中也显示出了其强大的能力,不仅可以准确地识别病虫害,还能生成病害区域的精确分割。

        近期的研究还探索了利用迁移学习和半监督学习技术来进一步提升玉米病虫害检测模型的性能。通过这些技术,模型可以在有限的标注数据上进行训练,并且能够更好地泛化到新的、未见过的病虫害类型上。此外,数据增强技术的应用也大大提高了模型的鲁棒性,使得在复杂环境下的检测更加准确可靠。

        Transformer模型,尤其是基于自注意力机制的Vision Transformer (ViT),已经在图像分类任务中展现了其强大的性能。ViT通过将图像划分为序列化的小块(patches),并将这些小块输入到Transformer模型中,利用自注意力机制捕获不同块之间的全局依赖关系。这种方法在处理农业图像数据时特别有效,因为它能够捕捉到病虫害特征与正常植物组织之间的微妙差异。最近的研究表明,ViT在多个农业病虫害数据集上都达到了优于传统CNN模型的性能。

        基于图卷积网络(GCN)的方法。GCN在处理图像时考虑了像素点之间的空间关系,这对于识别形状和大小各异的病虫害特征尤其重要。通过建立像素点之间的图表示,GCN能够有效地识别出复杂的病虫害模式,从而提高检测的准确率。这种方法在处理具有复杂背景和不同病虫害阶段的农业图像时表现尤为出色。

        在数据增强方面,一种名为AutoAugment的技术通过自动搜索最优的数据增强策略,显著提高了模型的泛化能力和鲁棒性。AutoAugment的策略通过强化学习自动确定,这使得模型能够在多样化的农业图像数据集上获得更好的性能。这项技术的应用大大提升了病虫害检测模型在面对不同光照、遮挡和背景条件时的准确性。

        本文通过综合运用最新的深度学习技术和图形界面设计工具,构建了一个先进的玉米病虫害检测系统,以YOLOv8算法为核心进行病虫害图像的检测与识别。文章的贡献主要体现在以下几个方面:

  1. 采用最先进的YOLOv8算法:本文不仅采用了目前最先进的YOLOv8算法进行玉米病虫害检测,而且还对比了YOLOv7、YOLOv6、YOLOv5等算法的检测效果。通过这种对比分析,本文详细展示了YOLOv8在检测速度、准确度以及实用性方面相比早期算法的显著优势,为病虫害检测领域提供了新的研究思路和实践手段。
  2. 利用PySide6实现友好的系统界面:通过使用Python的PySide6库,本文开发了一个用户友好的玉米病虫害检测系统界面。这一界面不仅直观便捷,而且极大地提升了用户的操作体验,有助于推广YOLOv8算法的应用,并促进深度学习技术在农业领域的实际应用。
  3. 包含登录管理功能,提高系统安全性:系统设计了登录管理功能,确保了使用过程的安全性,并为将来添加更多个性化功能留出了空间。这一功能的设计反映了本文在系统安全性和可扩展性方面的考虑。
  4. 对YOLOv8模型进行深入研究:本文不仅应用了YOLOv8算法,而且还对其性能进行了全面的评估,包括精确度、召回率等关键指标的分析。此外,还探讨了模型在不同环境条件下的表现,为YOLOv8算法的优化和改进提供了坚实的基础。
  5. 提供完整的数据集和代码资源包:为了使读者能够更加深入地理解和应用YOLOv8算法在玉米病虫害检测中的实践操作,本文提供了一套完整的数据集和代码资源包。这些资源将有助于读者直接复现文章中的实验结果,并在此基础上进行进一步的研究与开发。

1.数据集介绍

        在本研究中,我们致力于通过构建一个全面而精细的数据集,推动玉米病虫害检测技术的发展。此数据集包含了总计8856张高质量的图像,这些图像经过了严格的选择和预处理,以确保能够满足深度学习模型的训练需求。7339张用于训练的图片,757张用于验证的图片,以及760张用于测试的图片,这样的分配旨在确保模型能在广泛的数据上进行学习,并在未见数据上进行有效的性能验证。

        数据集经过预处理步骤,以适应深度学习模型的输入需求。所有图像首先经过自动定向校正,确保其方向一致,并移除了可能影响模型训练的EXIF方向信息。随后,图像被统一调整至640x640像素的分辨率,采用拉伸的方式来适配模型的输入尺寸,尽管这可能导致某些图像比例发生变化,但统一的图像尺寸对于确保模型处理的一致性和效率是必要的。

        边界框尺寸分布图表明,绝大多数的边界框在尺寸上比较小,这可能是由于病虫害往往只影响植物的一小部分。这种情况意味着我们的模型需要能够精确地识别小目标。在模型设计时,应当考虑增加模型对小尺寸目标的敏感性,或者使用一些专门针对小目标检测的算法优化技术。

        数据集中“病虫害”类别的实例最多,远多于其他类别,这表明我们的数据集对于训练病虫害检测模型是十分有利的。相较之下,“好条件下的玉米”和“受损的玉米”类别的实例数量较少,这可能会导致模型对这些类别的识别能力不足。因此,在训练模型时可能需要采取数据增强或过采样等策略来平衡类别分布。

        在图像标注方面,我们深知准确的标签对于训练有效的机器学习模型的重要性。我们的数据集包含多个类别的标签,涉及玉米在不同健康状态下的多种情形。标签及其对应的中文名称如下所示:

Chinese_name = { "Enfermedad": "病害","Good Condition Corn": "状态良好","Good Condition Maize": "良好",
    "Plaga": "害虫", "corn": "玉米", "damaged corn": "受损玉米"}

        通过这些细致的分类,我们的数据集可以帮助深度学习模型学习如何识别和区分玉米的健康状况,并且对于病害和害虫能够作出准确的判别。这对于研究和实践玉米健康管理,提高产量和质量具有重要的意义。

        综合考虑,我们的数据集不仅在数量和质量上满足了深度学习训练的高标准,而且通过细致的预处理和标注工作,为玉米病虫害检测模型的开发提供了一个坚实的基础。我们希望,这个数据集的发布能够激励更多的研究人员和开发者参与到农业病虫害检测技术的研究中来,共同推动这一领域的技术进步。


2. 系统界面效果

        系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。

(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。

(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行玉米病虫害检测的图片或视频,或者启动摄像头进行实时检测。在进行玉米病虫害检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。

(3)此外,系统还提供了一键更换YOLOv8/v5模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。

(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。


3. YOLOv8算法原理

        YOLOv8[5]作为目标检测领域的最新突破,继承并优化了其前身的架构和算法,实现了对于对象检测的高效性和精确性。在本部分,我们将深入探讨YOLOv8的原理,并分析其在玉米病虫害检测中的应用。

        首先,YOLOv8在网络架构上进行了创新。它采用了分层次的特征提取网络,该网络由多个模块组成,每个模块都负责从图像中提取不同层次的特征。这些模块包括多种类型的卷积层、残差连接以及正则化层,共同工作以捕捉从简单到复杂的图像特征。通过这样的结构设计,YOLOv8能够在保持实时检测速度的同时,提高对目标的检测准确率。

        YOLOv8在损失函数设计上也有所创新。它引入了'Distribution Focal Loss',这是一种改进的损失函数设计。与传统的Focal Loss相比,'Distribution Focal Loss'更加注重于预测分布的形状而不仅仅是单个类别的准确度,从而在提升模型对于类别分布不均匀数据的性能上有显著效果。这对于处理玉米病虫害检测这样的多类别不平衡数据集尤其有价值。

        此外,YOLOv8优化了任务分配过程。在以往的YOLO版本中,任务分配通常是基于预定阈值和锚框的IoU(交并比)来执行的。而YOLOv8采用了'Task Aligned Assigner',这是一种基于任务对齐的策略,它通过动态调整分配阈值和任务权重来实现更加有效的任务分配。这种策略能够更准确地匹配目标和预测框,从而提高模型对于小目标检测的敏感度和准确度,这在玉米病虫害检测中尤其重要,因为病害和害虫往往体积较小。

        最后,在目标检测的效率和准确性之间,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 模型接受的输入图像的尺寸,影响模型的识别能力和计算负担。

        在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。

from ultralytics import YOLO  
model = YOLO('./weights/yolov8s.pt', task='detect')  

        接着开始训练模型。其中指定了训练数据的配置文件路径,使用GPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8。

results2 = model.train(  
        data=data_path,
        device='0', 
        workers=workers, 
        imgsz=640,  
        epochs=120,  
        batch=batch,  
        name='train_v8_' + data_name  
    )

        在深入分析YOLOv8模型训练过程中的损失函数图像,我们可以对模型性能的发展趋势有一个全面的认识。这些图像为我们提供了丰富的信息,包括模型对于训练数据的拟合程度、验证过程中的泛化能力,以及模型预测的准确性和召回率。首先,观察训练和验证的边界框损失(train/box_loss和val/box_loss)图像,它们的数值随着训练次数的增加而稳定下降,表明模型在边界框定位方面的性能逐渐提升。损失函数的下降趋势较为平滑,没有出现明显的波动或上升,这表示训练过程稳定,没有遇到过拟合或者梯度爆炸的问题。验证损失的稳定下降也表明模型具有良好的泛化能力。

        接下来,分类损失(train/cls_loss和val/cls_loss)以及分布焦点损失(train/df1_loss和val/df1_loss)的图表也显示出类似的趋势。这两个指标的下降说明模型在区分不同类别以及处理类别不平衡问题方面取得了进展。特别是分布焦点损失的下降,证明了YOLOv8在处理多类别任务时的有效性,这对于玉米病虫害检测这样的复杂场景尤为重要。

        在模型的精确度和召回率方面,我们看到训练过程中的精确度(metrics/precision)和召回率(metrics/recall)指标虽有波动,但整体趋势向好。精确度的波动可能是由于模型在训练过程中不断尝试和修正不同的预测边界,而召回率的稳步提高表明模型越来越少地错过检测目标。这两个指标的提升是互补的,说明模型在识别真正的目标与减少误识别方面达到了平衡。

        最后,平均精度均值(metrics/mAP50和metrics/mAP50-95)指标为我们提供了模型性能的综合视图。mAP50指标的提高表明模型在IoU为0.5的阈值下对于目标的识别能力增强,而mAP50-95指标的增长则说明模型在各种IoU阈值下都表现出了良好的性能。特别是mAP50-95的稳定增长,意味着模型对于不同大小和形状的目标都具有较高的检测能力。

        PR曲线是一个重要的指标,用于评估分类器的性能,尤其是在数据集类别不平衡的情况下。它揭示了模型预测的精确度和召回率之间的关系。精确度(Precision)指的是模型预测为正的样本中实际为正的比例,而召回率(Recall)则是模型正确预测的正样本占所有实际正样本的比例。

         在这组曲线中,我们可以看到不同类别的精确度和召回率表现出明显的差异。以“Plaga”(害虫)为例,其曲线接近右上角,显示了极高的精确度和召回率,其AP值达到了0.947,这表明模型在检测害虫这一类别上具有极高的性能。在实际应用中,这意味着模型能够在大多数情况下准确地检测出害虫,且很少漏检。

         相比之下,“Good Condition Maize”(良好状态的玉米)的AP值仅为0.069,其PR曲线也显得较为平坦,这表明模型在这一类别上的识别性能较低。可能的原因包括该类别的样本数量较少、样本特征不够显著,或者训练样本中这类状态的玉米与其他状态间的差异性不够大。

        “Enfermedad”(病害)和“damaged corn”(受损玉米)的曲线虽然优于“Good Condition Maize”,但AP值分别为0.319和0.262,仍有提升空间。这可能是因为病害和受损玉米的特征更为复杂,或是这些状态在视觉上与健康玉米的区分度不足。“corn”(玉米)这一通用类别的AP值为0.528,显示了中等水平的模型性能,这可能是因为“玉米”这一类别包括了所有玉米的状态,因此模型需要区分的情况更为广泛和复杂。

        总体来说,所有类别的平均精确度均值[email protected]为0.393,这是一个中等偏上的结果,表明模型在多数情况下能够提供相对可靠的检测。然而,为了进一步提高模型的性能,可能需要对训练数据进行进一步的增强,或者对模型进行微调,特别是在那些性能较低的类别上。

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.386 0.374 0.368 0.45
F1-Score 0.43 0.42 0.41 0.393

(3)实验结果分析

        在本次实验中,我们对YOLOv5nu、YOLOv6n、YOLOv7-tiny和YOLOv8n四个算法进行了细致的比较和分析。通过在同一数据集上运行这些不同的YOLO算法版本,我们得以深入理解各自的性能特点。实验使用了两个关键的度量指标:平均精确度均值(mAP)和F1-Score,它们共同评估了算法的准确性和可靠性。

        首先,我们来分析mAP值,这个指标评估了检测器预测的精确性,即模型预测的边界框与真实边界框的重合程度。在这一指标上,YOLOv8n以0.45的mAP值明显领先于其他三个算法,显示出它在目标检测任务上的强大性能。YOLOv5nu以0.386的mAP紧随其后,而YOLOv6n和YOLOv7-tiny的mAP分别为0.374和0.368,表明这三个算法在精确度上的差异不大,但都低于YOLOv8n。

        F1-Score是另一个重要的度量指标,它结合了模型的精确率和召回率,是评估模型整体性能的重要指标。通常情况下,F1-Score越高,模型的性能越平衡。在这项指标上,YOLOv5nu以0.43的得分位居第一,紧跟其后的是YOLOv6n和YOLOv7-tiny,分别得分为0.42和0.41。有趣的是,尽管YOLOv8n在mAP上表现最好,但其F1-Score为0.393,略低于其他算法。这表明尽管YOLOv8n在检测的准确性上表现出色,但在精确率和召回率的平衡上,它可能没有其他模型那么均衡。

       综合以上数据,我们可以得出结论,YOLOv8n在目标检测的准确性上表现最佳,尤其是在检测目标的定位上。然而,当我们考虑到精确率和召回率的平衡时,YOLOv5nu在保持这一平衡方面略胜一筹。YOLOv6n和YOLOv7-tiny在这两个指标上的表现相当接近,表明在YOLO系列的发展中,性能的提升是渐进的,并且每个新版本都会在不同方面进行优化和改进。

       此次实验的结果强调了在选择合适的YOLO版本进行病虫害检测时,需要根据实际应用场景和具体需求来决定。如果目标的准确检测是首要任务,YOLOv8n可能是最佳选择;而如果需要更平衡的精确率和召回率,则可能会考虑使用YOLOv5nu。无论如何,随着YOLO算法的不断进步,我们可以预期在未来的病虫害检测任务中会有更高效和准确的模型出现。

4.4 代码实现

        在这篇博客中,我们要深入探讨如何使用Python和YOLOv8来开发一个玉米病虫害检测系统。这项技术结合了深度学习模型和图形用户界面(GUI),以实现一个易于操作的应用程序,它可以实时检测和识别玉米中的病害和害虫。

(1)导入必要的模块和配置
        首先,我们从导入必要的库和模块开始。我们使用sys模块处理Python运行时环境的操作,time模块获取时间相关数据,cv2即OpenCV库处理图像和视频。此外,还有QtFusion和PySide6库,用于创建和管理GUI。最关键的是YOLOv8Model中的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.CornPest.label_name import Label_list

QF_Config.set_verbose(False)

        在代码中,我们使用QtFusion库,这是一个封装了Qt功能的库,它提供了创建现代化窗口和控件的方法。
(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类继承自QMainWindow,它构成了我们应用的主窗口。在这个类中,我们设置窗口的基本属性,如大小和标签,这些标签将用于显示图像和检测结果。此外,我们还定义了键盘事件的处理函数,以便用户可以通过按键来控制应用程序。

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()  # 关闭窗口

        在我们的系统中,MainWindow类继承自QMainWindow,它是主窗口的基础。在这个类中,我们设置了窗口的大小,并且初始化了一个标签来显示处理过的图像。我们还定义了keyPressEvent函数来处理用户的键盘输入,当用户按下'Q'键时,程序会安全退出。

(4)主程序流程

        在主窗口类的基础上,我们定义了frame_process函数,它是系统的核心。此函数将处理视频流的每一帧图像。首先,我们将图像调整到窗口大小,并对其进行预处理,以适应我们的YOLOv8模型。然后,模型进行预测并计算所需时间,最终,根据预测结果在图像上绘制边界框和类别标签。这一流程不仅需要精确,而且必须足够快,以实现实时处理。

def frame_process(image):
    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']
            label = '%s %.0f%%' % (name, conf * 100)
            image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id])

    window.dispImage(window.label, image)

        MediaHandler对象负责处理视频文件,每当新的帧准备好时,它将调用frame_process函数进行处理。我们的MainWindow对象是用户界面的核心,它显示了从视频流中检测到的每一帧图像。

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 系统设计思路

        在我们的系统设计中,我们致力于打造一个直观且功能强大的交互式玉米病虫害检测与识别系统,旨在提高用户的操作便利性,并充分利用YOLOv8模型的强大功能。

(1)架构设计
        在开发交互式玉米病虫害检测与识别系统的过程中,我们的主要目标是构建一个用户友好且功能强大的应用程序,它能够实时识别和分类图像中的多个目标。我们的设计思路集中于创建一个集成化的环境,该环境将用户界面、媒体处理和深度学习模型的功能融为一体。在这个系统中,我们特别重视模块化和各功能间的流畅交互,确保了系统的高效运行和用户操作的便捷性。

  • 处理层(Processing Layer):这一层的核心是YOLOv8Detector类,一个强大的预训练模型,专门用于物体检测任务。这个类封装了所有必要的方法,用于处理图像数据、执行模型预测、并输出检测结果。其背后的设计理念是确保检测过程的高效和精确,允许系统在最短的时间内提供结果,这对于实时应用至关重要。
  • 界面层(UI Layer):用户界面是用户与系统交互的前端表示。由Ui_MainWindow类生成,它包括了一系列直观的用户交互元素,比如按钮、标签、图像显示框等。界面设计的直观性和响应性是此层的关键,使得用户能够轻松地上传图像、启动检测过程并接收反馈。
  • 控制层(Control Layer):作为系统的脑神经中枢,MainWindow类管理着用户的输入,调节媒体处理器的行为,并协调模型的预测流程。这一层通过定义一系列槽函数和事件处理方法,实现了对用户操作的响应。例如,当用户通过界面上传视频文件时,控制层将指挥媒体处理器加载文件,并且开始帧处理流程。此外,控制层还负责处理模型的预测结果,将检测信息反馈给用户界面层,实现了数据和任务的流畅传递。

        整体而言,我们的系统设计注重于灵活性和扩展性。每个层次都经过精心设计,旨在最大化用户体验和系统性能。通过这样的分层架构,我们确保了系统各部分的高度协同工作,同时保持了代码的整洁和可维护性。这种设计让我们的玉米病虫害检测与识别系统不仅能够在实验室环境中表现出色,也能够轻松适应实际应用场景的要求。

(2)系统流程

        在本次博客的探讨中,我们要探讨的是如何构建一个基于YOLOv8模型的交互式玉米病虫害检测与识别系统。这个系统的设计允许用户实时识别和分类玉米病虫害,其目标是提供一个高效且直观的工具来支持农业生产决策。

  1. 当用户启动这个应用程序时,它会首先实例化MainWindow类。这个类是用户交互的中心,它初始化应用程序的界面,设置必要的参数,并准备接收用户的输入。用户通过这个界面可以选择他们的输入源。输入源的选择非常灵活,可以是实时视频流、预录制的视频文件,甚至是单张的静态图像。这种设计使得系统可以广泛应用于不同的使用场景,从现场监控到图像分析都能够胜任。

  2. 在用户选择了输入源后,系统将调用MediaHandler等媒体处理器来配置摄像头、读取视频文件或加载图像文件。这个阶段是自动化的,用户只需通过点击几个按钮即可完成整个过程。系统内部会处理所有必要的媒体编解码和格式转换,确保不同格式的数据可以顺利进入下一个处理阶段。

  3. 处理媒体输入源的下一步是连续的帧处理循环。在这个循环中,系统首先对每帧图像进行预处理,这包括调整图像尺寸、变换色彩空间以及归一化等操作,以保证它们能够符合YOLOv8模型的输入标准。随后,预处理好的图像将被送入YOLOv8模型进行检测和识别。YOLOv8模型是这个系统的核心,它能够准确地定位病虫害,并对它们进行分类。
    4.随着模型输出的检测结果,用户界面将实时更新。这些更新包括展示检测到的病虫害边界框、分类标签,并在界面的显示元素中展示检测统计数据。这种实时反馈为用户提供了即时的视觉信息,帮助他们理解当前场景中的病虫害状况。

  4. 用户可以通过界面上的按钮进行各种交互操作,如保存结果、查看帮助信息或者退出应用。系统还提供了高级功能,例如筛选特定检测结果或分析检测数据,这些都可以通过下拉菜单来完成。用户还能控制媒体播放状态,例如开始或停止视频分析,这为用户提供了对检测过程的完全控制。

        总的来说,我们的系统不仅提供了一个强大的检测工具,而且还具备用户友好的交互设计。通过将深度学习模型与高效的界面设计结合,我们的系统在提高玉米生产效率和管理水平方面提供了有力的支持。这个系统的灵活性和直观性使它成为农业技术工具箱中的一个宝贵资产。

5.2 登录与账户管理

        在我们的玉米病虫害检测系统中,我们不仅注重于检测技术的实现,也同样重视用户体验。因此,我们设计了一个功能全面的用户登录与账户管理系统,以确保每位用户都能拥有个性化且安全的使用体验。

        利用PySide6强大的GUI开发能力和SQLite的轻量级数据库功能,我们为用户提供了一套完整的账户管理解决方案。用户首次使用系统时,可以通过注册功能创建自己的账户。在这个过程中,用户可以设置自己的用户名、密码,并选择一个头像,这些信息都将被存储在本地的SQLite数据库中,确保用户信息的私密性和安全性。

        注册后,用户可以使用自己的账户信息登录。登录界面不仅简洁直观,而且还支持密码的修改和头像的更新,使得用户能够根据个人喜好和需要调整账户设置。这些个性化设置让用户在使用玉米病虫害检测系统时拥有更加贴合个人需求的体验。

        在账户的管理方面,我们提供了注销和重新登录的选项,用户可以随时退出当前账户,并以不同的身份重新登录。这为使用公共场所或家庭共享环境的用户提供了额外的便利和灵活性。

        系统的主界面集成了深度学习模型,用户登录后可以实时查看包括检测框、类别、置信度等详细信息的检测结果。这些结果不仅可以在屏幕上实时显示,用户还可以将检测记录保存下来,以便后续的查看和分析。我们的系统支持多种输入源,包括图片、视频文件、实时摄像头捕获的图像和批量文件输入,这使得系统能够适用于各种不同的检测场景。

        通过这样的设计,我们的玉米病虫害检测系统不仅具备了强大的识别和检测功能,而且还提供了便捷的用户管理服务。无论用户在何种场景下使用,都能享受到高效、安全和个性化的服务体验。我们相信,这将极大地提升用户对系统的满意度,并推动更广泛的应用和发展。


6. 总结与展望

        在本博客中,我们详细介绍了一个基于YOLOv8模型的玉米病虫害检测系统,还实验了YOLOv7、YOLOv6、YOLOv5等模型。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的玉米病虫害检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。

        该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。


结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


  1. Fang W, Wang L, Ren P. Tinier-YOLO: A real-time object detection method for constrained environments[J]. IEEE Access, 2019, 8: 1935-1944. ↩︎

  2. 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. ↩︎

  3. Wan S, Goudos S. Faster R-CNN for multi-class fruit detection using a robotic vision system[J]. Computer Networks, 2020, 168: 107036. ↩︎

  4. He K, Gkioxari G, Dollár P, et al. Mask r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2961-2969. ↩︎

  5. 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. ↩︎

标签:YOLOv7,YOLOv6,Python,检测,模型,YOLOv8,图像,病虫害,玉米
From: https://www.cnblogs.com/sixuwuxian/p/18004835

相关文章

  • Python:Lambda
    Lambda>>>(lambda:3)()#Usingalambdaexpressionasanoperatorinacallexp.经过查阅资料,理解了这个表达式要做的事情:(lambda:3)()是一个Lambda表达式的调用,它表示创建了一个匿名函数(Lambda函数),该函数不接受任何参数,而在执行时返回值为3。(lambda:3):这......
  • python中常见的异常 error
    python中常见的异常在python2中可以通过一个模块来查看所有的内置异常,而在python3中就无法查看。>>>importexceptions>>>dir(exceptions)['ArithmeticError','AssertionError','AttributeError','BaseException','BufferError',&#......
  • Python Web 开源框架排行榜
    截止到2024年2月22日,对GithubStar>900的PythonWeb开源框架,按照Star数量,从高到低排序,具体排名如下:1.DjangoDjangoisahigh-levelPythonwebframeworkthatencouragesrapiddevelopmentandclean,pragmaticdesign.About: TheWebframeworkforperfec......
  • python实现zip分卷压缩与解压
    1. python实现zip分卷压缩WinHex开始16进制一个一个文件对比WinRar创建的分卷压缩和单个zip文件的差异。如果想把单个大文件 test.zip ->分卷文件 test.z01、test.z02、test.zip首先,在创建的第一个分卷文件 test.z01的前面加上 \x50\x4b\x07\x08 这个是分卷压缩......
  • python在B站爬糖豆广场舞
    先附上代码:importrequests,refromlxmlimportetree#这是单页面下载,翻页的目前还不会url='https://search.bilibili.com/all?vt=96737335&keyword=%E7%B3%96%E8%B1%86%E5%B9%BF%E5%9C%BA%E8%88%9E'headers={'user-agent':'Mozilla/5.0(Window......
  • 1.3 使用pip管理Python扩展库
    常用pip命令使用方法pip命令示例说明pipfreeze[>packages.txt]列出已安装模块及其版本号,可使用重定向符>把扩展库信息保存到文件packages.txt中pipinstallSomePackage[==version]在线安装SomePackage模块,可以使用方括号内的形式指定扩展库版本pipinstallSo......
  • 1.2 Python安装与简单使用
    Python3.6.8安装Python官网:https://www.python.org/Python3.6.8官网:https://www.python.org/downloads/release/python-368/按照提示安装即可,安装完成后,按win+R打开命令行,输入python-V,出现版本号,说明安装成功在开始菜单中选择IDLE(PythonGUI)即可启动Python解释器......
  • 1.1 如何选择Python版本
    简介Python是一门解释型高级语言,支持伪编译可以把Python源程序转换为字节码来优化程序和提高运行速度,支持使用py2exe、py2app、cx_Freeze或pyinstaller工具将Python程序打包为不同平台上的可执行程序,可以在没有安装Python解释器和相关依赖包的系统中运行Python支持多版本并存......
  • Python练习案例_Pico Fermi Bagels猜数字游戏
    案例介绍--《Python编程快速上手2》在PicoFermiBagels这个逻辑推理游戏中,你要根据线索猜出一个三位数。游戏会根据你的猜测给出以下提示之一:如果你猜对一位数字但数字位置不对,则会提示“Pico”;如果你同时猜对了一位数字及其位置,则会提示“Fermi”;如果你猜测的数字及其位置......
  • Python+Faker+Pandas数据库造数
    今日分享一些Python常用的东西,整理一些小笔记,比如Faker的使用,panda的使用1、使用faker造数据简介测试工作中,经常会遇到需要制造大量测试数据的时候,如果手动造数据必然会浪费大量时间Faker是一个制造数据的强大的python库,可以制造姓名、电话、身份证、地址、邮箱等等各种各样伪......