☰
YOLO红花目标检测数据集:10000张图三格式标签与训练教程
2026/10/1 22:43:54 网站建设 项目流程

简介:本资源为YOLO红花目标检测数据集,面向从事目标检测算法学习与实战的开发者、学生及科研人员,解决红花识别场景下高质量标注数据难获取的问题。数据均来自真实场景,覆盖多种光照与背景条件,使用labelimg标注,标注框质量高,并同步提供voc(xml)、coco(json)与yolo(txt)三种格式标签,分别存放于不同文件夹,可直接接入YOLO系列模型训练。压缩包共2000个文件,以1986个xml标注文件为主,另含少量html教程、txt说明与py脚本,整体约728.23MB。资源附带YOLO环境搭建、训练案例教程及数据集划分脚本,可按需生成训练集、验证集、测试集,并支持Windows与Linux两种环境。已有252人学习下载,适合希望快速搭建红花检测基线、验证模型效果或开展课程实践的用户参考使用。

1. 红花检测数据集到手:10000 张图、三套标签,先别急着 train

做农业视觉或者植物表型分析的朋友,大概率都遇到过同一个尴尬:算法框架跑得飞起,公开数据集却找不到几个能直接用的红花样本。COCO 里花类目标稀疏,VOC 里红花标注更是零散,自己从零标一万张图,光人力成本就够劝退一个小组。这份 YOLO 红花目标检测数据集就是冲着这个缺口来的——10000 张真实场景图片,labelImg 标注,同时给了 VOC(xml)、COCO(json)、YOLO(txt)三种格式标签,还附了划分脚本和 Linux/Windows 双版本环境搭建与训练教程。它解决的不是"有没有数据"的问题,而是"拿到数据后能不能在半天内跑通第一条 baseline"的问题。适合刚接手红花检测任务、需要快速验证模型可行性的人,也适合想拿一套干净标注数据做消融实验的熟手。下面我按实际拆包顺序,把这份资源从目录结构到训练落地讲透。

2. 拆包先看目录:三种标签格式到底怎么对应

拿到压缩包别急着解压到桌面就开跑,先搞清楚里面每个文件夹是干什么的。这份资源的目录组织逻辑是"一份图片、三套标签、若干脚本、若干教程",理解了这个结构,后面改路径才不会翻车。

2.1 图片与标签的目录映射关系

解压后典型结构大致是这样(不同版本可能略有差异,以实际为准):

dataset/ ├── images/ # 10000 张红花原图 ├── labels_voc/ # VOC 格式 xml 标签 ├── labels_coco/ # COCO 格式 json 标签 ├── labels_yolo/ # YOLO 格式 txt 标签 ├── scripts/ # 划分脚本 │ ├── split_train_val_test.py │ ├── split_train_val.py │ └── gen_imagesets_txt.py └── tutorials/ # 环境搭建与训练教程 html

关键点在于:图片只有一份,标签有三份。VOC 的 xml 是每张图一个文件,COCO 的 json 通常是一个大文件汇总所有标注,YOLO 的 txt 是每张图一个文件、每行class x_center y_center width height归一化坐标。这三种格式不是随便给的,而是对应不同训练框架的入口——YOLOv5/v8 原生吃 txt,mmdetection 常用 COCO json,而一些老派检测代码或者可视化工具更认 VOC xml。

我一般会先做一件事:随机抽 5 张图,分别去三个标签文件夹里找对应文件,用肉眼核对框的位置是否一致。这一步花不了三分钟,但能提前发现标签错位、图片重名、编号不连续这类玄学问题。血泪经验是,有些数据集图片名和标签名对不上,训练时 loss 直接不降,排查半天才发现是文件名多了个空格。

2.2 三种格式的转换逻辑与选用建议

如果你只需要跑 YOLO 系列,直接用labels_yolo就行,省去转换。但如果你要做格式互转或者用其他框架,得知道它们之间的换算关系。VOC 的 xml 里xmin, ymin, xmax, ymax是绝对像素坐标,转 YOLO 时要先算宽高再归一化:

# VOC xml 转 YOLO txt 的核心逻辑 def voc_to_yolo(xml_path, img_w, img_h, class_map): tree = ET.parse(xml_path) root = tree.getroot() lines = [] for obj in root.findall('object'): cls_name = obj.find('name').text cls_id = class_map[cls_name] # 类别名映射为数字 id 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) # 归一化并转为中心点+宽高 x_center = (xmin + xmax) / 2.0 / img_w y_center = (ymin + ymax) / 2.0 / img_h w = (xmax - xmin) / img_w h = (ymax - ymin) / img_h lines.append(f"{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}") return lines

这段代码里class_map是类别名到 id 的映射字典,红花数据集如果只有"红花"一个类,那就是{"red_flower": 0}。img_w和img_h必须从对应图片读取,不能硬编码,因为数据集里图片分辨率可能不统一。归一化保留 6 位小数是 YOLO 的常见要求,少了可能精度不够,多了没必要。

