首页/新闻资讯/正文详情

柑橘病害检测数据集:2814张VOC+YOLO双格式,4类病害YOLOv8训练实战

发布时间:2026/9/26 13:10:38 来源:云帆数科 栏目:资讯中心
柑橘病害检测数据集:2814张VOC+YOLO双格式,4类病害YOLOv8训练实战
简介这份数据集面向从事果蔬病害识别、农业视觉检测与深度学习目标检测的开发者与研究者提供橙子、橘子、桔子果实病害的标注图像可用于训练和验证YOLO、Faster R-CNN等检测模型。资源共2000个文件以1999个Pascal VOC格式xml标注文件和1个说明txt为主压缩包约82.45MB同时提供对应的YOLO格式txt标注图片与标注一一对应省去格式转换环节。标注类别共4类分别为blackspot、canker、fresh、grenning覆盖黑斑病、溃疡病、新鲜果实与青果等典型状态需注意标注对象为果实病害而非叶片病害。目前已有504人学习下载适合需要快速构建果实病害检测基线、开展模型对比实验或扩充农业数据集的研究者直接使用可有效减少数据采集与标注成本。1. 柑橘病害检测数据集2814 张 VOCYOLO 双格式4 类病害一次说清果园里最怕的不是虫是叶子上一块不起眼的黄斑。等它扩散成片果子基本就废了。柑橘类作物橙子、橘子、桔子的病害识别难就难在早期症状和缺素、日灼、药害长得太像人眼在田间地头根本分不清。这份 2814 张、4 类别的柑橘病害检测数据集把 VOC 和 YOLO 两套标注格式都打包好了拿到手就能直接喂给检测模型跑训练。它适合谁做农业 AI 落地的算法工程师、搞智慧果园课题的研究生、以及需要快速验证检测方案的产品团队。不用自己扛相机下地拍几千张再一张张框省下的时间够你把模型结构调三轮。数据集这东西标注质量比数量重要2814 张不算大但 4 类病害的边界框如果标得干净小样本也能出活。2. 数据集拆包与格式解析VOC 和 YOLO 到底怎么选2.1 两套格式的目录结构与字段含义解压之后你会看到典型的双格式布局。VOC 格式走的是 PASCAL VOC 那套老规矩每张图对应一个 XML 文件里面存着图片尺寸、目标类别和边界框的左上角右下角坐标。YOLO 格式则是每张图配一个 txt每行一个目标格式是类别索引 中心x 中心y 宽 高全部归一化到 0 到 1 之间。这两种格式没有谁绝对好取决于你用的框架。YOLOv5/v8/v11 系列原生吃 YOLO txtFaster R-CNN、SSD 这类走 VOC XML 更顺。数据集同时给两套省去了自己写转换脚本的麻烦但要注意两套标注必须严格对应同一批图不能一个格式里多标了、另一个漏标了。常见做法是先检查图片数量和标注文件数量是否一致。VOC 下Annotations文件夹的 XML 数应该等于JPEGImages里的图片数YOLO 下labels里的 txt 数也应该等于images里的图片数。差一个都说明有漏标或多余文件训练时可能报莫名其妙的错。2.2 用脚本验证标注完整性拿到数据集第一件事不是急着训练是验一遍标注。下面这段 Python 脚本同时检查 VOC 和 YOLO 两套标注的完整性包括图片与标注文件是否一一对应、YOLO 坐标是否越界、类别索引是否超出范围。import os import xml.etree.ElementTree as ET from pathlib import Path # 数据集根目录按实际解压路径改 ROOT Path(./citrus_disease_dataset) VOC_IMG_DIR ROOT / VOC / JPEGImages VOC_ANN_DIR ROOT / VOC / Annotations YOLO_IMG_DIR ROOT / YOLO / images YOLO_LBL_DIR ROOT / YOLO / labels # 4 类病害索引 0-3按你的 data.yaml 顺序核对 NUM_CLASSES 4 def check_voc(): imgs {p.stem for p in VOC_IMG_DIR.glob(*.jpg)} anns {p.stem for p in VOC_ANN_DIR.glob(*.xml)} missing_ann imgs - anns missing_img anns - imgs print(f[VOC] 图片 {len(imgs)} 张标注 {len(anns)} 个) if missing_ann: print(f 缺标注的图: {list(missing_ann)[:5]}) if missing_img: print(f 缺图的标注: {list(missing_img)[:5]}) # 抽查 XML 里的类别名 classes set() for xml_path in list(VOC_ANN_DIR.glob(*.xml))[:50]: tree ET.parse(xml_path) for obj in tree.findall(object): classes.add(obj.find(name).text) print(f XML 中出现的类别: {classes}) def check_yolo(): imgs {p.stem for p in YOLO_IMG_DIR.glob(*.jpg)} lbls {p.stem for p in YOLO_LBL_DIR.glob(*.txt)} print(f[YOLO] 图片 {len(imgs)} 张标签 {len(lbls)} 个) bad_lines 0 for lbl_path in YOLO_LBL_DIR.glob(*.txt): with open(lbl_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad_lines 1 continue cls_id int(parts[0]) coords [float(x) for x in parts[1:]] if cls_id NUM_CLASSES or any(c 0 or c 1 for c in coords): bad_lines 1 print(f 异常标签行数: {bad_lines}) if __name__ __main__: check_voc() check_yolo()这段脚本的逻辑很直白先做集合差集找出缺失配对再抽查 XML 里的类别名是否和预期一致最后逐行扫 YOLO 标签检查格式和数值范围。参数方面ROOT改成你解压后的实际路径NUM_CLASSES必须和你的data.yaml里nc保持一致。如果输出里出现缺标注或异常行先别往下走回去把数据修干净。我见过太多人跳过这步训练 loss 不降排查半天最后发现是某个 txt 里多了一行空行。2.3 生成 YOLO 训练用的 data.yamlYOLO 系列训练需要一个 yaml 描述文件告诉框架去哪找图、有几类、类名是什么。这份数据集是 4 类但具体类名比如是“黄龙病”“溃疡病”“炭疽病”“健康叶”还是别的组合以你解压后classes.txt或 XML 里实际出现的为准。下面是一个模板# citrus_disease.yaml path: ./citrus_disease_dataset/YOLO # 数据集根目录 train: images/train # 训练集图片相对路径 val: images/val # 验证集图片相对路径 test: images/test # 测试集没有可删掉这行 nc: 4 # 类别数必须和标签里的最大索引1一致 names: # 类名顺序必须和标签索引严格对应 0: disease_a 1: disease_b 2: disease_c 3: disease_d这里最容易翻车的是names的顺序。YOLO 标签里存的是数字索引框架靠names把索引映射回可读类名。如果索引 0 在标签里代表“溃疡病”你 yaml 里写成“健康叶”模型学到的就是错的映射推理时全乱。改完 yaml 后用python -c import yaml; print(yaml.safe_load(open(citrus_disease.yaml)))快速验证语法没写错。3. 从零跑通 YOLOv8 训练参数配置与显存控制3.1 环境准备与数据集划分训练之前先把环境搭好。YOLOv8 用 ultralytics 包一条命令装完。数据集如果没预先划分 train/val需要自己按比例切分常见是 8:1:1 或 7:2:1。柑橘病害这类样本如果某类病害特别少划分时要保证每个子集里都有该类样本否则验证集里缺类mAP 算出来没意义。# 安装 ultralytics建议 Python 3.9 pip install ultralytics # 如果数据集没有划分用这个脚本按 8:1:1 切分并保持类别分布 python - EOF import random, shutil from pathlib import Path src_img Path(./citrus_disease_dataset/YOLO/images) src_lbl Path(./citrus_disease_dataset/YOLO/labels) dst_root Path(./citrus_disease_dataset/YOLO) imgs sorted(src_img.glob(*.jpg)) random.seed(42) # 固定种子保证可复现 random.shuffle(imgs) n len(imgs) n_train int(n * 0.8) n_val int(n * 0.1) splits { train: imgs[:n_train], val: imgs[n_train:n_train n_val], test: imgs[n_train n_val:] } for split, files in splits.items(): (dst_root / images / split).mkdir(parentsTrue, exist_okTrue) (dst_root / labels / split).mkdir(parentsTrue, exist_okTrue) for img in files: shutil.copy(img, dst_root / images / split / img.name) lbl src_lbl / (img.stem .txt) if lbl.exists(): shutil.copy(lbl, dst_root / labels / split / lbl.name) print(f{split}: {len(files)} 张) EOF划分脚本里random.seed(42)是为了让每次运行结果一致方便复现实验。n_train、n_val按 8:1:1 算剩下的给 test。注意复制标签时用了if lbl.exists()因为有些图可能确实没有目标纯背景图这种图在 YOLO 里对应空 txt 或没有 txt训练时框架会当负样本处理但数量不能太多否则模型偏向预测背景。3.2 训练命令与关键参数解读环境好了、数据划分完了直接上训练命令。下面这条是 YOLOv8n 的典型起手式适合先跑通流程看效果再换大模型。yolo detect train \ data./citrus_disease.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ project./runs/citrus \ nameexp1 \ device0逐个说参数。data指向刚才写的 yaml。modelyolov8n.pt是 nano 版预训练权重参数量小、训练快适合先验证数据质量如果 mAP 上不去再换yolov8s.pt或yolov8m.pt。epochs100是上限实际靠patience20早停——验证指标 20 轮不提升就停省时间。imgsz640是输入分辨率柑橘病害的斑点有时候很小640 够用但如果你的图里病斑占比极小可以提到 1024代价是显存翻倍。batch16在 8GB 显存上跑 640 分辨率基本稳爆显存就降到 8 或 4。device0指定第一块 GPUCPU 训练把这项去掉或写cpu但速度会让你怀疑人生。训练启动后重点盯三个输出box_loss、cls_loss和mAP50。box_loss 管框得准不准cls_loss 管分类对不对mAP50 是综合指标。正常情况 box_loss 和 cls_loss 应该稳步下降如果震荡剧烈多半是学习率太大或 batch 太小把lr0降到 0.001 试试。3.3 推理验证与结果解读训练完在runs/citrus/exp1/weights/下会有best.pt和last.pt。best 是验证集上表现最好的那轮last 是最后一轮。推理用 best。# 对单张图推理 yolo detect predict \ model./runs/citrus/exp1/weights/best.pt \ source./test_images/leaf_001.jpg \ conf0.25 \ saveTrue # 对整个文件夹批量推理并输出统计 yolo detect predict \ model./runs/citrus/exp1/weights/best.pt \ source./test_images/ \ conf0.25 \ saveTrue \ save_txtTrueconf0.25是置信度阈值低于这个值的框不输出。柑橘病害检测里这个值别设太高0.25 到 0.3 比较稳设 0.5 会漏掉早期轻微病斑。save_txtTrue会把预测结果存成 YOLO 格式的 txt方便你后续做误检分析。拿到结果后别只看 mAP 数字把预测错的图挑出来看是漏检病斑没框出来还是误检把健康部位框成病害。漏检多就加数据或调低 conf误检多就检查标注里是不是把相似症状标混了。4. 避坑与排查标注、训练、推理里最容易翻车的五件事4.1 类别索引错位导致模型学反现象训练时 loss 正常下降但推理结果里类别全是乱的明明该是 A 病却预测成 B 病。原因YOLO 标签里的数字索引和data.yaml里names的顺序没对齐。比如标签里 0 代表溃疡病yaml 里 0 写成了炭疽病。解决打开任意一个 txt 标签看第一列数字再对照 yaml 的 names 顺序逐个核对。最稳妥的办法是从 VOC 的 XML 里提取类别名按字母序或固定顺序生成 names再确保 YOLO 标签是按同一顺序转的。4.2 图片和标签文件名不匹配现象训练报错No labels found或某张图被跳过。原因YOLO 要求图片和标签同名不同后缀leaf_001.jpg必须对应leaf_001.txt。如果转换脚本里改了名或漏了复制就会断链。解决跑一遍第 2 章的完整性检查脚本重点看imgs - lbls的差集。另外注意大小写Linux 下Leaf_001.jpg和leaf_001.txt不匹配Windows 下不区分但换到服务器就炸。4.3 小目标病斑在 640 分辨率下丢失现象mAP50 卡在 0.5 左右上不去可视化发现小病斑漏检严重。原因柑橘早期病斑可能只占几十个像素640 输入下经过下采样后特征几乎消失。解决把imgsz提到 1024 或 1280同时 batch 相应调小或者在数据增强里开启mosaic和copy_paste让模型多见小目标组合。如果显存实在不够用切片推理SAHI在推理阶段切图检测训练阶段仍用 640。4.4 验证集里某类样本为零现象训练日志里某一类的 mAP 始终是 0 或 nan。原因划分数据时没做分层抽样某类病害恰好全被分到训练集验证集里一个都没有。解决划分时按类别分层保证每个子集里每类至少有若干样本。如果某类总数本来就极少比如不到 50 张考虑合并相似类别或做过采样别硬训。4.5 过拟合训练 mAP 高但测试拉胯现象训练集 mAP 到 0.9验证集只有 0.6测试集更惨。原因2814 张对 4 类检测任务来说不算充裕模型容易记住训练集。解决开数据增强hsv_h、hsv_s、flipud、fliplr、mosaic加weight_decay或者换更小的模型。另外检查是不是训练轮数太多patience设小一点早停别硬等。5. 进阶技巧用混淆矩阵和 PR 曲线定位模型短板训练跑完runs/citrus/exp1/下会自动生成confusion_matrix.png和PR_curve.png。很多人只看 mAP 就完事其实这两张图信息量大得多。混淆矩阵的横轴是预测类别纵轴是真实类别对角线越深越好。如果发现“溃疡病”那一行大量落到“炭疽病”列说明这两类在特征上太像模型分不开。这时候别急着加数据先回去看标注是不是有些图里两种病同时存在标注时只标了一种或者病斑区域重叠导致框混了PR 曲线看的是每一类的查准率和查全率权衡。曲线越靠右上越好曲线下的面积就是 AP。如果某一类的 PR 曲线明显塌陷说明该类样本太少或太难。我一般会做一件事把该类所有验证图的预测结果导出来按置信度从低到高排看那些低置信度的框到底框在了哪。十有八九是标注框偏了或者病斑边界本身模糊导致模型犹豫。还有一个实用技巧是测试时增强TTA。推理时加augmentTrue框架会对同一张图做翻转、缩放等变换后综合预测通常能涨 1 到 3 个点 mAP代价是推理速度慢两三倍。对离线分析场景值得开实时检测就算了。# 开启 TTA 推理 yolo detect predict \ model./runs/citrus/exp1/weights/best.pt \ source./test_images/ \ augmentTrue \ conf0.25 \ saveTrue最后说个习惯。我每次拿到新数据集不管多急都强制走一遍“验标注 → 看分布 → 小模型试跑 → 看混淆矩阵”这四步。有次赶项目跳过验标注训了两天才发现有一百多张图的框全偏了十几个像素返工重标的时间够我把整个流程跑三遍。从那以后我每次解压数据集第一件事就是跑完整性脚本第二件事是随机抽 20 张图把框画出来肉眼过一遍。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

