【设计报告+源码+数据集】基于YOLO11的洋葱叶片病害检测系统
本文涉及的全部源码、训练好的模型权重、数据集、配套文档已整理打包,文末附下载链接,方便读者一键复现与二次开发。
开发目的
开发本系统的核心目的在于针对洋葱种植过程中常见的叶片病害识别难题,提供一套轻量、实时且可实际部署的检测方案。洋葱作为全球广泛种植的蔬菜作物,其叶片健康直接关系到鳞茎的产量与品质,而鸢尾黄斑病、叶枯病、紫斑病等病害在田间常混合发生,早期症状相似,人工肉眼判断不仅耗时费力,且容易因经验差异导致误诊或漏诊。现有研究多集中于通用作物病害,针对洋葱这一特定作物的专用数据集和端到端检测系统仍相对匮乏。因此,我们以自建的2000张洋葱叶片图像数据集(包含健康、鸢尾黄斑病、叶枯病、紫斑病四类,训练集1400张、验证集400张)为切入点,旨在利用深度学习目标检测技术,将病害识别从人工经验判断转化为自动化、标准化的视觉分析,从而辅助农户或农技人员快速定位病斑、区分病害类型,为精准施药和病害早期防控提供技术支撑。在技术路线选择上,我们采用YOLO11作为核心检测模型,该算法在保持高检测精度的同时具备极快的推理速度,特别适合对实时性有要求的田间移动端或Web端应用;其多尺度特征融合机制能有效应对洋葱叶片上大小不一的病斑(如早期紫斑病的小点状病灶),且对四类目标的区分能力已在训练中验证(实际训练指标mAP@0.5达到0.866)。后端选用Flask框架,因其轻量、灵活,能快速搭建RESTful API接口,便于将YOLO11模型封装为可调用的服务,同时支持图片上传、视频流处理等常见交互模式。前端采用Layui构建简洁直观的用户界面,无需复杂配置即可实现图片预览、检测结果标注、置信度展示等功能,降低了用户的使用门槛。三者结合在技术层面高度契合:YOLO11负责高效推理,Flask承担请求调度与结果返回,Layui提供友好交互,共同构成一个从输入到输出的完整闭环。在验证目标方面,我们将从检测精度与系统性能两个维度评估系统效果。精度评估主要基于验证集上的mAP@0.5指标(已获得0.866),同时分别统计各类别的平均精度,重点关注鸢尾黄斑病和紫斑病等小目标或边缘模糊病斑的识别表现;性能评估则通过测量单张图片的平均推理时间(毫秒级)以及Web端从上传到显示结果的端到端延迟,验证系统是否满足实时检测需求。此外,还会通过模拟不同光照、叶片姿态等实际场景下的测试图片,观察模型鲁棒性,并记录用户交互过程中的响应流畅度。所有评估均以客观实验数据为准,不预设具体数值目标,旨在全面反映系统在真实应用条件下的可行性与局限性。
YOLO11 介绍
YOLO11是由Ultralytics团队在2024年推出的新一代实时目标检测网络,延续了YOLO系列高效、轻量的设计理念,在精度与速度之间取得了更优平衡。其骨干网络(Backbone)经历了从CSPDarknet到C3k2的演进,核心创新在于引入了C3k2模块与C2PSA空间注意力机制。C3k2骨干通过将标准卷积替换为更高效的跨阶段部分连接(CSP)结构,并采用两个3×3卷积核的堆叠设计,显著减少了计算冗余,同时保持了丰富的梯度流路径——梯度在浅层与深层之间能够更顺畅地传播,避免了梯度消失或爆炸问题。C2PSA(Cross Stage Partial with Spatial Attention)模块进一步在特征提取过程中嵌入空间注意力,使网络能够自适应地聚焦于病害叶片的关键区域(如病斑边缘或纹理),从而提升对复杂背景的鲁棒性。这种设计在参数效率上尤为突出:相比YOLOv8的C2f模块,C3k2在相同深度下参数量更少,但感受野和特征表达能力并未下降,非常适合在资源受限的嵌入式设备或服务器端部署。
在特征融合层(Neck)方面,YOLO11沿用了YOLO系列经典的SPPF(Spatial Pyramid Pooling Fast)与PAN-FPN(Path Aggregation Network with Feature Pyramid Network)组合结构。SPPF通过不同尺度的池化操作提取多感受野特征,增强了网络对尺度变化的适应性;而PAN-FPN则通过自顶向下和自底向上的双向路径,将高层语义信息与低层细节信息充分融合。对于洋葱叶片病害数据集而言,病害斑点的尺度差异极大:健康叶片与早期病斑可能仅占图像中几十个像素,而严重叶枯病或紫斑病可能覆盖大片区域。多尺度特征融合使得网络能够同时捕捉小目标病斑的细微纹理和大面积病斑的轮廓信息,从而提升各类病害的检出率,尤其对鸢尾黄斑病这类早期小病斑的检测至关重要。
检测头部分,YOLO11采用了解耦检测头(Decoupled Head)设计,将分类分支与回归分支完全分离。每个分支独立使用若干卷积层进行特征映射,避免了传统耦合头中分类与回归任务相互干扰的问题。这种分离设计使得网络能够针对分类任务更关注类别判别性特征(如病斑颜色、形状),而回归任务则专注于边界框定位精度(如病斑边缘的准确框定),从而在洋葱叶片病害检测中同时提升分类准确率和定位召回率。
相较于YOLOv8和YOLOv10,YOLO11在三个关键方面进行了改进:其一,骨干网络从C2f升级为C3k2+C2PSA,在保持轻量化的同时引入了空间注意力,增强了特征判别力;其二,Neck部分优化了特征融合路径,减少了PAN-FPN中的冗余计算,并引入了更高效的卷积核配置;其三,检测头进一步精简了分类与回归分支的通道数,并采用了任务对齐学习(Task Alignment Learning)策略,使得分类与回归的损失函数能够更协调地优化。这些改进使得YOLO11在COCO等通用数据集上mAP提升约1-2%,同时推理速度更快。
本项目实际选型中,我们选择了yolo11s.pt作为基础权重。s版本(small)在参数量与精度之间取得了良好平衡,适合在中等算力环境下快速训练与部署。输入分辨率设定为[640, 640],这是YOLO系列的标准配置,能够覆盖洋葱叶片图像中常见病害斑点的尺度范围,同时避免过高分辨率带来的显存开销。训练轮数设为60轮,基于数据集规模(约数千张标注图像)与模型收敛曲线经验:在60轮左右,验证集mAP趋于稳定,继续增加轮数容易导致过拟合,且训练时间成本线性增长。综合来看,该配置能够在保证检测精度的前提下,实现高效的模型训练与实时推理。
系统设计
数据集
本项目使用的数据集为真实场景下采集的洋葱叶片病害数据集图像,专用于洋葱叶片病害数据集检测任务。数据图像来自实际现场拍摄,覆盖了多种典型场景,确保了数据的真实性与多样性。
数据集共包含2000 张已标注图像,具体划分为:
- 训练集:1400 张图像
- 验证集:400 张图像
- 测试集:200 张图像
数据集共包含4 个检测类别:[‘healthy’, ‘iris yellow spot’, ‘leaf blight’, ‘purple blotch’]
数据集各类别数目分布情况如下:
部分图像及标注如下图所示:
YOLO 在进行模型训练时,会读取data.yaml文件中的训练集、验证集路径以及检测类别信息。本文数据集的data.yaml内容如下:
train:J:\datasets\onion_leaf_disease\train\imagesval:J:\datasets\onion_leaf_disease\valid\imagestest:J:\datasets\onion_leaf_disease\test\imagesnc:4names:['healthy','iris yellow spot','leaf blight','purple blotch']#健康、鸢尾黄斑病、叶枯病、紫斑病模型训练
本文基于YOLO11进行模型训练。首先安装 Ultralytics:
pipinstallultralytics训练脚本基于YOLO类封装,核心代码如下:
fromultralyticsimportYOLOif__name__=='__main__':model=YOLO('yolo11s.pt')model.train(data='./data.yaml',imgsz=(640,640),workers=1,batch=16,epochs=60)模型常用训练超参数说明:
- epochs:训练轮数,本文设置为
60 - batch:批次大小,本文设置为
16 - imgsz:输入图像尺寸,本文设置为
[640, 640] - optimizer:优化器,本文使用
auto
训练后评估
模型训练完成后,必须对其性能进行科学评估,以判断其在实际应用中的可靠性。常用的评估指标包括精确率-召回率曲线(PR曲线)和平均精度(mAP)。
本文训练过程的 loss/metrics 曲线如下图所示:
PR 曲线描述了在不同置信度阈值下,模型的精确率(Precision)与召回率(Recall)之间的关系。
精确率(Precision):预测为正类的样本中,实际为正类的比例
P r e c i s i o n = T P T P + F P Precision = \frac{TP}{TP + FP}Precision=TP+FPTP
召回率(Recall):实际为正类的样本中,被正确预测为正类的比例
R e c a l l = T P T P + F N Recall = \frac{TP}{TP + FN}Recall=TP+FNTP
mAP(mean Average Precision):所有类别 Average Precision 的平均值,是衡量模型综合性能的核心指标。
mAP@0.5:IoU 阈值为 0.5 时的 mAP,反映较宽松匹配下的检测精度。
mAP@0.5:0.95:IoU 阈值从 0.5 到 0.95 步进 0.05 的平均 mAP,更严格,反映高精度匹配下的整体表现。
本文模型目标检测的mAP@0.5 = 0.866,mAP@0.5:0.95 = 0.664,Precision = 0.813,Recall = 0.848。
混淆矩阵如下:
模型推理
使用训练好的best.pt进行推理,支持图片、视频和摄像头三种检测模式。以下是三种模式的核心代码:
(1)图片推理
fromultralyticsimportYOLO# 加载训练好的模型model=YOLO('weights/best.pt')# 对图片进行推理results=model('test.jpg')# 可视化检测结果并保存res_plotted=results[0].plot()importcv2 cv2.imwrite('result.jpg',res_plotted)(2)视频推理
importcv2fromultralyticsimportYOLO model=YOLO('weights/best.pt')cap=cv2.VideoCapture('test.mp4')whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=model(frame)annotated=results[0].plot()cv2.imshow('YOLO Detection',annotated)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()(3)摄像头实时检测
importcv2fromultralyticsimportYOLO model=YOLO('weights/best.pt')cap=cv2.VideoCapture(0)# 0 表示默认摄像头whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=model(frame)annotated=results[0].plot()cv2.imshow('Live Detection',annotated)ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()cv2.destroyAllWindows()系统 UI 设计
系统整体采用 Flask 后端与 Layui 前端分离的架构,后端通过蓝图(Blueprint)将功能模块划分为用户管理、检测任务、模型配置、数据统计等独立路由组,每个蓝图对应一个 Python 模块,便于维护与扩展。模型推理部分被封装为独立的推理引擎类,与 Flask 的请求-响应循环解耦:视图函数仅负责接收请求参数、调用推理引擎的接口并返回结果,引擎内部管理模型加载、预处理、后处理及 GPU/CPU 切换,通过单例模式确保模型只加载一次。SQLite 数据库通过 Flask-SQLAlchemy 管理,存储用户信息、检测记录、配置参数等。RESTful 接口统一返回 JSON 格式,状态码与错误信息遵循约定,前端通过 AJAX 异步调用。
前端基于 Layui 的模块化机制,在检测记录页面使用table组件展示历史记录,支持分页、搜索、排序;用户管理页面利用form组件实现增删改查,配合layer弹出层完成编辑与确认操作。图片/视频上传借助 Layui 的upload组件,支持拖拽与多文件批量上传,上传前通过accept属性限制文件类型。所有前端交互均通过 jQuery 的$.ajax或 Layui 封装的util.event发起,请求头携带 CSRF Token,后端返回的数据直接渲染到表格或结果区域,无需页面刷新。检测结果保存按钮触发 AJAX 将当前结果写入数据库,并刷新表格。
检测流程的交互实现遵循清晰时序:用户选择图片或视频后,前端调用上传接口获得临时文件路径,再调用检测接口(如/api/detect)传入路径参数。后端接收后,由推理引擎执行模型推理,返回 JSON 结果,字段约定为{"code": 0, "data": {"detections": [{"class": "健康", "confidence": 0.95, "bbox": [x1, y1, x2, y2]}]}}。前端解析后,利用 Canvas 在原始图像上绘制边界框:先获取图片原始尺寸与显示尺寸的比例,将归一化坐标转换为像素坐标,再调用ctx.strokeRect绘制矩形框,同时用ctx.fillText标注类别与置信度。视频检测采用逐帧抽取策略,通过requestAnimationFrame循环读取视频帧并发送至后端,后端返回后立即绘制,实现近似实时效果。摄像头实时检测则通过getUserMedia获取媒体流,每帧截图后以 base64 形式 POST 到后端,后端解码后推理并返回结果,前端同样用 Canvas 覆盖显示。
部署与配置方面,模型权重路径通过环境变量MODEL_PATH指定,默认加载models/onion_best.pt。推理设备通过DEVICE配置项切换,支持cpu或cuda:0,系统自动检测 CUDA 可用性。关键配置项集中在config.py文件中,包括数据库路径、上传文件大小限制、检测阈值(默认 0.5)、最大批量检测数等。生产环境建议使用 Gunicorn 或 uWSGI 部署,并配置 Nginx 反向代理处理静态文件与请求转发。
系统主界面如下图所示:
系统功能
基于训练好的目标检测模型,本系统具备以下核心功能:
1. 多模式检测支持
- 图片上传检测(单张/批量)
- 视频文件上传检测
- 本地摄像头实时检测
2. 可调节推理参数
- 用户可动态调整置信度阈值(conf)
- 用户可动态调整 IoU 阈值
3. 可视化检测结果
- 在图像/视频上绘制边界框和类别标签
- 实时显示目标位置、目标总数、置信度、用时等信息
4. 结构化结果输出
- 表格展示每个检测目标的序号、类别、置信度和坐标
- 统计每类目标的检测总数
- 支持将检测结果保存为 CSV 文件
5. 跨设备兼容
- 自动判断是否支持 GPU,优先使用 GPU 加速
- 支持主流浏览器访问(Chrome / Edge / Firefox)
总结
本项目构建了一套基于YOLO11与Flask的洋葱叶片病害检测系统,覆盖了从数据准备到Web部署的完整流程。首先,对采集的2000张洋葱叶片图像进行人工标注,将病害类别划分为健康(healthy)、鸢尾黄斑病(iris yellow spot)、叶枯病(leaf blight)和紫斑病(purple blotch)四类,并转换为YOLO格式。随后采用YOLO11s作为基础权重,以640×640的输入分辨率进行60轮训练,批次大小为16,优化器选择自动模式。训练完成后,模型在验证集上取得了Precision 0.813、Recall 0.848、mAP@0.5 0.866以及mAP@0.5:0.95 0.664的指标。最后,基于Flask框架搭建了Web可视化系统,实现了图片上传、实时推理与结果展示功能,用户可通过浏览器直接上传叶片图像并查看检测结果。
从指标来看,模型在mAP@0.5上达到0.866,说明对多数病害的检测召回率和精确率较为均衡,能够有效识别主要病害区域。然而mAP@0.5:0.95仅为0.664,表明当IoU阈值提高时,检测框的定位精度有所下降,边界框与真实框的重合度不够理想。在实际训练和部署中,我们遇到几个典型问题:一是类别间易混淆,尤其是鸢尾黄斑病与紫斑病在早期症状上形态相似,模型偶尔出现误判;二是小目标检测效果欠佳,部分早期病斑面积较小,模型容易漏检;三是推理速度方面,在CPU环境下单张图片推理耗时约120ms,基本满足实时性要求,但在高并发场景下仍需优化。
后续可从三方面提升系统性能:数据增强方面,引入Mosaic、MixUp等策略增加样本多样性,缓解类别不平衡与相似病害的区分困难;模型规模方面,尝试YOLO11m或YOLO11l以提升特征提取能力,改善小目标检测效果;推理优化方面,采用TensorRT或ONNX Runtime进行模型量化与加速,降低推理延迟,适应更高吞吐量的部署需求。
随项目附带的源码文件结构说明:
随项目附带的设计说明书(docx)缩略图:
下载地址:https://mbd.pub/o/bread/YZaTmppxZw==