资讯动态

农作物多类别目标检测数据集:16类YOLO格式实战与避坑指南

发布时间:2026/10/8 13:50:28 来源:尧图企业网站定制
简介这份农作物多类别目标检测数据集面向农业AI开发者、农业院校科研人员及智能农机视觉模块工程师用于解决农田场景下作物种类识别与定位的标注数据匮乏问题。数据集覆盖香蕉、豆类、茄子、辣椒、黄瓜、大蒜、生姜、玉米、洋葱、豌豆、菠萝、马铃薯、水稻、高粱、番茄、小麦等16类主要农作物涵盖谷物、蔬菜与经济作物三大类别并包含豆类与豌豆、不同茄科作物等易混淆样本有助于训练高精度区分模型。压缩包共2000个文件以957张jpg图像和1041个txt标注文件为主另含1个yaml配置文件与1份docx说明文档整体约73.86MB标注严格遵循YOLO格式可直接用于YOLOv5/v7/v8等主流框架的迁移学习与微调。目前已有107人学习下载适合快速搭建农田巡检、智能除草与自动化收割等视觉感知实验。1. 农田里的 16 类作物这份 YOLO 数据集到底能不能直接开练前阵子帮一个做农机视觉的朋友看模型他吐槽自家除草机器人把豌豆苗认成豆角、把生姜叶子当成玉米误判率高得离谱。翻了他的训练日志才发现问题不在网络结构而在数据集——他用的公开集里蔬菜类样本太少茄科和豆科几乎没做区分。这类翻车在农业目标检测里太常见了因为农田场景的类间相似度远高于 COCO 那种通用集。这份「农作物多类别目标检测数据集」正好切中这个痛点1041 张图、16 类主要农作物、YOLO 格式标注训练/验证/测试按 726/212/103 切好拿到手就能直接喂给 YOLOv5 到 YOLOv12 这一系框架。它适合谁做智慧农业巡检、除草机器人、收割设备视觉模块的工程师以及农业院校里想跑通「AI农业」交叉课题的学生。下面我按自己拆包复现的顺序把这份资源从结构、转换、训练到避坑讲透。2. 拆开压缩包先看什么目录结构、类别映射与标注格式核对拿到一个目标检测数据集我习惯先不急着写训练脚本而是把目录、类别和标注文件三样东西核对一遍。这一步花十分钟能省掉后面几小时的 loss 不收敛排查。这份数据集的文件命名带 Roboflow 风格的 hash 后缀比如chilli_8_jpg.rf.71b9cb...jpg说明它大概率是从标注平台导出后整理过的文件名前缀就是类别英文名这对快速抽检很友好。2.1 目录结构与文件命名规律解压后典型的结构是这样训练/验证/测试三个子集各自带images和labelscrop_dataset/ ├── train/ │ ├── images/ # 726 张 jpg │ └── labels/ # 726 个 txt与图片同名 ├── valid/ │ ├── images/ # 212 张 │ └── labels/ ├── test/ │ ├── images/ # 103 张 │ └── labels/ └── data.yaml # 类别名与路径配置文件名前缀直接暴露类别比如chilli_、pineapple_、potato_抽检时随手ls train/images | grep chilli | head就能定位到辣椒样本。注意valid而不是val这是 Roboflow 导出的默认命名写data.yaml时路径要对上否则 Ultralytics 会报找不到验证集。2.2 16 类作物的类别映射与 data.yaml数据集覆盖香蕉、豆类、茄子、辣椒、黄瓜、大蒜、生姜、玉米、洋葱、豌豆、菠萝、马铃薯、水稻、高粱、番茄、小麦共 16 类。这里有个血泪经验类别顺序必须和标注文件里的 class id 严格对应一旦错位模型学出来的就是「番茄马铃薯」这种玄学结果。先确认data.yaml# data.yaml path: ./crop_dataset # 数据集根目录 train: train/images val: valid/images test: test/images nc: 16 # 类别数 names: 0: banana 1: bean 2: eggplant 3: chilli 4: cucumber 5: garlic 6: ginger 7: corn 8: onion 9: pea 10: pineapple 11: potato 12: rice 13: sorghum 14: tomato 15: wheatnc和names的索引必须从 0 连续排到 15中间不能跳号。如果你后续要合并别的数据集先把两边的names对齐再改 id别直接拼接。2.3 抽检 YOLO 标注文件是否规范YOLO 格式每行是class_id cx cy w h坐标全部归一化到 0~1。抽一个辣椒标注看看# 随机抽一个 label 文件看内容 cat train/labels/chilli_8_jpg.rf.71b9cb5407d240f706c0e72e817a39fb.txt正常输出类似3 0.512 0.634 0.221 0.318 3 0.744 0.402 0.156 0.287第一列3对应chilli后面四列是归一化中心点和宽高。核对要点有三个数值是否都在 0~1 之间出现大于 1 说明没归一化、每行是否恰好 5 个字段、class_id 是否落在 0~15。写个脚本批量扫一遍最稳妥import os, glob def check_labels(label_dir, nc16): bad [] for f in glob.glob(os.path.join(label_dir, *.txt)): with open(f) as fp: for i, line in enumerate(fp): parts line.strip().split() if len(parts) ! 5: bad.append((f, i, 字段数不对)) continue cid int(parts[0]) coords list(map(float, parts[1:])) if cid 0 or cid nc: bad.append((f, i, fclass_id 越界: {cid})) if any(c 0 or c 1 for c in coords): bad.append((f, i, 坐标未归一化)) return bad issues check_labels(crop_dataset/train/labels) print(f发现 {len(issues)} 处问题) for it in issues[:10]: print(it)这段脚本遍历所有 label 文件逐行校验字段数、class_id 范围和坐标范围。nc16是这份数据集的类别数换成别的集要同步改。跑完如果issues为空说明标注基本干净可以进入下一步如果有大量越界先别训练回去找标注源头。3. 从零跑通训练环境配置、data.yaml 与 YOLOv8/v12 启动参数标注核对没问题后就进入训练环节。这份数据集官方说明里明确支持 YOLOv5/v7/v8实测在 Ultralytics 系的 v8 和 v11/v12 上也能直接跑因为标注格式是通用的。我一般用 Ultralytics 的 Python 包命令行和脚本两种方式都行下面给能直接抄的版本。3.1 环境安装与版本选择先建虚拟环境别在系统 Python 里装否则依赖冲突能让你怀疑人生conda create -n crop_det python3.10 -y conda activate crop_det # 装 PyTorch按自己 CUDA 版本选这里以 cu121 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # 装 Ultralytics pip install ultralytics版本选择上YOLOv8 生态最成熟、文档最全新手优先用它想尝鲜 v11/v12 的话Ultralytics 的 API 基本兼容把模型名从yolov8n.pt换成yolo11n.pt或对应 v12 权重即可。注意别混装旧版yolov5仓库和ultralytics包两者的data.yaml字段名有差异混用会报KeyError: nc。3.2 用 Python 脚本启动训练命令行适合快速试脚本适合记录参数。我一般写个train.pyfrom ultralytics import YOLO # 加载预训练权重n 是最小模型农业场景数据量不大先用 n 或 s model YOLO(yolov8n.pt) results model.train( datacrop_dataset/data.yaml, # 指向你的 data.yaml epochs100, # 小数据集 100 轮够看趋势 imgsz640, # 输入分辨率和标注尺度匹配 batch16, # 显存不够就降到 8 或 4 device0, # 0 表示第一块 GPUCPU 写 cpu workers4, # 数据加载线程 patience20, # 20 轮无提升就早停 projectruns/crop, # 输出目录 nameexp1, # 实验名 pretrainedTrue, optimizerAdamW, # 小数据集 AdamW 比 SGD 稳 lr00.001, # 初始学习率 augmentTrue, # 开启内置增强 )参数逐个说imgsz640是 YOLO 系默认农田小目标多的话可以提到 800 甚至 1024但显存和速度要权衡batch16在 8G 显存上跑 640 分辨率差不多爆显存就减半patience20是早停防止过拟合optimizerAdamW对千级样本量比 SGD 收敛更平滑。augmentTrue会启用 mosaic、HSV 抖动等增强农业场景光照变化大这个别关。3.3 训练过程看什么指标启动后终端会打印每轮的box_loss、cls_loss、dfl_loss和 mAP。重点盯三个指标含义健康表现box_loss边界框回归损失持续下降后期趋平cls_loss分类损失下降若反弹说明过拟合mAP50IoU0.5 的平均精度逐步上升农业集 0.7 算可用如果cls_loss降到很低但mAP50上不去多半是类别混淆豆类和豌豆、不同茄科这时候要么加样本要么在推理端做后处理。训练完权重存在runs/crop/exp1/weights/best.pt验证和推理都用它。4. 推理、验证与迁移把 best.pt 用起来并接自己的数据训练只是中间产物真正要落地的是推理和迁移。这一章讲怎么用训好的权重跑单图、批量验证以及怎么把这份数据集当预训练基础迁移到你自己的农田场景。4.1 单图与批量推理单图推理最直接from ultralytics import YOLO model YOLO(runs/crop/exp1/weights/best.pt) # 单图 results model(test_field.jpg, conf0.25, iou0.45, saveTrue) # 批量整个目录 results model.predict( sourcecrop_dataset/test/images, conf0.25, # 置信度阈值低于此的框丢弃 iou0.45, # NMS 的 IoU 阈值重叠框合并 saveTrue, projectruns/predict, nametest_batch, )conf0.25是通用起点农业场景如果漏检多就降到 0.15误检多就提到 0.4。iou0.45控制 NMS作物密集重叠时适当调高到 0.5~0.6避免把相邻植株的框合并掉。批量推理结果会存到runs/predict/test_batch直接看图就能判断模型在测试集上的真实表现。4.2 在测试集上跑验证拿 mAP别只看训练曲线一定要在独立的 test 集上跑一次验证from ultralytics import YOLO model YOLO(runs/crop/exp1/weights/best.pt) metrics model.val( datacrop_dataset/data.yaml, splittest, # 指定用 test 子集 imgsz640, batch16, ) print(fmAP50: {metrics.box.map50:.4f}) print(fmAP50-95: {metrics.box.map:.4f})splittest是关键默认val会跑验证集但真正评估泛化能力要看测试集。mAP50是 IoU0.5 的均值mAP50-95更严格。农业集因为背景复杂、遮挡多mAP50能到 0.7 以上、mAP50-95到 0.5 左右就算不错。如果两者差距特别大说明框定位精度不够考虑提高imgsz或加更多边界清晰的样本。4.3 迁移到自有农田数据这份数据集最大的价值之一是当预训练基础。你手头只有几百张自家田的图时直接从头训基本没戏但拿这份 16 类权重做微调收敛快很多from ultralytics import YOLO # 加载这份数据集训出来的权重而不是官方 COCO 权重 model YOLO(runs/crop/exp1/weights/best.pt) model.train( datamy_farm/data.yaml, # 你自己的 data.yaml epochs50, # 微调轮数可以少些 imgsz640, batch8, lr00.0001, # 微调学习率调小别把预训练特征冲掉 freeze10, # 冻结前 10 层 backbone只训 head projectruns/finetune, namemy_farm, )lr00.0001比从头训的 0.001 小一个量级目的是保留预训练学到的通用作物特征。freeze10冻结 backbone 前 10 层小样本微调时能防止过拟合。如果你的自有类别和这 16 类有重叠比如也是番茄、黄瓜迁移效果会非常明显如果是全新作物至少底层纹理特征能复用。5. 避坑与排查这份数据集上手时最容易翻车的五件事数据集再干净实操里也有坑。下面五条是我和身边人踩过的按「现象 → 原因 → 解决」写照着排查能省不少时间。5.1 训练报错找不到验证集现象启动训练立刻报FileNotFoundError或Dataset valid images not found。原因是data.yaml里写的是val:但实际目录叫valid或者path用了相对路径而工作目录不对。解决把data.yaml的val字段改成valid/imagespath用绝对路径最保险或者确认你cd到了数据集根目录再启动。5.2 类别全预测成同一类现象推理时所有框都标成同一个类别mAP 极低。原因是data.yaml的names顺序和标注文件里的 class_id 错位了模型学到的映射是乱的。解决抽几个 label 文件看第一列 id 对应的作物和names逐一对齐。这份数据集文件名带类别前缀chilli_开头的图对应 label 里应该是3对不上就说明映射错了。5.3 显存爆掉训练中断现象跑几轮后CUDA out of memory。原因是batch或imgsz太大或者workers开太多导致数据加载占显存。解决先把batch减半还不行就把imgsz从 640 降到 512workers降到 2。实在不够就用梯度累积模拟大 batchUltralytics 里没有直接参数但可以减小 batch 多训几轮。5.4 小目标漏检严重现象田间的幼苗、远处植株检测不到。原因是 640 分辨率下小目标特征被下采样丢掉了。解决把imgsz提到 1024 或 1280或者在data.yaml同级加一个高分辨率训练配置。代价是显存和速度权衡着来。另一个办法是切图推理把大图裁成小块分别检测再合并。5.5 验证集 mAP 高但实拍效果差现象val上 mAP 0.8拿到真实农田拍图却一塌糊涂。原因是验证集和训练集同分布而真实场景的光照、角度、背景差异大。解决别只信验证集一定留一部分真实场景图做测试训练时把augment开满HSV、旋转、缩放都上必要时用这份数据集微调后再用自己拍的图做增量训练。6. 把 16 类检测接进业务类别混淆处理与部署前的一个验证习惯模型训完不是终点接进业务才算数。农业场景里最头疼的是易混淆类别——豆类和豌豆、不同茄科作物这份数据集专门收了这些难分样本但光靠模型本身还不够。我一般会在推理后加一层轻量后处理对置信度在 0.3~0.5 之间的框结合颜色直方图和形状先验做二次判定。比如豌豆叶片更细长、豆类叶片更宽用简单的宽高比阈值就能过滤掉一部分误判。代码不复杂import cv2 import numpy as np def refine_pea_bean(box, img, cls_name): 对豌豆/豆类的低置信框做宽高比二次判定 x1, y1, x2, y2 map(int, box) roi img[y1:y2, x1:x2] if roi.size 0: return cls_name h, w roi.shape[:2] aspect w / max(h, 1) # 豌豆叶片偏细长宽高比经验阈值 if cls_name bean and aspect 0.6: return pea if cls_name pea and aspect 1.2: return bean return cls_name这段逻辑很土但在实际项目里比硬调模型管用。aspect是检测框内 ROI 的宽高比阈值 0.6 和 1.2 是我在几十张样本上试出来的经验值换作物要重新标定。注意它只对低置信框生效高置信结果不动避免把对的改错。部署前还有一个习惯我强制自己走一遍拿 20 张完全没参与训练的真实农田图人工标一遍跑模型算 mAP和测试集结果对比。差距超过 15 个点说明域偏移严重得回去补数据或加增强。这个动作花不了半小时但能避免上线后才发现模型「纸上谈兵」。从那以后我每次交付农业检测模型前都强制走一遍这个真实场景抽检再也没被现场打脸过。希望这份拆解帮到你拿到数据集先核对标注、再跑通训练、最后用真实图验证三步走稳了再谈落地。本文还有配套的精品资源点击获取

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

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

免费获取报价 →
↑