ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

YOLO杂草检测数据集实战:6849张带标签图像从校验到训练全流程

YOLO杂草检测数据集实战:6849张带标签图像从校验到训练全流程 简介本资源为面向YOLO系列算法学习者的杂草检测目标检测数据集适用于农业智能识别、田间杂草定位等场景的模型训练与验证适合具备一定深度学习基础、需要快速开展目标检测实验的学生与开发者。压缩包共2000个文件以xml标注文件为主同时提供yolo格式txt标签两种格式分别存放便于按需选用整体约236.6MB并附带data.yaml配置文件可直接对接yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流框架。数据集已划分完毕包含6849张带标签图像标签覆盖类别索引与归一化中心点、宽高信息省去自行清洗与标注的环节。已有201人学习下载读者可据此快速复现训练流程、验证模型效果并在此基础上调整网络结构与超参数完成从数据准备到测试评估的完整闭环。1. 6849 张杂草图像带标签这份 YOLO 数据集到底能不能直接开训田里长草这件事做农业视觉的人都懂——真正难的不是把草认出来而是把「作物苗」和「杂草苗」在子叶期分开。这份yolo算法-杂草检测数据集-6849张图像带标签-杂草.zip就是冲着这个场景来的6849 张田间图像全部带标注同时给了 YOLO 格式的 txt 和 VOC 格式的 xml 两套标签还附了data.yaml理论上解压完改个路径就能开训。它适合三类人一是刚接触 yolo 训练、想找个真实数据集跑通全流程的新手二是做智慧农业、植保机器人、除草设备需要快速验证检测方案的工程师三是拿它当 baseline后续要接 yolo 改进、边缘部署比如 RK3588、树莓派这类板子的开发者。但「能直接开训」和「训出来能用」是两回事下面把我拆包、校验、试训的过程完整写一遍坑在哪也一并说清。2. 拆包先看结构txt 与 xml 双标签怎么对应2.1 目录结构与两种标签格式的差异解压之后常见做法是看到images、labels、annotations这几个目录外加一个data.yaml。YOLO 格式的 txt 和 VOC 格式的 xml 分别放在两个文件夹里这点摘要里写得很明确。先别急着训第一步是把结构摸清楚否则后面路径一错训练脚本报的错会让你怀疑人生。YOLO 的 txt 每行是一个目标格式为class x_center y_center width height四个坐标都是归一化到 0~1 的比例值class从 0 开始。VOC 的 xml 则是绝对像素坐标xmin/ymin/xmax/ymax类别写在name里。这两套标签描述的是同一批图只是坐标系和存储方式不同。为什么要给两套因为 yolo 系列训练吃 txt但很多标注工具、评估脚本、以及像firc-dataset那类电力红外数据集沿用的都是 VOC 习惯双格式能省掉一次转换。项目YOLO txtVOC xml坐标类型归一化比例值 0~1绝对像素值类别表示类别索引从 0 开始类别名称字符串每文件目标数多行一行一目标多个object节点训练直接可用是需转换2.2 用脚本核对图像与标签是否一一对应6849 张图靠眼睛数是数不过来的。我一般先跑一段校验脚本确认每张图都有对应标签、没有空标签、没有越界坐标。这一步能提前暴露数据集最常见的「图签不匹配」问题。import os from pathlib import Path img_dir Path(images) lbl_dir Path(labels) img_files {p.stem for p in img_dir.glob(*.jpg)} lbl_files {p.stem for p in lbl_dir.glob(*.txt)} # 图有标签没有或标签有图没有都要报出来 missing_lbl img_files - lbl_files missing_img lbl_files - img_files print(缺标签的图:, len(missing_lbl)) print(缺图的标签:, len(missing_img)) # 抽查坐标是否越界 bad [] for p in lbl_dir.glob(*.txt): for line in p.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: bad.append((p.name, 字段数不对)) continue vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): bad.append((p.name, 坐标越界)) print(异常标签数:, len(bad))逻辑说明先用集合差集找出图签不匹配的文件再逐行解析 txt检查字段数是否为 5、坐标是否落在 0~1。参数上img_dir和lbl_dir按你实际解压出来的目录名改。如果缺标签的图数量不为 0训练时那部分图会被跳过或报错得先处理。坐标越界通常是标注时框拖出了边界归一化后出现负值或大于 1这类框在训练里会带来梯度异常建议直接修正或剔除。2.3 data.yaml 里到底该改哪几行data.yaml是 yolo 训练的入口配置结构一般长这样path: ./dataset train: images/train val: images/val nc: 1 names: [weed]要改的核心就三处path指向数据集根目录train/val指向划分好的训练集和验证集图像目录nc是类别数、names是类别名。摘要说数据集已经划分好那train和val大概率已经分目录了你只需要把path改成自己机器上的绝对路径或相对路径。nc要和names长度一致杂草检测通常是单类但如果你拿到的标签里类别索引不止 0就得按实际最大索引 1 来设否则训练时类别越界会直接崩。提示改完 yaml 先用yolo checks或训练脚本的 dry-run 跑一遍确认路径能被解析到比训到一半才发现 val 路径写错要省事得多。3. 从零跑通训练yolov8 到 yolo11 的命令与参数3.1 环境准备与依赖版本选择yolo 系列迭代快v5、v7、v8、v9、v10、v11 的 API 差异不小。这份数据集摘要里说适用 v5 到 v11但实际训练时你得先定一个版本。新手我建议从 ultralytics 的 v8 或 v11 入手因为ultralytics这个包把训练、验证、导出统一成了一套接口装起来最省心。# 建虚拟环境避免和系统里的 torch 打架 python -m venv yolo_env source yolo_env/bin/activate # Windows 用 yolo_env\Scripts\activate # 装 ultralytics会自动带 torch pip install ultralytics # 验证装好了没 yolo version逻辑说明虚拟环境是为了隔离依赖yolo 训练对 torch 版本敏感系统里如果已经有一个旧 torch直接装很容易冲突。pip install ultralytics会自动拉取匹配的 torch 和 torchvision。参数上没什么可调的但如果你有 GPU装完记得确认torch.cuda.is_available()返回 True否则会默默用 CPU 训6849 张图在 CPU 上能训到你怀疑人生。3.2 用命令行启动第一次训练环境好了直接上训练命令。以 v8 为例yolo detect train \ data./dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/weed \ nameexp1逻辑说明data指向你改好的 yamlmodel用预训练权重yolov8n.ptn 是最小的 nano 版本适合先跑通流程确认没问题再换 s/m/lepochs是训练轮数100 是个稳妥起点imgsz640是输入分辨率杂草目标通常不大640 够用想提精度可以上 1280 但显存吃紧batch16按显存调8G 显存跑 640 的 n 模型基本没问题device0指定第一块 GPU没有 GPU 就写cpu。project和name决定结果存哪方便你多次实验对比。训练启动后控制台会打印每个 epoch 的 box_loss、cls_loss、mAP50、mAP50-95。重点盯 mAP50-95它比 mAP50 严格能反映框的定位质量。如果 loss 一直不降先别怀疑模型回头查标签格式和路径。3.3 训练完怎么验证与推理训完在runs/weed/exp1/weights/下会有best.pt和last.pt。验证和推理各一条命令# 在验证集上评估 yolo detect val modelruns/weed/exp1/weights/best.pt data./dataset/data.yaml # 单张图推理看实际效果 yolo detect predict modelruns/weed/exp1/weights/best.pt sourcetest.jpg saveTrue逻辑说明val会输出 mAP、precision、recall 和混淆矩阵混淆矩阵能看出类别有没有被混。杂草检测如果是单类混淆矩阵就一个格子意义不大但如果你扩了多类比如作物/杂草分开混淆矩阵就是判断误检方向的关键。predict的source可以是单图、目录或视频saveTrue会把带框的结果存下来。参数上推理时可以加conf0.25控制置信度阈值杂草场景误检多的话适当调高。注意yolo混淆矩阵总合不唯一是常见困惑原因是不同置信度阈值下矩阵会变别拿两次不同阈值的结果直接对比。4. 避坑与排查训练前后最容易翻车的五件事4.1 现象训练一开始就报「No labels found」原因data.yaml里的train/val路径指向了图像目录但 yolo 默认去同级或指定位置找labels路径没对上就找不到标签。解决确认图像和标签的目录结构符合 yolo 约定images/train对应labels/train或者用path把根目录指对让相对路径能拼出来。改完先跑校验脚本确认图签数量一致。4.2 现象loss 是 nan或者训练中途 bn 崩溃原因标签坐标越界、空标签文件、或者学习率过大。yolo训练中bn崩溃多半和异常输入有关BatchNorm 对输入分布敏感脏数据会把它带崩。解决回到 2.2 的校验脚本把坐标越界和字段数不对的标签清掉学习率先用默认的别一上来就调大。如果还有问题把batch调小试试。4.3 现象mAP 一直上不去卡在 0.3 左右原因要么是预训练权重没加载model写成了yolov8n.yaml而不是.pt要么是类别数nc设错要么是图像分辨率太低导致小目标丢特征。解决确认model用的是.pt预训练权重核对nc和标签里的最大类别索引杂草目标小的话把imgsz提到 960 或 1280 再试。4.4 现象推理时框一大堆误检率高原因置信度阈值太低或者训练集里背景样本太少模型没见过足够的负样本。yolo边缘部署监控误检率高在农业场景很常见田间光照、土壤颜色都会干扰。解决推理时把conf提到 0.4~0.5训练时如果有条件补一些纯背景图当负样本导出模型做边缘部署前先在目标设备上实测阈值。4.5 现象换 yolo 版本后脚本报 API 不兼容原因v5 和 v8/v11 的调用方式完全不同v5 用train.py加 argparsev8 之后是yolo命令行或 Python API。解决先确定你用哪个版本别混着抄教程。用 ultralytics 的话统一走yolo detect train这套用 v5 的话去对应仓库按它的--data参数来。数据集本身是通用的卡住的是调用方式不是数据。5. 进阶把这份数据集用到边缘部署与模型改进上跑通 baseline 只是开始。这份数据集真正的价值在于它能当验证平台——你想试 yolo 改进、想接 transformer、想部署到 RK3588 或树莓派都得先有个能稳定复现的数据底子。我一般会做两件事一是固定一份划分好的 train/val所有实验都用同一份保证对比公平二是把best.pt导出成 ONNX 或 RKNN提前暴露部署侧的算子兼容问题。# 导出 ONNX方便后续转 RKNN 或 TensorRT yolo export modelruns/weed/exp1/weights/best.pt formatonnx imgsz640 # 导出时加 dynamic 支持变分辨率输入 yolo export modelruns/weed/exp1/weights/best.pt formatonnx dynamicTrue逻辑说明formatonnx导出通用中间格式imgsz要和训练时一致否则精度会掉。dynamicTrue让模型支持动态输入尺寸边缘设备上如果分辨率不固定会用到。导出后拿onnxruntime跑一遍推理和 pytorch 结果对一下误差在合理范围再往下走。如果你要做模型改进比如换 backbone、加注意力、试mamba yolo这类新结构建议先用这份数据集的子集比如 1000 张快速验证改动有没有效有效再上全量。全量 6849 张训一轮的时间成本不低盲目上全量试错很亏。评估时除了 mAP还要看推理速度FPS和模型大小边缘部署场景下这两项和精度一样重要。实验目的建议操作关注指标验证改进是否有效用 1000 张子集快速训mAP50-95 相对 baseline 变化边缘部署可行性导出 ONNX/RKNN 实测FPS、内存占用、精度损失多类扩展改 nc 和 names重训混淆矩阵、各类 AP从那以后我每次拿到新数据集都强制先跑一遍图签校验和坐标越界检查再动训练命令——这个习惯帮我省下了至少三次训到一半才发现标签有问题的返工。这份杂草数据集结构清晰、双格式齐全按上面的步骤走从解压到出第一个best.pt基本一个下午能搞定。希望帮到你。本文还有配套的精品资源点击获取
返回列表