ARTICLE DETAIL

资讯详情

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

茶叶病害数据集VOC+YOLO格式883张8类别:YOLOv8训练与避坑指南

茶叶病害数据集VOC+YOLO格式883张8类别:YOLOv8训练与避坑指南 简介本资源为茶叶病害目标检测数据集面向从事农业图像识别、深度学习模型训练的学生与算法工程师可用于分类与检测任务的模型训练、验证及算法对比实验。数据集采用Pascal VOC与YOLO双格式标注包含883张jpg图片及对应的883个xml和883个txt标注文件压缩包共约2000个文件、200.5MB另附少量说明文本方便直接接入主流检测框架。标注覆盖炭疽病、藻斑病、鸟眼斑病、褐斑病、灰斑病、健康叶、红叶斑病、白斑病共8个类别总框数884每张图仅含单片叶子适合单目标检测场景。目前已有886人学习下载可作为茶叶病害识别研究的基础数据帮助快速搭建训练流程并验证模型效果。1. 茶叶病害数据集 VOCYOLO 格式 883 张 8 类别一线工程师的落地拆解拿到「茶叶病害数据集 VOCYOLO 格式 883 张 8 类别.zip」这个标题很多人第一反应是「数据量不大直接丢进 YOLOv8 跑一遍就完事」。但真正做过农业病害检测的人都知道883 张、8 个类别平均每类一百张出头这个规模恰好卡在「能训出东西」和「一换场景就翻车」的临界点上。茶叶病害的难点不在模型而在数据本身病斑边界模糊、健康叶与早期病叶差异极小、田间背景干扰强。这个数据集的价值在于它同时给了 VOC 和 YOLO 两套标注省掉了格式转换的重复劳动适合想快速验证茶叶病害检测可行性、又不想从零打标的从业者。下面按「先看清数据 → 再跑通训练 → 再处理坑」的顺序讲透。2. 先看清 883 张 8 类别到底装了什么VOC 与 YOLO 双格式的差异与选型2.1 VOC 的 XML 和 YOLO 的 txt 到底差在哪VOC 格式每张图对应一个 XML 文件标注信息写在object节点里坐标是绝对像素值xmin, ymin, xmax, ymax。YOLO 格式每张图对应一个 txt 文件每行是class_id x_center y_center width height全部归一化到 0~1。两者描述的是同一件事但使用路径完全不同VOC 更适合做数据审查、可视化核对、转 COCO 或做其他框架的中间格式YOLO 格式是直接喂给 YOLOv5/v8/v11 训练脚本的。我一般拿到这种双格式包第一件事不是训练而是核对两套标注是否一致。因为有些数据集在转换时会出现类别 ID 错位、坐标越界、漏转某张图的情况。核对脚本不复杂但能省掉后面训练时「loss 正常但 mAP 死活上不去」的玄学排查。import os import xml.etree.ElementTree as ET voc_dir Annotations yolo_dir labels img_dir JPEGImages # 建立类别名到 id 的映射顺序必须和 data.yaml 里一致 classes [algal_leaf_spot, brown_blight, healthy, leaf_rust, red_leaf_spot, tea_mosquito, tea_red_mite, white_scab] cls2id {c: i for i, c in enumerate(classes)} mismatch [] for xml_file in os.listdir(voc_dir): if not xml_file.endswith(.xml): continue stem xml_file[:-4] tree ET.parse(os.path.join(voc_dir, xml_file)) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) voc_boxes [] for obj in root.findall(object): name obj.find(name).text.strip() 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) voc_boxes.append((cls2id[name], xmin, ymin, xmax, ymax)) txt_path os.path.join(yolo_dir, stem .txt) if not os.path.exists(txt_path): mismatch.append((stem, missing_txt)) continue with open(txt_path) as f: yolo_lines [l.strip().split() for l in f if l.strip()] if len(voc_boxes) ! len(yolo_lines): mismatch.append((stem, fcount {len(voc_boxes)} vs {len(yolo_lines)})) continue for (cid, xmin, ymin, xmax, ymax), yl in zip(voc_boxes, yolo_lines): y_cid int(yl[0]) xc float(yl[1]) * w yc float(yl[2]) * h bw float(yl[3]) * w bh float(yl[4]) * h # 反算回绝对坐标允许 1 像素误差 if abs((xmin xmax) / 2 - xc) 1 or abs((ymin ymax) / 2 - yc) 1: mismatch.append((stem, coord_mismatch)) break print(f总核对 {len(os.listdir(voc_dir))} 个 XML异常 {len(mismatch)} 条) for m in mismatch[:20]: print(m)这段脚本做三件事读 VOC 的绝对坐标读 YOLO 的归一化坐标把 YOLO 反算回绝对坐标做比对。参数上唯一需要你改的是classes列表顺序必须和后面data.yaml里的names完全一致否则类别 ID 会整体错位。如果输出异常条数超过总数的 2%建议先修数据再训练不要指望模型自己扛过去。2.2 8 个类别的分布决定了你的训练策略883 张 8 类平均每类 110 张左右但实际分布往往不均匀。茶叶病害里「健康叶」通常最多「茶红螨」「白瘿病」这类可能只有几十张。类别不平衡直接决定你要不要用 mosaic、copy-paste 增强以及要不要给稀有类加权。先跑一个分布统计import os from collections import Counter label_dir labels counter Counter() for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fh: for line in fh: if line.strip(): counter[int(line.split()[0])] 1 for cid in sorted(counter): print(fclass {cid}: {counter[cid]} boxes) print(总框数:, sum(counter.values()))如果某个类框数低于 80训练时建议在data.yaml里不做特殊处理而是在训练脚本里用cls损失加权或者对该类做离线过采样。我一般会先看分布再决定不盲目上增强——茶叶病害的病斑位置有强空间先验多在叶缘、叶尖过度 mosaic 会把病斑拼到不合理的位置反而让模型学到错误上下文。3. 从零跑通 YOLOv8 训练环境、data.yaml 与最小可复现命令3.1 环境配置Anaconda 下装 ultralytics 的稳妥路径热词里「yolo v8 anaconda环境配置要求」「yolo环境搭建minicode」出现频率很高说明环境这一步卡住的人不少。我的习惯是 conda 建独立环境Python 3.10PyTorch 按 CUDA 版本装最后装 ultralytics。不要用 pip 全局装版本冲突会让你怀疑人生。conda create -n tea_yolo python3.10 -y conda activate tea_yolo # 按你的 CUDA 版本选这里以 CUDA 11.8 为例 pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics8.1.0 pip install opencv-python lxml tqdm装完验证python -c import torch; print(torch.cuda.is_available(), torch.__version__) yolo checkstorch.cuda.is_available()返回 True 才算环境通了。如果返回 False先查驱动和 CUDA 版本匹配不要急着改代码。yolo checks会打印 ultralytics 版本、CUDA 可用性、依赖状态是排查环境问题的第一手信息。3.2 data.yaml 怎么写路径、类别名与缓存YOLOv8 训练靠data.yaml找数据。这个数据集是 VOCYOLO 双格式我们只用 YOLO 的 images 和 labels。目录结构建议整理成tea_dataset/ images/ train/ val/ labels/ train/ val/ data.yamldata.yaml内容path: /abs/path/to/tea_dataset train: images/train val: images/val names: 0: algal_leaf_spot 1: brown_blight 2: healthy 3: leaf_rust 4: red_leaf_spot 5: tea_mosquito 6: tea_red_mite 7: white_scab三个参数必须说清楚path用绝对路径相对路径在 ultralytics 不同版本里行为不一致train/val是相对path的路径names的 ID 必须和 txt 里的 class_id 严格对应。改完 yaml 后第一次训练 ultralytics 会生成train.cache/val.cache如果你后面改了标注但没删 cache训练用的还是旧数据——这是血泪经验改完标注记得删 cache。3.3 最小训练命令与关键参数883 张的规模YOLOv8n 或 YOLOv8s 足够不要上 l/x会过拟合。最小命令yolo detect train \ datatea_dataset/data.yaml \ modelyolov8s.pt \ epochs150 \ imgsz640 \ batch16 \ patience30 \ lr00.01 \ lrf0.01 \ mosaic1.0 \ close_mosaic15 \ projectruns/tea \ nameexp1参数逐个说epochs150配合patience3030 轮没提升就早停省时间imgsz640是 YOLOv8 默认茶叶病斑偏小如果显存够可以试 800但 883 张下 640 通常够用batch16按显存调8G 显存跑 s 模型 640 大概能到 16lr00.01是初始学习率小数据集不要太大close_mosaic15表示最后 15 轮关掉 mosaic让模型在真实分布上收敛这个对病斑定位精度影响明显。训练完看runs/tea/exp1/results.csv重点看metrics/mAP50-95和每一类的metrics/mAP50-95。如果整体 mAP 还行但某一类特别低回去看那一类的样本量和标注质量不要盲目加 epoch。4. 883 张小数据集的避坑清单从标注到推理的 5 个翻车点4.1 坑一类别 ID 错位导致 mAP 全乱现象训练 loss 正常下降但验证时 mAP 极低混淆矩阵里类别完全对不上。 原因VOC 转 YOLO 时类别名到 ID 的映射顺序和data.yaml的names不一致或者转换脚本里用了set导致顺序随机。 解决用 2.1 的核对脚本先跑一遍确认每个 txt 的 class_id 和data.yaml对应。转换时显式用有序列表不要用集合。4.2 坑二图片和标签文件名不匹配现象训练报No labels found或大量图片被跳过。 原因VOC 的 XML 文件名和图片文件名不一致或者 YOLO 的 txt 用了不同后缀。 解决统一用图片 stem 作为主键写脚本检查images/和labels/的文件名集合是否完全一致差集打印出来手动处理。4.3 坑三坐标越界与零面积框现象训练时警告corrupt labels或者某些框在可视化里跑到图外。 原因标注时框超出图片边界或 xminxmax 导致宽高为 0。 解决训练前做一次清洗把坐标 clamp 到[0, w]/[0, h]宽高小于 2 像素的框直接丢弃。茶叶病斑很小的框如果确实重要宁可放大标注范围也不要留零面积框。4.4 坑四验证集泄漏进训练集现象验证 mAP 高得离谱换一批新图推理效果断崖式下跌。 原因883 张里同一片叶子的多角度图被随机分到了 train 和 val模型记住了叶子而不是病斑。 解决按「叶片/拍摄批次」分组划分同一片叶子的图只能进一个集合。没有分组信息时至少按文件名前缀或拍摄时间做粗分组。4.5 坑五推理时置信度门限照搬默认值现象部署后漏检严重或者误检一堆健康叶。 原因YOLOv8 默认conf0.25但茶叶病害小目标多默认值不一定合适。 解决在验证集上扫一遍 conf 从 0.1 到 0.5画 P-R 曲线按你的业务需求选。宁可漏检少一点就调低宁可误检少一点就调高。这个没有标准答案取决于你是做预警还是做统计。5. 把 883 张用到极致小数据集的增强策略与验证技巧883 张 8 类想再往上提点精度靠的不是换更大的模型而是把数据增强和验证做细。我一般会做两件事一是针对茶叶病害的空间先验做定向增强二是用交叉验证代替单次划分来评估真实泛化。定向增强方面茶叶病斑多分布在叶缘和叶尖随机旋转和翻转是安全的但大幅度的透视变换和 mosaic 要谨慎。我的做法是保留 mosaic 但降低概率同时加degrees10、translate0.1、scale0.3这种温和的几何增强HSV 增强可以开大一点因为田间光照变化大。具体在训练命令里加yolo detect train \ datatea_dataset/data.yaml \ modelyolov8s.pt \ epochs200 \ imgsz640 \ batch16 \ degrees10 \ translate0.1 \ scale0.3 \ hsv_h0.02 \ hsv_s0.7 \ hsv_v0.4 \ mosaic0.8 \ close_mosaic20 \ projectruns/tea \ nameexp2_aughsv_s0.7和hsv_v0.4比默认值大是为了让模型适应不同光照下的病斑颜色变化。mosaic0.8而不是 1.0是给真实分布留空间。close_mosaic20比上一版多 5 轮让最后收敛更稳。验证技巧方面单次 train/val 划分在 883 张上波动很大换一次随机种子 mAP 可能差 3~5 个点。我习惯做 5 折交叉验证把 883 张按叶片分组后分 5 份轮流做验证。虽然训练时间乘以 5但得到的 mAP 均值和方差才是可信的。如果时间紧至少跑 3 个不同随机种子的单次训练看 mAP 波动范围波动超过 5 个点说明数据划分有问题先解决划分再谈调参。最后说一个我自己的习惯每次训完我一定把验证集里 mAP 最低的 20 张图导出来用yolo detect predict跑一遍肉眼看病斑框得对不对。模型指标是给汇报用的肉眼看到的漏检和误检才是部署后真正会遇到的。这个数据集不大但茶叶病害检测这个方向值得做——把数据清洗和验证做扎实883 张也能训出能用的模型。希望帮到你。本文还有配套的精品资源点击获取
返回列表