1. 课程导入与YOLO技术定位
农作物病虫害识别,表面上看是一个“给图片分类”的问题,真正落到田间却远比通用图像分类复杂。同一片叶子上,病斑可能只有几毫米,早期症状与健康组织的颜色差异极小;害虫体型小、姿态多变,还常被叶片遮挡;拍摄时的光照从正午强光到阴天散射光变化剧烈,背景里混杂着土壤、杂草、滴灌带和相邻植株。更关键的是,一张田间图像里往往同时存在多种病虫害,需要回答“是什么”和“在哪里”两个问题。这正是目标检测任务的典型形态:输出一组边界框,每个框带类别标签和置信度。
从任务特点出发,可以归纳出四个约束。第一是小目标密集,病斑和蚜虫在整幅图像中占比可能不足千分之一,要求网络保留较高的特征图分辨率。第二是类间差异细微,霜霉病与褐斑病在早期都表现为黄褐色斑点,模型必须依赖纹理和边缘细节而非单纯颜色。第三是类内差异大,同一病害在不同作物、不同生育期、不同光照下外观差异明显,数据增强和足够的样本多样性比模型复杂度更重要。第四是部署环境受限,识别往往要跑在无人机机载设备、手持终端或边缘盒子上,算力和功耗都有上限,模型不能一味追求精度而忽视推理速度。
YOLO系列之所以成为这类任务的常用选择,核心在于它把检测建模为单次前向回归:将图像划分为网格,每个网格直接预测边界框坐标、置信度和类别概率,一次推理即可得到全部结果。相比两阶段检测器先产生候选区域再分类的做法,YOLO省去了区域提议环节,速度优势明显,且端到端训练流程简单,便于在自定义数据集上快速迭代。
回顾算法演进,可以抓住几条主线。YOLOv1 奠定单阶段回归框架,但定位精度有限;YOLOv2 引入锚框和批归一化,召回率显著提升;YOLOv3 采用多尺度特征金字塔,在三个尺度上分别预测,对小目标更友好,这一结构至今仍是检测网络的基础范式;YOLOv4 与 YOLOv5 在工程化上大幅完善,前者整合了 CSPDarknet、PANet、Mosaic 增强等技巧,后者以 PyTorch 实现和易用的训练脚本推动了社区普及;YOLOv8 转向无锚框的解耦头设计,分类与回归分支分离,并提供了从 n 到 x 的多个规模档位,方便按算力选型。对农作物病虫害场景而言,多尺度预测和无锚框设计尤其值得关注,前者应对病斑尺寸跨度大,后者减少了锚框尺寸与实际目标不匹配带来的调参负担。
课程项目全景围绕一条完整的开发链路展开:数据采集与标注、数据集组织与增强、模型选型与训练、指标评估与调优、模型导出与边缘部署。以本课程贯穿的示例项目为例,假设采集番茄叶片图像约 3000 张,标注类别设定为健康、早疫病、晚疫病、叶霉病、蚜虫五类,标注格式采用 YOLO 的 txt 格式,每行形如 类别索引 中心x 中心y 宽 高,坐标均归一化到 0 至 1。数据集按 8:1:1 划分训练、验证、测试集,目录结构如下:
tomato_dataset/
├── images/
│ ├── train/ # 2400 张
│ ├── val/ # 300 张
│ └── test/ # 300 张
├── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── data.yaml # 类别名与路径配置
开发环境建议采用 Python 3.10 搭配 PyTorch,并安装 Ultralytics 提供的 YOLO 实现。若使用 GPU 训练,需确认 CUDA 与 PyTorch 版本匹配;无 GPU 时可用 CPU 跑通小规模流程,但训练轮次和图像尺寸需相应压缩。一个可用的环境搭建与自检流程如下:
conda create -n crop-yolo python=3.10 -y
conda activate crop-yolo
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118
pip install ultralytics opencv-python matplotlib
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
python -c "from ultralytics import YOLO; print('ultralytics ok')"
自检时重点看两项输出:PyTorch 版本号是否打印正常,以及 torch.cuda.is_available() 是否为 True。若为 False,先排查驱动与 CUDA 版本,而不是急着改训练脚本。环境就绪后,可用一张样例图做一次推理冒烟测试,确认模型加载、图像读取和结果绘制链路通畅:
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model("sample_leaf.jpg", conf=0.25)
results[0].save("smoke_result.jpg")
运行后若能在输出目录看到带框图像,说明环境基本可用。此时模型还是通用预训练权重,对病虫害类别并无识别能力,它的作用是验证流程而非给出业务结论。后续章节将在此基础上替换为自建数据集、调整类别数并开展训练。需要提醒的是,上述图像数量、类别划分和训练参数均为教学示例设定,实际项目应依据采集条件与标注质量重新确定。