ARTICLE DETAIL

资讯详情

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

柑橘害虫检测数据集:YOLOV5目标检测实战与避坑指南

柑橘害虫检测数据集:YOLOV5目标检测实战与避坑指南 简介这份资源面向从事农业虫害智能监测、目标检测算法练习与课程设计的研究者与开发者提供柑橘害虫检测的YOLOv5格式数据集可直接投入训练省去格式转换与标注整理环节。数据聚焦苍蝇与木虱两类害虫图像为1000至4000像素的大尺度RGB图片贴近真实田间拍摄场景适合检验模型对小目标与高分辨率输入的适应能力。压缩包共603个文件以300张jpeg图像、301个txt标注文件为主另附1个可视化py脚本与1张png预览图整体约260MB其中训练集含240张图片及对应标签验证集含60张图片及对应标签并给出2类别文本信息。可视化脚本随机传入一张图片即可绘制边界框并保存至当前目录无需修改即可运行便于快速核查标注质量。目前已有403人学习下载可作为虫害检测入门与算法对比的实用数据基础。1. 柑橘害虫检测数据集2 类目标、300 张图为什么它值得先跑一遍柑橘害虫检测这个方向真正卡住人的往往不是模型结构而是数据。你搜 YOLOV5 目标检测数据集能翻到一堆通用数据集但落到具体作物、具体虫种上能直接开训的少之又少。这份柑橘害虫检测数据集的价值就在这2 类别苍蝇、木虱训练集 240 张图配 240 个 txt 标签验证集 60 张图配 60 个 txt 标签目录结构直接按 YOLOV5 的 datasets 规范摆好解压就能挂到训练脚本上不需要你再写格式转换。图像是 1000–4000 像素的大尺度 RGB 图对移动小目标检测来说这个分辨率意味着虫子不会糊成一团色块。它适合两类人一类是想验证 YOLOV5 训练链路是否跑通的新手另一类是手上有柑橘虫情图像、想先拿一份干净标注做 baseline 的从业者。下面我按「先看清结构、再动手训练、最后避坑」的顺序拆一遍。2. 目录结构与标注格式先搞清 YOLOV5 到底认什么2.1 为什么是 YOLOV5 目录格式而不是 COCO 或 VOC目标检测数据集的格式之争本质是「谁来做解析」的问题。COCO 用单个 JSON 汇总所有标注VOC 用 XML 一图一文件而 YOLOV5 走的是「一图一 txt」的极简路线每张图片旁边放一个同名 txt每行一个目标格式是class_id x_center y_center width height后四个值都是归一化到 0–1 的相对坐标。这种设计的好处是加载时不用一次性把全量标注读进内存DataLoader 按图索引直接读对应 txt对 300 张这种小规模数据集几乎零开销。坏处也明显类别名不在标注里得靠一个额外的类别文本文件或 data.yaml 来映射。这份数据集给的就是 2 类别 txt 文本信息配合 images/labels 分目录存放正好是 YOLOV5 默认的datasets/images/train、datasets/labels/train那套约定。常见做法是把目录整理成下面这样训练脚本里--data指向的那个 yaml 再声明路径和类别# 解压后的典型结构按 YOLOV5 约定 citrus_pest/ ├── images/ │ ├── train/ # 240 张 jpg │ └── val/ # 60 张 jpg ├── labels/ │ ├── train/ # 240 个 txt │ └── val/ # 60 个 txt └── data.yaml # 类别数与类别名这里要提醒一句YOLOV5 找标签不是靠 yaml 里写 labels 路径就完事它默认把images替换成labels再拼.txt。所以 images 和 labels 必须同级、子目录名一致否则训练时会出现「找到图但找不到标签」的静默跳过loss 看着在降其实一半样本没参与。2.2 类别映射与 data.yaml 的写法2 类别意味着nc: 2类别顺序必须和 txt 里的 class_id 对齐。苍蝇是 0、木虱是 1还是反过来取决于标注时用的顺序这个不能猜。最稳的验证方式是抽一个 txt看里面出现的数字集合再对照类别文本文件。data.yaml 我一般这么写# data.yaml path: ./citrus_pest # 数据集根目录 train: images/train # 相对 path 的训练图目录 val: images/val # 相对 path 的验证图目录 nc: 2 # 类别数 names: [fly, psyllid] # 顺序必须与 txt 中 class_id 一致参数说明path是根train/val写相对路径YOLOV5 会自动去同级找 labels。names的顺序错了不会报错但推理时框上的类别名会张冠李戴mAP 本身不受影响可你后面做可视化或部署时就会被误导。所以第一次跑之前务必用可视化脚本确认一遍框和类别。2.3 用自带可视化脚本验证标注是否对齐数据集提供了一个可视化 py 文件随机传入一张图就能画框并保存到当前目录脚本无需改动。这一步别跳过它是你判断「标注有没有偏移、类别有没有错位」的唯一低成本手段。典型调用逻辑是这样# visualize.py 的核心逻辑示意按实际脚本为准 import cv2, random, os img_dir citrus_pest/images/train lbl_dir citrus_pest/labels/train names [fly, psyllid] img_name random.choice(os.listdir(img_dir)) img cv2.imread(os.path.join(img_dir, img_name)) h, w img.shape[:2] lbl_path os.path.join(lbl_dir, img_name.replace(.jpg, .txt)) with open(lbl_path) as f: for line in f: c, x, y, bw, bh line.split() # 归一化坐标还原成像素坐标 x1 int((float(x) - float(bw) / 2) * w) y1 int((float(y) - float(bh) / 2) * h) x2 int((float(x) float(bw) / 2) * w) y2 int((float(y) float(bh) / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, names[int(c)], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) cv2.imwrite(vis_result.jpg, img)逻辑说明读图后按 txt 里的归一化中心点和宽高反算出左上、右下像素坐标再画框。参数上注意x_center是框中心不是左上角新手最容易在这里把框画歪然后误判数据集有问题。跑完看vis_result.jpg框应该紧贴虫子本体如果框整体偏移或大小离谱先怀疑坐标还原公式再怀疑标注本身。3. 拿这份数据跑 YOLOV5从环境到首轮训练3.1 环境与依赖别在版本上翻车YOLOV5 对 PyTorch 和 CUDA 的版本比较敏感尤其是你要用 GPU 训练时。我一般建议先用官方 requirements 装再单独确认 torch 的 CUDA 版本和显卡驱动匹配。300 张图、2 类别属于小数据集显存压力不大batch size 给 16 或 32 都行主要瓶颈在数据增强和 IO。环境这块的常见组合是 Python 3.8–3.10、PyTorch 1.12 以上、torchvision 配套版本。装完先跑一句python -c import torch; print(torch.cuda.is_available())返回 True 再往下走否则后面训练会默默退回 CPU速度差一个数量级。3.2 训练命令与关键超参数YOLOV5 的训练入口是train.py核心参数就那么几个。针对这份数据集我给一组能直接抄的起点python train.py \ --data citrus_pest/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0 \ --project runs/train \ --name citrus_pest参数说明--weights yolov5s.pt用预训练权重小数据集必须迁移学习从零训基本没戏--img 640是训练分辨率原图 1000–4000 会被缩放虫子本身像素占比不大640 是速度和精度的折中想抓小目标可以试 960 或 1280但显存和耗时同步上涨--epochs 100对 240 张训练图来说够收敛配合早停不会过拟合太久--batch 16是保守值显存够就往上加。--device 0指定第一块 GPU没有 GPU 就删掉这行。3.3 训练过程看什么loss 曲线与 mAP 的读法训练启动后终端会打印每轮的 box_loss、obj_loss、cls_loss 和验证集的 mAP0.5、mAP0.5:0.95。小数据集上前 10 轮 loss 下降快是正常的重点看验证 mAP 有没有跟着涨。如果训练 loss 一直降、验证 mAP 卡住甚至掉那就是过拟合信号常见做法是加大数据增强mosaic、mixup、加 weight_decay或者干脆减 epoch。另一个坑是类别不平衡苍蝇和木虱的样本数如果差得多模型会偏向多数类这时可以看混淆矩阵必要时对少数类做过采样。YOLOV5 训练完会在runs/train/citrus_pest下存权重、曲线图和混淆矩阵best.pt是验证集最优权重后面推理和部署都用它。4. 避坑与排查小数据集训练最容易踩的 5 个坑4.1 现象训练日志里WARNING: No labels found原因images 和 labels 目录没对齐或者 txt 文件名和图片名不一致比如图片是train_163.jpeg标签却是train_163.jpg.txt。YOLOV5 是按「图片路径替换 images 为 labels、扩展名换 .txt」去找的任何一处不匹配就找不到。解决写个脚本遍历 images 目录逐个检查对应 labels 下是否存在同名 txt缺的列出来补上或删掉对应图。4.2 现象可视化框整体偏移或大小不对原因坐标还原时把x_center当成左上角或者忘了乘回原图宽高。归一化坐标是相对整图的比例不是像素值。解决严格按x1 (xc - w/2) * W还原画之前打印几个框的像素坐标和图片尺寸核对。4.3 现象mAP 一直很低但 loss 正常下降原因类别顺序和 names 对不上或者验证集里混进了训练集图片导致评估虚高后又回落。小数据集尤其要保证 train/val 无重叠。解决核对 data.yaml 的 names 顺序与 txt 中 class_id 的对应关系并用文件哈希或文件名比对确认两个集合没有交集。4.4 现象显存溢出CUDA out of memory原因--img调太大或 batch 太大大尺度原图缩放后仍占显存。解决先把 img 降到 640、batch 降到 8 跑通再逐步往上试也可以开--rect减少 padding 浪费。4.5 现象推理时框出一堆重复框原因NMS 的 IoU 阈值不合适小目标密集时容易重叠。解决调--conf-thres和--iou-thres小目标场景一般把 iou-thres 从默认 0.45 适当调低或调高做对比看哪个更干净。5. 进阶把 300 张图用出 3000 张的效果小数据集的终极问题永远是「样本不够」。这份数据 240 张训练图直接训容易过拟合但它的高分辨率给了你一个别人没有的杠杆切图增强。原图 1000–4000 像素虫子只占其中一小块你可以把大图裁成多个 640×640 的子图每个子图里只要有目标就保留对应标签这样一张原图能裂变出好几张训练样本等于免费扩增。常见做法是用滑动窗口切图窗口 640、重叠 128裁完重新生成归一化标签。这个操作对移动小目标检测特别有效因为缩放整图会让虫子变得极小而切图保留了原始像素密度。另一个杠杆是数据增强参数的针对性调整。YOLOV5 默认的 mosaic 对小目标友好但 mixup 在样本极少时可能引入噪声可以先把 mixup 关掉观察。HSV 增强对虫体颜色敏感的场景要克制hue 抖动太大会让木虱和背景混淆。我一般会先跑一版默认增强做 baseline再单独调 mosaic 和 scale对比 mAP 变化而不是一次性全改。验证方法上别只看 mAP 一个数。混淆矩阵能告诉你苍蝇和木虱有没有互相误判PR 曲线能看出在什么置信度下召回掉得厉害。部署前我习惯抽 10 张验证集图做单图推理肉眼看框的贴合度这一步能抓到指标看不出的问题比如小目标漏检、密集区域框合并。从那以后我每次拿到新的小数据集都强制先跑一遍可视化脚本确认标注、再切图扩增、最后才开训这三步顺序乱了就得返工。希望这份柑橘害虫检测数据集能帮你把 YOLOV5 的链路先跑通再谈调优。本文还有配套的精品资源点击获取
返回列表