恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

小麦田杂草检测YOLO数据集:从标注格式到训练实战

  • 首页
  • 资讯中心
  • /
  • 小麦田杂草检测YOLO数据集:从标注格式到训练实战

相关资讯

工业互联网平台落地实战:从设备接入到告警联动全解析 2026/10/18 4:41:22
PSMNet立体匹配实战:SPP上下文聚合与3D代价体训练全解析 2026/10/18 4:41:22
从select到epoll:单线程事件循环如何撑起百万并发连接 2026/10/18 4:41:22

最新资讯

大模型编程新利器 Kiro 实测:Specs 与 Hooks 如何吊打 Cursor 工作流
BPM软件应用价值分析与实施案例:从价值算账到落地
吴恩达 AI 工程技能图再更新:Coding Agent 时代,用 TaoToken 统一 Key 打通全栈开发链路
JQuick-Excel 复杂 STYLE 实战:把报表样式拆成可维护的坐标规则
表格OCR与普通OCR的核心差异:从结构识别到单元格重建的实战解析
Qt触屏画线平滑:从采样点到贝塞尔曲线与位图绘制

今日推荐

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本周热门

基于GMM的语音识别系统原理与MATLAB实现详解
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

小麦田杂草检测YOLO数据集:从标注格式到训练实战

