尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLOV5柑橘害虫检测实战:2类300张图数据集训练与避坑指南

YOLOV5柑橘害虫检测实战:2类300张图数据集训练与避坑指南 简介这份资源面向从事农业智能化、目标检测算法学习与落地的开发者提供一套按YOLOv5目录规范整理的柑橘害虫检测数据集可直接投入训练省去格式转换与标注清洗环节。数据聚焦柑橘场景中的两类害虫——苍蝇与木虱图像为1000至4000像素的大尺度RGB图片适合检验模型对小目标与高分辨率输入的适应能力。压缩包共603个文件以301个txt标注文件、300张jpeg图像为主另附1个可视化py脚本与1张png示意图整体约260MB其中训练集含240张图片及对应标签验证集含60张图片及对应标签并给出2类别文本信息。配套脚本可随机读取一张图片绘制边界框并保存至当前目录无需修改即可运行便于快速核验标注质量。目前已有402人学习下载适合作为课程设计、科研实验或算法对比的现成数据基础。1. 柑橘害虫检测数据集2 类目标、300 张图为什么它值得先跑一遍柑橘害虫检测这个方向真正卡住人的往往不是模型结构而是数据。你搜 YOLOV5 目标检测数据集能搜到一堆通用数据集但落到柑橘这个具体作物、落到苍蝇和木虱这两个具体虫种公开可用的标注数据其实很少。这份资源给的就是一个已经整理好的 YOLOV5 目录格式数据集2 类别训练集 240 张、验证集 60 张图像分辨率在 1000 到 4000 之间属于大尺度 RGB 图片总大小 260MB。它解决的不是从零标注的问题而是拿到就能直接开训的问题。适合两类人一类是想验证 YOLOV5 训练流程是否跑通的新手另一类是做农业虫情监测、需要一个小规模基线来对比自己采集数据的从业者。目录结构已经按 YOLOV5 规范排好标签是 txt 格式不需要你再做格式转换。2. YOLOV5 目录结构与标签格式先看懂再动手2.1 目录长什么样每个文件夹对应什么拿到一个目标检测数据集第一件事不是急着写训练脚本而是把目录结构看清楚。这份数据按 YOLOV5 的标准组织方式存放核心是 images 和 labels 两个平行目录各自再分 train 和 val。常见做法是长这样datasets/ ├── images/ │ ├── train/ # 240 张 jpg │ └── val/ # 60 张 jpg ├── labels/ │ ├── train/ # 240 个 txt │ └── val/ # 60 个 txt └── data.yaml # 数据集配置文件images 下放的是原始图片labels 下放的是同名 txt 标签文件。这里有个容易忽略的点图片和标签必须同名只是扩展名不同。比如train_163.jpeg对应的标签必须是train_163.txt一旦名字对不上YOLOV5 在加载时会直接跳过这张图而且默认不报错你只会发现训练时样本数变少了。验证集同理60 张图配 60 个标签数量必须严格一致。data.yaml 是数据集和训练脚本之间的接口文件它告诉 YOLOV5 去哪里找图片、去哪里找标签、有几个类别、类别名字叫什么。这份数据的 2 个类别是苍蝇和木虱写进 yaml 时要注意顺序因为标签 txt 里的类别索引是从 0 开始的整数0 对应第一个类别名1 对应第二个。顺序写反了模型学到的就是错的映射。2.2 标签 txt 里到底存了什么YOLO 格式的标签文件是纯文本每一行代表一个目标框格式是class_id x_center y_center width height五个字段用空格分隔。class_id 是类别索引后面四个都是归一化到 0 到 1 之间的浮点数分别表示框中心点的 x、y 坐标和框的宽、高基准是整张图片的宽和高。这里最容易翻车的地方是很多人以为存的是像素坐标直接拿像素值去写结果训练时框全跑到图片外面去了。归一化的意思是如果一张图宽 2000 像素某个框中心在 x1000 的位置那 x_center 就是 0.5。这份数据已经标注好了你不需要自己算归一化但理解这个格式对排查问题很关键。比如训练时 loss 一直不降或者预测出来的框位置明显偏移第一反应就应该是去抽查几个标签文件看看数值是不是都在 0 到 1 之间。如果发现某个值大于 1那基本可以确定标注环节出了问题。2.3 用可视化脚本先验证一遍标注质量数据集提供了可视化 py 文件随机传入一张图片就能绘制边界框并保存到当前目录。这个脚本的价值在于它让你在正式训练之前用肉眼确认标注框和实际虫体是否对齐。我一般拿到任何数据集都会先跑一遍可视化因为标注错位、漏标、类别标反这些问题光看 txt 文件是看不出来的。脚本无需更改即可运行典型用法是传入图片路径它读取对应的标签文件在原图上画框然后保存一张带框的新图。跑几张训练集和验证集的图重点看三件事框有没有把虫子框全、框有没有明显偏大或偏小、同一张图里多个目标是否都被标出来了。如果发现某张图的框明显不对可以决定是修标签还是直接剔除这张图。对于只有 300 张图的小数据集每一张的质量都很重要剔除几张脏数据对最终效果的影响可能比调参还大。3. 从零跑通 YOLOV5 训练环境、配置、启动3.1 环境配置conda 建环境锁版本YOLOV5 对环境版本比较敏感尤其是 PyTorch 和 torchvision 的匹配关系。我一般用 conda 单独建一个环境避免和系统里其他项目冲突。常见做法是conda create -n yolo5 python3.8 -y conda activate yolo5 pip install torch1.13.1 torchvision0.14.1 --index-url https://download.pytorch.org/whl/cu117 pip install -r requirements.txt这里 python 选 3.8 是因为 YOLOV5 的很多依赖在这个版本上最稳。torch 和 torchvision 的版本必须配套1.13.1 配 0.14.1 是经过验证的组合。cu117 表示 CUDA 11.7如果你机器上是别的 CUDA 版本去 PyTorch 官网查对应命令替换。requirements.txt 里包含 opencv、matplotlib、pyyaml 这些装完基本就能跑了。有个血泪经验不要用最新版的 torch 去配老版 YOLOV5很容易在加载模型时遇到莫名其妙的报错。如果实在不确定先跑python -c import torch; print(torch.cuda.is_available())确认 GPU 能被识别再往下走。3.2 data.yaml 怎么写类别顺序别搞反data.yaml 是训练脚本读取数据集信息的入口内容大致如下path: ./datasets train: images/train val: images/val nc: 2 names: [fly, psyllid]path 是数据集根目录train 和 val 是相对于 path 的图片路径。注意这里只写 images 下的路径YOLOV5 会自动把 images 替换成 labels 去找对应标签。nc 是类别数这里是 2。names 是类别名列表顺序必须和标签里的 class_id 对应。如果你不确定哪个是 0 哪个是 1打开任意一个标签文件看第一列出现的数字再对照可视化脚本里画的框和类别名就能确认。提示names 里的名字只是标签不影响训练但影响你后面推理时输出的可读性。写错名字不会报错但会让你在结果里看到错误的类别。3.3 启动训练命令行参数逐个说清YOLOV5 的训练入口是 train.py最简启动方式python train.py --data datasets/data.yaml --img 640 --batch 8 --epochs 100 --weights yolov5s.pt逐个说参数。--data 指向你的 data.yaml。--img 640 表示训练时把图片缩放到 640 像素这份数据原图是 1000 到 4000 的大图统一缩放到 640 是常见做法既控制显存又保留足够细节。--batch 8 是批大小300 张图的数据集用 8 比较稳显存够可以加到 16。--epochs 100 是训练轮数小数据集一般 100 到 300 轮看 loss 收敛情况。--weights yolov5s.pt 表示从预训练权重开始微调这比从零训练效果好得多尤其是数据量小的时候。训练开始后终端会打印每轮的 box_loss、obj_loss、cls_loss 和 mAP。重点盯 mAP0.5如果它在前期快速上升然后趋于平稳说明训练正常。如果一直不动或者下降回去检查标签格式和 data.yaml 路径。3.4 训练完怎么看结果权重文件在哪训练结束后结果默认保存在 runs/train/exp 目录下。里面有几个关键文件weights/best.pt 是验证集上表现最好的权重weights/last.pt 是最后一轮的权重results.csv 记录了每轮的指标confusion_matrix.png 是混淆矩阵。做推理时用 best.pt因为它是在验证集上挑出来的泛化性通常比 last.pt 好。验证集只有 60 张图mAP 的波动会比较大不要因为某一轮 mAP 突然掉了一点就慌。更靠谱的做法是看整体趋势以及用可视化脚本把预测结果画出来肉眼确认框的位置和类别是否正确。对于 2 类别的任务混淆矩阵能直接告诉你苍蝇和木虱有没有被互相误判如果某一类经常被预测成另一类可能是两类样本在图像上太相似或者标注时类别搞混了。4. 避坑与排查小数据集训练最容易踩的五个坑4.1 图片和标签数量对不上训练样本悄悄变少现象训练日志里显示的样本数比预期少比如训练集应该有 240 张但日志里只加载了 230 多张。原因images 和 labels 目录下文件名不一致YOLOV5 找不到对应标签就跳过该图且默认不报错。解决用一条命令对比两个目录的文件名列表找出差集。diff (ls datasets/images/train | sed s/\.[^.]*$// | sort) (ls datasets/labels/train | sed s/\.[^.]*$// | sort)这条命令把图片和标签的文件名去掉扩展名后排序对比输出里带的是只有图片没有标签带的是只有标签没有图片。发现缺失后要么补标签要么把对应图片也删掉保持成对。4.2 标签数值超出 0 到 1框跑到图外现象训练 loss 异常大或者预测出来的框位置完全不对。原因标签 txt 里的坐标没有归一化写成了像素值。解决抽查几个标签文件如果看到类似0 1000 500 200 300这种大于 1 的数就是没归一化。这份数据已经处理好了但如果你自己后续增补数据一定要记得除以图片宽高。检查命令awk $21 || $31 || $41 || $51 {print FILENAME: $0} datasets/labels/train/*.txt这条命令会打印出所有坐标值大于 1 的行正常情况应该没有任何输出。4.3 类别索引和 names 顺序不一致模型学反现象推理时苍蝇被标成木虱木虱被标成苍蝇但框的位置是对的。原因data.yaml 里 names 的顺序和标签里 class_id 的实际含义对不上。解决打开一个标签文件看第一列的数字再用可视化脚本确认那张图里实际是什么虫。如果标签里 0 对应的是木虱但 names 里第一个写的是 fly那就把 names 顺序调过来。这个坑很隐蔽因为训练过程完全正常只有看结果时才发现类别反了。4.4 大图直接训练导致显存爆掉现象训练启动后报 CUDA out of memory。原因原图分辨率 1000 到 4000如果 --img 设得太大比如 1280 甚至原图尺寸显存扛不住。解决把 --img 降到 640 或 512同时把 --batch 也降下来。这份数据用 640 训练是合理的因为虫体在图中占比不算特别小640 下仍能保留可辨识的细节。如果确实需要更高分辨率用 --img 1280 --batch 4 这种组合用批大小换分辨率。4.5 验证集 mAP 虚高但实际效果差现象验证集 mAP 看起来不错但拿新图片去测效果明显不行。原因验证集只有 60 张且可能和训练集来自同一批采集分布太接近导致指标虚高。解决不要只看 mAP用可视化脚本把验证集的预测结果画出来逐张看。另外如果条件允许自己另外找几张没参与训练的柑橘害虫图做测试这才是真实泛化能力的体现。小数据集上mAP 的参考价值有限肉眼验证更可靠。5. 进阶技巧用这份数据做迁移学习和数据增强这份数据只有 300 张直接训练容易过拟合。我一般会做两件事一是用预训练权重做迁移学习二是开数据增强。YOLOV5 默认已经开了 mosaic、HSV 增强、随机翻转这些但针对柑橘害虫这个场景可以再调几个参数。python train.py --data datasets/data.yaml --img 640 --batch 8 --epochs 200 \ --weights yolov5s.pt --hyp data/hyps/hyp.scratch-low.yaml \ --cache --augment--cache 把图片缓存到内存300 张图不大缓存后每轮读取更快。--augment 开启测试时增强推理时对同一张图做多次增强再合并结果能小幅提升 mAP但会拖慢推理速度看场景取舍。--hyp 指定超参数文件hyp.scratch-low.yaml 是给小数据集用的低增强配置如果你发现增强太猛导致训练不稳定可以换这个。另一个实用技巧是冻结 backbone 先训几轮再解冻全量微调。YOLOV5 支持 --freeze 参数python train.py --data datasets/data.yaml --img 640 --batch 8 --epochs 50 \ --weights yolov5s.pt --freeze 10--freeze 10 表示冻结前 10 层只训练后面的检测头。这样在数据量小的时候能防止 backbone 被少量数据带偏。训完 50 轮后再用不冻结的方式接着训通常比一上来就全量微调更稳。验证方法上我习惯在训练结束后跑一遍val.py指定 best.pt 和验证集看最终的 P、R、mAP0.5、mAP0.5:0.95 四个指标。然后随机抽 10 张验证集图片用detect.py跑预测把结果图和原图并排看。如果 10 张里有 8 张以上框得准这份数据训出来的模型就算可用了。从那以后我每次拿到新数据集都强制先跑可视化脚本抽查 20 张标注再开始训练这个习惯帮我省下了大量返工时间。希望帮到你。本文还有配套的精品资源点击获取
返回列表