基于YOLOv26的农作物病虫害检测系统

本项目使用YOLOv26模型,在公开数据集上对常见农作物的病虫害进行检测任务的训练,训练完成后通过测试代码,完成单张图片、多张图片批量检测农作物的病虫害。

一、项目文件夹结构介绍

如下图,在项目主目录下,有六个文件夹。configs文件夹:存放数据集配置文件data.yaml;Dataset文件夹:存放数据集,训练集、测试集、验证集图片及其labels标签文件;runs文件夹:存放模型训练过程中保存的中间结果,模型训练完成后的权重文件等;src文件夹:存放训练代码;test文件夹:存放测试代码;weights文件夹:存放预训练模型的权重文件。

二、数据集介绍

本项目分别使用了两个公开数据集PlantVillage和PlantDoc。

1.PlantVillage数据集

宾夕法尼亚州立大学(Penn State)和瑞士联邦理工学院(EPFL),于2016年发布,配套论文《Using Deep Learning for Image-Based Plant Disease Detection》。覆盖14种农作物,26种病害,共38个分类类别,总计54306张RGB叶片图像。所有图像均为实验室可控环境拍摄的叶片特写:单张图仅含1片目标叶片,背景为纯色(白/灰),光照均匀无遮挡,叶片占比大,无复杂场景干扰。但原生数据集只支持图像分类任务,无法直接用于YOLO病虫害检测任务的训练。

目前可以选择开源社区人工标注的检测版本,在Kaggle平台、GitHub平台、Roboflow平台等等,搜索PlantVillage YOLO Dataset,开源社区均有成熟的YOLO格式标注包。

PlantVillage数据集规模大、类别标注精准、图像噪声低、训练收敛快,是农业病害识别的入门首选,也是分类任务的通用基准,但与田间真实生产场景差距大,训练的模型泛化性弱,无法直接用于户外农业落地场景。

数据集下载地址:PlantVillage for object detection YOLO,该数据集需要手动区分训练集、测试集、验证集。

Kaggle平台下载数据集需要注册账号,具体注册过程自行搜索。

2.PlantDoc数据集

印度理工学院(IIT)等机构,于2020年发布,配套论文《PlantDoc: A Dataset for Visual Plant Disease Detection》。覆盖13种农作物,27个检测类别,总计2598张田间实景RGB图像,人工标注8851个目标边界框。全部为户外田间自然环境拍摄:包含复杂土壤、植被背景、多目标同框、叶片重叠遮挡、光照变化(逆光、弱光)、不同拍摄角度与距离、小目标叶片,贴合真实农业生产场景。数据集原生支持目标检测和图像分类。

PlantDoc数据集景真实、标注规范,但数据规模相对较小,部分病害类别样本不均衡,对模型的泛化能力、小目标检测、抗遮挡能力要求高。

数据集下载:PlantDoc

Kaggle平台下载数据集需要注册账号,具体注册过程自行搜索。

三、项目环境配置

该项目包含YOLOv26、PyTorch等,显然在Anaconda的虚拟环境下,更有利于项目环境的配置和管理,可以创建新的虚拟环境,也可以直接使用前期创建过的yolov11的虚拟环境。

1.虚拟环境配置

若新创建虚拟环境,需要安装Python3.11或以上版本,安装Python版本所对应的PyTorch。同时,如果要使用CUDA加速模型的训练,PyTorch一定要下载GPU版本(通常大于2G),还需要下载对应版本的cuDNN、CUDA等。

若直接使用已经创建过的yolov11虚拟环境,则项目环境已然搞定,无需其他操作。

2.预训练模型下载

项目是基于yolov26的预训练模型yolo26n.pt进行训练,在预训练模型的基础上进行训练,可以加快模型的收敛速度,增加模型训练过程的稳定性等等。yolo26n.pt是最小的一个预训练模型,如果模型训练结果不达预期,可以尝试使用下图中的中高规模参数的预训练模型,如yolo26m.pt、yolo26l.pt等。

yolo26n.pt下载地址:ultralytics/ultralytics: Ultralytics YOLO

下载完成后,需要将预训练模型放到\weights文件夹下。

四、训练YOLOv26

首先需要准备数据,以PlantDoc数据集为例,该数据集原生支持目标检测任务,数据集内部的文件结构为数据集下载后,放到/Dataset目录下,将数据集内的data.yaml文件放到/configs目录下,并修改data.yaml内的数据集路径如下图。

