文末附源码、数据集下载链接
开发目的
随着智慧农业与精准植保技术的不断发展,农作物病虫害的智能化识别与快速响应已成为现代农业管理的重要需求。苹果作为全球广泛种植的经济作物之一,其产量与品质直接关系到果农收入与市场供应稳定。然而,在实际种植过程中,苹果叶片常受到多种病虫害(如斑点落叶病、白粉病、蚜虫、红蜘蛛等)侵袭,若未能及时发现与防治,极易导致叶片早落、果实减产甚至整树衰弱,造成严重的经济损失。
传统病虫害识别主要依赖人工田间巡查与经验判断,不仅耗时耗力、覆盖范围有限,且易受人员专业水平影响,难以实现早期、快速、精准的诊断。面对日益增长的规模化果园管理需求,亟需一种高效、智能、可推广的自动化检测手段。
YOLO8作为YOLO系列实时目标检测模型,在检测精度、推理速度与多尺度特征融合方面实现了进一步优化,具备更强的小目标检测能力与复杂农田环境适应性,能够精准定位并识别苹果叶片上的各类病虫害症状。结合Streamlit这一高效交互式Web应用框架,本系统构建了一套集可视化、易操作、可扩展于一体的苹果叶片病虫害智能检测平台,支持图像上传、实时分析与结果展示,显著降低了技术使用门槛,提升了农业技术服务的可及性。
该系统的研发不仅实现了对苹果叶片病虫害的快速、准确、自动化识别,有效弥补了传统人工检测在时效性与规模化应用中的不足,更为果园管理者提供了科学决策支持,助力实现病虫害的早发现、早干预、早控制,对于提升苹果种植智能化水平、降低农药滥用风险、保障果品安全与生态环境具有重要意义,同时也推动了人工智能技术在智慧农业场景中的落地与深化应用。
YOLO8介绍
作为Ultralytics推出的最新一代目标检测网络,YOLO8在速度、精度与模型泛化性上实现了全面突破。其设计延续了YOLO系列“端到端”的核心思想,同时在骨干网络、Neck(特征融合层)、检测头三大关键模块进行了针对性重构,显著提升了小目标检测、复杂场景适应等能力。以下从核心模块展开解析,并对比YOLO5、YOLO7的改进逻辑。
一、骨干网络(Backbone):从C3到C2f的高效进化
YOLO8的骨干网络以C2f模块(Cross Stage Partial Networks with fewer parameters)为核心,替代了YOLOv5的C3模块与YOLOv7的ELAN(Extended Efficient Layer Aggregation Network)。C2f通过更细粒度的梯度路径设计,在减少参数量的同时保持了特征表达能力:将C3模块中连续的卷积层拆分为多个分支,每个分支包含1-2个卷积层与残差连接,并通过“隐式特征”(Implicit Feature)机制强化不同尺度特征的交互。这一改进使骨干网络在ImageNet上的Top-1准确率较YOLOv5提升1.2%,FLOPs降低15%,尤其在小目标特征提取上表现更优。
对比来看,YOLOv5的C3模块虽通过CSP(Cross Stage Partial)结构减少了计算冗余,但分支合并方式较粗犷;YOLOv7的ELAN虽引入更多跨层连接,但模块复杂度较高,推理延迟略高。YOLO8的C2f则平衡了效率与效果,成为轻量化与高性能的新标杆。
二、Neck:PAN-FPN的精细化特征融合
YOLO8的Neck采用改进的PAN-FPN(Feature Pyramid Network)结构,在保留YOLOv5“自顶向下+自底向上”双向特征传递的基础上,新增了“跨阶段局部融合”(Partial Cross Stage Fusion)机制。具体表现为:在每一层特征金字塔的输出端,增加一条与前一阶段特征图的短路连接,并通过1×1卷积调整通道后与主路径特征相加。这一设计强化了浅层细节特征(如边缘、纹理)与深层语义特征(如目标类别)的融合,尤其提升了小目标在深层网络中的信息保留能力。
YOLOv5的Neck虽已采用SPPF(Spatial Pyramid Pooling - Fast)增强感受野,但特征融合仅依赖简单的拼接与卷积;YOLOv7的Neck尝试了更复杂的双向连接,但未针对不同尺度特征设计差异化融合策略。YOLO8的Neck通过局部跨阶段融合,在COCO数据集上的mAP@0.5:0.95较YOLOv5提升3.1%,小目标检测AP(AP_S)提升4.5%,验证了特征融合优化的有效性。
三、检测头(Detection Head):解耦头与动态分配的协同升级
YOLO8的检测头延续了解耦设计(Decoupled Head),但进一步简化了预测分支结构:将分类与回归任务的特征提取路径从“共享基础层+独立输出层”改为“基础层直接分支”,减少了特征传递中的信息损耗。同时,引入动态标签分配策略Task-Aligned Assigner(TAA),根据分类置信度与定位精度的对齐程度动态分配正负样本,避免了YOLOv5/YOLOv7中固定规则(如IoU阈值)导致的样本分配偏差。
具体来看,YOLOv5的检测头虽已解耦,但分类与回归分支仍共享前几层卷积;YOLOv7的检测头尝试了任务特定的特征增强,但未解决样本分配的动态性问题。YOLO8的检测头通过解耦结构简化与动态分配策略的结合,在COCO数据集上的推理速度较YOLOv5提升18%(相同精度下),同时小目标漏检率降低22%。
总结:YOLO8的核心突破
YOLO8的革新围绕“高效特征处理”展开:骨干网络C2f通过轻量化设计平衡速度与精度,Neck的跨阶段局部融合强化了多尺度特征表达,检测头的解耦结构与动态分配则优化了任务特异性。相比YOLO5,其在精度(mAP提升3%+)、速度(推理快15%+)、模型大小(参数量减少20%)上实现全面超越;相比YOLO7,其骨干与Neck的简化设计降低了计算复杂度,更适合边缘设备部署。作为当前YOLO系列的集大成者,YOLO8为实时目标检测提供了更优的工业级解决方案。
系统设计
数据集
(1) 数据集基本情况
本项目使用的数据集为真实果园场景下拍摄的苹果树叶片图像,专用于苹果叶片病虫害检测任务。数据集图像尺寸统一为640×640像素,共包含946张已标注图像,具体划分为:
- 训练集:781张图像
- 验证集:165张图像
数据集共包含8个类别,分别为:
- 苹果褐纹病
- 苹果褐斑病
- 苹果黑星病
- 黑腐病
- 叶锈病
- 健康
- 不健康
- 未知
所有图像均为原始拍摄图像,未进行任何数据增强处理,确保了数据的真实性和模型评估的可靠性。经实测,使用YOLOv11s模型在该数据集上训练,mAP@50可达85.5%,说明该数据集具有较高的标注质量和检测挑战性。
(2) 数据集处理
在获取原始图像后,我们使用 Labelme 工具对图像进行人工标注。Labelme 是一个开源的图像标注工具,支持多边形、矩形、点等多种标注方式,适用于目标检测、语义分割等任务。我们采用矩形框(bounding box)对每张图像中的病害区域进行标注,并为每个目标分配对应的类别标签。
标注完成后,Labelme 生成的标注文件为 .json
格式,包含图像路径、对象类别、边界框坐标等信息。随后,我们将这些 .json
文件转换为 YOLO 目标检测模型所需的格式。
YOLO目标检测数据集格式说明:
YOLO 模型要求每张图像对应一个同名的 .txt
标注文件,文件中每一行表示一个目标,格式如下:
<class_id> <x_center> <y_center> <width> <height>
其中:
class_id
:类别索引(从0开始)x_center, y_center
:边界框中心点坐标(相对于图像宽高的归一化值,范围[0,1])width, height
:边界框宽高(归一化值)
所有 .txt
文件与图像文件一同组织在 labels/
目录下,构成标准的 YOLO 数据格式。该格式简洁高效,便于模型训练时快速读取和解析。
模型训练
安装 Ultralytics
我们使用 Ultralytics 提供的 YOLOv11 模型进行训练。首先安装 ultralytics
库:
pip install ultralytics
训练代码编写
训练脚本基于 YOLO
类封装,只需几行代码即可完成模型训练:
from ultralytics import YOLO
# 加载预训练模型
model = YOLO('yolov11s.pt')
# 开始训练
results = model.train(
data='apple_disease.yaml',
epochs=100,
imgsz=640,
batch=16,
name='yolov11_apple_disease'
)
其中 apple_disease.yaml
是数据配置文件,定义训练集、验证集路径及类别名称。
训练参数设置(超参数)
Ultralytics 支持丰富的超参数配置,以下为本次训练中关键超参数及其含义:
超参数 | 取值 | 含义 |
---|---|---|
epochs |
100 | 训练轮数,控制模型学习的迭代次数 |
batch |
16 | 每批次输入图像数量,影响内存占用与梯度稳定性 |
imgsz |
640 | 输入图像尺寸,与数据集一致 |
optimizer |
auto (AdamW) | 优化器类型,自动选择AdamW |
lr0 |
0.01 | 初始学习率 |
lrf |
0.01 | 最终学习率(学习率衰减至初始的1%) |
momentum |
0.937 | SGD动量参数 |
weight_decay |
0.0005 | 权重衰减,防止过拟合 |
warmup_epochs |
3.0 | 学习率预热阶段的epoch数 |
warmup_momentum |
0.8 | 预热阶段动量值 |
box |
7.5 | 边界框回归损失权重 |
cls |
0.5 | 分类损失权重 |
iou |
0.5 | IoU损失阈值 |
conf |
0.25 | 置信度损失阈值 |
hsv_h |
0.015 | 图像增强:HSV色调增强幅度 |
hsv_s |
0.7 | HSV饱和度增强幅度 |
hsv_v |
0.4 | HSV明度增强幅度 |
degrees |
0.0 | 随机旋转角度范围 |
translate |
0.1 | 平移增强比例 |
scale |
0.5 | 缩放增强比例 |
shear |
0.0 | 剪切变换角度 |
flipud |
0.0 | 上下翻转概率 |
fliplr |
0.5 | 左右翻转概率 |
这些超参数可根据任务需求进行调整,以平衡模型精度与训练效率。
训练后评估
模型训练完成后,必须对其性能进行科学评估,以判断其在实际应用中的可靠性。常用的评估指标包括 精确率-召回率曲线(PR曲线) 和 平均精度(mAP)。
PR曲线
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
其中:
- TP:真正例(True Positive)
- FP:假正例(False Positive)
- FN:假反例(False Negative)
PR曲线越靠近右上角,说明模型性能越好。
mAP(mean Average Precision)
mAP 是目标检测中最核心的评价指标,表示所有类别AP(Average Precision)的平均值。AP 是PR曲线下的面积。
- mAP@50:IoU阈值为0.5时的mAP
- mAP@50:95:IoU阈值从0.5到0.95(步长0.05)的平均mAP
mAP越高,说明模型在定位和分类上的综合性能越强。
模型推理
使用训练好的模型进行推理,支持图片、视频和摄像头实时检测。以下是核心推理代码:
图片推理
from ultralytics import YOLO
from PIL import Image
model = YOLO('best.pt')
image = Image.open('test.jpg')
results = model.predict(source=image, conf=0.25, iou=0.45)
annotated_img = results[0].plot()
annotated_img.show()
视频推理
import cv2
model = YOLO('best.pt')
cap = cv2.VideoCapture('test.mp4')
while cap.isOpened():
success, frame = cap.read()
if success:
results = model.predict(source=frame, conf=0.25, iou=0.45)
annotated_frame = results[0].plot()
cv2.imshow('YOLOv11 Detection', annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
系统UI设计
本系统采用 Streamlit 框架构建用户界面。Streamlit 是一个专为数据科学和机器学习应用设计的开源 Python 库,具有以下优点:
- 开发快速:无需前端知识,纯 Python 编写交互式界面
- 实时渲染:代码更改后自动刷新页面
- 组件丰富:支持文件上传、滑块、按钮、表格等常用UI组件
- 部署简单:可一键部署到 Streamlit Community Cloud
结合提供的源码,系统UI设计如下:
- 页面标题居中显示:使用 HTML + CSS 实现标题居中
- 侧边栏配置面板:
- 置信度滑块(10%~100%)
- IoU阈值滑块
- 检测模式选择(图片/视频/摄像头)
- 主区域布局:
- 使用
st.columns
分两列显示原始图像与检测结果 - 使用
st.image
显示图像 - 使用
st.video
播放上传视频 - 使用
st.empty()
创建空容器用于实时显示摄像头画面
- 使用
- 结果展示:
- 使用
st.dataframe
展示检测结果表格(序号、类别、置信度、坐标) - 统计各类别检测数量
- 使用
通过 @st.cache_resource
装饰器缓存模型加载,避免重复加载,提升响应速度。
系统功能
基于提供的代码,本系统具备以下核心功能:
多模式检测支持:
- 图片上传检测
- 视频文件上传检测
- 本地摄像头实时检测
可调节推理参数:
- 用户可通过滑块动态调整置信度阈值和IoU阈值
可视化检测结果:
- 在图像/视频上绘制边界框和类别标签
- 实时显示检测画面
结构化结果输出:
- 表格展示每个检测目标的序号、类别、置信度和坐标
- 统计每类病害的检测总数
跨设备兼容:
- 自动判断是否支持GPU,优先使用
.pt
模型;否则加载.onnx
模型保证CPU推理效率
- 自动判断是否支持GPU,优先使用
用户友好界面:
- 响应式布局,适配不同屏幕尺寸
- 清晰的提示信息和加载动画
该系统可广泛应用于果园智能巡检、农业科研辅助、移动端病害识别等场景,具备良好的实用性和扩展性。
总结
本文围绕苹果叶片病虫害智能识别的需求,设计并实现了一套基于目标检测技术与交互式Web框架的自动化识别系统。
本系统依托高质量的真实果园数据集,完成了从数据标注、格式转换、模型训练到性能评估的全流程构建,并利用Streamlit快速搭建了直观、易用的前端交互界面,实现了图片、视频及摄像头三种模式下的实时病害检测功能。系统不仅具备良好的检测精度(mAP@50达85.5%),还通过参数调节、结果可视化和设备兼容性设计,提升了实用性与用户体验。
综上所述,该系统充分体现了人工智能在智慧农业中的应用潜力。未来工作应聚焦于使用官方支持的最新YOLO版本进行模型优化,并进一步拓展至移动端部署与多作物病害识别,推动农业智能化向更广更深方向发展。
另外,限于本篇文章的篇幅,无法一一细致讲解系统原理、项目代码、模型训练等细节,需要数据集、项目源码、训练代码、系统原理说明文章的小伙伴可以从下面的链接中下载:
基于YOLO8和Streamlit的苹果叶片病虫害检测系统