← 文章

在无人机空拍图里,把作物和杂草一个个框出来

2026-06-05 · 项目 · 4 min · #深度学习 #YOLO #目标检测 #计算机视觉

任务

给一张无人机从空中拍的农田照片,把里面的作物杂草一个个框出来、分清楚。这是个目标检测问题,难点在于:空拍图里目标很(尤其幼苗期的杂草),而且作物和杂草长得有点像。

数据用的是公开的 Roboflow「Weed Crop Aerial」数据集,模型选了 YOLO 系列(YOLOv8 / YOLO11)。

作物与杂草空拍识别

最终成绩

最终模型是 YOLO11m + 8 倍几何增强 + TTA(测试时增强),在测试集上:

  • mAP@0.5 = 0.853
  • Crop AP@0.5 = 0.901

都明显超过了一开始定的 0.80 目标。

但我更想讲走过的弯路

这个项目我做了十几轮迭代(v0 到 v14),成绩不是一蹴而就的,中间踩的坑反而最有价值:

弯路一:以为"多复制点数据"就能涨点。 早期我试过把图片简单翻转、复制来扩充数据集(v6/v7),结果不升反降——因为复制出来的图和原图像素高度相关,YOLO 自己的在线增强本来就覆盖了,等于喂了一堆冗余信息,反而过拟合了。

弯路二:堆更大的模型不一定更好。 换上更大的 YOLO11l(v9),直接过拟合,还不如中等的 11m。

弯路三:花哨的技巧也会翻车。 试过 SAHI 切片推理、WBF 多模型集成这些"听起来很强"的方法,在这个数据集上都没奏效。

真正的突破在几何增强(v10、v12)。 改用仿射变换(旋转、拉伸、缩小)来增强——关键是标注框会随变换矩阵精确地一起更新。这样模型看到的是真正"没见过的新几何视角",而不是简单复制。泛化能力一下就上来了。

一句话总结这个项目教我的:数据增强的意义,是让模型见到"有效的新变化",而不是"更多的重复"。 而且标注质量是这一切的前提——框歪了,增强得再花哨也是错的。

还做了个网页 demo

光有指标不够直观,所以我还用 React + Vite 做了个小网页,能把检测结果、各版本的性能曲线、迭代过程展示出来,让"这个模型到底行不行"看得见。

技术栈

模型框架是 Ultralytics(YOLOv8/YOLO11 统一框架),数据分析和可视化用 matplotlib / seaborn / pandas,网页 demo 用 React + Recharts。训练还在 DCU 国产加速卡上踩了一堆环境的坑(torchvision 扩展不兼容、NMS 太慢要改源码……),也算是另一种历练。

一点感想

以前我觉得做模型就是"调参 → 看分数 → 调参"。做完这个项目才更明白:真正涨点的,往往不是某个魔法参数,而是你对数据和问题理解得够不够深。 那些失败的版本不是浪费——它们才是让我想清楚"为什么"的地方。

#深度学习#YOLO#目标检测#计算机视觉