1.yolo模型训练

模型训练的代码需要自己编写。在\src目录下创建train.py。

训练代码参考车牌识别项目中的yolo训练代码,只需要调整yolo训练时输入的参数即可,大佬写的代码各个方面都很不错。

由于PlantDoc数据集中,由于小目标、遮挡、长尾分布等因素,直接使用yolo默认的训练参数,训练效果不佳。可以尝试调整yolo训练中涉及的参数。

(1)寻找显存占用和训练速度的平衡

imgsz参数:默认640,要求是32的倍数。该参数对小目标检测精度影响大,可以尝试调高该参数,但会大大增加显存占用,需要和batch参数做平衡。

batch参数:要求是8的倍数。调高该参数会加速训练,但会大大增加显存占用。该参数太小,会导致模型收敛速度慢。

对于小目标检测来说,增大imgsz会导致显存占用过高,然后适当减小batch,用时间换精度。不同规模的预训练模型,训练是对应的显存占用也不一样。

(2)数据增强

mosaic参数:保持默认1。Mosaic将4张图像拼接成1张。应对丰富背景信息,提升小目标检测能力,1表示全量启用。

hsv_h、hsv_s、hsv_v参数:HSV色调、饱和度、亮度扰动范围。可以稍微提高,如0.02,0.8,0.5,尝试适配复杂背景。

YOLO训练可以调整的参数很多,可以多多探索尝试。

2.分析训练结果

YOLO26L中大规模参数的预训练模型,在RTX 4070 12G显存下,训练的结果如下图所示,全类精度63.9%,召回率54.3%漏检严重。

在Corn rust leaf(玉米锈病)、grape leaf black rot(葡萄黑腐病)、Strawberry leaf(草莓健康叶)、Apple leaf(苹果白粉病)、Corn leaf blight(玉米叶枯病)检测的准确率表现不错,这类病害特征明显、样本辨识度高,整体在80%。

在番茄、马铃薯、甜椒的病虫害检测结果很差,病害本身特征相似度高、叶片重叠遮挡严重、病斑小,模型难以学习和区分。尤其是番茄的病害,数据量多但训练精度差,拉低了全类检测精度。

运行train.py完成训练后。训练结束后的结果会保存在:

\runs\plant_disease_PlantDoc\weights,其中best.pt为验证集上表现最好的权重。

五、基于Tkinter设计GUI交互界面

为了方便测试,用Tkinter设计了一个简单的交互界面,整体GUI界面如下图所示。当然,Qt、PySimpleGUI等常见的Python GUI库将设计出来更美观的现代化交互界面,可以多多去尝试。

这个GUI界面的基本功能:(1)选择模型(训练好的bset.pt文件);(2)选择测试的运行设备(GPU或者CPU);(3)GUI界面内可以自定义校徽、院系、姓名、学号;(4)单张图片的测试,将测试结果显示在GUI界面内;(5)批量测试:选择某文件夹,将文件夹内的全部图片批量测试,并将批量测试结果按表格样式显示在GUI界面内,同时批量测试结果保存到.csv格式的文件内;(6)停止批量测试的按钮;(7)检测结果可视化功能(图片放大/缩小、更换显示图片)。

碎碎念

笔者不仅在PlantDoc数据集上做了训练,在PlantVillage数据集上也做了训练。在PlantVillage数据集上的训练结果十分不错,准确率达到99.7%,训练过程也很顺利。由此看出,数据集的质量很大程度影响YOLO模型最后的预测准确率,小目标、复杂背景、遮挡、多个大小不同的目标、数据集长尾分布等等因素,都会造成使用默认参数训练YOLO的结果不尽人意。如果数据集质量不能再上一个台阶,此时,对YOLO默认训练参数的调整就是最后的挽救机会。

后记

如果您对笔者上述提到的YOLO病虫害识别系统、数据集、GUI界面等感兴趣,或者想在自己学习过程中有个实际案例做参考,欢迎光临我的面包多主页小尘的橱窗的个人主页,希望对您的学习有帮助~~

参考资料

YOLO 常用训练参数详解与调优指南_yolo训练-CSDN博客

PlantVillage for object detection YOLO

公开数据集合:农作物、农业相关的数据集合_plantvillage数据集-CSDN博客

上一篇
下一篇