
简介一套面向甘蔗病害识别场景的YOLO格式目标检测数据集包含约3,300张已标注图片覆盖健康、黄叶病、锈病等4个类别适合计算机视觉学习者和农业智能化研究人员进行模型训练。数据集已完成训练集、验证集、测试集划分附带show可视化脚本可方便查看标注与图片对应效果。压缩包共2,000个文件以jpg图像和txt标注文件为主1,679个标签、320张图片另有1个Python脚本大小约68.58MB目录结构清晰。已有148人学习下载。搭配作者博客中的YOLOv5改进实战专栏可了解从数据准备到模型改进检测的完整流程样本包含锈病、黄叶病等典型症状的田间实拍图特别适合迁移学习、病害识别等方向的实验与评估。1. 甘蔗病害目标检测3300 张 YOLO 标注图值不值得当成训练底子做甘蔗病害目标检测最卡人的往往不是模型而是标注数据。手里这份约 3300 张已标注的甘蔗病害图像是 YOLO 格式的现成训练底子解压后直接喂给 YOLOv8 就能训练不用下田采集也不用人工框标。对想快速出病害检测原型、又不想把两周时间耗在标框上的团队来说省掉的正是最枯燥的那段活。它的价值边界也要说透3300 张属于中小规模能撑起可演示、可调优的检测模型但别指望一步覆盖所有田间光照和病害阶段。我一般拿它做基座数据先跑通流程拿到基线再叠加实地采集的样本迭代。适合智慧农业算法工程师、农业院校病虫害课题组以及想评估甘蔗病害检测落地可行性的产品负责人。2. 把标注格式看得明明白白YOLO txt 坐标、目录结构与 data.yaml 的匹配规则YOLO 标注格式看着简单就一个 txt 文件几行数字但坑全藏在约定里。下面先把格式拆开讲清楚再给一套拿到数据后必做的体检流程。别急着开训先花十几分钟确认这份标注能被框架正确读进去后面省的调试时间远超过这个投入。2.1 一张图对应一个同名 txt类别 id 与归一化坐标的换算逻辑YOLO 检测格式的核心约定每张图像对应一个同名文本文件。图像是 IMG_0012.jpg同目录或对应 labels 目录下就有 IMG_0012.txtbasename 必须一致。txt 每行代表一个目标框0 0.3125 0.4167 0.2083 0.2778 1 0.1234 0.5678 0.0456 0.0890 0 0.7521 0.1833 0.0984 0.1120一行五个值类别 id从 0 开始加四个归一化坐标 x_center、y_center、width、height。三个容易忽略的点。第一坐标是除以图像宽高后的比例范围必须在 [0,1]否则训练 loss 直接出 NaN这是后面要展开的第一个大坑。第二中心点和宽高都是归一化后的想还原像素位置要按原图尺寸换算。第三类别 id 的顺序以数据包自带的 classes.txt 或 data.yaml 的 names 列表为准排在 index 0 的就是 0凭感觉猜会错位。换算逻辑不难原图 1920x1080人工框了一个左上角 (400,300)、右下角 (800,600) 的像素框cx(400800)/2/19200.3125cy(300600)/2/10800.4167w(800-400)/19200.2083h(600-300)/10800.2778。如果这份数据是用 LabelImg 或 X-AnyLabeling 导出 YOLO 格式坐标通常已经归一化如果是从 VOC 的 xml 自转的转换脚本里最容易忘的就是除以宽高坐标全变成像素值后面第 4 章专门讲。2.2 目录组织方式images/labels 分置与 data.yaml 三个关键字段单个 txt 看懂只是第一步框架是按目录约定读数据的。常见做法是 images 和 labels 平行各自分 train、val、testsugarcane_disease/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamltrain/val/test 的划分比例看数据包自带情况。有的包给好了三份目录有的只给全部图像和标签需要自己按约 8:1:1 划分。我习惯划分前先按类别分布做分层抽样避免某个病害类别全被分进 val那样验证集会失真。labels 目录和 images 目录要保持同名结构Ultralytics 读 train 图像目录时会自动把路径里的 images 换成 labels 去定位 txt目录名改乱会报 label not found。data.yaml 是训练入口Ultralytics 靠它定位数据和类别。三个关键字段train: ./images/train val: ./images/val test: ./images/test nc: 5 names: 0: red_rot 1: smut 2: white_leaf 3: mosaic 4: brown_stripenames 里的类别名我只列了甘蔗病害里最常见的几种做示意赤腐、黑穗、白叶、花叶、褐条实际命名以你手里包的 classes.txt 为准。nc 必须和 names 长度一致也必须和 txt 里出现的最大类别 id 1 一致三者对不上训练到一半就会报 index out of range。注意路径用相对路径时data.yaml 和 images、labels 的相对位置不能乱动如果把 data.yaml 挪到别处要么改用绝对路径要么用path:字段指定数据集根目录。2.3 拿到数据先做四步体检哪些问题必须在下刀前处理我拆过不少标注包经验是拿到手先跑一遍体检脚本把格式问题消灭在训练之前。四步数量核对、坐标边界、空标签、可视化抽检。前三步用一段脚本搞定from pathlib import Path img_dir Path(images/train) lbl_dir Path(labels/train) imgs sorted(list(img_dir.glob(*.jpg)) list(img_dir.glob(*.png))) txts sorted(lbl_dir.glob(*.txt)) img_names {p.stem for p in imgs} txt_names {p.stem for p in txts} print(fimages{len(imgs)} labels{len(txts)}) print(missing_label:, len(img_names - txt_names)) print(orphan_label:, len(txt_names - img_names)) oob, empty 0, 0 for t in txts: lines [ln.split() for ln in t.read_text().splitlines() if ln.strip()] if not lines: empty 1 for ln in lines: vals list(map(float, ln[1:5])) if any(v 0 or v 1 for v in vals): oob 1 print(foob_boxes{oob} empty_txts{empty})输出三组关键信息图像与标签数量差、越界框数量、空标签数量。missing_label 不为 0 说明有图没标训练会跳过但浪费样本orphan_label 不为 0 说明有多余 txt多半是标注工具残留。oob 只要大于 0 就必须修否则训练 loss 出 NaN 或 mAP 永远上不去。empty 的 txt 要区别对待放进 val 可以当背景负样本检验误报放进 train 会让模型在这张图上学“什么都不输出”量少没事多了直接拉低召回。可视化抽检我用 ImageDraw 或 OpenCV 把框画回图上随机抽 60 张重点看三类样本病斑边缘不清晰的、互相遮挡的、尺寸很小的目标。框偏离病斑边缘超过半个病斑的样本占比大于 5%这份标注就得先修再训这个投入比训练十轮后发现效果不对再回头便宜得多。3. 用这份数据训练 YOLOv8 模型环境配置、训练命令与指标判读格式体检过了、目录结构摆好了就可以让这 3300 张标注真正发挥作用。下面从环境安装一路走到推理验证每一步给出可直接复制的命令并解释为什么这么设。3.1 环境准备ultralytics 安装与预训练权重选型训练 YOLOv8 最少只需要 ultralytics 一个库它会连带装好 PyTorch。Python 建议 3.9-3.11PyTorch 2.x 起步。CPU 也能训但 3300 张图 imgsz640 训 100 轮要十几个小时有 NVIDIA 显卡务必装 CUDA 版装完先验证pip install ultralytics python -c import torch; print(torch.cuda.is_available())返回 True 才继续。模型选型上甘蔗病斑在整幅田间图里经常只占很小面积属于小目标为主的任务。我一般用 yolov8s 起步yolov8n 对极小目标漏检严重yolov8m 以上在 3300 张规模下容易过拟合s 是性价比平衡点。显存只有 4-6G 就退回 n 或把 imgsz 降到 512。预训练权重直接用官方 yolov8s.pt它在 COCO 上学到的纹理和边缘表征对病害识别是有迁移价值的比从零训练收敛快得多。3.2 训练命令逐行拆解epochs、imgsz、batch 的取值逻辑命令行标准写法yolo taskdetect modetrain \ modelyolov8s.pt \ datasugarcane_disease.yaml \ epochs120 imgsz640 batch16 \ patience20 workers4 device0参数建议值取值逻辑modelyolov8s.pt用 COCO 预训练权重做起点不是从零建模型imgsz640甘蔗病斑小640 是底线降到 512 会明显掉小目标精度batch16看显存显存不够降到 8 或 4同时拉长 epochs 补偿梯度噪声epochs1203300 张配 batch16 约 200 step/轮120 轮足够配合早停收敛patience20验证集 mAP 连续 20 轮不涨就停workers4Windows 上建议 0-2防 DataLoader 报错等价 Python 写法便于在训练前后插入自定义逻辑from ultralytics import YOLO model YOLO(yolov8s.pt) model.train( datasugarcane_disease.yaml, epochs120, imgsz640, batch16, patience20, workers4, device0, projectruns/sugarcane, nameexp1 )epochs 别盲目设大。300 轮但 patience 设大了只会把时间浪费在过拟合后的指标震荡上。早停的意义在于验证集指标连续不涨时自动截断把剩下的时间留给调参而不是空转。3.3 训练过程看什么指标损失曲线、mAP50 与 mAP50-95训练开始后终端每轮打印一列指标关键四列是 box_loss、cls_loss、mAP50、mAP50-95。box_loss 和 cls_loss 持续下降说明模型在正常学习如果某轮后 loss 开始反弹而 mAP 不再涨过拟合开始了早停会在附近截断。mAP50 是 IoU 阈值 0.5 下的平均精度回答“框大概框中了没有”。病害检测以发现为目标mAP50 是核心指标。mAP50-95 把 IoU 从 0.5 到 0.95 平均对框的精确位置更敏感。甘蔗病斑边界天然模糊mAP50-95 通常比通用数据集低一截不用慌。我自己的参照线mAP50 在 0.75 以上、mAP50-95 在 0.45 以上这个模型就有田间试运行的价值如果 mAP50 不到 0.6先回看标注质量而不是急着调参。训练结束在 runs/sugarcane/exp1/weights/ 下生成 best.pt 和 last.pt。best.pt 是验证集最优权重后续推理、部署都用它。results.png 里是 loss 和 PR 曲线的汇总建议每条都扫一眼PR 曲线右下角明显塌陷说明召回差对应漏检多要去补小目标和遮挡样本。3.4 一次推理验证把权重跑到真实图片上指标抽象把检测框画到图上才直观from ultralytics import YOLO model YOLO(runs/sugarcane/exp1/weights/best.pt) results model.predict( sourcefield_test/, # 目录、单张图或视频都行 conf0.30, # 置信度阈值病害场景 0.25-0.35 是安全区间 imgsz640, saveTrue, save_txtTrue )conf 设 0.30 是平衡点太低会把健康叶片的纹理误报成病害太高会漏掉早期小病斑。结果在 runs/detect/predict/ 下。这一步不只看效果也是评估标注质量的反馈回路如果推理框明显比标注框大一圈或同一目标框的位置反复晃说明这个类别的标注本身不一致回头修标注比加数据更划算。4. 避坑指南甘蔗病害标注数据最常见的五个翻车现场这章是拆数据包、跑训练踩出来的记录每条按现象、原因、解决展开复现时遇到同类问题直接照方抓药。4.1 标签坐标越界训练 loss 直接爆成 NaN现象训练到第 2-5 轮box_loss 突然变成 nan之后所有指标全是 nan训练中止。原因txt 里有框的归一化坐标大于 1最常见的来源是 VOC 转 YOLO 时忘了除以图像宽高。比如原图 1920 宽框宽 800 像素转换后直接写成 800 而不是 0.4167。解决用 2.3 节的体检脚本定位越界文件逐个框重新归一化如果是整批转换出错回到转换脚本补上除以宽高的逻辑重新生成所有标签别在单个文件上打补丁。4.2 类别 id 错位模型把黑穗病认成赤腐病现象训练 loss 正常、mAP 也正常但推理结果张冠李戴某些类别被稳定地认成另一个。原因data.yaml 的 names 顺序和导出标注时用的顺序不一致txt 里第一列写 0data.yaml 说 0 是赤腐病实际标注时 0 指的是黑穗病。解决训练前随机开几个 txt和包内 classes.txt 或 data.yaml 逐个 id 核对。顺序错了就写脚本做 id 映射改 txt 或改 data.yaml 二选一改完重跑体检脚本确认没有越界 id。4.3 空标签图片混进训练集验证 mAP 虚高真实场景误报爆炸现象val mAP 高得离谱但换到真实田块推理误报率完全不能接受。原因数据包里“有图无框”的干净样本被分进了 val模型只要学“什么都不检测”就能拿高分验证指标完全失真。解决先把空标签 txt 单独筛出来。数量不大统一放到 val 当负样本注意这会略微拉低真实场景的置信度数量很大说明采样阶段把健康田块成片拍进来了这类负样本应该少量均匀撒进 train 和 val而不是堆成一堆。4.4 小目标病斑漏检imgsz 和最小框不匹配现象mAP50 能看recall 在 0.3 附近早期小病斑大面积漏检。原因病斑在 1920x1080 原图里可能只有 30x30 像素resize 到 640 后只剩 10x10特征几乎被压没。YOLOv8 对极小目标本来就是弱项。解决第一imgsz 提到 768 或 896显存够就上 896小目标召回会明显回升第二统计所有标注框的面积分布如果大量框小于最终输入尺寸的 3%考虑切片推理切块检测再合并结果第三把小目标样本单独过采样这个放到第 5 章。4.5 数据增强把病斑颜色洗没了现象训练集 mAP 正常验证集和真实场景都掉点尤其红褐色病斑几乎失明。原因Ultralytics 默认开 hsv_h、hsv_s、hsv_v 颜色增强色相偏移过大会把赤腐病的红棕洗成健康绿模型学到的是增强后的伪分布。解决训练参数里收窄颜色增强幅度。病害这类颜色敏感任务我一般用 hsv_h0.01、hsv_s0.3、hsv_v0.3保留几何增强。调完看 runs 下 train_batch*.jpg 的增强预览图确认病斑颜色没有被破坏再开训。5. 把 3300 张标出上万张的效果类别不均衡、数据增强与迁移学习数据量就这么多想再上一个台阶得从数据利用效率下手。下面讲三件事盘类别家底、增强怎么不伤病害特征、迁移学习怎么用才划算。5.1 先做类别分布统计再决定要不要调 loss训练前把每个类别的框数量盘一下from collections import Counter from pathlib import Path counts Counter() for t in Path(labels/train).glob(*.txt): for ln in t.read_text().splitlines(): if ln.strip(): counts[int(ln.split()[0])] 1 print(dict(sorted(counts.items())))输出形如 {0: 1800, 1: 620, 2: 380, 3: 145, 4: 95}具体数值以你拿到的包为准。对照 data.yaml 的 names 就能看出哪个类别框数明显偏少。甘蔗病害数据常见的失衡是某一种高发病害占了大半另一种早期症状只有几十框。我的处理分三档框数中等偏少过采样该类图片就够不用动 loss框数特别少少于一百框先查标注质量再看有没有同源数据可补硬训只会让模型把它学成噪声整体失衡但每类都过百框可以调 cls_loss 权重但实际经验是过采样和增强更可控、更直观。过采样的实现很简单把稀有类别的图片连同标签复制一份进训练目录。注意 YOLO 不会自动去重同一个文件名的两次出现以最后一次读取为准所以复制后要把文件名改掉比如加 _dup 后缀。这样做比调 loss 权重直接因为模型确实多看了这些样本。5.2 增强策略要贴着甘蔗病害的物理特征来增强不是越多越好要让模型看到真实田间会出现的变化。甘蔗病害检测有三类增强是安全的几何类旋转正负 15 度以内、平移、缩放、翻转模拟拍摄角度变化亮度对比度扰动模拟早中晚光照差异高斯噪声和模糊模拟手机对焦不准。要极其小心的是颜色偏移甘蔗病害诊断往往就靠颜色红棕的赤腐、黑色的黑穗、黄化的花叶色相偏移等于把诊断依据抹掉。实操直接在训练参数里指定强度model.train( datasugarcane_disease.yaml, epochs150, imgsz640, batch16, hsv_h0.01, hsv_s0.3, hsv_v0.3, degrees10, translate0.1, scale0.4, fliplr0.5, mosaic1.0 )degrees 设 10 而不是更大因为甘蔗叶片是长条状旋转角度太大会生成田间不存在的朝向模型会把朝向当成特征去学换场景就崩。mosaic 拼接增强保留默认它能让模型在遮挡和小目标上更鲁棒。核心权衡只有一句话几何和光照增强可以放开颜色与形态相关的增强必须克制这是病害检测和通用目标检测最大的区别。5.3 迁移学习预训练权重和冻结骨干的正确节奏3300 张属于小数据集从零训练容易过拟合正确做法是从 COCO 预训练权重起步。加载 yolov8s.pt 时框架会自动替换最后的检测头保留骨干特征提取能力。这里有个节奏问题我一般前 30 轮冻结骨干只训检测头让头先学会用现有纹理特征输出病害框30 轮后解冻全部参数用更小学习率微调骨干。冻结骨干能防止梯度噪音在小数据集上扰动骨干训练更稳速度也更快。# 第一阶段冻结骨干只训检测头 model YOLO(yolov8s.pt) model.train(datasugarcane_disease.yaml, epochs30, freeze10, ...) # 第二阶段解冻微调 model YOLO(runs/sugarcane/exp1/weights/best.pt) model.train(datasugarcane_disease.yaml, epochs120, lr00.001, ...)freeze10 表示冻结前 10 层骨干。想确认到底冻了哪些层加载模型后打印 model.model 结构对照参数名看骨干范围不同 YOLOv8 版本的层数命名略有差异以你装的版本为准。显存小的时候冻结骨干还有个附带好处梯度不需要回传骨干显存占用明显下降batch 可以适当加大。解冻阶段把初始学习率从 0.01 降到 0.001否则骨干在微调初期被大步长扰动loss 会反弹。整个策略的目标是保持 COCO 学到的通用特征同时尽可能拟合甘蔗病害的纹理和边缘。6. 验证别只信指标野外复现、混淆矩阵与一个收敛习惯训练跑完只是开始真实病害检测在田里不在验证集上。最后给三个验证与调试的习惯我每次都会强制走一遍。6.1 野外复现测试与混淆矩阵权重落地的第一关是换场景。我习惯拿手机在田间、温室、实验室各拍三五十张覆盖晴天正午、阴天、傍晚三种光照直接喂给 best.pt。这一步暴露两类问题正午强光把浅色病斑洗白模型漏检低照度下绿色通道噪声放大误报上升。对应解法是回训练数据补对应光照的样本或加强亮度扰动重训。第二关看混淆矩阵。训练生成的 confusion_matrix.png 里对角线以外的值就是混淆对甘蔗病害里最经典的组合是赤腐病初期和褐条病颜色纹理都接近。如果某对类别混淆率超过 5%先别急着加数据回看这两类的标注是不是早期样本标混了标注噪声是混淆矩阵异常的常见元凶修标注比加数据便宜得多。6.2 一个收敛习惯先体检、后冻结、再看矩阵我拆标注数据包有个固定习惯。第一步永远是体检脚本确认格式、坐标、类别映射干净第二步永远是冻结骨干跑 30 轮拿一个不震荡的基线第三步才是全量微调和野外复现。这三步走完再考虑数据增强、类别权重这些精细化手段。这一套流程走下来3300 张标注数据的价值能榨到八九成剩下那部分要靠你自己下田补拍的实地样本来填这也是模型真正落地必须走的路。拿到这份数据后直接按第 3 章的流程跑一个基线再按第 4 章排查、按第 5 章提精度——数据是死的流程是活的希望帮到你。本文还有配套的精品资源点击获取