资讯动态

16类农作物目标检测数据集:YOLO格式标注与农业视觉实战

发布时间:2026/10/19 5:17:45 来源:尧图企业网站定制
简介这份农作物多类别目标检测数据集面向农业AI开发者、农业院校研究者及智能农机视觉模块工程师用于解决农田场景下作物种类识别与定位的样本匮乏问题。数据集覆盖香蕉、豆类、茄子、辣椒、黄瓜、大蒜、生姜、玉米、洋葱、豌豆、菠萝、马铃薯、水稻、高粱、番茄、小麦等16类主要农作物涵盖谷物、蔬菜与经济作物三大类别并特别包含豆类与豌豆、不同茄科作物等易混淆样本便于训练高精度区分模型。资源包共2000个文件以957张jpg图像与1041个txt标注文件为主另含1个yaml配置文件与1份docx说明文档压缩包约73.86MB标注严格遵循YOLO格式可直接用于YOLOv5/v7/v8等主流框架的迁移学习与微调。目前已有107人学习下载适合快速搭建农田巡检、智能除草与自动化收割等视觉感知实验。1. 从一次农田巡检 Demo 翻车说起这套 16 类农作物检测数据集到底解决什么问题去年帮一个做农业机器人的小团队看他们的巡检 Demo模型在实验室里跑得挺欢一到真实田块就抓瞎——番茄和辣椒的检测框互相串豆类和豌豆几乎分不出来洋葱和大蒜更是随机乱标。问题不在网络结构也不在训练技巧根子在数据他们拿网上零散爬来的图片自己标类别定义混乱、边界框松垮、遮挡样本几乎没有。这也是我后来一直建议做农业视觉项目的同学先把数据集这件事定死的原因。这份农作物多类别目标检测数据集就是冲着这个痛点来的。它覆盖香蕉、豆类、茄子、辣椒、黄瓜、大蒜、生姜、玉米、洋葱、豌豆、菠萝、马铃薯、水稻、高粱、番茄、小麦共 16 类主要农作物训练集 726 张、验证集 212 张、测试集 103 张全部采用 YOLO 格式标注标准化边界框坐标加类别标签可以直接喂给 YOLOv5/v7/v8 乃至 yolov12 这类主流框架做迁移学习和微调。它适合三类人正在做农业目标检测毕设或课设的学生、要搭农田巡检或智能除草视觉模块的开发者、以及需要标准化作物检测数据做交叉学科研究的实验室。下面我按需求、设计、落地、验收的顺序把这份数据集怎么用、怎么避坑讲透。2. 需求与技术选型为什么是 YOLO 格式加 16 类划分2.1 农业检测任务的真实约束农田场景和通用 COCO 那类数据集完全不是一回事。第一作物在田间是密集生长的叶片互相遮挡、果实半露边界框很容易画大或画小第二同一科属的作物外观高度相似豆类和豌豆、茄子与辣椒在幼苗期几乎一个样模型必须靠纹理和局部特征区分第三光照和背景变化剧烈晴天正午和阴天傍晚的同一块地颜色分布能差出一大截。这些约束决定了数据集不能只追求图片数量类别定义的清晰度和标注的一致性才是命门。这份数据集把 16 类拆成谷物小麦、水稻、玉米、高粱、蔬菜番茄、黄瓜、洋葱、茄子、辣椒、大蒜、生姜、豆类、豌豆、经济作物香蕉、菠萝三大块还特意保留了易混淆作物的区分样本。这个划分方式是有讲究的它没有按植物学分类硬切而是按视觉可分性和应用场景来组织方便你在训练时做类别分组消融实验。2.2 为什么锁定 YOLO 标注格式选 YOLO 格式不是跟风是工程上的务实。YOLO 的标注是归一化的class_id x_center y_center width height全部落在 0 到 1 之间和图片分辨率解耦换输入尺寸不用重标。相比之下 VOC 的 XML 是绝对像素坐标COCO 的 JSON 结构又偏重做实时检测时转换成本高。这份数据集直接给 YOLO 格式意味着你可以跳过格式转换这一步把精力放在模型和调参上。下面是一个典型的 YOLO 标注文件长什么样以及配套的data.yaml该怎么写# data.yaml —— 数据集配置文件放在数据集根目录 path: ./crop_dataset # 数据集根路径 train: images/train # 训练集图片目录 val: images/val # 验证集图片目录 test: images/test # 测试集图片目录 # 类别数量与名称顺序必须和标注文件里的 class_id 严格对应 nc: 16 names: 0: banana # 香蕉 1: bean # 豆类 2: eggplant # 茄子 3: chili # 辣椒 4: cucumber # 黄瓜 5: garlic # 大蒜 6: ginger # 生姜 7: corn # 玉米 8: onion # 洋葱 9: pea # 豌豆 10: pineapple # 菠萝 11: potato # 马铃薯 12: rice # 水稻 13: sorghum # 高粱 14: tomato # 番茄 15: wheat # 小麦nc必须等于 16names的键值顺序就是标注里class_id的含义一旦错位模型会把番茄学成辣椒而且 loss 曲线看起来还挺正常这是最阴的坑。path建议用相对路径方便整个数据集打包迁移。训练集、验证集、测试集按 726/212/103 的比例已经分好不要自己再随机打乱重分否则验证集和测试集的分布会漂移评估结果不可信。2.3 框架选型的取舍摘要里提到可直接用于 YOLOv5/v7/v8关键词里又带了 yolov12。我的建议是如果你是要快速出结果交毕设选 YOLOv8生态成熟、文档全、训练脚本开箱即用如果论文里想体现技术前沿性可以拿 yolov12 做对比实验但要注意新版本的依赖环境可能和你的显卡驱动打架预留出折腾环境的时间。数据集本身是格式中立的换框架只需要改data.yaml的路径标注文件不用动这也是选 YOLO 格式的另一个好处。3. 总体设计数据组织、类别体系与训练流程3.1 目录结构与文件组织拿到压缩包解压后通常的目录组织是这样的我一般会先花五分钟把结构理清楚再动手crop_dataset/ ├── data.yaml # 数据集配置 ├── images/ │ ├── train/ # 726 张训练图 │ ├── val/ # 212 张验证图 │ └── test/ # 103 张测试图 ├── labels/ │ ├── train/ # 与训练图同名的 .txt 标注 │ ├── val/ │ └── test/ └── crop_dataset.docx # 数据集说明文档图片和标注文件必须同名只是扩展名不同。比如chilli_8_jpg.rf.71b9cb5407d240f706c0e72e817a39fb.jpg对应的标注就是chilli_8_jpg.rf.71b9cb5407d240f706c0e72e817a39fb.txt。文件名里那串rf.后面的哈希是标注工具自动生成的唯一标识不要手动改改了容易和标注对不上。crop_dataset.docx是说明文档里面一般会写类别定义、采集场景和标注规范训练前值得读一遍尤其是类别边界模糊的地方文档里通常有约定。3.2 类别体系的视觉可分性设计16 类里最容易翻车的是豆类和豌豆、茄子和辣椒这两组。数据集特意保留了这些易混淆样本这是它的价值所在但也意味着你在训练时要针对性处理。我的做法是先跑一版基线看混淆矩阵如果豆类和豌豆的误判率高就在数据增强里加更多的颜色抖动和随机裁剪逼模型去看豆荚形状和颗粒排列这些细节特征而不是靠整体色调蒙。类别不平衡也要留意。16 类里香蕉、菠萝这类经济作物的样本量可能比水稻、小麦少训练时可以用类别权重或者过采样来平衡。下面是一段检查各类别样本分布的脚本训练前跑一遍心里有数import os from collections import Counter # 统计训练集标注里每个类别的框数量 label_dir crop_dataset/labels/train class_names [banana,bean,eggplant,chili,cucumber,garlic, ginger,corn,onion,pea,pineapple,potato, rice,sorghum,tomato,wheat] counter Counter() for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: # YOLO 每行第一个数字是 class_id cls_id int(line.split()[0]) counter[cls_id] 1 # 打印每个类别的框数量找出长尾类别 for i, name in enumerate(class_names): print(f{name:10s}: {counter.get(i, 0)} boxes)这段脚本遍历训练集所有标注文件统计每个class_id出现的次数。如果某个类别框数明显偏少比如低于平均值的 30%训练时就要给它加权否则模型会偏向多数类少数类召回率惨不忍睹。跑完这个统计你对数据集的脾气就有底了。3.3 训练流程与迁移学习策略数据集规模是 726 张训练图这个量级从头训不现实必须用预训练权重做迁移学习。流程是加载 COCO 预训练的 YOLO 权重冻结主干网络先训几个 epoch 让检测头适应新类别再解冻全网络微调。学习率用余弦退火初始值设小一点因为农业图像和 COCO 的自然图像分布差异大学习率太猛会把预训练特征冲垮。from ultralytics import YOLO # 加载预训练模型用迁移学习而不是从头训 model YOLO(yolov8n.pt) # 开始训练参数按农业小数据集场景调 model.train( datacrop_dataset/data.yaml, epochs100, # 小数据集容易过拟合100 轮够用 imgsz640, # 输入尺寸和标注归一化基准无关 batch16, # 显存不够就降到 8 lr00.001, # 初始学习率迁移学习要小 patience20, # 20 轮没提升就早停省时间 augmentTrue, # 开启内置增强缓解样本不足 projectcrop_runs, # 训练结果保存目录 namebaseline )epochs设 100 是因为 726 张图很容易过拟合轮数太多验证 loss 会反弹。patience20是早停验证指标 20 轮不涨就停避免无效训练。imgsz640是 YOLO 的常用输入尺寸和标注的归一化坐标无关你可以改成 512 或 768 做对比。augmentTrue会启用 mosaic、翻转、色彩抖动等增强对小数据集是刚需。训练完在crop_runs/baseline/weights/下会得到best.pt和last.pt评估和推理都用best.pt。4. 模块实现从数据校验到推理部署的关键代码4.1 数据完整性校验训练前必须校验图片和标注是否一一对应缺标注的图片会让训练直接报错缺图片的标注则是脏数据。我一般会写个校验脚本先过一遍import os img_dir crop_dataset/images/train lbl_dir crop_dataset/labels/train # 收集图片和标注的文件名不含扩展名 imgs {os.path.splitext(f)[0] for f in os.listdir(img_dir) if f.lower().endswith((.jpg, .png, .jpeg))} lbls {os.path.splitext(f)[0] for f in os.listdir(lbl_dir) if f.endswith(.txt)} # 找出只有图片没标注、或只有标注没图片的异常项 only_img imgs - lbls only_lbl lbls - imgs print(f缺标注的图片: {len(only_img)} 张) print(f缺图片的标注: {len(only_lbl)} 个) for name in list(only_img)[:5]: print( 缺标注:, name)这个脚本用集合差集找出不匹配的项。正常情况两个数字都应该是 0。如果缺标注的图片不多直接删掉如果缺得多说明数据集打包时出了问题得回头找原始数据。这一步花两分钟能省掉训练跑到一半崩掉的几小时。4.2 标注质量抽检YOLO 标注的常见问题是坐标越界大于 1 或小于 0和框过小。越界的框会让 loss 变成 NaN框太小则是无效标注。抽检脚本如下import os lbl_dir crop_dataset/labels/train bad_boxes [] for fname in os.listdir(lbl_dir): if not fname.endswith(.txt): continue with open(os.path.join(lbl_dir, fname)) as f: for lineno, line in enumerate(f, 1): parts line.split() if len(parts) ! 5: bad_boxes.append((fname, lineno, 字段数不对)) continue _, x, y, w, h map(float, parts) # 检查坐标是否在 0-1 之间宽高是否过小 if not all(0 v 1 for v in (x, y, w, h)): bad_boxes.append((fname, lineno, 坐标越界)) elif w 0.01 or h 0.01: bad_boxes.append((fname, lineno, 框过小)) print(f可疑标注: {len(bad_boxes)} 处) for item in bad_boxes[:10]: print(item)坐标越界的框要手动修或删框过小的宽或高小于图宽高的 1%基本是误标也建议删。抽检完把有问题的标注文件列出来逐个处理别指望模型能容忍脏标注——它只会把错误学进去。4.3 推理与可视化验证训练完拿best.pt在测试集上跑推理把检测结果画出来看这是最直观的验收方式from ultralytics import YOLO model YOLO(crop_runs/baseline/weights/best.pt) # 在测试集上推理保存带框的可视化结果 results model.predict( sourcecrop_dataset/images/test, conf0.25, # 置信度阈值低于此值的框不显示 iou0.45, # NMS 的 IoU 阈值控制重叠框合并 saveTrue, # 保存可视化图片 projectcrop_runs, nametest_pred ) # 打印每张图的检测类别和数量 for r in results: boxes r.boxes names [model.names[int(c)] for c in boxes.cls] print(r.path, -, names)conf0.25是常用起点漏检多就降到 0.15误检多就升到 0.4。iou0.45控制非极大值抑制密集生长的作物框重叠多这个值可以适当调高到 0.5 减少误合并。跑完去crop_runs/test_pred/看可视化图重点看易混淆类别有没有串、遮挡目标有没有漏。这一步的直观程度远超看指标数字我每次都会亲自翻一遍测试集的预测图。5. 避坑与常见问题排查5.1 类别 ID 错位导致「学啥都像番茄」现象训练 loss 正常下降但推理时所有作物都被标成同一类混淆矩阵一片糊。原因data.yaml里names的顺序和标注文件里class_id的实际含义对不上模型学的是错位的映射。解决打开几个标注文件看class_id的分布再对照crop_dataset.docx里的类别定义确认names顺序。最稳妥的办法是拿一张已知类别的图推理看输出的类别名对不对。5.2 验证集指标虚高测试集一塌糊涂现象验证集 mAP 冲到 0.9测试集只有 0.5。原因验证集和测试集分布不一致或者训练时无意中把测试集图片混进了训练。解决确认三个集合的图片没有重叠检查文件名是否有重复。另外如果验证集里某类样本特别多指标会被拉高要看每类的 AP 而不是只看总 mAP。5.3 小目标漏检严重现象大棵的玉米、高粱检测得到小颗的豌豆、豆类几乎全漏。原因输入尺寸下采样后小目标特征丢失或者标注里小目标的框本身就少。解决提高输入尺寸到 768 或 1024或者在模型里加 P2 小目标检测层。数据层面检查小目标类别的框数量必要时对小目标样本做复制增强。5.4 过拟合训练 loss 降到底验证 loss 反弹现象训练到 60 轮后训练 loss 还在降验证 loss 开始往上走验证 mAP 停滞。原因726 张图对 16 类任务来说偏少模型记住了训练样本。解决开强增强mosaic、mixup、随机擦除加 weight decay用早停。如果还不行考虑冻结更多层只训检测头。5.5 显存爆掉训练中断现象训练到一半报 CUDA out of memory。原因batch设太大或者imgsz太高。解决把batch从 16 降到 8 或 4imgsz从 640 降到 512。YOLO 支持梯度累积batch4配合accumulate4等效于batch16显存不够时这是标准操作。6. 验收与答辩怎么证明这套数据集和模型真的能用验收这件事很多人栽在「只报一个 mAP」上。答辩老师或评审最想看的不是单一数字而是你对数据、模型、场景三者关系的理解。我一般会准备三层证据。第一层是定量指标。在测试集 103 张图上跑评估输出每类的 Precision、Recall、mAP0.5 和 mAP0.5:0.95做成表格。重点标出易混淆类别豆类 vs 豌豆、茄子 vs 辣椒的指标如果这两组能到 0.7 以上说明模型确实学到了细节特征而不是靠颜色蒙。下面这段评估代码直接出每类指标from ultralytics import YOLO model YOLO(crop_runs/baseline/weights/best.pt) # 在测试集上评估输出每类指标 metrics model.val( datacrop_dataset/data.yaml, splittest, # 指定用测试集不是验证集 imgsz640, conf0.25 ) # 打印每类的 AP定位弱项类别 for i, name in enumerate(model.names.values()): print(f{name:10s} mAP50{metrics.box.ap50[i]:.3f})splittest是关键很多人评估时忘了改拿验证集数字当测试集报一答辩就露馅。metrics.box.ap50是每类在 IoU0.5 下的 AP逐类打印出来弱项一目了然。第二层是定性可视化。挑 10 到 15 张有代表性的测试图覆盖遮挡、密集、小目标、易混淆四种场景把预测框和真值框并排画出来。答辩时放这张对比图比任何数字都有说服力。如果某张图漏检了别藏主动分析原因——是目标太小还是被遮挡然后给出改进方向这反而显得你懂行。第三层是场景适配说明。这份数据集的应用场景是农田巡检、智能除草、收割设备视觉模块你要说清楚模型在这些场景下的边界比如它适合白天光照均匀的条件夜间红外图像没在训练集里不能直接迁移。把适用边界讲明白比吹嘘「通用」更让人信服。验收项合格线检查方式数据完整性图片与标注一一对应校验脚本输出 0 异常标注质量无越界、无过小框抽检脚本输出 0 可疑整体 mAP0.5≥ 0.75测试集评估易混淆类别 AP≥ 0.65逐类指标表可视化抽检遮挡/密集场景无明显漏检人工翻预测图最后说个血泪经验我早期做项目时验收前一夜才发现测试集里混进了训练集的图指标虚高得离谱答辩现场被问「这张图你训练时见过吧」直接卡壳。从那以后我每次评估前都强制走一遍文件名去重和图片哈希比对确认三个集合零重叠才敢报数字。这套流程看着笨但能保命。希望这份数据集的用法和验收思路能帮你把农业检测这个项目稳稳落地。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