发布时间:2026/10/18 4:41:22
小麦田杂草检测YOLO数据集:从标注格式到训练实战 简介面向目标检测与农业智能化应用的小麦田地杂草图像数据集约1400条已标注数据可直接用于YOLO系列模型训练与精度的验证。数据集标注8类杂草包括RAD2、RAD3、RAD4、RAD1、RD2、RAD23、RDA3、RA1等类别划分较细所有标注均采用YOLO格式的txt文件并预先做好训练集/验证集划分附带的show.py脚本可一键可视化标注结果方便检查标签质量。压缩包共2000个文件其中1414个txt为YOLO格式标签585张jpg为田间作物/杂草图像1个py为可视化工具整体大小约276.19MB。目前已有101人学习下载可显著降低数据采集与标注成本特别适合农业AI、计算机视觉方向的学生和工程师也可结合作者博客中的YOLOv5改进实战快速开展算法优化与试验验证。1. 小麦田杂草检测一份能直接开训的 YOLO 标注数据到底解决了什么做目标检测的人都有过这种经历模型结构改了一轮又一轮mAP 卡在零点几不动最后发现是数据本身出了问题——标注框偏移、类别错标、训练集和验证集有重复图。小麦田地杂草图像目标检测数据这份资源核心价值不是算法而是把数据采集、清洗、标注、划分这套最费时间的脏活提前干完了。约 1400 张已经标注好的田间图像8 个杂草类别全部整理成 YOLO 格式的 txt 标签拿到手就能直接喂给 YOLOv5 训练。适合谁用正在做农业视觉、田间杂草识别、精准喷药相关课题的开发者或者刚接触 YOLO 目标检测、想找一份干净数据练手的学生。数据的特点在于场景真实——小麦田里的杂草不会整整齐齐摆在你面前遮挡、光照变化、杂草与麦苗形态接近这些在普通公开数据集里很难体验到的真实噪声这份数据里都有。本文会从数据格式拆起再到训练前的校验、YOLOv5 的配置实操最后给出几个标注数据和训练中常见的坑以及如何从这份数据里榨出更多价值。2. 数据包内部结构与 YOLO 标注格式8 个杂草类别如何对应到 txt 标签2.1 解压后的文件构成与命名规律拿到资源压缩包解压后第一件事不是急着跑训练而是先把目录结构摸清楚。常见做法是这类数据包会包含 images或 JPEGImages与 labels或 annotations两个主目录外加一个 classes.txt 和划分好的 train.txt / val.txt。这份数据我没法替你把目录树打印出来但按标注数据的通用组织方式推大概率是下面这种结构dataset/ ├── images/ │ ├── train/ │ │ ├── camden_wheat_radish1_45_20210421_11-33-07_crop.jpg │ │ └── ... │ └── val/ │ └── ... ├── labels/ │ ├── train/ │ │ ├── camden_wheat_radish1_45_20210421_11-33-07_crop.txt │ │ └── ... │ └── val/ │ └── ... ├── classes.txt ├── train.txt └── val.txt文件名值得细看。像camden_wheat_radish1_45_20210421_11-33-07_crop.jpg这种命名camden 是田间地块代号wheat 指小麦radish1 表示萝卜杂草类型数字 45 可能是拍摄角度20210421 是采集日期crop 表示已经做了裁剪。命名规律在训练中不会直接影响结果但如果后续要做数据筛选——比如把角度 45 度拍的图像单独抽出来测试鲁棒性这个命名就是现成的元信息。2.2 YOLO txt 标签的坐标体系与类别映射YOLO 标注格式的核心是每个 txt 文件对应一张 jpg文件名前缀一致。txt 里每一行代表一个目标格式为class_id x_center y_center width height全部是归一化到 0~1 之间的浮点数。注意这里不是像素坐标x_center 是目标框中心点的 x 除以图像宽度width 是框宽度除以图像宽度高度同理。举一个具体例子某张图里的标签内容是2 0.453125 0.637963 0.087500 0.113889 0 0.715625 0.860185 0.062500 0.101852第一列数字 2 代表类别对应 classes.txt 里的第 3 行索引从 0 开始。如果 classes.txt 内容按描述中的类别顺序排列大致可能是RAD1 RAD2 RAD3 RAD4 RD2 RAD23 RDA3 RA1那标签第一行的类别 2 就是 RAD3第二行的类别 0 是 RAD1。像素坐标转归一化坐标的公式是x_center_norm (x_min x_max) / 2 / img_widthwidth_norm (x_max - x_min) / img_width。这个转换如果从 LabelImg 等工具导出工具会自己算好但如果你后续要写脚本合并或筛选数据这条公式必须刻在脑子里。2.3 classes.txt 与 8 个类别的语义对应8 个类别从代号看是萝卜类杂草的不同生长阶段或不同品种RAD1 到 RAD4 可能是萝卜在不同生育期的形态RD2 可能是另一种萝卜类型RAD23 与 RDA3 疑似标签混用或相似品种合并RA1 可能是独脚金或其他阔叶杂草。这里要提醒一件事农业数据集的类别命名通常带有实验性质同一个物种在不同物候期会被分成不同类因为喷药策略不同。实际训练时类别粒度越细模型需要的数据量越大。这 8 个类在 1400 张图里分布如果不均匀小类别的 AP 大概率会偏低训练结果里要重点关注 AP 最低的类别。3. 训练前必做的数据校验show 脚本的可视化逻辑与三类隐藏问题3.1 先跑通 show 脚本可视化代码的基本结构数据描述里提到运行 show 脚本即可可视化数据。这个脚本的典型实现方式是用 OpenCV 或 matplotlib 读取图像和 txt 标签把归一化坐标还原成像素框画在图上。我一般会在跑任何训练之前先做这一步因为标注数据的质量问题只有人眼能高效判断。一个合格的 show 脚本核心逻辑大致如下import cv2 img_path dataset/images/train/camden_wheat_radish1_45_20210421_11-33-07_crop.jpg label_path dataset/labels/train/camden_wheat_radish1_45_20210421_11-33-07_crop.txt class_names [RAD1, RAD2, RAD3, RAD4, RD2, RAD23, RDA3, RA1] img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() cls_id int(parts[0]) x_center float(parts[1]) * w y_center float(parts[2]) * h box_w float(parts[3]) * w box_h float(parts[4]) * h x_min int(x_center - box_w / 2) y_min int(y_center - box_h / 2) x_max int(x_center box_w / 2) y_max int(y_center box_h / 2) cv2.rectangle(img, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2) cv2.putText(img, class_names[cls_id], (x_min, max(0, y_min - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 1) cv2.imwrite(show_result.jpg, img)这段代码做的事就是把每行标签的前四个浮点值乘回图像宽高再用 cv2.rectangle 画出边界框。class_names[cls_id]的作用是把数字类别 ID 转成可读字符串显示在框的左上角方便人眼确认类别是否正确。这里有一个参数细节cv2.putText里的max(0, y_min - 5)是为了防止框贴在图顶部时文字画到图像区域外报错。如果你要批量跑所有训练图的校验可以在外面套一层 os.listdir 遍历把输出图统一存到一个校验目录里。3.2 可视化时重点盯住的三类问题第一类是标注框错位。杂草在图片里经常是重叠生长的叶子交叉在一起标注时容易把 A 株杂草的框框到了 B 株泄漏到画面里的叶子上。可视化时看到框的边线没有紧贴叶缘而是切到了旁边的麦苗这种框会直接污染训练标签。第二类是类别错误。两个不同生长阶段的萝卜草长得越像标错概率越高。特别是 RAD23 和 RAD3 这种数字顺序相近的类别标注疲劳后很容易手滑选错。人眼扫可视化图时如果发现一个标注为 RAD23 的目标形态特征和同图里的 RAD2 更像记下来回头去翻原始 tag 文件。第三类是漏检。真实场景的标注只会标出标注人员认为属于目标类别的对象。小型杂草苗、被遮挡大半的目标、位于图像边缘的目标最容易漏掉。这类问题可视化时尤其难发现因为没有框的地方你默认认为没有目标。一个辅助策略是统计每张图的标签行数如果大部分图有 5 到 8 个目标突然出现一批只有 1 到 2 个目标的图需要重点抽查。3.3 训练集与验证集划分的独立性检查数据描述里说明已经做了训练集和验证集划分。这里要自己动手验证一件事训练集和验证集之间的图像没有重复。个别数据打包时如果划分脚本写得不严谨会出现同名图像同时出现在 train.txt 和 val.txt 里。这种情况对训练过程没有直接影响但验证指标会虚高因为模型见过的图像又出现在了验证集里。检查方式很简单用 Python 集合求交集python -c import os train set(open(train.txt).read().splitlines()) val set(open(val.txt).read().splitlines()) inter train val print(重复数量:, len(inter)) 如果输出非 0就要去 data.yaml 里重新切分。YOLOv5 的训练入口支持通过参数指定训练列表与验证列表路径如果数据划分本身有问题直接改 yaml 文件里的 train 和 val 字段指向新的文本文件即可。4. 基于这份数据训练 YOLOv5目录组织、配置文件与训练命令实操4.1 按 YOLOv5 要求的目录结构整理数据集YOLOv5 对数据集的目录组织有约定俗成的要求官方仓库的 datasets 目录结构是 images 与 labels 同级且 train/val 的划分在两者内部保持一致。如果你解压后的数据目录不是这个结构训练脚本会报找不到标签文件的错。我需要提醒的是不要把 images 和 labels 合并到同一层再让 YOLOv5 自己找。正确做法是保持如下结构wheat_weed_dataset/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ ├── classes.txt ├── train.txt └── val.txt如果你解压出来的原始结构是 images 下直接铺了全部 jpg、labels 下直接铺了全部 txt你需要先按 train.txt 和 val.txt 里的图像路径把文件移动到对应子目录。一个常见做法是写个小脚本按清单归位#!/bin/bash # move_to_split.sh while read line; do img_name$(basename $line) mv dataset/images/$img_name dataset/images/train/ mv dataset/labels/${img_name%.jpg}.txt dataset/labels/train/ done train.txt脚本里${img_name%.jpg}.txt是 shell 参数替换把 jpg 后缀换成 txt用来定位同名标签文件。basename提取纯文件名避免路径层级混乱时误判。执行前先在一个样本上试验确认标签文件确实存在再全量跑。4.2 配置数据 yaml 与超参数文件训练前要在 YOLOv5 的 data 目录下新建一个 yaml 文件指向这份数据的路径和类别定义。这个 yaml 是训练脚本读取数据信息的唯一入口格式如下# wheat_weed.yaml train: /absolute/path/to/wheat_weed_dataset/images/train val: /absolute/path/to/wheat_weed_dataset/images/val nc: 8 names: [RAD1, RAD2, RAD3, RAD4, RD2, RAD23, RDA3, RA1]nc必须与 classes.txt 中的行数一致写成 8。names列表的顺序必须与标签文件里 class_id 的含义严格对应。这里我吃过亏有一次 labels 里类别 0 对应的是某一种草我 yaml 里的 names 列表第一位写成了另一个类别模型训练全程没报错最后可视化推理结果时才发现预测名全对不上。如果数据集路径和 YOLOv5 代码仓库不在同一位置train 和 val 字段建议写绝对路径避免训练时相对路径解析到错误位置。YOLOv5 在相对路径解析失败时会把路径拼接在仓库目录下如果你数据集是外置的即使目录名正确也会报 FileNotFoundError。报错日志里显示的路径如果和你实际数据位置不符优先检查这里。4.3 训练命令与关键参数说明训练命令基本形式如下cd yolov5 python train.py \ --data wheat_weed.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 150 \ --cache \ --name wheat_weed_run各参数的实际作用--data指向刚写的 yaml 文件--weights yolov5s.pt加载 COCO 预训练权重做迁移学习对于 1400 张这种中小规模数据不建议从头训练收敛速度和最终精度都会差很多--img 640是把输入图像缩放到 640x640。理论上用 1280 能提高小目标检测精度但显存占用会翻倍不止RTX 3060 这种 12G 卡在 batch 8 下都可能爆显存先用 640 起步是稳妥做法。--cache参数会把图像提前缓存在显存或内存中避免每轮迭代都从磁盘读图。数据量只有 1400 张时缓存带来的加速非常明显但要注意首次运行时会在数据目录生成缓存文件如果磁盘剩余空间不足 5G建议关掉这个参数改用默认 IO。训练到中途如果发现损失下降缓慢可以用--resume配合--name接着上次的权重继续跑命令是python train.py --data wheat_weed.yaml --weights runs/train/wheat_weed_run/weights/last.pt --resume4.4 训练输出指标怎么解读训练结束会在runs/train/wheat_weed_run/下生成 weights 里的 best.pt 和 last.pt以及 results.csv 和一堆曲线图。重点关注三个指标第一是 mAP0.5。在杂草检测场景里框得不准但大概位置对对于喷药决策可能够用mAP0.5 是基础及格线。第二是 mAP0.5:0.95这个指标对框的精确度更敏感如果这个值远低于 mAP0.5说明框的定位精度有待提升可以考虑加大输入分辨率。第三是每个类别的 AP 单独列出的那个区域小类别的 AP 如果掉到 0.3 以下那意味着模型对这个类别基本不可用。5. 避坑指南标注数据与训练环节的典型踩坑记录5.1 标签文件第一列可能是空格开头导致解析失败现象运行 show 脚本时部分图片正常部分图片抛出 ValueError提示字符串无法转换为浮点数。检查 txt 文件发现行的开头或结尾有空格。原因标注工具在导出 YOLO 格式时在行首或者行尾意外保留了空白字符或者文件最后多了一个空白行。YOLOv5 的训练脚本解析时用了 split() 不指定分隔符能自动处理但自写的解析脚本如果用了split( )会在连续空格处得到空字符串转换 float 就报错了。解决用 strip() 先清理每一行再按空格切分。读取代码改为for line in f: parts line.strip().split()这样无论行首行尾有多少空格都不会出问题。对于文件末尾的空行直接判断if not line.strip(): continue跳过。5.2 归一化坐标出现大于 1 的值导致训练 loss 异常现象训练第一个 epoch 的 box_loss 就高得离谱甚至 loss 为 nan。检查部分标注的 txt发现 x_center 或 width 的值大于 1。原因多数是标注工具在导出时把归一化基准搞错了。有的工具使用标签相对图像边缘的裁剪框来归一化但图像本身在预处理时又被 resize 过坐标和宽高比例就对不上了。更常见的是人工编辑标签时手滑输入了错误的小数点位。解决训练前写脚本全量扫描标签把任何超出[0, 1]区间的数值的标签行单独导出来人工检查python -c import os for root, _, files in os.walk(dataset/labels): for f in files: with open(os.path.join(root, f)) as fp: for i, line in enumerate(fp): parts line.strip().split() for v in map(float, parts[1:]): if not 0 v 1: print(f, i1, line.strip()) 输出任何异常行后定位到对应图片可视化确认是标注错误还是本来就合法。如果确实错误删除该行或整个标签文件都可能影响数据质量尽量找原标注记录修复。5.3 训练集与验证集图像数量相差过大导致 val loss 震荡现象训练过程中 val 指标波动剧烈同一轮前后调节的曲线像锯齿。查看 data.yaml 时发现 val 目录下只有几十张图。原因数据集采集按地块组织的划分时如果按文件名前缀简单随机切分某几个地块的图像全部落入训练集验证集只覆盖一部分地块的生态形态导致验证集指标不稳定。解决按文件名中的地块代号分层抽样。这份数据的地块代号在文件名开头比如 camden 前缀可以用它做分组每个组内按比例抽到训练集和验证集保证每个田块的图像在两个集合里都有分布。具体操作是在 pandas 里按前缀 groupby 后分别随机抽样。5.4 迁移学习时预训练权重和类别数不匹配导致通道数报错现象执行 train.py 时加载 yolov5s.pt 后立即报错提示类别数不一致或形状不匹配。原因数据集类别数 8 与 COCO 的 80 类不一致模型最后的检测头输出通道数不同直接加载权重时最后一层参数无法复用PyTorch 在加载时如果对形状不一致的键默认 strictTrue就会直接报错。解决YOLOv5 的 train.py 内部会自动对检测头做处理只加载 backbone 权重。遇到手动修改过的版本或者自己写训练脚本时加载权重需要显式告知忽略最后一层比如torch.load之后手动删除model[-1].weight和model[-1].bias的键或设置strictFalse再加载。6. 进阶用类别频率统计调整损失权重顺手筛出困难样本训练收敛后想要进一步提升对少数类别的检测能力最直接的做法是统计训练集里 8 个类别的目标框数量针对出现频次最低的几个类别做针对性处理。统计方式很简单遍历所有标签文件累计每个类别的出现次数import os from collections import Counter label_dir dataset/labels/train counts Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: parts line.strip().split() if len(parts) 5: continue cls_id int(parts[0]) counts[cls_id] 1 for i in range(8): print(fclass {i}: {counts[i]} boxes)跑完输出后你大概率会看到分布极不均匀的结果。少数类别框数量可能只有多数类别的十分之一。这时模型训练时的类别损失会被多数类别主导小类别的特征在反向传播中被淹没。常规做法有两种。第一种是调整损失权重在 YOLOv5 里可以在 yaml 里加cls_pw参数这个参数控制类别损失的幂次权重给少数类别设置更大的权重让模型对它们的误判付出更高代价。调参思路是把最少类别的权重设为多数类别的 2 到 3 倍起步观察多次训练后小类别 AP 是否提升。第二种是针对性做数据增强。对包含少数类别的图像做额外的随机裁剪、旋转、亮度抖动把这些增强后的副本放回训练集。注意不要对验证集做同样操作否则指标失真。具体操作是把albumentations这类增强库接进 YOLOv5 的 mosaic 增强流程里或者直接离线扩充生成新的标签文件。筛选困难样本的办法也在这个阶段很有用。把 best.pt 在训练集上做一次推理记录所有预测置信度低于 0.5 的检测框对应的图像。这些图往往是杂草被遮挡、杂草与背景颜色相近、或者杂草形态特殊的情况。把这些困难样本单独存放评估一下是否有共性的视觉缺陷。比如大量困难样本集中在小苗期杂草你就去采集更多小苗期的标注数据比继续堆模型结构更有效。另外一个实用技巧是在训练结束后把 images/val 下的图像和对应推理结果合成成视频或拼接长图逐帧检查模型在边界情况的响应。重点关注小麦苗与杂草交界处模型的框如果频繁在边界抖动说明特征提取对轮廓信息敏感度不够此时可以尝试把输入分辨率从 640 提到 768 或 960重新训练。那份数据集我拿到手时先跑了一遍 show 脚本其中一个标签文件里框的位置明显偏了半株草的距离当时改完再训练省了整整一下午排查时间。从那以后我每次拿到新数据都强制先做一遍全量可视化校验再谈模型调参这个习惯帮我拦下了不少低质量数据。希望这份小麦田杂草数据也能让你的项目少踩几个坑。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号