ARTICLE DETAIL

资讯详情

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

红花检测数据集:10000张图+三种标签格式,YOLO训练避坑指南

红花检测数据集:10000张图+三种标签格式,YOLO训练避坑指南 简介本资源为YOLO红花目标检测数据集面向从事目标检测算法学习与实战的开发者、学生及科研人员解决红花识别场景下高质量标注数据获取困难的问题。数据集采集自真实场景图像背景与光照条件丰富使用labelimg完成标注标注框质量较高共含10000张图片并同步提供voc、coco和yolo三种格式标签分别存放于不同文件夹可直接接入YOLO系列模型训练。压缩包共2000个文件以1986个xml标注文件为主另含少量html说明文档、txt列表文件与py脚本整体约728.23MB。资源附带数据集划分脚本可按需生成训练集、验证集与测试集并配有YOLO环境搭建及训练案例教程覆盖Windows与Linux平台便于读者快速跑通训练流程、理解数据组织方式并迁移到自有数据集。目前已有252人学习下载适合作为目标检测课程设计、毕业设计或算法验证的数据基础。1. 红花检测数据集到底解决什么问题从 10000 张图到三种标签格式做农业视觉项目的朋友大概率遇到过这个场景想用 YOLO 做红花藏红花、红花药材或观赏红花的自动检测翻遍公开数据集要么是 COCO 里零星几张要么是 ImageNet 那种分类标注根本没法直接训练检测模型。自己拿手机拍几百张标完发现类别不均衡、遮挡样本太少、模型一上田间就翻车。这个标题里的资源就是冲着这个痛点来的——10000 张红花图片配 VOC、COCO、YOLO 三种格式标签外加划分脚本和训练教程。它适合三类人一是刚入门 YOLO、想找一个完整闭环数据集练手的新手二是做智慧农业、药材计数、花期监测的工程团队需要一个能直接跑通的基线三是想研究格式转换、数据增强、小目标检测的从业者拿它当可控实验床。核心价值不在图片数量而在于三种标签格式同时给到省掉了最耗时的格式对齐环节。下面按「数据长什么样 → 怎么转怎么划 → 怎么训 → 坑在哪 → 怎么调优」的顺序拆开讲。2. 三种标签格式的差异与转换VOC、COCO、YOLO 到底该用哪个2.1 三种格式的字段对照与选型理由很多人拿到数据集第一反应是「我直接用 YOLO 格式不就行了」但实际项目里三种格式各有不可替代的位置。VOC 是 XML 结构一张图一个文件人类可读性最好标注工具LabelImg默认输出就是它COCO 是单个 JSON 管全量字段最全带iscrowd、area、segmentation做实例分割或评估时绕不开YOLO 是每张图一个 txt归一化坐标训练时读取最快。维度VOC (XML)COCO (JSON)YOLO (TXT)存储方式每图一文件单文件全量每图一文件坐标形式绝对像素 xmin/ymin/xmax/ymax绝对像素 [x,y,w,h]归一化 cx,cy,w,h类别字段name 字符串category_id 整数class_id 整数从0起适用场景标注交换、可视化评估、分割、多任务YOLO 系列训练读取速度慢中快选型逻辑很简单训练 YOLOv5/v8/v11 用 YOLO 格式要跑 pycocotools 算 mAP 或做分割用 COCO要拿 LabelImg 继续补标或跟别人交换标注用 VOC。三种都给意味着你不用在格式上反复折腾。2.2 VOC 转 YOLO 的转换脚本与归一化细节转换的核心是把绝对坐标除以图像宽高得到 0~1 的归一化值同时把类别名映射成从 0 开始的整数 id。下面这段脚本我一般直接放在数据集根目录跑import os import xml.etree.ElementTree as ET from PIL import Image # 类别映射顺序必须和训练时的 data.yaml 一致 CLASSES [honghua] IMG_DIR images XML_DIR annotations/voc OUT_DIR labels/yolo os.makedirs(OUT_DIR, exist_okTrue) for xml_file in os.listdir(XML_DIR): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(XML_DIR, xml_file)) root tree.getroot() # 用实际图片尺寸不要用 XML 里的 size标注工具偶尔会写错 img_name root.find(filename).text img_path os.path.join(IMG_DIR, img_name) w, h Image.open(img_path).size lines [] for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in CLASSES: continue cls_id CLASSES.index(cls_name) bbox obj.find(bndbox) xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) # 归一化中心点与宽高 cx (xmin xmax) / 2.0 / w cy (ymin ymax) / 2.0 / h bw (xmax - xmin) / w bh (ymax - ymin) / h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_path os.path.join(OUT_DIR, xml_file.replace(.xml, .txt)) with open(out_path, w) as f: f.write(\n.join(lines))逻辑说明先读 XML 拿到每个 object 的类别和框再用 PIL 打开原图取真实宽高做归一化。参数上CLASSES必须和后续data.yaml里的names顺序完全一致否则类别会错位坐标保留 6 位小数足够YOLO 内部会再处理。注意不要用 XML 里size标签的宽高标注工具在图片被压缩过的情况下经常写错这是血泪经验。2.3 COCO 转 YOLO 与划分脚本的配合COCO 转 YOLO 要多一步从annotations里按image_id把框归到对应图片。核心代码片段import json from PIL import Image with open(annotations/instances.json) as f: coco json.load(f) # image_id - 文件名、宽高 img_info {im[id]: im for im in coco[images]} # category_id - 连续 class_id cat_ids sorted(c[id] for c in coco[categories]) cat2cls {cid: i for i, cid in enumerate(cat_ids)} for ann in coco[annotations]: im img_info[ann[image_id]] w, h im[width], im[height] x, y, bw, bh ann[bbox] # COCO 是左上角 x,y 宽高 cx (x bw / 2) / w cy (y bh / 2) / h cls cat2cls[ann[category_id]] # 追加写入对应 txt参数说明COCO 的bbox是[x, y, width, height]不是角点别当成 VOC 用category_id往往不连续比如 1、3、7必须重映射成 0 起的连续 id。划分脚本一般按 8:1:1 切 train/val/test注意要按图片切而不是按标注切否则同一张图会同时出现在训练和验证集里指标虚高。提示划分前先统计每类框数量红花如果存在「一图多朵」的情况按图片切分后要检查 val 集里是否每类都有样本否则 mAP 波动会很大。3. 用这份数据集跑通 YOLOv8 训练从 data.yaml 到第一轮收敛3.1 目录组织与 data.yaml 的正确写法YOLO 训练对目录结构有硬性约定推荐这样放honghua/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml内容path: /data/honghua train: images/train val: images/val test: images/test nc: 1 names: [honghua]参数说明path是数据集根目录train/val/test写相对路径即可nc是类别数红花单类就是 1names顺序必须和转换脚本里的CLASSES一致。常见翻车点是path用了相对路径但训练时工作目录变了导致找不到图片建议写绝对路径。3.2 训练命令与关键超参设置yolo detect train \ data/data/honghua/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience20 \ cacheTrue \ device0逻辑说明modelyolov8n.pt用官方预训练权重做迁移学习小数据集上比从头训收敛快得多imgsz640是速度和精度的平衡点红花如果花朵很小可以提到 960batch16按显存调8G 显存跑 640 一般能到 16patience20表示 20 轮没提升就早停避免过拟合cacheTrue把图片缓存到内存10000 张图大概占几个 G能明显加快 epoch 速度。训练过程中重点看三个指标box_loss是否稳定下降、mAP50是否在 30 轮后开始爬升、cls_loss是否震荡。如果box_loss降但mAP不涨多半是标注框质量问题如果cls_loss一直高检查类别映射是否错位。3.3 训练教程里没写但必须做的验证步骤训完不是看个best.pt就完事。第一步用yolo detect val在独立 test 集上跑一遍确认 mAP 和训练日志里的 val 指标差距不大第二步拿几张没参与训练的田间实拍图做推理看漏检和误检分布第三步用conf阈值扫描红花检测里低置信度框往往是遮挡或小目标阈值从 0.25 调到 0.4 看召回掉多少。yolo detect predict \ modelruns/detect/train/weights/best.pt \ source/data/honghua/images/test \ conf0.3 \ saveTrue参数说明conf0.3是推理置信度阈值比训练默认的 0.25 略高能压掉一部分背景误检saveTrue把带框结果存下来方便肉眼核对。这一步做完你才知道模型到底能不能用而不是被 mAP 数字骗了。4. 红花检测的避坑清单5 个真实踩过的坑4.1 坑一类别 id 从 1 开始导致全部预测错类现象训练 loss 正常下降但推理时框的位置对、类别全错或置信度极低。原因VOC 转 YOLO 时直接用了原始类别序号而 YOLO 要求 class_id 从 0 开始连续。解决转换脚本里统一用CLASSES.index(name)生成 id训练前用head labels/train/*.txt抽查几个文件确认第一列是 0。4.2 坑二图片和标签文件名不一致导致静默丢样本现象训练日志里train图片数比实际少几百张但没有任何报错。原因YOLO 按文件名匹配 images 和 labels.jpg和.JPG、img_1和img_01这种不一致会被直接跳过。解决写个校验脚本比对两个目录的文件名集合差集打印出来手动修或者统一在转换阶段重命名。4.3 坑三验证集里没有小目标导致 mAP 虚高现象val mAP 到 0.9一上真实场景小花朵全漏。原因划分时随机切分小目标样本恰好都进了训练集。解决划分前按框面积分桶确保 val 集里小、中、大目标都有红花场景建议小目标面积 32²占比不低于 15%。4.4 坑四cacheTrue 在图片尺寸差异大时爆内存现象训练到一半进程被 kill日志无报错。原因cacheTrue把解码后的图片全部驻留内存10000 张 4K 图能吃掉几十 G。解决先统一 resize 到接近imgsz的尺寸再训练或者改cachedisk用磁盘换内存。4.5 坑五数据增强把红花颜色改得面目全非现象训练集增强后红花偏色严重模型学到错误的颜色特征。原因默认 HSV 增强的hsv_h0.015对红花这种颜色敏感目标偏大。解决把hsv_h降到 0.005hsv_s、hsv_v保持默认或者直接关掉色调增强只保留翻转和缩放。5. 从能跑到好用红花检测的进阶调优与验证习惯数据集跑通只是起点真正决定项目能不能落地的是后面这几件事。第一是难例挖掘用训好的模型在未标注的田间图上推理把低置信度但位置合理的框导出来人工复核补进训练集迭代两三轮 mAP 通常能再涨几个点。第二是输入分辨率与部署的权衡如果最终要上边缘设备640 训练、640 推理是基线但红花如果只占画面很小一块可以试 960 训练、640 推理或者用切片推理SAHI把小目标放大后再检测。第三是评估习惯。我一般会固定一个「黄金测试集」——50 到 100 张覆盖不同光照、遮挡、密度的图每次改完超参或换模型都在这上面跑一遍记录漏检、误检、重复框的数量而不是只看 mAP。mAP 是聚合指标红花检测里一朵花被拆成两个框和整片漏掉mAP 可能差不多但业务影响完全不同。调优方向具体操作预期收益难例回补低置信度框人工复核后加入训练mAP 3~8分辨率提升imgsz 640→960小目标召回 5~10增强收敛降 hsv_h、关 mosaic 最后 10 轮减少偏色误检模型换大yolov8n→yolov8s/m精度 2~5速度降切片推理SAHI 切图后合并密集小目标召回明显提升最后说个习惯每次训练完把args.yaml、results.csv和best.pt一起归档命名带上日期和关键超参。我吃过亏两周后想复现某个结果发现忘了当时lr0设的多少只能重训。数据集的三种格式标签也一样转换脚本和划分脚本要跟数据放一起别只留最终 txt。希望帮到你。本文还有配套的精品资源点击获取
返回列表