ARTICLE DETAIL

资讯详情

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

农作物病害实例分割数据集实战:YOLOv8-seg训练与避坑指南

农作物病害实例分割数据集实战:YOLOv8-seg训练与避坑指南 简介这份农作物病害实例分割数据集面向农业AI诊断、精准农业监测及植物病理学交叉研究场景适合从事YOLO实例分割任务开发的中高级算法工程师与农业科技研究者使用。资源包共582个文件以290张jpg图像与290个txt标注文件为主另含1个yaml配置文件与1份docx说明文档压缩包约58.81MB目录结构清晰便于直接接入训练流程。数据集总计290张图片按训练集258张、验证集23张、测试集9张划分覆盖细菌性枯萎病、褐条病、花叶病三类典型病害标注采用YOLO多边形格式精确勾勒病害区域边界。读者可据此快速构建自动识别与分割植物病害区域的模型用于早期诊断、物联网实时检测及农业院校教学演示兼顾科研与落地应用价值。目前已有87人学习下载。1. 农作物病害实例分割数据集290 张图、3 类病害能不能撑起一个 YOLO 分割训练拿到一个只有 290 张图的实例分割数据集第一反应通常是「这么点数据能训出什么」。但如果你正在做农业病害 AI 诊断系统的原型验证或者要给 YOLOv8-seg、YOLO11-seg 这类模型跑通一条从标注到推理的完整链路这个农作物病害实例分割数据集反而是个合适的起点。它包含训练集 258 张、验证集 23 张、测试集 9 张标注格式为 YOLO 多边形分割覆盖 Bacterialblight细菌性枯萎病、BrownStreakDisease褐条病、MosaicDisease花叶病三个类别。图片来自农业图像采集格式为常见 JPEG/PNG。它解决的不是「训一个生产级大模型」的问题而是「让你在半天内把实例分割训练流程跑通、把多边形标注的坑踩一遍」的问题。适合农业科技方向的学生、做精准农业监测的算法工程师以及需要快速验证病害分割可行性的从业者。2. 拆开压缩包先看什么目录结构、标注格式与类别分布2.1 从文件名到目录先确认数据集的组织方式下载下来是一个 zip 包解压后你会看到图片文件和一份 docx 说明文档。从项目正文给出的文件名来看图片命名类似Mkundi-41-_JPG.rf.5ce28e63b4e056bec66c1f76ee5cf450.jpg这种带哈希后缀的命名方式说明图片经过了去重或平台化处理原始文件名中的Mkundi-41很可能是采集编号。常见做法是解压后先按训练/验证/测试三个子目录整理YOLO 分割任务的标准目录结构如下dataset/ ├── images/ │ ├── train/ # 258 张 │ ├── val/ # 23 张 │ └── test/ # 9 张 ├── labels/ │ ├── train/ # 对应的 .txt 标注文件 │ ├── val/ │ └── test/ └── data.yaml # 数据集配置文件如果你拿到的压缩包里图片是平铺的需要自己按说明文档里的划分数量拆分。我一般会先统计图片总数确认是 290 张再按 258/23/9 的比例移动文件。注意图片和标注文件必须同名只是扩展名不同——图片是.jpg标注是.txt这是 YOLO 格式的硬性要求。2.2 YOLO 实例分割标注长什么样YOLO 格式的实例分割标注和普通目标检测标注不同。目标检测的.txt每行是class_id x_center y_center width height而实例分割每行是class_id x1 y1 x2 y2 ... xn yn后面跟的是归一化后的多边形顶点坐标。一个标注文件里可以有多行每行代表一个实例。举个例子一张图片里有两片叶子分别感染了细菌性枯萎病标注文件就会有两行每行以0开头假设 Bacterialblight 是第 0 类后面跟各自的多边形点。0 0.412 0.335 0.445 0.312 0.478 0.356 0.461 0.401 0.423 0.398 0 0.712 0.535 0.745 0.512 0.778 0.556 0.761 0.601 0.723 0.598上面第一行表示一个 Bacterialblight 实例由 5 个顶点构成的多边形第二行是另一个同类实例。顶点数量不固定取决于标注时勾勒病害区域边界的精细程度。这里有个容易翻车的地方多边形顶点必须是归一化到 0~1 之间的浮点数且至少 3 个点才能构成一个面。如果你自己转换标注忘了归一化或者点数为 2训练时不会报错但 mask 会变成一条线或者空区域模型学不到东西。2.3 三个类别的分布与检查方法数据集包含三个类别Bacterialblight、BrownStreakDisease、MosaicDisease。在data.yaml里需要按顺序定义类别名称和对应的索引path: ./dataset train: images/train val: images/val test: images/test names: 0: Bacterialblight 1: BrownStreakDisease 2: MosaicDisease写完配置后建议先跑一个统计脚本看看每个类别的实例数量和图片分布。常见做法是用 Python 遍历所有标注文件统计每个类别的行数和涉及的图片数import os from collections import defaultdict label_dir dataset/labels/train class_names {0: Bacterialblight, 1: BrownStreakDisease, 2: MosaicDisease} class_count defaultdict(int) class_images defaultdict(set) for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for line in f: parts line.strip().split() if len(parts) 7: # class_id 至少3个点(6个坐标) continue cid int(parts[0]) class_count[cid] 1 class_images[cid].add(fname) for cid, name in class_names.items(): print(f{name}: {class_count[cid]} 个实例, 出现在 {len(class_images[cid])} 张图中)这段脚本的逻辑很直接逐行读取标注文件按类别 ID 累加实例数同时记录每个类别出现在哪些图片里。参数方面len(parts) 7这个判断是为了过滤掉格式异常的行——正常一行至少是 1 个类别 ID 加 3 个顶点共 7 个值。跑完你就能知道三个类别是否均衡。如果某个类别实例数特别少训练时需要考虑过采样或者类别权重。3. 用 YOLOv8-seg 跑通训练配置、命令与参数怎么改3.1 环境准备与模型选型实例分割任务在 YOLO 系列里对应的是-seg后缀的模型。YOLOv8-seg 是目前文档最全、社区支持最好的选择YOLO11-seg 也可以但如果你刚接触实例分割建议先用 YOLOv8-seg 把流程跑通。环境安装不复杂pip install ultralyticsUltralytics 包会自动处理依赖。安装完成后用yolo checks确认环境没问题。模型选型上yolov8n-seg.pt是最小的适合快速验证yolov8s-seg.pt或yolov8m-seg.pt精度更高但对显存要求也更高。290 张图的规模用 nano 或 small 版本就够了大模型反而容易过拟合。3.2 训练命令与关键参数训练命令本身不复杂但参数设置直接决定你能不能跑出有意义的结果yolo segment train \ datadataset/data.yaml \ modelyolov8n-seg.pt \ epochs100 \ imgsz640 \ batch8 \ lr00.01 \ patience20 \ projectruns/segment \ namecrop_disease_seg逐项说明data指向你的data.yamlmodel指定预训练权重Ultralytics 会自动下载epochs100对 258 张图来说足够配合patience20早停防止过拟合imgsz640是默认输入尺寸如果你的图片分辨率远大于此可以适当调大但显存占用会上升batch8是保守值显存够可以加到 16lr00.01是初始学习率小数据集不建议设太大。训练过程中重点关注mask mAP50和box mAP50两个指标前者反映分割质量后者反映检测框质量。如果 mask mAP 远低于 box mAP说明多边形标注可能有问题。3.3 训练过程中的监控与中断处理训练启动后终端会实时打印每个 epoch 的损失和指标。我一般会同时开一个 TensorBoard 或者直接看runs/segment/crop_disease_seg/下的results.csv。如果发现train/seg_loss持续下降但val/seg_loss开始上升就是过拟合的信号早停会帮你处理。另一个常见情况是 loss 直接变成 NaN多半是学习率太大或者标注里有非法值比如坐标超出 0~1 范围。这时候需要回头检查标注文件用脚本扫一遍所有坐标是否在合法区间内。import os def validate_labels(label_dir): issues [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname)) as f: for i, line in enumerate(f): parts line.strip().split() if len(parts) 7: issues.append(f{fname}:{i1} 点数不足) continue coords [float(x) for x in parts[1:]] if any(c 0 or c 1 for c in coords): issues.append(f{fname}:{i1} 坐标越界) if len(coords) % 2 ! 0: issues.append(f{fname}:{i1} 坐标数不是偶数) return issues problems validate_labels(dataset/labels/train) for p in problems[:20]: print(p) print(f共发现 {len(problems)} 个问题)这个检查脚本能帮你快速定位标注里的低级错误。坐标越界和点数不足是最常见的两类问题修掉之后训练稳定性会明显提升。4. 避坑与排查小数据集实例分割的五个血泪经验4.1 验证集只有 23 张指标波动大到怀疑人生现象每个 epoch 的val mask mAP50上下跳动超过 10 个百分点完全看不出收敛趋势。原因验证集太小23 张图的评估结果对单张图的预测质量极其敏感一张图分割失败就能拉低整体指标。解决不要只看单个 epoch 的指标看滑动平均或者最后 10 个 epoch 的趋势。如果条件允许从训练集里再划 20~30 张到验证集或者用交叉验证的方式评估。4.2 多边形标注点太多导致训练显存爆炸现象训练启动后显存占用远高于预期batch 调到 4 还是 OOM。原因实例分割的 mask 分支计算量和多边形顶点数相关如果标注时每个病害区域勾了上百个点mask 解码时的计算图会非常大。解决对标注做简化用 Douglas-Peucker 算法把多边形顶点数降到 20~30 个以内肉眼几乎看不出差别但显存占用能降不少。常见做法是在转换标注时加一步简化。4.3 类别不均衡导致小类别完全学不到现象训练完后发现 MosaicDisease 的 mask mAP 接近 0而 Bacterialblight 能到 0.6 以上。原因三个类别的实例数量差距大模型倾向于预测多数类。解决在data.yaml里给每个类别加权重或者用copy_paste数据增强把少样本类别复制粘贴到其他图上。Ultralytics 支持通过cls参数调整分类损失的权重也可以手动过采样少样本图片。4.4 图片和标注不同名导致静默跳过现象训练日志显示train: 0 images但明明图片就在目录里。原因YOLO 在加载数据时会检查图片是否有对应的.txt标注如果文件名不匹配比如图片是Mkundi-41.jpg但标注是Mkundi-41_JPG.txt这张图会被直接跳过而且不报错。解决写个脚本批量检查图片和标注的文件名是否一一对应把不一致的列出来手动修。4.5 测试集只有 9 张别用它调参现象在测试集上反复评估不同模型选了一个测试集指标最高的上线后效果差很多。原因9 张图的测试集统计意义极弱在上面调参等于过拟合测试集。解决测试集只在最终确定模型后跑一次中间的所有模型选择都基于验证集。如果验证集也不够就接受指标有噪声这个事实多看几个 epoch 的稳定性。5. 从训练到推理验证分割效果与导出部署模型训练完成后runs/segment/crop_disease_seg/weights/下会有best.pt和last.pt。best.pt是验证集指标最好的权重通常用它做推理。先拿几张测试集图片跑一下可视化确认分割 mask 是否贴合病害区域yolo segment predict \ modelruns/segment/crop_disease_seg/weights/best.pt \ sourcedataset/images/test \ saveTrue \ conf0.25 \ projectruns/predictconf0.25是置信度阈值低于这个值的检测结果会被过滤。跑完后去runs/predict下看带 mask 的可视化结果。如果发现 mask 边缘很粗糙说明训练还不够或者标注本身就不够精细。如果 mask 区域明显偏移检查一下推理时的imgsz是否和训练时一致——训练用 640推理也用 640不要随意改。确认效果后如果要在边缘设备上部署可以导出 ONNX 或 TensorRTyolo export modelbest.pt formatonnx imgsz640ONNX 格式通用性好TensorRT 在 NVIDIA 设备上推理更快。导出后建议用onnxruntime跑一遍推理确认输出和 PyTorch 版本一致。我一般会固定一个随机种子把同一张图分别用 PyTorch 和 ONNX 推理对比 mask 的 IoU超过 0.99 才认为导出无损。从那以后我每次拿到新的实例分割数据集都强制先跑一遍标注合法性检查再统计类别分布最后才启动训练。这三步花不了十分钟但能省掉后面几个小时的无效等待。希望帮到你。本文还有配套的精品资源点击获取
返回列表