简介:这份资源面向从事农业图像识别、目标检测学习与落地的开发者,提供玉米叶片缺陷检测的YOLOv5格式数据集,解决病害识别场景中样本获取与标注成本高的问题。数据按YOLOv5标准目录组织,包含训练集与验证集,无需额外转换即可直接投入训练。压缩包共约2000个文件,以txt标注文件为主,另附一个可视化py脚本,整体约298.96MB;训练集含1558张图片及对应标签,验证集含667张图片及对应标签,图像为2000至3000像素的大分辨率RGB图,边界框标注清晰、图像完整,类别为infected单类。可视化脚本随机传入一张图片即可绘制并保存边界框,无需修改即可运行,便于快速核验标注质量。目前已有165人学习下载,适合作为目标检测课程实践、缺陷识别课题或算法对比实验的数据基础。
1. 玉米叶片缺陷检测数据集:一份能直接喂给 YOLOv5 的 2225 张图资源
如果你正在找一份能直接跑起来、不用自己清洗标注的农业视觉数据集,这份玉米叶片缺陷检测数据大概率能省掉你两三天标注时间。它按 YOLOv5 标准目录组织,1 个类别infected,训练集 1558 张、验证集 667 张,压缩后 298 MB,图像是 2000–3000 像素的大分辨率 RGB 原图,边界框标注清晰、图像完整。适合做农作物病害识别、叶片缺陷检测的算法验证,也适合拿来做 YOLOv5 训练自己数据集的练手素材。下面我按「拿到手怎么用 → 参数怎么设 → 坑在哪」的顺序拆一遍,都是能直接抄的步骤。
2. 数据集结构与 YOLOv5 目录规范:先看懂再动手
2.1 目录长什么样,为什么这样组织
这份数据最大的价值是「不用额外处理」。YOLOv5 对数据集的目录结构有固定要求,很多人第一次训练失败不是模型问题,而是路径和 txt 标签没对上。这份资源已经按规范排好,解压后大致是这样:
datasets/ ├── images/ │ ├── train/ # 1558 张 jpg │ └── val/ # 667 张 jpg ├── labels/ │ ├── train/ # 1558 个 txt │ └── val/ # 667 个 txt └── data.yaml # 类别配置图片和标签文件名一一对应,比如20200701_080200.jpg对应20200701_080200.txt。这种命名方式来自采集设备的时间戳,好处是天然唯一、不会重名,坏处是肉眼没法从文件名判断内容,所以后面可视化脚本就很有必要。
YOLOv5 的标签格式是「归一化中心点 + 宽高」,每行一个目标:
<class_id> <x_center> <y_center> <width> <height>这里只有 1 类,所以class_id恒为 0。四个坐标都是相对整图宽高的 0–1 浮点数,不是像素值。这一点是新手最容易翻车的地方——如果你拿到的标注是像素坐标,直接塞进去训练,模型会学得一塌糊涂。
2.2 data.yaml 怎么写
YOLOv5 靠一个 yaml 文件告诉训练器去哪找图、有几类、类名叫什么。这份数据对应的配置大概是这样:
# data.yaml path: ./datasets # 数据集根目录 train: images/train # 训练集相对路径 val: images/val # 验证集相对路径 nc: 1 # 类别数 names: ['infected'] # 类别名,顺序对应 class_id参数说明:path是根目录,train和val是相对path的路径,YOLOv5 会自动把images替换成labels去找标签。nc必须和names长度一致,写错了训练能启动但类别会错位。names里的顺序就是class_id的顺序,这里只有一类,所以是 0 号。
提示:如果你把数据集放在别的盘或别的目录,只改
path就行,train/val保持相对路径,别写成绝对路径,否则换机器就崩。
2.3 可视化脚本 show.py 怎么用
资源里带了一个show.py,随机抽一张图把边界框画出来存到当前目录。这个脚本看着简单,但它是验证「图和标签是否对得上」的最快手段。核心逻辑大概是这样:
import cv2 import random import os import glob # 随机取一张训练图 img_dir = "datasets/images/train" img_path = random.choice(glob.glob(os.path.join(img_dir, "*.jpg"))) # 对应的标签路径:images 换成 labels,后缀换成 txt label_path = img_path.replace("images", "labels").replace(".jpg", ".txt") img = cv2.imread(img_path) h, w = img.shape[:2] with open(label_path, "r") as f: for line in f.readlines(): cls, xc, yc, bw, bh = map(float, line.strip().split()) # 归一化坐标还原成像素坐标 x1 = int((xc - bw / 2) * w) y1 = int((yc - bh / 2) * h) x2 = int((xc + bw / 2) * w) y2 = int((yc + bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 3) cv2.imwrite("vis_result.jpg", img) print("saved vis_result.jpg")逻辑说明:先随机选图,再按images→labels、.jpg→.txt的规则找到标签,读入归一化坐标后乘回宽高得到像素框,最后画框保存。参数上唯一要注意的是cv2.rectangle的线宽,大分辨率图(2000–3000 像素)用 3 太细,建议改成 5 或 6,否则缩略图里看不清框。
跑之前确认img_dir指向你解压后的真实路径。如果报FileNotFoundError,八成是路径写错或者标签文件名和图片对不上——这时候别急着训练,先把可视化跑通,确认框的位置合理,再往下走。
3. 用 YOLOv5 训练这份数据:从环境到出结果
3.1 环境准备与依赖版本
YOLOv5 对 PyTorch 和 CUDA 版本比较敏感,版本不匹配是训练启动失败的头号原因。常见做法是建一个干净虚拟环境,按官方 requirements 装:
conda create -n yolo5 python=3.8 -y conda activate yolo5 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt参数说明:Python 3.8 是 YOLOv5 兼容性最稳的版本,3.10 以上偶尔会在某些算子上报错。requirements.txt里锁定了 torch、torchvision、numpy 等版本,别自己手动升级 torch,否则容易出现 CUDA 版本和驱动不匹配。装完用下面这行验证:
python -c "import torch; print(torch.__version__, torch.cuda.is_available())"如果输出False,说明 CUDA 没被识别,要么是驱动版本低,要么是装了 CPU 版 torch。CPU 也能训,但 2225 张大图会慢到怀疑人生,建议至少一张 8G 显存的卡。
3.2 训练命令与关键参数
数据放好、yaml 写好之后,训练命令本身不复杂:
python train.py \ --data data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --project runs/train \ --name corn_defect参数逐个说:--weights yolov5s.pt用官方预训练权重做迁移学习,小数据集上比从头训收敛快得多;--img 640是训练输入尺寸,原图 2000–3000 会被缩放到 640,这是速度和精度的折中;--batch 16在 8G 显存上比较稳,显存不够就降到 8;--epochs 100对 1558 张训练图通常够用,看验证集 mAP 不再涨就可以停。
这里有个反直觉的点:原图分辨率很高,但训练时缩到 640,小缺陷可能被缩没了。如果验证时发现漏检严重,把--img提到 1280 再试,代价是显存翻倍、速度减半。这是这份大分辨率数据最需要权衡的参数。
3.3 训练过程看什么指标
训练启动后终端会刷一堆指标,重点盯三个:box_loss、obj_loss、mAP@0.5。box_loss是边界框回归损失,正常应该持续下降;obj_loss是目标置信度损失,如果它不降反升,多半是标签有问题(比如框超出图像边界)。mAP@0.5是验证集上的平均精度,这是判断模型好坏的最终指标。
训练完结果存在runs/train/corn_defect/下,weights/best.pt是最优权重,results.png是损失和 mAP 曲线。如果曲线震荡剧烈,常见原因是学习率太大或 batch 太小,可以加--lr0 0.001手动调低初始学习率。
3.4 推理验证:拿 best.pt 跑单张图
训练完别只看数字,实际跑几张图看效果:
python detect.py \ --weights runs/train/corn_defect/weights/best.pt \ --source datasets/images/val \ --img 640 \ --conf 0.25 \ --save-txt参数说明:--source可以是单张图、目录或视频;--conf 0.25是置信度阈值,低于它的框不显示,调高减少误检、调低减少漏检;--save-txt会把预测框存成 txt,方便和真值对比算指标。结果默认存在runs/detect/exp/下。
如果发现框位置整体偏移,先检查data.yaml里的nc和names有没有写错;如果框大小明显不对,回去看标签是不是归一化坐标。这两个问题占了新手翻车的大半。
4. 避坑与排查:这份数据最容易踩的五个坑
4.1 图片和标签文件名对不上
现象:训练启动后报No labels found或者 mAP 一直是 0。原因:YOLOv5 靠文件名匹配图片和标签,20200701_080200.jpg必须对应20200701_080200.txt,少一个字符就找不到。解决:写个脚本比对两个目录的文件名集合,差集就是问题文件。
import os imgs = {os.path.splitext(f)[0] for f in os.listdir("datasets/images/train")} labs = {os.path.splitext(f)[0] for f in os.listdir("datasets/labels/train")} print("缺标签的图:", imgs - labs) print("缺图的标签:", labs - imgs)4.2 标签坐标没归一化
现象:训练 loss 居高不下,预测框乱飞。原因:标注工具导出的是像素坐标,没除以宽高。解决:检查 txt 里有没有大于 1 的数,有就是没归一化,需要批量转换。
# 假设已知原图宽高 w, h with open(label_path) as f: lines = f.readlines() with open(label_path, "w") as f: for line in lines: cls, x1, y1, x2, y2 = map(float, line.split()) xc = (x1 + x2) / 2 / w yc = (y1 + y2) / 2 / h bw = (x2 - x1) / w bh = (y2 - y1) / h f.write(f"{int(cls)} {xc:.6f} {yc:.6f} {bw:.6f} {bh:.6f}\n")4.3 大分辨率图训练显存爆掉
现象:CUDA out of memory。原因:--img设太大或--batch太高。解决:先降 batch 到 8 或 4,还不行就降 img 到 640。显存和精度是跷跷板,别硬撑。
4.4 验证集 mAP 虚高
现象:验证集 mAP 0.9 以上,实际用却很差。原因:训练集和验证集如果有同一批次采集的相似图,等于变相泄漏。解决:这份数据按时间戳命名,如果 train 和 val 里有连续时间戳的图,说明划分可能不够随机。可以自己重新按 8:2 随机划分,别直接用原划分。
4.5 类别名写错导致推理标签乱码
现象:推理结果框上显示的类别名是0或乱码。原因:data.yaml的names和训练时不一致,或者推理时没加载对 yaml。解决:推理时确保--data指向同一个 yaml,names里写infected而不是别的。
5. 进阶技巧:把这份数据用出更多价值
5.1 用高分辨率切片提升小缺陷检出
原图 2000–3000 像素,直接缩到 640 会丢细节。一个实用技巧是切片推理:把大图切成 640×640 的小块分别检测,再合并结果。YOLOv5 官方没有内置切片,但可以自己写:
import cv2 img = cv2.imread("datasets/images/val/20200701_080200.jpg") h, w = img.shape[:2] tile = 640 overlap = 128 # 重叠区,避免切边目标被截断 for y in range(0, h, tile - overlap): for x in range(0, w, tile - overlap): crop = img[y:y+tile, x:x+tile] cv2.imwrite(f"tiles/tile_{y}_{x}.jpg", crop)切完用detect.py批量跑,再把框坐标加回偏移量合并。这个做法在农业病害检测里很常见,因为病斑往往只占叶片一小块,缩图后可能只剩几个像素。代价是推理时间成倍增加,适合对精度要求高的场景。
5.2 数据增强参数怎么调
YOLOv5 默认开了 mosaic、HSV、翻转等增强。这份数据是叶片缺陷,翻转和旋转是安全的,但上下翻转要谨慎——叶片正反面纹理不同,翻了可能引入噪声。可以在hyp.scratch-low.yaml里调:
flipud: 0.0 # 关闭上下翻转 fliplr: 0.5 # 保留左右翻转 mosaic: 1.0 # 保留 mosaic hsv_h: 0.015 # 色调扰动,别太大参数说明:flipud设 0 是因为叶片上下翻转不符合真实场景;hsv_h控制色调扰动,农业图像颜色是重要特征,扰动太大会让模型学偏。这些值没有标准答案,看验证集表现微调。
5.3 验证模型是否真的学到东西
训练完别只看 mAP,做个「遮挡测试」:把图里病斑区域手动涂黑,再跑推理,如果模型还能框出来,说明它学的是背景而不是缺陷本身。这个测试能暴露数据集的 shortcut。我一般会在验证集里随机抽 20 张做这个检查,通过率低于一半就说明数据或训练有问题。
从那以后我每次拿到新数据集,都强制先跑一遍可视化、再比对文件名、最后做遮挡测试,这三步走完才敢开训。希望这份玉米叶片缺陷数据能帮你少走点弯路,把时间花在调模型而不是修数据上。
本文还有配套的精品资源,点击获取