计算机视觉在农业的应用:作物识别 + 病虫害检测实战

计算机视觉在农业的应用:作物识别 + 病虫害检测实战

传感器搞定了数据,但有些东西仪表测不了------叶子上的虫眼、果实的大小、地里到底长了几颗白菜。这些问题,得上摄像头 + 计算机视觉。


农业 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

病虫害检测------数据集是个大坑

作物病害的数据集有几个问题:

  1. 实验室照 vs 田间照差距大------PlantVillage 全是单叶、白底、均匀光照,你的摄像头拍出来是逆光、脏镜头、叶子半遮挡
  2. 地域差异------北方的霜霉病和南方的霜霉病,湿度不同外貌差异很大
  3. 病害阶段------同一种病初期是黄点、中期是褐斑、末期是枯死,一个模型要全认出来

我的实战路线:

  • 第一步:用 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 可视化一把梭。