简介:本资源为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_ok=True) 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是类别数,红花单类就是 1;names顺序必须和转换脚本里的CLASSES一致。常见翻车点是path用了相对路径但训练时工作目录变了,导致找不到图片,建议写绝对路径。
3.2 训练命令与关键超参设置
yolo detect train \ data=/data/honghua/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ lr0=0.01 \ lrf=0.01 \ patience=20 \ cache=True \ device=0逻辑说明:model=yolov8n.pt用官方预训练权重做迁移学习,小数据集上比从头训收敛快得多;imgsz=640是速度和精度的平衡点,红花如果花朵很小可以提到 960;batch=16按显存调,8G 显存跑 640 一般能到 16;patience=20表示 20 轮没提升就早停,避免过拟合;cache=True把图片缓存到内存,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 \ model=runs/detect/train/weights/best.pt \ source=/data/honghua/images/test \ conf=0.3 \ save=True参数说明:conf=0.3是推理置信度阈值,比训练默认的 0.25 略高,能压掉一部分背景误检;save=True把带框结果存下来,方便肉眼核对。这一步做完你才知道模型到底能不能用,而不是被 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 坑四:cache=True 在图片尺寸差异大时爆内存
现象:训练到一半进程被 kill,日志无报错。原因:cache=True把解码后的图片全部驻留内存,10000 张 4K 图能吃掉几十 G。解决:先统一 resize 到接近imgsz的尺寸再训练,或者改cache=disk,用磁盘换内存。
4.5 坑五:数据增强把红花颜色改得面目全非
现象:训练集增强后红花偏色严重,模型学到错误的颜色特征。原因:默认 HSV 增强的hsv_h=0.015对红花这种颜色敏感目标偏大。解决:把hsv_h降到 0.005,hsv_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。希望帮到你。
本文还有配套的精品资源,点击获取