多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

玉米叶片缺陷检测数据集:2225张YOLOv5训练资源与实战指南

玉米叶片缺陷检测数据集:2225张YOLOv5训练资源与实战指南 简介这份资源面向从事农业图像识别、目标检测学习与落地的开发者提供玉米叶片缺陷检测的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 python3.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、mAP0.5。box_loss是边界框回归损失正常应该持续下降obj_loss是目标置信度损失如果它不降反升多半是标签有问题比如框超出图像边界。mAP0.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指向同一个 yamlnames里写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:ytile, x:xtile] cv2.imwrite(ftiles/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 张做这个检查通过率低于一半就说明数据或训练有问题。从那以后我每次拿到新数据集都强制先跑一遍可视化、再比对文件名、最后做遮挡测试这三步走完才敢开训。希望这份玉米叶片缺陷数据能帮你少走点弯路把时间花在调模型而不是修数据上。本文还有配套的精品资源点击获取
返回列表