1. 项目背景与核心价值
去年帮农科院做病虫害监测时,我深刻体会到传统人工巡检的效率瓶颈。在30亩的实验田里,三个技术员每天工作8小时只能完成60%区域的物种记录,而漏检的角落往往就是虫害爆发的重灾区。这个基于YOLOv5的农场多物种检测系统,正是为解决这类痛点而生。
这个毕业设计级别的项目,用不到2000行代码实现了从数据标注到Web部署的完整流程。特别适合计算机视觉入门者练手,也完全能作为农业科技公司的POC方案。实测在RK3588开发板上能达到17FPS的检测速度,对草莓、番茄等经济作物的常见病虫害识别准确率超85%。
2. 技术架构解析
2.1 为什么选择YOLOv5
相比Faster R-CNN等两阶段检测器,YOLO的单阶段特性使其在农场场景更具优势:
- 实时性:在Jetson Nano上处理640x640图像仅需23ms
- 轻量化:最小的YOLOv5s模型仅7.3MB
- 多尺度检测:适应作物近景特写和远景监控
我们特别选用v5.0版本而非最新的v8,因为:
- 社区生态更成熟(80%的农业检测论文基于v5改进)
- 对TensorRT的支持更稳定
- 自定义数据集的训练曲线更平滑
2.2 数据流水线设计
2.2.1 数据采集要点
- 使用华为Mate40 Pro拍摄时,建议关闭AI增强(会改变真实色彩)
- 不同时段采集:清晨露珠/正午强光/傍晚逆光各占30%
- 背景复杂度控制:单张图像包含3-5个目标物最佳
2.2.2 LabelImg标注技巧
# 修改标注保存路径(避免C盘爆满) python labelImg.py --savedir D:/farm_dataset/labels标注时特别注意:
- 叶片病害标注要包含1cm健康边缘
- 昆虫类需完整包含触角
- 使用"crop_"前缀区分类似物种(如crop_corn, crop_wheat)
2.3 模型训练实战
2.3.1 环境配置避坑指南
# 实测稳定的环境组合 torch==1.8.0+cu111 torchvision==0.9.0+cu111 # 必须安装的依赖 pip install pycocotools>=2.02.3.2 关键训练参数
# data/farm.yaml nc: 12 # 我们定义的12类农作物/害虫 anchors: [10,13, 16,30, 33,23] # 针对小型目标优化 # models/yolov5s_farm.yaml depth_multiple: 0.33 width_multiple: 0.50训练命令建议:
python train.py --img 640 --batch 16 --epochs 100 --data farm.yaml --cfg yolov5s_farm.yaml --weights yolov5s.pt --cache重要提示:农业图像建议使用--cache参数,可提升20%训练速度
3. 系统部署方案
3.1 Streamlit Web界面开发
我们摒弃了传统的Flask方案,选择Streamlit的原因:
- 内置的st.image自动适配YOLO的检测结果可视化
- 无需前端知识即可构建专业UI
- 支持实时视频流处理
核心代码结构:
import streamlit as st from detect import run_detection st.set_page_config(layout="wide") uploaded_file = st.file_uploader("上传农田图像") if uploaded_file: results = run_detection(uploaded_file) st.image(results, caption='检测结果')3.2 边缘设备部署
3.2.1 RK3588实战
# 转换ONNX模型 python export.py --weights runs/train/exp/weights/best.pt --include onnx # 使用rknn-toolkit2量化 ./rknn_convert --onnx model.onnx --rknn model.rknn --mean 0,0,0 --std 255,255,255实测性能:
| 设备 | 分辨率 | FPS | 功耗 |
|---|---|---|---|
| RK3588 | 640x640 | 17 | 5W |
| Jetson Nano | 416x416 | 9 | 10W |
| 昇腾310 | 1024x1024 | 23 | 15W |
4. 常见问题解决方案
4.1 数据集问题
症状:验证集mAP@0.5始终低于0.6
排查:
- 检查标注XML文件中width/height是否为0
- 验证图像通道数:
cv2.imread(img).shape应为(高,宽,3)
4.2 训练异常
报错:CUDA out of memory
解决:
# 修改train.py --batch-size 16 -> 8 --img-size 640 -> 5124.3 部署问题
现象:RKNN模型输出乱码
修复:
- 检查预处理是否一致:
# 必须与训练时相同 img = img[:, :, ::-1] # BGR to RGB img = img / 255.0 # 归一化5. 项目扩展建议
- 添加分类分支实现"物种+病态"双输出(需要修改model.yaml)
- 集成OpenCV的跟踪算法实现跨帧计数
- 使用MQTT协议连接农业物联网传感器
- 开发Android端部署版本(可用NCNN框架)
这个项目最让我惊喜的是YOLOv5在农业场景的泛化能力——用草莓数据集训练的模型,对蓝莓病害也有65%的识别率。建议初学者先从200张标注数据开始,逐步迭代到2000张规模,这样的学习曲线最平滑。