COCO json 转 YOLO 稍微麻烦一点,因为 COCO 的bbox格式是[x_min, y_min, width, height]绝对坐标,且category_id可能从 1 开始而不是 0。转换时要先减 1 对齐,再归一化。我一般会写个脚本批量处理,而不是手动改,因为一万张图的量级手动操作必然出错。

提示:转换前先备份原始标签文件夹,转换脚本跑完抽查 10 张图的标注可视化,确认框没偏移再进入训练。

3. 划分脚本怎么跑:train/val/test 三分的参数与坑

数据集给好了,下一步是划分。这份资源里带了三个划分脚本,名字分别是split_train_val_test.py、split_train_val.py和gen_imagesets_txt.py,用途不同,别拿一个脚本硬套所有场景。

3.1 三个划分脚本的分工与调用方式

先看split_train_val_test.py,这是最常用的三分脚本,把图片和标签同时复制到train/、val/、test/三个新文件夹下。典型调用方式:

python split_train_val_test.py \ --images_dir ./images \ --labels_dir ./labels_yolo \ --output_dir ./split_dataset \ --train_ratio 0.7 \ --val_ratio 0.2 \ --test_ratio 0.1 \ --seed 42

参数说明:--images_dir和--labels_dir分别指向原图和 YOLO 标签;--output_dir是划分后输出根目录;三个 ratio 加起来必须等于 1.0,否则脚本可能报错或者按默认值走;--seed是随机种子,固定住才能保证每次划分结果一致,做对比实验时这点很重要。脚本内部逻辑通常是先os.listdir拿到所有图片名,random.shuffle打乱,再按比例切片,最后shutil.copy到对应子文件夹。

split_train_val.py是二分脚本,只分训练和验证,适合数据量偏少、不想单独留测试集的场景。gen_imagesets_txt.py则是生成ImageSets下的 txt 文件列表,这是 VOC 风格的划分方式,txt 里只存文件名,不复制图片,适合磁盘空间紧张或者想保持原始目录结构的情况。

3.2 划分比例与随机种子的实操建议

红花检测这种单类目标检测任务,我一般用 7:2:1 或者 8:1:1。如果图片场景重复度高(比如同一块田连续拍摄),要特别注意按场景划分而不是纯随机,否则训练集和验证集里出现几乎一样的图,验证指标虚高,上线就翻车。常见做法是先按拍摄批次或日期分组,再在组间划分。

随机种子--seed别忽略。有一次我忘了固定种子,两次划分结果不同,模型指标差了 3 个点,排查半天才发现是数据划分变了。从那以后我每次划分都强制写死 seed,并且在日志里记下来。

划分完成后检查三件事:一是三个文件夹的图片数量比例是否符合预期;二是每张图片在对应标签文件夹里都有同名 txt;三是没有图片同时出现在两个集合里。用几行 shell 就能验证:

# 统计各集合图片数量 for d in train val test; do echo -n "$d: "; ls split_dataset/$d/images | wc -l; done # 检查标签是否缺失 for d in train val test; do for img in split_dataset/$d/images/*; do base=$(basename "$img" | sed 's/\.[^.]*$//') [ -f "split_dataset/$d/labels/$base.txt" ] || echo "missing label: $base" done done

第二段脚本会打印出所有缺标签的图片名,如果输出为空就说明配对完整。

4. 环境搭建与训练:Linux 和 Windows 两条路

教程文件夹里给了 Linux 和 Windows 两个版本的环境搭建与训练说明,这里我把两条路的关键步骤和差异讲清楚,避免你在某个依赖上卡半天。

4.1 Linux 下的环境配置与训练启动

Linux 版本教程通常基于 Ubuntu,核心步骤是装显卡驱动、CUDA、cuDNN,再建 Python 虚拟环境装 PyTorch 和 YOLO 框架。我一般用 conda 管理环境:

conda create -n redflower python=3.9 -y conda activate redflower # 根据显卡驱动版本选择对应 CUDA 版本的 PyTorch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 YOLO 框架(以 ultralytics 为例) pip install ultralytics

装完后用python -c "import torch; print(torch.cuda.is_available())"验证 GPU 是否可用,返回True才算环境通了。如果返回False,大概率是 CUDA 版本和驱动不匹配,或者装成了 CPU 版 PyTorch。

训练启动前要准备一个data.yaml,指定训练、验证、测试路径和类别数:

path: ./split_dataset train: train/images val: val/images test: test/images nc: 1 names: ['red_flower']

然后一行命令开跑:

yolo detect train data=data.yaml model=yolov8n.pt epochs=100 imgsz=640 batch=16

model参数可以换成yolov8s.pt或yolov8m.pt,越大精度通常越高但显存占用也越大。imgsz=640是常见输入尺寸,如果红花目标很小,可以提到 1280,但要相应减小 batch。epochs=100是起步值,实际看验证集 mAP 什么时候不再涨就可以早停。

4.2 Windows 下的差异与常见报错

