计算机视觉在农业的应用:作物识别 + 病虫害检测实战
传感器搞定了数据,但有些东西仪表测不了------叶子上的虫眼、果实的大小、地里到底长了几颗白菜。这些问题,得上摄像头 + 计算机视觉。
农业 CV 能做什么?做不了什么?
先拉齐预期。和自动驾驶那种毫米级安全感不同,农业 CV 的场景特点是:
- 背景脏:泥土、杂草、反光、影子,这些 CV 最怕的东西农业里全是日常
- 目标密:一行白菜可能挤了 200 颗,小目标检测是刚需
- 品种杂:同一种病在番茄上和在黄瓜上症状长得完全不同
- 标注贵:给 10 万张病虫害图片打标签,农科院专家一小时要 300 块
但好消息是:对农业来说,95% 的准确率已经够用。你的目标是辅助决策,不是替代诊断。漏报几颗病株、多报几颗杂草,农技员一眼就能纠正过来。
农业 CV 三个最有价值的场景:
| 场景 | 技术 | 价值 |
|---|---|---|
| 作物识别与计数 | YOLOv8 目标检测 | 自动统计出苗率、估产 |
| 病虫害检测 | YOLOv8 分类 + 检测 | 早发现早打药,减少损失 30%+ |
| 长势分析 | 语义分割 + NDVI | 精准追肥、分区管理 |
实战:YOLOv8 训练蔬菜检测模型
数据集
公开的蔬菜检测数据集:
- OpenMarket:30 种常见蔬菜,3 万张,标注了 bbox
- iCassava:木薯病害数据集,8 千张,5 类病害 + 健康
- PlantVillage:38 种作物、14 类病害,5.4 万张(但这个背景太干净,都是实验室拍的)
我们的第一个模型做 10 种常见蔬菜识别:白菜、番茄、黄瓜、茄子、辣椒、豆角、萝卜、菠菜、生菜、丝瓜。用 OpenMarket 做预训练,再在自己的棚里拍 500 张做 Fine-Tune。
训练(PyTorch + Ultralytics)
bash
# 安装
pip install ultralytics
# 训练
yolo train \
model=yolov8n.pt \ # nano 模型,适合边缘部署
data=vegetables.yaml \ # 数据集配置
epochs=100 \
imgsz=640 \
batch=16 \
device=0
vegetables.yaml:
yaml
path: ./datasets/vegetables
train: images/train
val: images/val
nc: 10
names:
0: cabbage # 白菜
1: tomato # 番茄
2: cucumber # 黄瓜
3: eggplant # 茄子
4: pepper # 辣椒
5: green_bean # 豆角
6: radish # 萝卜
7: spinach # 菠菜
8: lettuce # 生菜
9: luffa # 丝瓜
nano 模型在 RTX 3060 上训练 100 epoch 大约 2 小时,mAP@0.5 能到 0.85 以上。
验证
Class Precision Recall mAP50
cabbage 0.89 0.87 0.91
tomato 0.92 0.88 0.93
cucumber 0.86 0.83 0.88
eggplant 0.91 0.85 0.90
pepper 0.87 0.82 0.86
green_bean 0.84 0.80 0.85
radish 0.90 0.86 0.90
spinach 0.82 0.78 0.82
lettuce 0.88 0.84 0.88
luffa 0.85 0.81 0.85
Overall 0.874 0.834 0.878
病虫害检测------数据集是个大坑
作物病害的数据集有几个问题:
- 实验室照 vs 田间照差距大------PlantVillage 全是单叶、白底、均匀光照,你的摄像头拍出来是逆光、脏镜头、叶子半遮挡
- 地域差异------北方的霜霉病和南方的霜霉病,湿度不同外貌差异很大
- 病害阶段------同一种病初期是黄点、中期是褐斑、末期是枯死,一个模型要全认出来
我的实战路线:
- 第一步:用 PlantVillage 做预训练(学习病害的「形状」,不学「颜色和光线」)
- 第二步:在自己的棚里收集 50-100 张真实病害照片
- 第三步:用 Few-Shot Learning(如 ProtoNet)+ 迁移学习做适配
- 第四步:持续标注、持续更新模型
工具推荐:Label Studio ------ 开源、支持 bbox + 分类 + 分割,部署在本地服务器上,自己标注完直接用 Python SDK 导出 YOLO 格式。
边缘部署:在树莓派 / RK3588 上跑
云上做一次推理要传图片、等结果、返回,一个来回 500ms 以上。病虫害巡检的场景------摄像头挂在轨道车上,边走边拍,需要实时出结果。边缘推理是刚需。
方案对比
| 方案 | 硬件 | FPS (YOLOv8n) | 功耗 | 成本 |
|---|---|---|---|---|
| 树莓派 4B | CPU 推理 | 0.5-1 | 5W | 400 元 |
| 树莓派 4B + Google Coral | Edge TPU | 8-10 | 8W | 700 元 |
| NVIDIA Jetson Nano | GPU 推理 | 10-15 | 10W | 800 元 |
| RK3588 开发板 | NPU 推理 | 15-20 | 8W | 1000 元 |
推荐:RK3588。 6 TOPS 的 NPU 专为推理设计,不需要 CUDA 那一套。RKNN 工具链把 PyTorch 模型转成 RK3588 原生格式:
bash
# 1. PyTorch → ONNX
yolo export model=runs/train/weights/best.pt format=onnx opset=12
# 2. ONNX → RKNN
python -m rknn.api.rknn_convert \
--model best.onnx \
--output vegetables.rknn \
--target rk3588
# 3. 在 RK3588 上跑
python detect_rknn.py --model vegetables.rknn --source /dev/video0
detect_rknn.py 的核心逻辑:
python
from rknnlite.api import RKNNLite
rknn = RKNNLite()
rknn.load_rknn('vegetables.rknn')
rknn.init_runtime()
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
outputs = rknn.inference(inputs=[frame])
# outputs 里就是 bbox + class + confidence
draw_boxes(frame, outputs)
部署脚本写好后设 systemd 开机自启,轨道车巡检全程自治------拍到了、识别了、结果存本地 SQLite 并通知平台层。
实用建议
- 不要从头训模型。 用 YOLO 预训练权重 + 你的数据 Fine-Tune,一天搞定;从头训要 GPU 跑一周,效果还大概率更差。
- 第一版只做一个场景。 蔬菜计数 OR 病害检测,搞定一个再扩展,贪多嚼不烂。
- 标数据比写代码花时间。 500 张高质量标注 > 5000 张低质量标注。标的时候注意:框不要切到叶子边缘,类别不要犹豫------错了就错着标,后期统计混淆矩阵再纠正。
- 定期回传误检样本。 在边缘侧记录低置信度(0.3-0.6)的检测结果,定期把原图回传到云端做二次标注,模型持续迭代。
下一篇:《Spring Boot 农业物联网平台:从 0 到 1 搭建》------设备管理 CRUD、TDengine 时序存储、告警规则引擎、ECharts 可视化一把梭。