1. 项目概述:基于YOLOv11的作物杂草识别系统
去年在农业科技展上看到植保无人机喷洒农药时,我注意到一个关键问题:传统均匀喷洒方式会浪费大量药剂在无杂草区域。这促使我开发了这套基于YOLOv11的智能识别系统,它能以每秒30帧的速度实时区分作物与杂草,准确率在我的测试中达到了92.3%。不同于通用目标检测方案,这个毕设项目专门针对农业场景优化,在玉米、小麦等作物田间实测时,即使遇到叶片重叠或光照变化也能保持稳定识别。
系统采用Python+PyTorch框架开发,包含完整的数据标注工具、模型训练模块和轻量化部署方案。特别值得一提的是,我在YOLOv11基础上加入了针对细小杂草的检测头改进,对于5像素以上的杂草目标检出率提升27%。整套代码已开源,包含详细的注释和训练脚本,即使没有深度学习基础的同学也能快速复现。
关键优势:模型体积仅14.8MB(INT8量化后),可在RK3588等边缘设备流畅运行,满足田间实时处理需求
2. 核心设计思路与技术选型
2.1 为什么选择YOLOv11?
在比较了YOLOv8、YOLOv10和最新YOLOv11后,我最终选择v11版本主要基于三点考量:
- 梯度流优化:v11的GELAN结构比v8的CSPNet减少15%梯度消失风险
- 小目标检测:新增的P2检测头专门针对杂草这类小物体(测试集里40%的杂草小于32×32像素)
- 训练效率:相比v10,v11在COCO数据集上达到相同mAP所需训练周期减少20%
模型结构上,我保留了原版的主干网络,但做了以下调整:
- 将P2检测头的通道数从256压缩到128(降低计算量)
- 在Neck部分加入轻量化的SE注意力模块(提升特征区分度)
- 输出层改用DFL(Distribution Focal Loss)提升分类精度
2.2 农业场景的特殊处理
作物杂草识别面临三大挑战:
- 相似颜色问题:早期生长的杂草与作物颜色接近
- 解决方案:在HSV颜色空间增强饱和度通道的对比度
- 密集遮挡问题:作物叶片会部分遮盖杂草
- 解决方案:采用CutMix数据增强,模拟30%-50%的遮挡情况
- 光照变化问题:田间光照条件随时间剧烈变化
- 解决方案:训练时随机应用Gamma校正(γ∈[0.7,1.5])
# 数据增强示例代码 transform = A.Compose([ A.RandomGamma(p=0.5), A.HueSaturationValue( hue_shift_limit=10, sat_shift_limit=30, # 重点增强饱和度 val_shift_limit=20, p=0.7 ), A.Cutout( num_holes=8, max_h_size=32, max_w_size=32, fill_value=0, p=0.3 ) ])3. 数据集构建与模型训练
3.1 自制农业图像数据集
由于公开数据集(如Corn-Weed、Rice-Seedling)与本地作物品种存在差异,我采集并标注了包含以下内容的专属数据集:
- 作物类型:玉米(3个生长期)、小麦(2个生长期)、大豆
- 杂草种类:稗草、马唐、反枝苋等8类常见杂草
- 场景多样性:包含晴天/阴天、晨间/正午、干旱/湿润等6种环境条件
标注工具采用改进版的LabelImg,增加了以下功能:
- 快捷键快速切换类别(提升标注效率30%)
- 自动保存裁剪的负样本(用于困难样本挖掘)
- 导出YOLO格式时自动平衡各类别权重
数据集统计:
| 类别 | 训练集 | 验证集 | 测试集 |
|---|---|---|---|
| 玉米 | 4,200 | 600 | 800 |
| 小麦 | 3,800 | 500 | 700 |
| 杂草(综合) | 12,500 | 1,800 | 2,500 |
3.2 训练策略与调参技巧
在RTX 3090上训练时,我采用分阶段训练策略:
第一阶段(冻结主干)
- 周期:50
- 学习率:0.01(Cosine衰减)
- 优化器:SGD(momentum=0.9)
- 数据增强:仅基础变换(翻转+缩放)
第二阶段(全网络训练)
- 周期:100
- 学习率:0.001(带warmup)
- 优化器:AdamW
- 数据增强:加入CutMix和Mosaic
关键调参发现:
- 使用Focal Loss时α=0.25, γ=2效果最佳(相比默认参数mAP↑3.2%)
- Batch Size设为32时显存占用18GB,此时梯度累积步数设为2等效于BS=64
- 早停机制(patience=15)能有效防止过拟合
避坑指南:农业图像中普遍存在长尾分布,务必使用类别加权采样(我采用sqrt(n)加权法)
4. 工程实现与部署优化
4.1 系统架构设计
整套系统采用模块化设计,主要包含以下组件:
- 图像采集模块:支持USB摄像头、RTSP视频流、图片批量输入
- 推理引擎:基于TensorRT加速的YOLOv11模型(FP16精度)
- 业务逻辑层:实现杂草密度统计、喷药区域计算等农业专用功能
- 可视化界面:PyQt5开发的跨平台应用(含实时检测显示和历史记录查询)
# TensorRT部署核心代码片段 def build_engine(onnx_path, engine_path): logger = trt.Logger(trt.Logger.WARNING) builder = trt.Builder(logger) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) parser = trt.OnnxParser(network, logger) with open(onnx_path, 'rb') as model: if not parser.parse(model.read()): for error in range(parser.num_errors): print(parser.get_error(error)) return None config = builder.create_builder_config() config.set_flag(trt.BuilderFlag.FP16) config.max_workspace_size = 1 << 30 # 1GB serialized_engine = builder.build_serialized_network(network, config) with open(engine_path, 'wb') as f: f.write(serialized_engine) return serialized_engine4.2 边缘设备部署
在RK3588开发板上部署时,我遇到并解决了以下典型问题:
问题1:内存溢出
- 现象:推理时偶发段错误
- 排查:通过
free -h发现内存耗尽 - 解决:改用INT8量化(精度损失<2%,内存占用降低60%)
问题2:帧率不达标
- 现象:实际帧率仅8FPS(目标≥25FPS)
- 排查:
sudo tegrastats显示CPU频率被限制 - 解决:写入性能模式
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
问题3:摄像头延迟
- 现象:画面滞后约300ms
- 排查:v4l2缓冲区设置过大
- 解决:调整v4l2参数
v4l2-ctl --set-parm=30
部署后的性能指标:
| 设备 | 精度 | 帧率 | 功耗 |
|---|---|---|---|
| RK3588 | INT8 | 28FPS | 5W |
| Jetson Nano | FP16 | 15FPS | 10W |
| x86 CPU | FP32 | 8FPS | 45W |
5. 实际应用效果与改进方向
5.1 田间测试结果
在3个不同农场进行的实测显示:
- 准确率:晴天条件下达到92.3%(阴天降至87.1%)
- 漏检分析:主要发生在杂草密度>20株/㎡时(因遮挡严重)
- 速度表现:1920×1080分辨率下平均处理耗时34ms
典型错误案例及改进措施:
- 幼苗误判:将刚发芽的作物识别为杂草
- 解决方案:加入更多早期生长阶段样本
- 阴影干扰:深色阴影被误认为杂草
- 解决方案:在预处理中加入阴影检测算法
- 边界模糊:田埂边的杂草容易被忽略
- 解决方案:采用滑动窗口重叠检测
5.2 后续优化计划
当前系统还存在以下可改进空间:
- 多模态融合:结合近红外图像提升晨昏时段的识别率
- 动态喷药决策:根据杂草密度自适应调整药剂喷射量
- 作物生长建模:结合时间序列预测杂草爆发风险
- 模型轻量化:探索知识蒸馏技术(如用YOLOv11-tiny作为学生模型)
我在GitHub仓库中预留了以下扩展接口:
/plugins/目录支持自定义预处理模块- 通过继承
WeedDetector基类可实现新算法集成 - 提供Dockerfile便于云端部署
这个项目从构思到实现历时6个月,最大的体会是:农业AI应用必须深入田间实地测试。实验室里95%的准确率,到实际环境中可能因为一片反光的露珠就下降10个百分点。建议后来者至少预留30%的时间用于现场调优