资讯动态

番茄病害识别数据集:YOLO格式解析与训练实战

发布时间:2026/10/5 11:32:57 来源:尧图企业网站定制
简介这是一份面向深度学习目标检测任务的高质量番茄病害识别数据集主要服务于使用YOLO系列、Faster RCNN、SSD等框架的算法工程师与科研人员。数据集包含斑萎病毒、早疫病、健康番茄、番茄赤霉病四大类别共2083张图片并已完成训练集、验证集与测试集划分。压缩包内共2000个文件以1999个txt标注文件和1个yaml配置文件为主txt文件格式与YOLO和VOC标准兼容yaml文件则集中指定类别信息可直接用于YOLOv5至YOLOv10等系列模型的训练。目前该资源已有368人学习整体包体约139.11MB标注文件命名规整便于批处理与二次开发。对于正在开展农业视觉识别项目或需要现成番茄病害数据集进行模型验证的开发者这份资源能有效省去数据采集与格式转换环节帮助快速启动训练与评估流程。1. 番茄病害识别数据集2083 张图、4 个类别为什么值得直接用来训 YOLO做农业目标检测的人大都有这个体会找图不难难的是图没标签标签格式还五花八门。番茄病害识别尤其典型——斑萎病毒、早疫病、番茄赤霉病在叶片上的病斑很接近标注错一类后面的 mAP 就会被拖垮。这份番茄病害识别数据集共 2083 张图、4 个类别斑萎病毒、早疫病、健康番茄、番茄赤霉病同时提供 YOLO 的 txt、VOC 的 xml 和指定类别信息的 yaml并且已经划好训练集、验证集、测试集改完路径就能直接喂给 YOLOv5 到 YOLOv10。适合两类人想用 YOLOv8 训练自己的数据集但还不熟悉格式的新手以及要做真实番茄病害检测落地的工程师。2. 读懂数据集内部txt、xml、yaml 在番茄病害检测里各管什么在跑 YOLOv8 之前第一步不是装环境而是先把手里的数据格式摸清楚。这份数据集里同时出现 .txt、.xml、.yaml 三种文件很多人第一次拿到会发懵到底哪个是给 YOLO 用的哪个是给 Faster R-CNN 用的哪个是训练时真正读的我按自己的习惯拆开讲一遍。2.1 YOLO 标签怎么看一行归一化坐标就是一个目标框YOLO 训练读的是 txt每一行对应一个目标框共 5 个数字类别 id、框中心点 x、框中心点 y、框宽、框高。前 4 个坐标全部除以原图宽高做了归一化所以你在 txt 里看到的永远是 0 到 1 之间的小数和图片分辨率无关。这也是 YOLO 系列算法能在不同输入尺寸下保持框一致性的原因。一个典型标签长这样0 0.4836 0.5672 0.0821 0.09040 表示类别序号对应 yaml 里 names 列表的第 0 项0.4836 表示框中心点位于图片宽度的 48.36% 处0.5672 是高度的 56.72%0.0821 和 0.0904 分别是框的宽度和高度占整张图的比例。想快速验证标签内容是否正常可以用下面这段脚本读一个 txtfrom pathlib import Path label_path Path(DSC03632_JPG.rf.4085f5bdaa58dfaf16650a16769dfc22.txt) for line in label_path.read_text().strip().splitlines(): parts line.split() if len(parts) ! 5: continue cls_id int(parts[0]) cx, cy, w, h map(float, parts[1:]) print(fclass{cls_id}, center({cx:.4f}, {cy:.4f}), size({w:.4f}, {h:.4f}))逻辑说明读取 txt 每一行并要求 5 个字段跳过空行和异常行把类别单独拎出来、坐标转浮点这样能快速确认标签内容。参数上len(parts) ! 5的判断很关键——Roboflow 导出偶尔会混入空行或多余空格直接按 5 个字段解析会抛异常加上这层过滤能让脚本在大部分脏数据下也能跑完。2.2 VOC xml 还原标注现场从 bndbox 到 yolo 字段的换算xml 是给 Faster R-CNN、SSD 或者自己写的转换脚本用的。VOC 格式记录的是真实像素坐标一个目标对应一个object块里面包含类别名和 bndbox 的四个角点。以下是这份数据集里 xml 的典型结构字段内容做了简化示意annotation foldervalid/folder filenameDSC03632_JPG.jpg/filename size width416/width height416/height depth3/depth /size object nameearly_blight/name bndbox xmin112/xmin ymin98/ymin xmax168/xmax ymax136/ymax /bndbox /object /annotationxml 与 yolo 的换算关系可以看下面的表VOC 字段YOLO 字段计算方式xmin / xmaxx_center(xmin xmax) / 2 / widthymin / ymaxy_center(ymin ymax) / 2 / heightxmax - xminwidth除以 widthymax - yminheight除以 height如果你的训练框架只认 VOC直接把 xml 丢进去如果用 YOLO则要按上面公式换算。这份数据集两者都给齐了也就是说你不需要自己写转换脚本但要明白两种格式的差异否则后面调整标签时容易把坐标系搞混。2.3 data.yaml 是关键入口names 顺序不对整个训练白做yaml 文件是 YOLO 训练真正读取的配置入口。它告诉 ultralytics 数据在哪、类别有几个、类别名叫什么。常见做法是长这样具体路径按你自己的目录改path: /home/user/tomato_disease train: images/train val: images/valid test: images/test names: 0: tomato_spotted_wilt_virus 1: early_blight 2: healthy 3: fusarium逻辑说明path 是数据集根目录train/val/test 是相对路径names 的键必须和 txt 第一列的 class id 严格对应。很多人只改 path 不改 names或者从网上复制一个类别列表结果训练时类别错位、验证 loss 乱跳。这里特别提醒第 0 类是什么、第 1 类是什么务必以随包的 names 顺序为准如果我上面示例里的英文名和你的 txt 第一列对不上请打开一个 txt 文件看第一列数字再回头核对 yaml。提示拿到数据集后第一件事是备份原始 labels 目录后面任何格式清洗或过滤脚本都可能在原文件上直接写留一份底稿才有后悔药。2.4 images/labels 目录结构已经划分好的 train/val/test 能省多少事YOLO 默认期望图片和标签放在同级目录的 images 与 labels 下像下面这样dataset/ ├── images/ │ ├── train/ │ ├── valid/ │ └── test/ ├── labels/ │ ├── train/ │ ├── valid/ │ └── test/ ├── data.yaml └── 其他说明文件这份数据集已经按训练集、验证集、测试集切好图片和 txt 标签一一对应省去自己写 train_test_split 的时间。新手最大的坑是自己划分时把图片复制到 train、标签却还在全量目录或者图片改名后标签没同步改名导致训练时“图片能找到、标签找不到”。拿到数据集后先确认 images 和 labels 的子目录数量一致再用后面的检查脚本扫一遍缺失比直接开训练稳妥得多。3. 用 YOLOv8 训练这份数据环境、命令与评估指标一次跑通格式看完就可以进训练阶段。这里用 ultralytics 的 YOLOv8 做例子因为上手门槛低而且命令习惯同样适用于 YOLOv9、YOLOv10 的接口如果你已经装了 YOLOv5也可以按同样的数据组织方式跑但下面以 v8 的 yolo 命令行为主。3.1 环境准备Ultralytics 安装与显存参考假设已经装好 Python 3.8 以上和 CUDA 环境安装命令很简单pip install ultralytics如果你用的是 PyTorch 2.x上面这一条会顺带装好对应版本的 torch 和 torchvision。显存比较紧张的话建议先装 CPU 版跑通数据流程再用 GPU 正式训练。对于 2083 张图、imgsz640 的情况我一般按下表预估显存模型batch16, imgsz640 显存参考适合场景YOLOv8n4~6 GB先跑通链路、验证数据YOLOv8s6~8 GB快速出基线YOLOv8m8~12 GB追求精度但显存有限YOLOv8l/x12 GB 以上精度优先这组数字是经验值不同驱动和 PyTorch 版本会有浮动。建议先 n 后 s等数据验证没问题再升级。若显卡只有 6 GBn 模型 batch 调到 8 也能稳跑。3.2 数据配置与启动训练用 yolov8n 先跑通链路把 data.yaml 里的 path 改成实际绝对路径执行yolo detect train data/path/to/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16 device0参数说明data 指向 yamlmodel 用预训练权重 yolov8n.pt它会下载 COCO 预训练模型做迁移学习起点epochs100 对 2083 张图来说足够收敛如果想先验证链路可以改成 20 跑完一轮再说imgsz640 是 YOLOv8 的默认输入尺寸batch16 根据显存调整显存不够先降到 8device0 指第一块显卡。用 Python 调用也一样from ultralytics import YOLO model YOLO(yolov8n.pt) results model.train( data/path/to/data.yaml, epochs100, imgsz640, batch16, device0, )训练开始后终端会打印每一轮的 box_loss、cls_loss、dfl_loss。正常情况三个 loss 都是下降趋势偶尔在某个 epoch 反弹也正常。真正要盯的是验证集指标mAP50、mAP50-95。前者是 IoU 阈值固定 0.5 的平均精度后者是 0.5 到 0.95 每隔 0.05 取一次阈值再平均更严格地反映框的定位质量。番茄病斑这类目标不算大我一般更看重 mAP50-95 是否有持续提升mAP50 对框位置的要求太宽容。3.3 训完怎么看mAP50、mAP50-95 与置信度阈值的关系训练结束后用 best.pt 在验证集上评估yolo detect val modelruns/detect/train/weights/best.pt data/path/to/data.yaml splitval这会输出每个类别的 P精确率、R召回率、mAP50、mAP50-95。健康番茄通常最好认因为背景简单、形态固定早疫病和斑萎病毒如果分数接近多半是病斑本身长得像。评估时还可以把 conf 阈值拖到 0.25看 P/R 曲线找到 P 和 R 的平衡点。如果 mAP50 能到 0.8 以上说明数据质量和标注一致性都不错可以继续加增强如果只有 0.3先回头查标签有没有错不要急着换大模型。4. 避坑排查YOLO 训练番茄病害数据集的 4 个常见翻车点数据集本身质量不错但训练过程该踩的坑一个都不会少。下面几条是我在类似病害检测项目里反复遇到的血泪经验每条都按“现象 → 原因 → 解决”写方便你对照排查。4.1 类别错位loss 正常但 mAP 只有 0.05先检查 txt 第一列现象训练 100 轮loss 降得很漂亮验证集 mAP 却在 0.05 附近打转。原因类别映射与 yaml 的 names 对不上模型把“早疫病”学成了“健康番茄”或者反过来。txt 里第一列的 0/1/2/3 是纯数字必须按 yaml 的顺序解释有些数据集下载后 yaml 被覆盖或者训练时改了类别索引。解决先统计所有训练标签里出现了哪几个类别号from collections import Counter from pathlib import Path counts Counter() for p in Path(labels/train).glob(*.txt): for line in p.read_text().splitlines(): if line.strip(): counts[int(line.split()[0])] 1 print(sorted(counts.items()))逻辑说明把每个 txt 第一列按类别号计数输出形如[(0, 623), (1, 488), (2, 402), (3, 570)]的结果。最大类别号如果大于 3或缺失某个序号说明 label 和 yaml 不一致先把类别理顺再训练。这一步建议放在任何格式转换之前做成本最低。4.2 标签缺失No labels found 的目录结构与命名核对现象训练命令执行后很快报 “No labels found in /path/images/train”但 images/train 里图片都在data.yaml 也指对了。原因YOLO 训练时按 yaml 只给了 images 路径它要求标签放在同级 labels 目录如果目录名不是 labels或者文件名做了裁剪就会找不到。解决先看目录结构再按 basename 核对for f in images/train/*.jpg; do base$(basename $f .jpg) [ -f labels/train/$base.txt ] || echo missing label: $f done这段脚本遍历 images/train 里的每张 jpg取出不带扩展名的文件名再检查 labels/train 下是否存在同名 txt。只要打印出 missing就去查是划分时漏拷还是改名不一致。Roboflow 导出的 txt 文件名很长肉眼很容易漏看用脚本扫一遍比眼睛靠谱。4.3 显存溢出batch 与 imgsz 配合模型的常见调法现象训练十几轮后报 CUDA out of memory有时同样 batch 下 n 模型能跑、s 模型就炸。原因占显存的不仅是参数还有特征图、梯度、优化器状态batch16 imgsz640 yolov8s 在 8 GB 显卡上本来就紧张。解决优先把 batch 降到 8还不行就把 imgsz 降到 512。imgsz 对显存的影响是平方级从 640 降到 512 能省出接近三分之一的空间。也可以在训练参数里加 cacheFalse避免 ultralytics 默认把图片缓存到显存导致峰值更高。yolo detect train datadata.yaml modelyolov8s.pt epochs100 imgsz512 batch8 cacheFalse这段命令把显存压力降了一档imgsz 越小速度越快代价是番茄病斑这类小目标的检测精度可能下降。所以我的习惯是先 n 模型验证流程确定能跑通再用 s 或 m 微调一上来就上大模型只会浪费调参时间。4.4 坐标越界txt 里混入负数或大于 1 的框怎么办现象验证时某几张图检测异常或者训练中 loss 偶发跳高。打开对应 txt发现 cx、cy、w、h 出现负数或超过 1。原因Roboflow 导出某些裁剪图时标注框超出了原图边界归一化后要么小于 0 要么大于 1。YOLO 训练时会把这类框算进损失造成梯度扰动。解决写一个过滤脚本把越界坐标修正到 0~1 内或者直接丢弃异常框from pathlib import Path def clean_label(txt_path: Path): lines [] for line in txt_path.read_text().splitlines(): parts line.split() if len(parts) ! 5: continue c, cx, cy, w, h map(float, parts) cx min(max(cx, 0.0), 1.0) cy min(max(cy, 0.0), 1.0) w min(w, 1.0) h min(h, 1.0) if w 0 and h 0: lines.append(f{int(c)} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) txt_path.write_text(\n.join(lines) \n) for p in Path(labels).rglob(*.txt): clean_label(p)逻辑说明读取每一行5 个字段校验后把中心点裁剪到 0~1宽高裁到 1.0 以内过滤掉空行和宽高为 0 的框再把结果写回原文件。注意这份脚本会覆盖原标签跑之前先备份 labels 目录坐标越界的框占比超过 5% 的话说明导出环节就有问题宁可重新导出也不要硬修。5. 进阶盘活标签可视化、数据增强与混淆矩阵调优训练能跑通只是第一步真正让模型在田间场景可用还要做三件事确认标签贴得准、增强策略贴合实际光照、用混淆矩阵找准病害对之间的误判。5.1 训练前先画框10 行代码验证标签与图片的对齐情况统计标签只能看出“数量对不对”看不出“框贴不贴病灶”。我一般会用 OpenCV 把验证集前 10 张图的框画出来肉眼扫一遍import cv2 from pathlib import Path img_dir Path(images/valid) label_dir Path(labels/valid) colors [(0, 255, 0), (0, 0, 255), (255, 0, 0), (0, 255, 255)] for img_path in list(img_dir.glob(*.jpg))[:10]: img cv2.imread(str(img_path)) h, w img.shape[:2] txt label_dir / (img_path.stem .txt) for line in txt.read_text().splitlines(): parts line.split() if len(parts) ! 5: continue c, cx, cy, bw, bh map(float, parts) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), colors[int(c)], 2) cv2.imwrite(fcheck_{img_path.name}, img)逻辑说明读取每张图按归一化坐标反算像素坐标并画矩形框。框的中心点和宽高换算成 x1/y1/x2/y2 后如果框明显偏移到叶片外说明标签本身有偏差先修数据再谈训练。5.2 增强参数怎么调大棚光照、叶片遮挡与翻转番茄病害图常见两类现场问题大棚逆光导致暗部多、叶片互相遮挡导致病斑不完整。YOLOv8 默认开了 mosaic 和部分 HSV 增强但对农业场景我会把色调、饱和度和亮度再放宽一点代码里直接写在 yaml 同级的增强配置中或训练时用参数覆盖model.train( datadata.yaml, epochs100, imgsz640, hsv_h0.015, hsv_s0.6, hsv_v0.5, degrees15, scale0.6, fliplr0.5, )参数说明hsv_h 控制色调偏移hsv_s 控制饱和度hsv_v 控制亮度。把 hsv_v 调到 0.5 可以让模型见过更多暗光叶片不至于只在实验室光照下有效degrees15 做小角度旋转模拟手持拍摄时轻微倾斜scale0.6 让目标缩放范围更大。需要注意的是增强太猛会把病斑颜色带偏反而引入误检所以要一边加一边看 mAP50-95 是否跟着涨。5.3 混淆矩阵是病害对调优的核心参照训练完的 runs/detect/train 目录下会生成 confusion_matrix.png这是我最先看的图。对番茄病害来说重点看早疫病和斑萎病毒、健康番茄之间有没有互相误判。如果早疫病频繁被分成健康说明病斑初期特征太弱需要增加早期样本或把置信度阈值调低如果斑萎病毒和早疫病互相混说明两者形态太接近单靠目标检测框架很难区分常见做法是加一个分类头或者在数据层面补充更多病斑细节。从那以后我拿到任何目标检测数据集都会先跑一遍可视化脚本再谈训练参数先确认数据没问题模型才可能可信。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