Windows 版本教程的步骤类似,但有几个坑更常见。一是路径分隔符,data.yaml里用正斜杠/或者双反斜杠\\,单反斜杠会被当转义字符。二是num_workers参数,Windows 下多进程 DataLoader 容易报BrokenPipeError,我一般设成 0 或者 2,别设太大。三是 CUDA 和 PyTorch 版本对应关系,Windows 下装错版本的概率比 Linux 高,建议直接去 PyTorch 官网复制对应命令。

训练过程中如果看到 loss 变成nan,常见原因是学习率太大或者标签里有非法值(比如坐标超出 0-1 范围)。这时候先检查标签文件,用脚本扫一遍有没有负数或大于 1 的坐标:

import os bad = [] for txt in os.listdir('labels_yolo'): with open(f'labels_yolo/{txt}') as f: for line in f: parts = line.strip().split() if len(parts) != 5: bad.append((txt, 'field_count')) continue vals = list(map(float, parts[1:])) if any(v < 0 or v > 1 for v in vals): bad.append((txt, 'out_of_range')) print(bad[:20], 'total:', len(bad))

这段脚本会列出字段数不对或者坐标越界的标签文件,训练前跑一遍能省很多排查时间。

5. 避坑与排查:标注、划分、训练里最容易翻车的五件事

5.1 标签坐标越界导致 loss 不收敛

现象:训练几个 epoch 后 loss 居高不下或者直接变nan。原因:部分 YOLO txt 标签里的归一化坐标小于 0 或大于 1,通常是标注时框拖出了图片边界,或者转换脚本没做裁剪。解决:用上面那段扫描脚本找出越界标签,手动修正或者用max(0, min(1, v))裁剪后重写。

5.2 图片与标签文件名不匹配

现象:训练时提示找不到标签,或者某张图没有对应标注。原因:图片是.jpg,标签是.txt,但文件名主体不一致,比如图片叫IMG_001.jpg,标签叫img_001.txt,大小写或前缀不同。解决:写脚本统一重命名,确保图片和标签除扩展名外完全一致。划分脚本跑完后也要再校验一次。

5.3 划分后类别分布严重不均

现象:验证集 mAP 波动大,或者某一类几乎检测不到。原因:随机划分时某些场景的图片集中进了同一个集合,导致训练集和验证集分布差异大。解决:按场景或拍摄批次分层抽样,而不是纯随机。如果只有一个类,至少保证不同光照、不同背景的图片在三个集合里都有。

5.4 CUDA out of memory

现象:训练启动几秒后报显存不足。原因:batch或imgsz设太大,或者模型选得太大(比如yolov8x)。解决:先把batch降到 8 或 4,imgsz降到 640;还不够就换小模型。也可以开梯度累积模拟大 batch。

5.5 验证集指标虚高但实际检测效果差

现象:验证集 mAP 很高,但拿新图片测试时漏检严重。原因:训练集和验证集图片过于相似,模型过拟合到了特定场景。解决:检查划分是否按场景隔离,必要时重新划分并增加验证集多样性。另外确认验证集没有混入训练集图片。

6. 进阶技巧:用预训练权重和混淆矩阵把红花检测调到位

环境通了、数据划分好了、第一条 baseline 也跑起来了,接下来是怎么把指标往上推。这份资源本身没绑定特定预训练模型,但 YOLO 系列通用的做法是加载 COCO 预训练权重再微调,收敛速度和最终精度都比从零训好。以 ultralytics 为例,model=yolov8n.pt就是自动加载预训练权重,如果你想换更大的,直接改yolov8s.pt或yolov8m.pt即可。注意别用yolov8n.yaml,那是从零初始化,小数据集上很容易欠拟合。

训练完成后,验证阶段生成的混淆矩阵是排查类别问题的好工具。红花数据集如果只有一个类,混淆矩阵看起来就是 2x2,重点看背景被误判为红花的比例(假阳性)和红花被漏检的比例(假阴性)。如果假阳性高,说明模型把一些红色物体误认成红花,可以适当增加背景负样本;如果假阴性高,说明漏检多,可以调低置信度阈值或者增加训练 epoch。

我一般会跑一组对比:yolov8nvsyolov8s,imgsz=640vsimgsz=1280,各训 100 epoch,看验证集 mAP50 和 mAP50-95 的差异。红花目标如果偏小,imgsz=1280通常能涨 2-3 个点,但显存占用翻倍,得权衡。另外学习率别用默认值一路到底,前几个 epoch 用 warmup,后期用余弦退火,这些在 ultralytics 里都有内置参数可以调。

最后说个习惯:每次训练完,我都会拿测试集里随机 20 张图跑一遍推理,把预测框画出来肉眼过一遍。指标再好看,框歪了或者漏了,实际用起来就是不行。从那以后我每次训完新模型都强制走一遍可视化抽检,再决定要不要部署。希望这份红花数据集和脚本能帮你少走点弯路,把时间花在模型改进而不是数据整理上。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询