
简介这份资源面向从事目标检测学习与课程实践的学生、教师及算法入门者提供一套真实场景下的树叶分类目标检测数据集可直接用于YOLO系列模型的训练与验证。压缩包共2000个文件约27.93MB包含1000张高质量标注图片以及voc格式的xml、coco格式的json和yolo格式的txt三种标签文件另附yaml配置文件、划分脚本与训练教程网页方便按需组织数据。资源还提供训练集、验证集、测试集划分脚本可将图片与标签按比例写入新文件夹并生成ImageSets下的txt索引便于复现标准实验流程。教程部分覆盖Windows与Linux下的YOLO环境搭建、Ubuntu安装及基于案例修改训练自己数据集的完整思路帮助读者快速跑通训练与评估。目前已有471人学习下载适合需要现成数据与配套脚本快速开展目标检测实践的用户。1. 树叶检测数据集怎么选1000 张真实场景图 三格式标签能省掉多少标注功夫做农业视觉或者林学调查的同行十有八九都卡在同一个地方模型结构抄得飞快数据集却要从零标。我见过一个团队为了做叶片病害初筛三个人标了两周才凑出 600 张最后 mAP 还上不去问题就出在标注框松紧不一、遮挡样本太少。这份 YOLO 树叶分类目标检测数据集核心价值就在于把最耗人的那一步替你干完了——1000 张真实场景图片用 labelImg 标注同时给出 VOCxml、COCOjson、YOLOtxt三种格式标签分文件夹存放拿到手就能直接喂给 YOLO 系列。它适合三类人刚入门目标检测、想跑通第一个自定义数据集的新手需要快速验证某个改进点比如换 head、加注意力但懒得重新标数据的老手以及做树叶计数、冠层分析、病虫害区域定位这类落地任务、需要一份干净基线数据的工程师。配套还塞了环境搭建、训练教程和划分脚本Windows 和 Linux 两套都有等于把「从装环境到出结果」这条链路铺平了。2. 三格式标签到底怎么选VOC、COCO、YOLO 的差异与转换逻辑2.1 三种格式的坐标系差异先搞懂再动手很多人拿到压缩包第一反应是「三个文件夹随便挑一个用呗」结果训练时报坐标越界或者框全跑到左上角。根子在于三种格式的坐标定义根本不是一回事。VOC 的 xml 存的是绝对像素坐标xmin, ymin, xmax, ymax原点在左上角COCO 的 json 存的是[x, y, width, height]同样是绝对像素但它是左上角点加宽高YOLO 的 txt 存的是归一化后的x_center, y_center, width, height全部除以图片宽高落在 0 到 1 之间。你如果直接把 VOC 的绝对坐标塞进 YOLO 的标签文件训练时损失函数会直接爆炸因为网络期望的是 0~1 的值。这份数据集把三种格式分开存放就是让你按框架选而不是自己转。常见做法是用 Ultralytics 的 YOLOv5/v8/v11 就选 yolo 格式的 txt用 Detectron2 或者 MMDetection 就选 COCO 的 json用早期 Darknet 或者某些老教程就选 VOC 的 xml。我一般会先确认训练框架的 dataloader 读哪种再决定用哪个文件夹避免中间多一次转换引入误差。2.2 用脚本验证标签与图片是否一一对应拿到数据集别急着开训先跑一遍一致性检查。下面这段脚本我每次拿到新数据集都会跑专门查图片和标签是否配对、坐标是否越界。import os from pathlib import Path from PIL import Image img_dir Path(images) # 图片目录 lbl_dir Path(labels) # YOLO txt 标签目录 img_files {p.stem for p in img_dir.glob(*.jpg)} lbl_files {p.stem for p in lbl_dir.glob(*.txt)} # 1. 检查是否有图片没标签或标签没图片 missing_lbl img_files - lbl_files missing_img lbl_files - img_files print(f缺标签的图片: {len(missing_lbl)} 张) print(f缺图片的标签: {len(missing_img)} 个) # 2. 检查 YOLO 坐标是否越界 bad [] for txt in lbl_dir.glob(*.txt): for line in txt.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: bad.append((txt.name, 字段数不对)) continue cls, x, y, w, h parts vals list(map(float, [x, y, w, h])) if any(v 0 or v 1 for v in vals): bad.append((txt.name, f坐标越界: {vals})) print(f异常标签: {len(bad)} 个) for b in bad[:10]: print(b)逻辑说明第一步用集合差集找出图片和标签不匹配的情况这是最常见的低级错误尤其是手动删过图之后。第二步逐行读 YOLO txt检查每行是不是 5 个字段类别 4 个归一化坐标再判断坐标是否落在 0~1。参数上img_dir和lbl_dir按你实际解压后的路径改图片扩展名如果是 png 就把*.jpg换掉。跑完如果异常数为 0说明这份数据是干净的可以放心进入划分环节。2.3 划分脚本怎么用train/val/test 三种切法压缩包里给了三个划分脚本名字分别是「训练集、验证集、测试集划分脚本」「训练集、验证集划分脚本」和「split_train_val 生成 ImageSets 下 txt 文件划分脚本」。前两个是把图片和标签复制到新文件夹第三个是生成 VOC 风格的 ImageSets txt 索引。我一般用第一个做三划分因为验证集和测试集分开能更真实地反映泛化能力。# 典型调用方式按脚本内 argparse 参数调整 python 训练集、验证集、测试集划分脚本.py \ --images_dir ./images \ --labels_dir ./labels \ --output_dir ./dataset_split \ --train_ratio 0.7 \ --val_ratio 0.2 \ --test_ratio 0.1 \ --seed 42逻辑说明脚本按比例把图片和对应标签复制到dataset_split/train、val、test三个子目录保证图片和标签同步移动不会出现「图在 train、标签在 val」的错位。参数上三个比例加起来必须等于 1seed固定随机种子保证可复现。注意 1000 张的规模下test 给 0.1 就是 100 张够做一次最终评估如果数据更少建议改成 8:1:1 甚至 8:2:0把验证集当测试集用别为了凑三划分把训练集压得太小。3. 从环境搭建到跑通训练Windows 与 Linux 两条路3.1 环境搭建的关键版本约束配套教程分了 Windows 和 Linux 两版还单独给了 Ubuntu 安装教程。我踩过的坑是教程里的 CUDA 版本和你显卡驱动不匹配装完 torch 之后torch.cuda.is_available()返回 False。常见做法是先nvidia-smi看驱动支持的最高 CUDA 版本再去 PyTorch 官网找对应命令别直接抄教程里的pip install torch。# Linux 下确认 GPU 与 CUDA nvidia-smi # 输出右上角 CUDA Version 是驱动支持上限安装的 torch 不能超过它 # 创建独立环境避免污染系统 Python conda create -n leaf_yolo python3.9 -y conda activate leaf_yolo # 按官网命令装 torch示例以实际驱动为准 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 验证 python -c import torch; print(torch.cuda.is_available())逻辑说明nvidia-smi给出的 CUDA Version 是驱动能支持的最高运行时版本你装的 PyTorch 自带 CUDA runtime只要不超过这个上限就行。用 conda 建独立环境是为了避免和系统里其他项目的依赖打架这个习惯能省掉大量「昨天还能跑今天报错」的玄学问题。最后那行验证必须返回 True否则后面训练会默默跑在 CPU 上速度差几十倍。3.2 按教程改配置训练自己的数据集教程的核心是「根据案例修改训练自己的数据集」也就是把官方示例的 data yaml 和模型配置改成指向你的树叶数据。以 Ultralytics YOLOv8 为例你需要新建一个leaf.yaml# leaf.yaml path: ./dataset_split # 数据集根目录 train: train/images # 训练图片相对路径 val: val/images # 验证图片相对路径 test: test/images # 测试图片相对路径 nc: 1 # 类别数树叶分类按你的实际类别改 names: [leaf] # 类别名顺序要和标签里的 class id 对应逻辑说明path是根目录下面的 train/val/test 都是相对它的路径这样换机器只要改一处。nc是类别数量如果你标了多种树叶就改成对应数字names列表的顺序必须和标注时用的类别 id 一致否则模型学出来的类别会张冠李戴。改完 yaml 就可以起训yolo detect train \ dataleaf.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0参数上model用预训练权重能明显加快收敛imgsz640是通用起点显存不够就降到 416 或 320batch跟着显存调device0指定第一块 GPU。1000 张数据用 yolov8n 大概几十分钟能跑完 100 轮具体看卡。3.3 训练日志里该盯哪几个指标跑起来之后别只等最后结果训练日志里有几个信号要实时看。box_loss和cls_loss应该整体下降如果 cls_loss 一直不降多半是类别标签对不上或者类别不平衡。mAP50 在验证集上应该稳步上升如果训练集 mAP 很高但验证集上不去就是过拟合考虑加数据增强或者减模型容量。我一般会在前 10 轮确认 loss 在降中间看 mAP 曲线有没有平台期最后看混淆矩阵确认有没有把某一类全预测成另一类。4. 避坑与排查树叶数据集训练最容易翻车的五个地方4.1 现象训练一开始 loss 就是 nan原因YOLO 标签坐标没归一化或者 txt 里混进了绝对像素值。这份数据集虽然给了正确的 yolo 格式但如果你自己用 VOC 转的时候忘了除以宽高就会这样。解决用 2.2 的检查脚本跑一遍确认所有坐标都在 0~1越界的重新生成。4.2 现象mAP 一直是 0模型什么都没学到原因data yaml 里的names顺序和标签里的 class id 对不上或者nc写成了 0。解决打开一个 txt 看第一个数字是几那就是 class id确保names列表长度等于nc且索引对应。树叶数据集如果只有一类nc: 1、names: [leaf]别写成 80。4.3 现象验证集图片加载报错提示找不到文件原因划分脚本复制图片时路径层级和 yaml 里写的不一致。比如脚本输出是dataset_split/train/images/xxx.jpg而 yaml 里写的是train/xxx.jpg。解决ls一下实际目录结构yaml 里的 train 路径要指到包含图片的那一层通常是train/images。4.4 现象显存溢出batch 调到 1 还是 OOM原因imgsz太大或者没开混合精度。1000 张图不算多但 640 分辨率下 batch 16 在 8G 卡上可能吃紧。解决先把imgsz降到 416或者加ampTrue开自动混合精度再不行换更小的模型yolov8n 已经很小了可以考虑 nano 级别。4.5 现象训练集指标很好换一批新图就崩原因1000 张真实场景图虽然场景丰富但如果你的测试场景和训练集分布差太多比如训练全是晴天、测试全是阴天泛化就是会掉。解决这不是脚本能修的属于数据层面问题。常见做法是把新场景的图补进训练集或者用更强的数据增强HSV 抖动、随机遮挡提升鲁棒性。别指望一个数据集包打天下。5. 进阶玩法用这份数据做迁移学习和改进验证跑通基线只是开始这份数据集真正的价值在于它够干净、够小适合快速验证想法。我一般会拿它做两件事一是迁移学习对比二是改进模块的消融实验。迁移学习方面你可以冻结 backbone 只训 head看小数据下能不能更快收敛。以 YOLOv8 为例冻结前 10 层yolo detect train \ dataleaf.yaml \ modelyolov8n.pt \ epochs50 \ freeze10 \ lr00.001freeze10表示冻结前 10 层lr0是初始学习率冻结训练时学习率可以适当调小。对比全量微调冻结版在小数据上往往更稳不容易过拟合。改进验证方面如果你在试新的 head 或者注意力模块直接换模型结构文件数据侧不用动。1000 张的规模下一次消融实验几十分钟就能出结果迭代速度很快。验证方法上我习惯固定随机种子跑三次取平均 mAP单次结果波动可能有 1~2 个点别被一次跑高就下结论。还有个实用技巧把 test 集单独留出来每次改完只在 val 上调参最后用 test 跑一次最终数字。我见过太多人反复在 test 上调最后报出来的指标虚高换真实场景就露馅。从那以后我每次划分数据集都强制把 test 锁死不到最后不碰。希望这份数据和脚本能帮你把树叶检测这条链路快速跑通少走我当年那些弯路。本文还有配套的精品资源点击获取