白萝卜检测数据集:1000张图双格式标签,YOLO全系开训指南

发布时间:2026/10/5 5:28:55
白萝卜检测数据集:1000张图双格式标签,YOLO全系开训指南 简介本资源为面向YOLO系列目标检测算法学习者的白萝卜检测数据集适用于yolov5、yolov8、yolov9、yolov7、yolov10及yolo11等主流框架可直接用于模型训练与验证测试帮助初学者和进阶开发者快速搭建农作物目标检测实验环境。压缩包共2000个文件包含1000个xml标注文件、999个txt标注文件及1个yaml配置文件整体约32.8MB其中txt为YOLO格式标注xml为VOC格式标注yaml用于数据集路径与类别配置两种标注格式分别存放于独立文件夹文件名末尾附带部分类别名称便于按类别检索与管理。YOLO格式采用归一化中心点与宽高比例值符合标准训练输入要求。数据集已完成训练集与验证集划分省去手动切分步骤可直接接入训练流程。目前已有63人学习下载适合需要快速验证检测模型效果或开展农业视觉应用实践的用户参考使用。1. 白萝卜检测数据集1000 张图带双格式标签YOLO 全系直接开训做农业视觉项目的同行大概率都遇到过这个场景算法框架搭好了模型结构也调通了结果卡在数据上——要么找不到足够数量的白萝卜标注图要么标签格式对不上自己的训练脚本要么划分好的训练集验证集比例不合理重新切分又得折腾半天。这份白萝卜检测数据集就是冲着这个痛点来的1000 张图像全部带标签已经划分好训练集和验证集同时提供 YOLO 格式的 txt 文件和 VOC 格式的 xml 文件两套标签附赠 data.yaml 配置文件yolov5、yolov8、yolov9、yolov7、yolov10、yolo11 都能直接拿来跑。适合谁做农产品分拣、田间目标计数、采摘机器人视觉模块的工程师以及想拿一个真实场景数据集练手 YOLO 训练全流程的新手。下面从数据组织、配置对接、训练验证到踩坑排查一步步拆开讲。2. 数据集结构与标签格式先搞清楚手里拿的是什么2.1 目录组织与文件命名逻辑拿到压缩包解压后常见的目录结构是这样的根目录下分 images 和 labels 两个大文件夹images 里再按 train 和 val 切分labels 对应同样的层级。VOC 格式的 xml 文件通常单独放在一个 annotations 文件夹里不参与 YOLO 训练但做格式转换或交叉验证时有用。文件命名方面从项目正文给出的文件名列表可以看到图像和标签是成对出现的比如 img_06_13.txt 对应 img_06_13.jpg或 .pngimg_0639_15.txt 对应 img_0639_15.jpg。这种命名方式的好处是你写数据加载脚本时不需要额外维护映射表直接用文件名主干去匹配就行。注意文件名末尾可能带类别名称后缀这是为了方便人工核对训练时不影响YOLO 读取标签只看 txt 内容。提示解压后先别急着改目录结构用find . -name *.txt | wc -l和find . -name *.jpg -o -name *.png | wc -l分别统计标签和图像数量确认是否一一对应。如果数量对不上先排查是不是有隐藏文件或解压不完整。2.2 YOLO 格式标签的字段含义与读取方式YOLO 格式的 txt 标签每行代表一个目标框格式为class x_center y_center width height五个字段用空格分隔。class是类别索引从 0 开始后面四个都是归一化到 0 到 1 之间的浮点数分别表示目标框中心点的 x 坐标、y 坐标以及框的宽度和高度全部相对于图像宽度和高度做比例。举个例子如果一张 640×480 的图里有个白萝卜中心点在 (320, 240)框宽 200 像素、高 150 像素那么标签行就是0 0.5 0.5 0.3125 0.3125读取时用 Python 解析很简单def parse_yolo_label(label_path, img_w, img_h): boxes [] with open(label_path, r) as f: for line in f.readlines(): parts line.strip().split() if len(parts) ! 5: continue cls_id int(parts[0]) xc, yc, w, h map(float, parts[1:]) # 转成像素坐标方便画框验证 x1 (xc - w / 2) * img_w y1 (yc - h / 2) * img_h x2 (xc w / 2) * img_w y2 (yc h / 2) * img_h boxes.append((cls_id, x1, y1, x2, y2)) return boxes这段代码的关键点在于归一化坐标乘以图像宽高才能还原到像素空间画框或做数据增强时必须走这一步。参数上img_w和img_h必须和实际图像尺寸一致否则框会偏移。常见翻车点是图像被 resize 过但标签没同步更新导致框对不上。2.3 VOC 格式 xml 的用途与转换思路VOC 格式的 xml 文件保留了绝对像素坐标结构上包含size里的宽高、object里的类别名和bndbox的 xmin/ymin/xmax/ymax。这份数据集同时给两套格式实际训练 YOLO 时用 txt 就够了xml 的价值在于一是方便用 LabelImg 重新打开做人工复核或增补标注二是如果你要转成 COCO 格式做对比实验从 xml 转比从 txt 转更直接因为 xml 里有原始像素坐标和类别名不用反归一化。转换脚本核心逻辑import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, class_map): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[cls_name] bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) xc (x1 x2) / 2 / img_w yc (y1 y2) / 2 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{cls_id} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) return linesclass_map是类别名到索引的映射字典必须和 data.yaml 里的 names 顺序一致。保留六位小数是为了减少精度损失YOLO 训练时对坐标精度不敏感但太粗糙会影响小目标。3. data.yaml 配置与 YOLO 全系对接从 yolov5 到 yolo11 怎么改3.1 data.yaml 的字段拆解与路径写法数据集自带的 data.yaml 通常长这样path: ./dataset train: images/train val: images/val nc: 1 names: [white_radish]path是数据集根目录train和val是相对于 path 的子路径。nc是类别数白萝卜检测只有一类所以是 1。names是类别名列表顺序必须和标签里的 class 索引对应。如果你的目录结构和默认不一样改这三个路径就行。常见坑是路径用了绝对路径但换机器后失效建议用相对路径或者在训练脚本里动态拼接。另外 Windows 下路径分隔符是反斜杠YAML 里最好统一用正斜杠避免转义问题。3.2 各版本 YOLO 的训练入口差异yolov5 用train.py命令是python train.py --data data.yaml --weights yolov5s.pt --img 640 --epochs 100 --batch-size 16yolov8 及之后版本统一用yolo命令行yolo detect train datadata.yaml modelyolov8n.pt imgsz640 epochs100 batch16yolov9、yolov10、yolo11 的入口和 yolov8 类似只是模型权重文件名不同比如yolov9c.pt、yolov10n.pt、yolo11n.pt。参数含义基本一致imgsz是输入分辨率epochs是训练轮数batch是批大小。1000 张图的数据集建议从 yolov8n 或 yolo11n 这种轻量模型开始跑通流程再换大模型。注意yolov5 的--img参数在 yolov8 里变成了imgsz直接复制命令会报错。版本迁移时先看官方文档的参数表别硬套。3.3 训练前用脚本做一次标签体检在正式训练前强烈建议跑一个标签检查脚本确认没有越界框、空标签、类别索引超范围等问题import os import cv2 def check_labels(img_dir, label_dir, nc): issues [] for label_file in os.listdir(label_dir): if not label_file.endswith(.txt): continue img_name label_file.replace(.txt, .jpg) img_path os.path.join(img_dir, img_name) if not os.path.exists(img_path): issues.append(fmissing image: {img_name}) continue img cv2.imread(img_path) h, w img.shape[:2] with open(os.path.join(label_dir, label_file)) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) ! 5: issues.append(f{label_file} line {i}: field count {len(parts)}) continue cls_id int(parts[0]) if cls_id 0 or cls_id nc: issues.append(f{label_file} line {i}: class {cls_id} out of range) vals list(map(float, parts[1:])) if any(v 0 or v 1 for v in vals): issues.append(f{label_file} line {i}: coord out of [0,1]) return issues这个脚本会输出所有异常记录。参数nc传 data.yaml 里的类别数。跑完如果 issues 为空说明标签质量过关可以放心开训。如果有越界坐标大概率是标注时框拖到了图像外面需要人工修正或直接剔除该样本。4. 训练参数调优与验证1000 张图怎么跑出可用模型4.1 小数据集的增强策略与超参设置1000 张图在目标检测里算小数据集容易过拟合。常见做法是开启 Mosaic 增强和 HSV 色彩扰动yolov5 默认就带 Mosaicyolov8 也有mosaic参数。学习率方面用预训练权重微调时初始 lr 设 0.001 到 0.01 之间配合余弦退火。batch size 根据显存来8G 显存跑 640 分辨率yolov8n 可以开到 16yolov8m 可能只能开到 8。如果验证集 mAP 波动大先把close_mosaic设成最后 10 个 epoch 关闭 Mosaic让模型在真实分布上收敛。这个技巧在农业数据集上尤其管用因为 Mosaic 拼接会引入不自然的边界而白萝卜在田间的背景相对固定。4.2 训练过程监控与指标解读训练启动后重点看三个指标box_loss、cls_loss 和 mAP0.5。box_loss 下降说明框回归在收敛cls_loss 下降说明分类在改善mAP0.5 是综合指标。如果 box_loss 震荡不降检查学习率是不是太大如果 cls_loss 很快降到接近零但 mAP 不涨可能是类别不平衡或标注有噪声。验证阶段用yolo detect val命令yolo detect val datadata.yaml modelruns/detect/train/weights/best.pt imgsz640输出会给出每类的 precision、recall 和 mAP。白萝卜检测只有一类重点看 recall漏检比误检更致命。如果 recall 低于 0.8优先补充难样本比如遮挡、小目标、逆光场景的图。4.3 推理测试与结果可视化训练完成后用 best.pt 做推理yolo detect predict modelbest.pt sourcetest_images/ saveTrue conf0.25conf是置信度阈值默认 0.25白萝卜检测可以调到 0.3 减少误报。saveTrue会把画框结果存到 runs/detect/predict 目录。如果想批量统计检测数量可以写脚本遍历输出目录解析每张图的框数量。提示推理时如果发现框普遍偏大或偏小检查训练时的 imgsz 和推理时的 imgsz 是否一致。不一致会导致框尺度错位这是血泪经验。5. 避坑与排查标签、路径、显存三个高频翻车点5.1 标签文件与图像文件不匹配现象训练启动后报No labels found或 loss 一直为 nan。原因标签目录和图像目录的文件名主干不一致或者标签文件为空。解决用 3.3 节的检查脚本先跑一遍确认每个图像都有对应标签且标签内容非空。如果文件名有大小写差异统一转成小写再匹配。5.2 data.yaml 路径错误导致数据集加载失败现象报Dataset not found或0 images found。原因path字段写的是相对路径但训练脚本的工作目录和数据集根目录不在同一层级。解决在 data.yaml 里用绝对路径或者在训练命令前先cd到数据集根目录。另一个常见原因是train和val字段忘了带images/前缀直接写了trainYOLO 会去根目录找。5.3 显存不足导致训练中断现象报CUDA out of memory。原因batch size 太大或 imgsz 太高。解决先把 batch 降到 4 或 2确认能跑通后再逐步往上加。如果显存实在紧张把 imgsz 从 640 降到 416 或 320但注意小目标检测精度会下降。另一个技巧是开启混合精度训练yolov8 默认开启 AMPyolov5 加--amp参数。5.4 验证集 mAP 异常低但训练 loss 正常现象训练 loss 稳步下降但验证 mAP 始终在 0.1 以下。原因验证集和训练集的类别分布差异大或者验证集标签格式有问题。解决分别统计训练集和验证集的类别数量和框尺寸分布如果验证集里全是小目标而训练集全是大目标模型泛化会差。另外检查验证集的 txt 文件是不是误用了 VOC 格式的坐标。5.5 推理结果框重叠严重现象同一根白萝卜被检测出多个框。原因NMS 阈值设得太高或者模型对重叠目标区分能力不足。解决推理时调低iou参数默认 0.45可以试 0.3。如果还是重叠说明训练数据里密集目标标注不一致需要回头检查标注质量。6. 进阶技巧用 TTA 和模型集成把白萝卜检测 recall 再拉一截训练跑通之后如果 recall 还差那么几个点可以试试测试时增强TTA。YOLO 官方支持augmentTrue推理会对每张图做翻转、缩放等多尺度预测再融合yolo detect predict modelbest.pt sourcetest_images/ augmentTrue conf0.25 iou0.4TTA 的代价是推理速度变慢大概慢 2 到 3 倍但 recall 通常能涨 1 到 3 个百分点。对于白萝卜这种形状相对规则的目标水平翻转和轻微缩放增强效果最明显。另一个技巧是模型集成。用 yolov8n 和 yolo11n 分别训练推理时把两个模型的框合并再做一次 NMS。集成脚本核心逻辑from ultralytics import YOLO import numpy as np model_a YOLO(runs/yolov8n/weights/best.pt) model_b YOLO(runs/yolo11n/weights/best.pt) def ensemble_predict(img_path, conf0.25, iou0.5): boxes_a model_a(img_path, confconf)[0].boxes boxes_b model_b(img_path, confconf)[0].boxes all_boxes np.concatenate([boxes_a.xyxy.cpu().numpy(), boxes_b.xyxy.cpu().numpy()], axis0) all_scores np.concatenate([boxes_a.conf.cpu().numpy(), boxes_b.conf.cpu().numpy()], axis0) # 这里接一个 NMS 实现按 iou 阈值过滤 keep nms(all_boxes, all_scores, iou) return all_boxes[keep], all_scores[keep]nms函数可以用 torchvision 的torchvision.ops.nms传入框的 tensor 和分数即可。集成的收益取决于两个模型的差异度如果都是 yolov8n 只是随机种子不同提升有限用不同架构的模型集成效果更好。验证集成效果时别只看 mAP把 recall 单独拎出来对比。白萝卜检测场景下漏检一根萝卜的代价比多检一个框高得多。我一般会在验证集上跑三组对比单模型、单模型TTA、双模型集成选 recall 最高且推理耗时能接受的那个方案。从那以后我每次拿到新数据集都强制先跑一遍标签体检脚本再开训练。这个习惯帮我省了至少三次通宵排查的功夫。希望帮到你。本文还有配套的精品资源点击获取