在无人机空拍图里,把作物和杂草一个个框出来
任务
给一张无人机从空中拍的农田照片,把里面的作物和杂草一个个框出来、分清楚。这是个目标检测问题,难点在于:空拍图里目标很小(尤其幼苗期的杂草),而且作物和杂草长得有点像。
数据用的是公开的 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 太慢要改源码……),也算是另一种历练。
一点感想
以前我觉得做模型就是"调参 → 看分数 → 调参"。做完这个项目才更明白:真正涨点的,往往不是某个魔法参数,而是你对数据和问题理解得够不够深。 那些失败的版本不是浪费——它们才是让我想清楚"为什么"的地方。