搞农业视觉识别的朋友,应该都体会过找数据的痛苦。要么是公开数据集里全是玉米、小麦、水稻,高粱这种小众作物几乎没人做;要么就是找到了几个病害图集,但图片数量少、背景单一、病害类别缺胳膊少腿,拿来做深度学习训练,验证集上跑得欢,一到田间地头就原形毕露。
这份高粱叶病害数据集,包含六种常见叶部病害,每类1000多张图像,总共六千多张。这个规模放在主流作物数据集里不算大,但在高粱这个细分领域,已经算是相当能打的资源了。它解决的正是“有模型没数据”“有想法没样本”的尴尬局面,适合做基于YOLO系列、Faster R-CNN、SSD等目标检测模型的病害识别训练,也适合做图像分类、语义分割的预处理数据。无论你是刚接触农业AI的学生,还是已经在做植保智能化项目的工程师,这套数据都能帮你少走大段弯路。
1. 这个数据集到底解决什么问题
1.1 为什么盯上高粱叶部病害
高粱是我国重要的粮食作物和酿酒原料,尤其在北方干旱半干旱地区种植面积很大。但高粱的病害问题一直困扰着种植户,叶部病害又是发生最频繁、传播最快、对产量影响最直接的一类。传统的人工田间调查方式效率低、主观性强,一个经验丰富的植保员一天也就能查几十亩地,等发现大面积发病时,往往已经错过了最佳防治窗口。
用深度学习做高粱叶部病害识别,就能把这些工作自动化。无人机低空巡检、手机拍照诊断、智能虫情测报灯联动,这些场景都需要一个稳定可靠的病害识别模型。模型要训练好,第一步就是要有高质量的标注数据。这个数据集的定位,就是给这些应用场景提供“弹药”。
1.2 每类1000多张的规模,背后有讲究
很多刚开始做数据集的朋友会有个误解,觉得图片越多越好。实际上,对于病害识别这种任务,每类1000张左右的样本量是一个比较合理的区间。
从模型训练的角度看,YOLOv8这类目标检测模型,每类500张以上就能训练出一个可用的模型,1000张左右可以让模型在复杂背景下有更好的泛化能力。从数据采集的角度看,高粱叶部病害在不同生育期、不同光照条件、不同种植密度下的表现差异很大,每类采集1000多张,意味着采集者需要考虑品种差异、地域差异、病情严重程度差异,这个工作量是实打实的。
我自己做过同类作物的数据集,深知这类工作的繁琐程度。每张图片都要保证病害特征的清晰度,每病害类别都要有足够多的形态变化覆盖,每张标注框都要准确框住病斑区域。6000多张图片背后,是几周的田间拍摄加几周的标注修图,这个数据集的含金量不在于数量,而在于对病害表型多样性的覆盖程度。
2. 六种高粱叶部病害的形态特征与识别要点
2.1 高粱炭疽病
高粱炭疽病是叶部最常见的病害之一,由炭疽菌引起。典型症状是叶片上出现椭圆形、梭形的病斑,病斑中央灰白色,边缘红褐色或紫褐色,病斑表面有时会出现小黑点,那是病菌的分生孢子盘。
在标注这类病害时需要注意,炭疽病病斑早期很小,只有针尖大小,后期才会扩大成梭形。一个叶片上往往密密麻麻分布十几个甚至几十个病斑,标注时要把每个独立的病斑都框出来,不能因为病斑多就合并成一个大的标注框。这类密集小目标对模型的训练要求比较高,建议在训练时开启马赛克增强和随机透视变换。
2.2 高粱大斑病
大斑病在高粱上也很常见,病原菌为高粱大斑病菌。它的典型特征是叶片上出现长梭形的大病斑,病斑长度可达几厘米甚至十几厘米,颜色初期为水渍状暗绿色,后期变为褐色或灰褐色,边缘有时会有明显的黄色晕圈。
大斑病的病斑比较大,标注时相对容易,但要注意病斑经常跨越叶脉生长,纹理比较复杂。如果做图像分类任务,要把整个病斑连同周围的黄色晕圈一起作为识别区域;如果做检测任务,标注框要完整覆盖病斑主体,晕圈部分可以不纳入框内。这个细节直接关系到模型学到的特征是否准确。
2.3 高粱紫斑病
紫斑病也是高粱叶部的高发病害,尤其在高温高湿的南方地区。病斑初期为圆形或不规则形的小斑点,紫红色或暗紫色,后期病斑中央会变成灰白色,边缘保持紫色,看起来像一个个小眼睛。
紫斑病和炭疽病有时候容易混淆,两者的区别在于:紫斑病的病斑颜色更偏紫色,且病斑之间一般不融合;炭疽病的病斑偏褐色,后期会形成明显的梭形。在训练集标注时,把这两种病害放在一起,模型可以通过颜色特征和病斑形态学特征把它们分开。数据增强时可以适当增加色彩饱和度的调整范围,帮助模型更好地区分这两种相近病害。
2.4 高粱锈病
高粱锈病是由锈菌引起的病害,初期在叶片上出现褪绿小斑点,随后在斑点处长出锈褐色的粉状孢子堆。孢子堆破裂后会散出大量锈粉,严重时整个叶片表面都覆盖一层锈色粉末。
锈病的特点是病斑小而密,孢子堆有明显的粉状质感,这个特征在图像上非常显眼。但要注意,拍摄时光线的角度会影响锈粉的视觉效果,逆光时孢子堆会显得更亮、更明显,顺光时可能看起来只是普通的褐色斑点。所以这类病害的数据集图片最好在不同光照条件下采集,让模型学会从不同角度识别锈病的典型特征。
2.5 高粱煤纹病
煤纹病在很多地方也叫褐斑病,它和炭疽病的症状有点像,但病原菌不同,防治方法也不同。煤纹病的病斑初期为黄褐色小斑点,后期扩展成不规则形的大斑,病斑表面有一层暗褐色的霉层,这是病原菌的分生孢子梗和孢子。
煤纹病与炭疽病最大的视觉差异在于病斑表面是否有霉层。煤纹病病斑表面有明显的暗色霉状物,用手摸有粗糙感;炭疽病的病斑表面即使有孢子盘,也只是一些小黑点,不会有霉层覆盖。标注时要把霉层区域也纳入标注框内,因为霉层是模型区分这两种病害的关键特征。
2.6 高粱细菌性条纹病
细菌性条纹病是这几年高粱种植区逐渐加重的一种病害。它的典型症状是叶片上出现水渍状的长条形条纹,初期为暗绿色半透明,后期变为褐色,条纹通常沿叶脉方向延伸,严重时条纹连片,导致叶片大面积枯死。
细菌性条纹病和真菌性病害的视觉差异比较大,条纹状的水渍状病斑非常容易识别。但要注意,细菌性病害在湿度大的时候病斑表面会有菌脓,干后形成一层薄膜,这个特征在图像上不够明显,拍摄时最好用微距模式拍几张特写。标注时,细长的条形病斑适合用旋转框或者四边形框标注,如果用直框会带入大量背景信息,影响模型的定位精度。
为了让大家快速对比这六种病害的差异,我把它们的核心识别特征整理成了一个表:
| 病害名称 | 病斑颜色 | 病斑形状 | 典型特征 | 易混淆病害 |
|---|---|---|---|---|
| 炭疽病 | 中央灰白、边缘红褐 | 椭圆形、梭形 | 病斑上有小黑点 | 紫斑病 |
| 大斑病 | 褐色至灰褐色 | 长梭形、大病斑 | 边缘有黄色晕圈 | 煤纹病 |
| 紫斑病 | 紫红色至灰白 | 圆形、不规则形 | 病斑中央灰白 | 炭疽病 |
| 锈病 | 锈褐色 | 小斑点密集分布 | 粉状孢子堆 | 无 |
| 煤纹病 | 黄褐色至暗褐色 | 不规则形大斑 | 表面有暗色霉层 | 炭疽病 |
| 细菌性条纹病 | 暗绿色至褐色 | 长条形条纹 | 沿叶脉方向水渍状 | 大斑病 |
3. 从田间到训练集:数据构建全流程
3.1 数据采集的设备选择与拍摄规范
采集设备选择上,普通手机就够用,我建议使用主摄拍摄,不要用广角,避免叶片边缘变形。分辨率最好在1200万像素以上,这样单张图片里可以容纳足够多的病斑细节。如果要采集高清特写图,可以用微距镜头,把单个病斑的表型特征拍清楚。
拍摄时间上,最好选择晴天上午9点到下午3点之间,这个时间段光照充足且均匀,叶片的真实颜色还原度最好。阴天也可以拍,但要注意白平衡的调整,否则后期图片整体偏色,会影响训练效果。每片叶子至少拍一张正面照,有条件的话再拍一张背面的照片,因为有些病害的背面色斑比正面更明显。
拍摄背景尽量选择干净的土壤或地膜,避免杂草、其他作物叶片干扰。如果实在避不开,后期标注时可以忽略背景区域,但要增加背景干扰的多样性,让模型学会聚焦在叶片区域。
3.2 图像清洗与质量筛选
拍完的原始图片不能直接拿去标注,必须经过严格的筛选。筛选标准有三条:一是图片不能过曝或过暗,病斑区域的纹理要清晰可见;二是图片不能抖动模糊,尤其是手持手机拍摄时,快门速度低于1/100秒很容易糊;三是图片主体必须是高粱叶片,不能出现大量非高粱叶片的背景占据画面主体。
我筛选图片时会先把所有图片按拍摄批次打开,快速浏览一遍,把明显不合规的去掉。然后针对保留的图片逐张放大检查,看看病斑区域是否清晰。一张图片里只要有一个病斑不清晰,就会影响模型的训练质量,所以宁缺毋滥。初步筛选后,一般会删掉10%到15%的图片,这个损耗率是正常的。
3.3 标注规范与格式转换
标注是数据集构建中最费时间的环节,也是最影响模型性能的环节。我用LabelImg和X-AnyLabeling都做过标注,后者体验更好一些,支持深度学习辅助标注,可以先用预训练模型跑一遍自动标注,再人工修正,效率能提升不少。
标注时要遵循几条核心规范:第一,标注框必须紧贴病斑边界,不要留白太多,也不要切掉病斑边缘。第二,每个病斑单独标注,不合并、不遗漏。同一张图片上有多个病斑,就标多个框。第三,标注类别要严格对应六种病害的名称,不能混用。第四,如果某个叶片上同时有多个病害,每种病害都标上,这就是多标签场景,检测模型完全可以处理。
标注完成后,LabelImg默认输出的是Pascal VOC格式的XML文件,X-AnyLabeling可以输出COCO格式的JSON文件。训练YOLO系列模型需要转换成YOLO格式的TXT文件,每行内容为:类别编号 中心点x坐标 中心点y坐标 框宽 框高。转换工具可以用Python脚本,也可以用Roboflow的在线转换功能。转换前记得检查类别编号和类别名称的对应关系,这个错一个全盘错。
3.4 数据增强与样本均衡
六种病害各1000多张,数量还算均衡,但模型训练时仍然需要做数据增强来提升泛化能力。常用的增强方法有四类:几何变换类,包括水平翻转、垂直翻转、随机旋转、随机缩放;色彩变换类,包括亮度调整、对比度调整、饱和度调整、色相微调;噪声类,包括高斯噪声、椒盐噪声;混合类,包括马赛克增强、复制粘贴增强、混合增强。
我用YOLOv8训练时,开了水平和垂直翻转、随机旋转正负15度、亮度对比度增强、马赛克增强,效果比不开增强有明显提升,尤其在光照多变的田间场景下,mAP50高了两三个点。但要注意数据增强需要手动调整参数,旋转角度太大容易让病斑变形失真,色彩增强幅度太大容易让图片色调偏离真实场景。
如果某类病害的图片数量偏少,比如只有800张,而其他类有1200张,建议用复制粘贴增强或者重采样策略把数量补齐,保证每个类别的样本量尽量均衡。样本不均衡会导致模型对少数类别学习不充分,推理时频繁漏检。
3.5 数据集划分原则
数据集划分直接决定模型评估的可信度。我推荐按7:2:1的比例划分训练集、验证集和测试集,同时确保划分时同一张叶片的不同图片不能同时出现在训练集和测试集中。比如同一株高粱上拍了多张图片,只能都进训练集或都进测试集,否则会造成数据泄漏,测试集上表现虚高。
划分策略上还有一个细节:按时间线划分。如果图片是在不同时间、不同地块采集的,尽量把后期采集的图片作为测试集,前期采集的作为训练集。这样更贴近实际应用场景,因为模型部署后遇到的基本都是未来时间段的图片,按时间划分能让评估结果更有说服力。
分完数据集后,建议把每类的图片数量统计一下,做到心里有数。如果哪一类在训练集里只有700张,可以考虑先做一次切图增强,把大图切成小图,既能增加样本量,又能让模型关注到更局部的病斑特征。
4. 用这套数据集训练YOLOv8的实操记录
4.1 环境配置与数据准备
训练环境我用的是Ubuntu 20.04系统,显卡是RTX 3090 24GB显存,PyTorch版本1.13,CUDA版本11.7,YOLOv8代码直接从Ultralytics官方仓库克隆。这套配置在6千多张图片的训练中非常够用,一张卡吃满,训练时间大约两三个小时就能完成一百个轮次。
数据准备上,先把标注好的TXT文件和图片按YOLO的目录结构放好,目录结构如下:
datasets/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
├── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── data.yaml
data.yaml文件内容要指定训练集、验证集的路径,以及类别名称列表。类别名称必须和标注文件里的类别编号一一对应,不能错位。我贴一个参考配置:
path: /home/user/datasets/sorghum_leaf
train: images/train
val: images/val
test: images/test
names:
0: anthracnose
1: northern_leaf_blight
2: purple_spot
3: rust
4: sooty_stripe
5: bacterial_stripe
配置好环境后,先跑一次数据检查命令,用YOLOv8内置的验证模式随便指定一个预训练权重,看看数据能不能正常加载:
yolo detect val model=yolov8n.pt data=data.yaml
如果标注文件有问题,这里就会报错;如果没问题,模型虽然检测不出什么结果,但能确认数据管线是通的。
4.2 训练参数设置与调优
训练的初始参数我用的是YOLOv8的默认值改过来的。网络选择YOLOv8s,因为高粱叶部病害的检测目标不大不小,但密集场景很多,s版本的速度和精度比较均衡。图片尺寸设置为640×640,batch size设为16,优化器选择SGD,学习率初始值0.01,权重衰减0.0005,训练轮次100。如果显存小,batch size降到8甚至4,学习率也要跟着降到接近0.005,否则梯度更新太猛,训练容易震荡。
跑第一轮训练时,重点观察loss曲线。正常的loss下降趋势是前30个轮次快速下降,后期慢慢收敛。如果loss曲线一直无法下降,大概率是数据问题,要检查标注框是否错位、类别标签是否错误、数据增强参数是否设置过大。
训练到第70个轮次左右,我用验证集跑一下评估,看看每个类别的AP值。如果发现某类AP值明显低于其他类,比如紫斑病只有70%,而其他病害都在85%以上,那就要针对紫斑病做专项优化:补充更多紫斑病的训练图片,或者调整数据增强参数,增加色彩变换的幅度,让模型对紫斑病的特征更敏感。
4.3 评估指标与结果分析
训练结束后,YOLOv8会输出mAP50、mAP50-95、precision、recall等评估指标。我用实测数据说一下这几个指标的判读经验:mAP50在80%以上,这个模型基本可用了;mAP50-95在55%以上,说明模型的定位精度和分类精度都比较均衡;precision和recall差距不要太大,如果precision高recall低,说明模型保守,漏检多;如果recall高precision低,说明模型激进,误检多。
同一套数据集,用不同模型训练同一个任务,结果差异很大。以这个高粱叶数据集为例,YOLOv8s大概能跑到mAP50在86%左右,YOLOv5s约83%,Faster R-CNN约81%。这个对比不是说哪个模型就一定更好,而是要结合部署端算力来选型。如果模型将来要部署到无人机边缘计算盒子或者手机端,YOLOv8s或者YOLOv5s更合适,轻量级的YOLOv8n虽然mAP50会掉到79%左右,但速度优势明显,算力受限场景下值得用精度换速度。
5. 高频踩坑与排查方法
5.1 标注错位与漏标问题
标注过程最容易出的问题就是标注框和病害实际区域错位。产生的原因有三个:一是标注时图片被缩放过,但标注坐标没有同步缩放,导致框对不上;二是标注工具导出的坐标系统与训练框架的坐标系统不一致,比如中心点坐标和左上角坐标混用;三是多人同时标注时,不同人对“病斑边界”的理解不一致,导致同一病害的标注框大小差异很大。
排查时最简单的办法是把标注框可视化画在图上,逐张检查。写段Python脚本,读取标注文件和图片,画出所有框,然后人眼过一遍。这样虽然费时间,但能一次性找出绝大多数标注问题。
我个人体验是:标注这个工作,宁可慢一点也要保证质量。每张图片多看几眼,比事后反复返工要省事得多。
5.2 光照差异导致误检
模型训练好之后,在室内测试集上表现很好,一拿到田间就不行了,这是最头疼的问题。根因多半是训练集中的图片拍摄条件太单一。如果大多数图片都是晴天正午拍摄的,模型就学不到阴天、早晚时分、逆光等场景下的病害特征,遇到这些情况就会漏检或者误检。
解决办法是在数据扩充阶段把不同光照条件下的图片都包含进来,或者用颜色增强模拟不同的光照条件。我在训练时会把亮度增强参数加大到正负25%,对比度增强正负20%,实测对阴天场景的检测效果有明显改善。另外,在部署端做图像预处理标准化也很关键,训练时如果做了归一化,推理时也要做相同处理的归一化,两边不一致也会导致精度下降。
5.3 小目标漏检的优化思路
高粱叶上的炭疽病和锈病,单个病斑面积很小,在640×640的输入图上可能只占几十个像素,很容易被模型漏掉。针对这种情况,我实测有效的优化手段有几个:
- 用YOLOv8的P2检测层替换默认的P3检测层,P2层输出特征图分辨率更高,小目标的召回率有明显提升。
- 把输入图片尺寸从640提升到1024,小目标在特征图上的响应更明显,但代价是显存占用增大,训练速度变慢。
- 用切图推理的方式,推理时把大图切成四块重叠的小图分别检测,再合并结果。这个方法能有效提升小目标检测率,但会增加推理时间。
这几个方法可以组合使用,比如先切图再推理,但要注意切图重叠区域的大小,避免同一个病斑在相邻子图中被重复检测,合并结果时要做好去重处理。
写在最后
做数据集的这个过程,我自己经历了从田间拍摄、图片筛选、手工标注、格式转换、模型训练到反复调优的完整链路,深知每个环节的坑和难度。如果你手头有这份高粱叶病害数据集,我建议不要急着丢进模型开训,先花几天时间把数据整理清楚,做好清洗和标注检查,再开始训练,效果会好很多。
另外分享一个小技巧:数据集的图片文件名最好按“拍摄地点-拍摄日期-序号”的格式命名,比如“Jilin-20240615-001.jpg”,这样后期做数据分析和问题回溯时会非常方便。等模型训练出了问题,想查某张图是在什么条件下拍的,看文件名就知道个大概,省得翻原始记录。
这套数据集的后续扩展空间也很大,可以继续增加高粱其他叶部病害类别,比如高粱靶斑病、高粱轮纹斑病;也可以增加不同生育期的图片,让模型从小苗期到抽穗期的病害都能识别。随着数据量的增加和病害类型的丰富,模型的泛化能力会越来越强,希望这份高粱叶病害数据集能帮你在植保智能化的路上少走一些弯路。
171



被折叠的 条评论
为什么被折叠?



