
简介这份资源面向从事农业图像识别、目标检测学习与科研的学生和开发者提供一套真实场景下的葡萄叶片病害检测数据集可直接用于YOLO系列模型训练与验证。压缩包共约2000个文件整体349.64MB以1985个xml标注文件为主另含少量txt、html与py脚本分别对应标签数据、教程说明和数据集划分工具。数据经labelimg标注同时提供voc、coco和yolo三种格式标签分目录存放便于不同框架直接读取。资源还附赠YOLO环境搭建、训练案例教程及训练集、验证集、测试集划分脚本读者可自行调整数据比例快速跑通从环境配置到模型训练的全流程。目前已有355人学习下载适合需要现成标注数据、想省去采集与标注成本的中高级学习者参考使用。1. 葡萄叶片病害检测数据集10000 张图配三套标签到手就能开训葡萄叶片病害检测这个方向公开可用的高质量数据一直不算多。要么是类别太少只有黑腐病和健康两类要么是标注格式单一拿到手还得自己写脚本转格式。这份资源把 10000 张葡萄叶片图片、VOC / COCO / YOLO 三种格式标签、划分脚本和训练教程打包在一起省掉了最耗时的数据整理环节。它适合正在做农业视觉检测的算法工程师、准备打比赛的学生以及需要快速验证 YOLO 系列模型在细粒度病害分类上表现的研究者。你拿到手之后不需要从零标注也不用纠结格式转换直接进入模型训练和调参阶段。下面按「数据长什么样 → 怎么转格式 → 怎么训 → 坑在哪」的顺序拆一遍。2. 数据集结构与三种标签格式的选型逻辑2.1 10000 张图的目录组织与类别分布这份数据集的图片以葡萄叶片为拍摄对象覆盖健康叶片和多种常见病害。从实际农业检测场景来看葡萄叶片病害通常包括黑腐病、轮斑病、褐斑病、霜霉病等不同病害在叶片上的斑点形态、颜色和分布区域有差异这也是目标检测能生效的前提。10000 张的体量在农业数据集里属于中等偏上按常见划分比例 8:1:1 来算训练集约 8000 张验证集和测试集各 1000 张对于 YOLOv5s 或 YOLOv8n 这类轻量模型来说单卡跑 100 到 300 个 epoch 基本能收敛。目录结构常见做法是根目录下分images和labels两个大文件夹再各自按train/val/test切分。图片格式以 JPG 为主分辨率大概率在 640×640 上下浮动因为很多农业数据集采集时会统一 resize 到这个尺寸。如果你拿到的原始图分辨率更高训练前需要确认是否已经做过缩放否则 YOLO 的 letterbox 预处理会引入额外的形变。类别数量直接决定检测头的输出维度。假设是 4 类病害加 1 类健康那 YOLO 的nc参数就设 5。这里有个容易翻车的点VOC 格式的 XML 里类别名可能是中文或英文混用转 YOLO 格式时必须统一映射成 0 到 nc-1 的整数索引否则训练时类别标签对不上loss 会直接飙到 nan。2.2 VOC、COCO、YOLO 三种格式的差异与适用场景三种格式不是随便凑数的它们对应不同的训练框架和评估工具链。VOC 格式以 XML 文件存储每个 XML 对应一张图里面包含object节点记录类别名和边界框的xmin、ymin、xmax、ymax。这种格式可读性好适合用 LabelImg 做人工校验也方便用xml.etree直接解析。COCO 格式是单个 JSON 文件包含images、annotations、categories三个核心字段边界框用[x, y, width, height]表示且坐标是绝对像素值。COCO 格式在评估时常用 mAP[.5:.95]比 VOC 的 mAP0.5 更严格。YOLO 格式最简洁每张图对应一个.txt文件每行是class_id x_center y_center width height全部归一化到 0 到 1 之间。选型逻辑很直接如果你用 Darknet 或 Ultralytics 的 YOLO 系列直接用 YOLO 格式最省事如果你要跑 MMDetection 或 Detectron2COCO 格式是首选如果你需要做数据清洗和人工复核VOC 格式的 XML 最方便逐条检查。这份资源同时提供三种格式意味着你可以在不同框架之间切换而不用重新标注。2.3 划分脚本的参数含义与运行方式划分脚本通常是一个 Python 文件核心逻辑是读取所有图片文件名按比例随机切分然后生成对应的train.txt、val.txt、test.txt。下面是一个常见实现的骨架import os import random import argparse def split_dataset(img_dir, output_dir, train_ratio0.8, val_ratio0.1, seed42): # 固定随机种子保证每次划分结果可复现 random.seed(seed) # 支持的图片后缀按需增减 exts (.jpg, .jpeg, .png, .bmp) files [f for f in os.listdir(img_dir) if f.lower().endswith(exts)] random.shuffle(files) n len(files) n_train int(n * train_ratio) n_val int(n * val_ratio) train_files files[:n_train] val_files files[n_train:n_train n_val] test_files files[n_train n_val:] # 分别写入三个 txt每行一个图片路径 for name, subset in [(train, train_files), (val, val_files), (test, test_files)]: with open(os.path.join(output_dir, f{name}.txt), w) as f: for item in subset: f.write(os.path.join(img_dir, item) \n) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--img_dir, typestr, requiredTrue, help图片根目录) parser.add_argument(--out_dir, typestr, requiredTrue, help输出 txt 的目录) parser.add_argument(--train_ratio, typefloat, default0.8) parser.add_argument(--val_ratio, typefloat, default0.1) parser.add_argument(--seed, typeint, default42) args parser.parse_args() split_dataset(args.img_dir, args.out_dir, args.train_ratio, args.val_ratio, args.seed)逻辑说明脚本先扫描图片目录过滤出图片文件然后打乱顺序。seed参数固定后每次运行得到的划分结果一致方便复现实验。train_ratio和val_ratio控制训练集和验证集比例剩下的自动归为测试集。输出的是三个 txt 文件每行一个绝对路径或相对路径YOLO 训练时通过--data参数指向包含这些 txt 的 yaml 文件即可。参数怎么改如果数据量小可以把val_ratio调到 0.2训练集降到 0.7。如果要做交叉验证可以把seed设成不同值多跑几次生成多组划分。注意img_dir和out_dir不要设成同一个目录否则 txt 文件会被当成图片扫描进去导致路径错乱。3. 从零跑通 YOLO 训练环境、配置与启动命令3.1 环境依赖与版本匹配YOLO 训练环境的核心依赖是 PyTorch、torchvision 和 Ultralytics 包。截至当前YOLOv8 和 YOLOv5 都还在活跃维护但两者的 API 有差异。如果你拿到的教程是基于 YOLOv5 的那就装torch1.7.0和对应的requirements.txt如果是 YOLOv8直接pip install ultralytics会连带装好依赖。CUDA 版本要和显卡驱动匹配常见做法是先用nvidia-smi看驱动支持的 CUDA 上限再去 PyTorch 官网找对应版本的安装命令。一个容易忽略的点是 Python 版本。YOLOv5 在 Python 3.8 到 3.10 上比较稳YOLOv8 对 3.10 和 3.11 支持更好。如果你用 conda 建环境建议单独建一个避免和系统里的其他包冲突。下面是一套常见的环境初始化命令conda create -n grape_yolo python3.10 -y conda activate grape_yolo pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics opencv-python matplotlib pyyaml tqdm逻辑说明第一行建一个名为grape_yolo的虚拟环境Python 版本选 3.10。第二行激活环境。第三行装 PyTorch 和 torchvisioncu118表示 CUDA 11.8 版本如果你的驱动只支持到 11.7就换成cu117。第四行装 Ultralytics 和其他辅助包opencv-python用于图像读写matplotlib用于画 loss 曲线pyyaml用于解析数据配置文件。参数怎么改如果你没有独立显卡把cu118换成cpu但训练速度会慢很多10000 张图可能要跑一整天。如果有显卡但显存小于 6GB训练时要把batch调到 4 或 8否则会 OOM。3.2 数据配置文件与模型配置文件的写法YOLO 训练需要一个数据配置文件通常叫grape.yaml内容如下path: /data/grape_dataset train: train.txt val: val.txt test: test.txt nc: 5 names: [black_rot, esca, leaf_blight, healthy, downy_mildew]逻辑说明path是数据集根目录train/val/test是相对于path的 txt 文件路径。nc是类别数names是类别名列表顺序必须和标签里的class_id一一对应。如果 VOC 转 YOLO 时类别映射顺序搞错了这里就会张冠李戴训练出来的模型会把黑腐病认成健康叶。模型配置文件方面YOLOv5 用yolov5s.yamlYOLOv8 用yolov8n.yaml。如果你要改类别数需要把模型配置里的nc改成和数据集一致。YOLOv8 的做法更简单直接在训练命令里指定nc会自动覆盖。常见做法是先用yolov8n.pt预训练权重做迁移学习这样收敛更快mAP 起点也更高。3.3 启动训练与关键参数解读训练命令根据框架不同略有差异。YOLOv5 的典型命令是python train.py --img 640 --batch 16 --epochs 200 --data grape.yaml --weights yolov5s.pt --device 0YOLOv8 的命令更简洁yolo detect train datagrape.yaml modelyolov8n.pt epochs200 imgsz640 batch16 device0逻辑说明--img 640或imgsz640表示输入图片缩放到 640×640。--batch 16是批次大小显存不够就往下调。--epochs 200是训练轮数农业数据集通常 150 到 300 轮能看到收敛。--data指向数据配置文件。--weights指定预训练权重从 COCO 预训练模型开始比从零训练效果好很多。--device 0表示用第一块 GPU多卡可以用0,1。训练过程中要盯几个指标box_loss和cls_loss应该稳步下降如果震荡剧烈可能是学习率太大或 batch 太小。mAP0.5在验证集上的曲线如果早早平了说明模型容量不够或者数据增强太弱。precision和recall要一起看单看一个容易被误导。参数怎么改如果显存充足把batch调到 32 或 64训练更稳。如果过拟合加--dropout或增大--weight_decay。如果欠拟合把--epochs加到 300 以上或者换更大的模型如yolov8m.pt。4. 避坑与排查标签转换和训练中的五个血泪教训4.1 现象训练 loss 一直是 nan原因VOC 转 YOLO 时坐标没归一化解决检查 txt 里的数值范围VOC 的 XML 里坐标是绝对像素值比如xmin120、xmax340。转 YOLO 格式时必须先算中心点和宽高再除以图片的宽和高得到 0 到 1 之间的小数。如果直接拿绝对坐标写进 txtYOLO 读取时会认为坐标超出范围loss 直接变 nan。排查方法是随便打开一个 txt 文件看每行后四个数是不是都在 0 到 1 之间。如果不是回去改转换脚本。4.2 现象训练时提示 “No labels found”原因txt 文件和图片没有放在对应目录解决检查路径映射YOLO 默认会在图片同级目录下找同名的.txt文件。如果你的图片在images/train/下标签在labels/train/下需要在数据配置文件里正确设置路径或者用--img-path和--label-path分别指定。常见错误是把所有 txt 放在一个文件夹里但图片分散在多个子目录导致路径对不上。解决方法是保持images和labels的目录结构完全镜像。4.3 现象mAP 一直很低但 loss 在降原因类别不平衡或标注框太小解决检查类别分布和框的尺寸葡萄叶片病害的标注框有时候会很小比如早期病斑只有几十个像素。YOLO 的默认 anchor 可能匹配不上这么小的框导致召回率低。解决方法是重新聚类 anchor或者改用 YOLOv8 的自适应 anchor 机制。另外如果健康叶片样本远多于病害样本模型会偏向预测健康类这时候要用--class-weights或者对少数类做过采样。4.4 现象训练到一半突然 OOM原因验证阶段 batch 太大或图片尺寸不一致解决调小 val batch 或统一 resizeYOLO 在训练和验证时都会占用显存验证阶段的 batch 默认和训练一致。如果训练时勉强能跑验证时可能就爆了。解决方法是在命令里加--val-batch 8或类似参数把验证 batch 调小。另外如果数据集里混入了分辨率特别大的图片letterbox 之后仍然很大也会导致 OOM。统一 resize 到 640 或 512 能缓解。4.5 现象推理时框的位置偏移原因训练时用了 mosaic 增强但推理没关解决确认推理配置Mosaic 增强会把四张图拼成一张训练时能提升泛化但推理时如果还开着框的位置会错乱。YOLOv5 和 YOLOv8 在推理时默认关闭 mosaic但如果你自己改了代码或者用了自定义推理脚本要确认augmentFalse。另外如果训练时用了rectTrue推理时也要保持一致否则长宽比处理方式不同会导致偏移。5. 进阶技巧用混淆矩阵和 PR 曲线定位模型短板训练完之后别只看一个 mAP 数字就收工。真正能帮你改进模型的是混淆矩阵和 PR 曲线。YOLOv8 在验证时会自动生成confusion_matrix.png和PR_curve.png放在runs/detect/val/目录下。混淆矩阵的行是真实类别列是预测类别对角线越深越好。如果发现黑腐病经常被预测成褐斑病说明这两个类在特征上太接近可能需要增加更多区分性强的样本或者调整损失函数里的类别权重。PR 曲线看的是每个类别的 precision 和 recall 权衡。曲线下的面积就是 AP所有类别的 AP 平均就是 mAP。如果某个类别的曲线早早掉下来说明这个类别的召回率不行模型漏检多。这时候可以降低置信度阈值或者专门对这个类别做数据增强。下面是一段用 Python 画自定义 PR 曲线的代码适合你想把多个模型的曲线画在一起对比import matplotlib.pyplot as plt from sklearn.metrics import precision_recall_curve, average_precision_score import numpy as np # 假设 y_true 是真实标签y_scores 是模型输出的置信度 # 这里用随机数据演示实际替换成你的验证结果 np.random.seed(0) y_true np.random.randint(0, 2, 1000) y_scores np.random.rand(1000) precision, recall, _ precision_recall_curve(y_true, y_scores) ap average_precision_score(y_true, y_scores) plt.plot(recall, precision, labelfAP{ap:.3f}) plt.xlabel(Recall) plt.ylabel(Precision) plt.title(Precision-Recall Curve) plt.legend() plt.grid(True) plt.savefig(pr_curve.png, dpi150)逻辑说明precision_recall_curve会返回不同阈值下的 precision 和 recall 数组average_precision_score直接算出 AP 值。画图时横轴是 recall纵轴是 precision曲线越靠近右上角越好。如果你有多个模型的结果把这段代码循环调用每条曲线加一个 label就能直观看出哪个模型在哪个类别上更强。参数怎么改y_scores换成你模型输出的置信度y_true换成对应的 0/1 标签。如果是多类别需要对每个类别单独算用 one-vs-rest 的方式。dpi控制图片清晰度投稿或写报告时调到 300。我自己的习惯是每次训练完先看混淆矩阵再看 PR 曲线最后才看 mAP。因为 mAP 是个平均数会掩盖某些类别的严重短板。有一次我训了一个葡萄病害模型mAP0.5 有 0.87看起来不错但混淆矩阵显示霜霉病的召回只有 0.6实际部署时漏检了很多。后来专门补了 500 张霜霉病样本重新训了一轮召回才拉到 0.85。从那以后我每次训完都强制走一遍混淆矩阵和 PR 曲线不敢只看一个数就交差。希望帮到你。本文还有配套的精品资源点击获取