科学记忆训练指南:从遗忘曲线到主动回忆
科学记忆训练指南:从遗忘曲线到主动回忆

先交代背景:我做了六年的学习教练,日常被问得最多的一句话就是"我记性差,怎么破"。这个问题背后藏着很多误解,比如把记忆力当成天赋,或者以为多背几遍就能记住。实际上,记忆完全是一门可训练的技… · 2026/9/26 13:10:38

西米普利单抗(Cemiplimab)临床疗效数据:肺癌、皮肤癌 III 期核心试验结果与 TaoToken 配置验证
西米普利单抗(Cemiplimab)临床疗效数据:肺癌、皮肤癌 III 期核心试验结果与 TaoToken 配置验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:10:38

板对板单排连接器生产厂家有哪些 板对板连接器优质供应商综合实力推荐
板对板单排连接器生产厂家有哪些 板对板连接器优质供应商综合实力推荐

板对板连接器选型必看:从原理到落地的全链路指南 板对板连接器的核心原理与基础应用逻辑板对板连接器作为两块PCB直接互连的精密元器件,本质是通过针座与插孔的物理接触,实现信号、电力的快速传导,是智能设备内部多层PCB高密度堆叠… · 2026/9/26 13:10:38

私人 AI 随身带!OpenClaw+cpolar 外网访问完整教程(TaoToken 配置版)
私人 AI 随身带!OpenClaw+cpolar 外网访问完整教程(TaoToken 配置版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:41:02

claude_code_mineru_skill 配置 TaoToken:settings.json 骨架与连通性验证
claude_code_mineru_skill 配置 TaoToken:settings.json 骨架与连通性验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 13:41:02

应用日语毕业论文,别一上来就问“哪个AI最强”[特殊字符]
应用日语毕业论文,别一上来就问“哪个AI最强”[特殊字符]

先把场景说具体:假设你是教育与体育大类 / 语言类 / 应用日语专业的学生,正在做毕业论文,题目类似《日系酒店前台服务中的敬语误用研究——基于实习访谈与问卷的分析》。 这类题目的难点很典型: 要查中文和日文两类资料&#xf… · 2026/9/26 13:40:49

AAMAS投稿全指南:多智能体系统学术圣殿的准入逻辑
AAMAS投稿全指南:多智能体系统学术圣殿的准入逻辑

1. AAMAS不是“AI会议”而是多智能体系统的学术圣殿:先破除三个常见误解很多人第一次听说AAMAS,是在某篇论文的参考文献里看到缩写,或者在导师随口一句“这个方向投AAMAS比较对口”中偶然撞见。更常见的是,在中文社区里被笼统地归… · 2026/9/26 13:40:49

从一只蓝牙耳机充电盒开始:电子产品检测人的毕设 AI 搭子怎么选
从一只蓝牙耳机充电盒开始:电子产品检测人的毕设 AI 搭子怎么选

电子产品检测技术专业的同学,大概都懂这种感觉:一只看起来很小的 TWS 蓝牙耳机充电盒,真做成毕业项目时,事情一点也不少。 它里面有锂电池、充电管理电路、接口、外壳和保护器件。你可能要完成的任务是:制定一份“蓝牙… · 2026/9/26 13:40:42

AI电子元器件行业解决方案:从选型到量产,拆解落地路径与避坑指南
AI电子元器件行业解决方案:从选型到量产,拆解落地路径与避坑指南

电子元器件这个行当,过去二十年拼的是渠道、库存和交期。但这两年跟不少做采购、做FAE、做供应链的朋友聊下来,大家共同的感受是:光靠"关系经验"已经不够用了。一颗料从选型到量产,中间牵扯的数据量、文档量、替代料判断… · 2026/9/26 13:40:42

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码