ARTICLE DETAIL

资讯详情

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

柑橘害虫检测数据集实战:YOLOv5目录格式与训练避坑指南

柑橘害虫检测数据集实战:YOLOv5目录格式与训练避坑指南 简介这份资源面向从事农业虫害智能监测、目标检测算法练习与课程设计的研究者与开发者提供柑橘害虫检测的YOLOv5格式数据集可直接投入训练省去格式转换与标注整理环节。数据聚焦苍蝇与木虱两类害虫图像为1000至4000像素的大尺度RGB图片贴近真实田间拍摄场景适合检验模型对小目标与高分辨率输入的适应能力。压缩包共603个文件以301个txt标签、300张jpeg图像为主另附1个可视化py脚本与1张png示意图整体约260MB其中训练集含240张图片及对应标签验证集含60张图片及对应标签并给出2类别文本信息。可视化脚本无需修改即可运行随机传入一张图片便能绘制边界框并保存到当前目录便于快速核查标注质量。目前已有402人学习适合作为目标检测入门到进阶的实战素材。1. 柑橘害虫检测数据集从拿到 YOLOv5 目录到跑通第一轮训练果园里挂黄板、装诱虫灯拍回来的照片堆了几千张真正让人头疼的不是拍照而是把「柑橘害虫检测」这件事拆成模型能吃的格式。这个数据集按 YOLOv5 目录格式组织两个类别训练集和验证集分开拿到手就能直接喂给 YOLOv5 训练脚本。它解决的是从「一堆原始图片」到「可训练数据」之间那段最耗时的脏活标注文件路径、类别编号、images/labels 对应关系、data.yaml 配置。适合两类人一是做农业虫情监测、想快速验证检测方案可行性的算法工程师二是刚接触目标检测、想找一个真实场景数据集把 YOLOv5 训练流程完整走一遍的开发者。下面按「目录长什么样 → 怎么接进训练 → 参数怎么调 → 坑在哪」的顺序讲清楚。2. YOLOv5 目录格式拆解柑橘害虫数据集的文件结构与类别映射2.1 标准目录树与两个类别的编号约定YOLOv5 对数据集目录有固定期待常见做法是根目录下放images和labels两个文件夹各自再分train和val。柑橘害虫检测数据集通常就是这个结构两个类别在data.yaml里按顺序声明编号从 0 开始。先看目录长什么样# 典型 YOLOv5 数据集根目录结构 citrus_pest_dataset/ ├── images/ │ ├── train/ # 训练集图片jpg/png │ │ ├── 0001.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── 0101.jpg │ └── ... ├── labels/ │ ├── train/ # 与 images/train 同名的 txt 标注 │ │ ├── 0001.txt │ │ └── ... │ └── val/ │ ├── 0101.txt │ └── ... └── data.yaml # 类别名与路径配置这里的关键约束是images/train/0001.jpg必须对应labels/train/0001.txt文件名不含扩展名严格一致。YOLOv5 在加载时会按这个规则去配对配不上就静默跳过训练时表现为「图片数比预期少」这是最常见的翻车点之一。data.yaml的内容一般长这样# data.yaml柑橘害虫检测数据集配置 path: ./citrus_pest_dataset # 数据集根目录 train: images/train # 相对 path 的训练图片目录 val: images/val # 相对 path 的验证图片目录 nc: 2 # 类别数柑橘害虫为 2 类 names: # 类别名顺序即编号 0、1 0: pest_a 1: pest_bnc必须和names的条目数一致names的顺序决定标注文件里数字的含义。如果标注时把类别 0 写成了一种虫、配置里却把 0 写成另一种模型学到的就是错位的映射验证时精度会莫名其妙地低。2.2 标注文件格式一行一个目标的归一化坐标YOLO 格式的标注是纯文本每行一个目标格式为class_id x_center y_center width height后四个值都是相对图片宽高的归一化值范围 0 到 1。柑橘害虫检测里一只虫在叶片上可能只占几十个像素归一化后数值很小这是正常的。# labels/train/0001.txt 示例 0 0.412 0.533 0.086 0.121 # 类别0中心在(0.412,0.533)宽高占比 1 0.720 0.310 0.054 0.078 # 类别1如果拿到的是 VOC 的 XML 或 COCO 的 JSON需要先转换。转换时最容易错的是归一化分母必须用该图片自身的宽高而不是数据集统一尺寸。下面是一个最小转换片段把 VOC 的bndbox转成 YOLO 行# voc_to_yolo.py单张 VOC XML 转 YOLO txt import xml.etree.ElementTree as ET from PIL import Image def voc_to_yolo(xml_path, img_path, class_map): img_w, img_h Image.open(img_path).size # 用原图尺寸做归一化分母 tree ET.parse(xml_path) lines [] for obj in tree.findall(object): name obj.find(name).text if name not in class_map: continue # 未声明的类别直接跳过 cls_id class_map[name] box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) xc (x1 x2) / 2 / img_w # 中心 x 归一化 yc (y1 y2) / 2 / img_h # 中心 y 归一化 w (x2 - x1) / img_w # 宽归一化 h (y2 - y1) / img_h # 高归一化 lines.append(f{cls_id} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) return \n.join(lines)class_map是类别名到编号的字典必须和data.yaml的names完全对应。归一化保留 6 位小数足够YOLOv5 内部会再处理。转换完建议抽查几张用可视化脚本把框画回原图确认没有整体偏移或缩放错误。3. 用 YOLOv5 在本地跑通柑橘害虫训练环境、命令与超参数3.1 环境配置与最小训练命令YOLOv5 的环境配置常见做法是用 conda 建一个独立环境装 PyTorch 和依赖。版本上不必追新能跑通即可。下面是一套可复现的流程# 创建环境并安装依赖 conda create -n yolo5 python3.9 -y conda activate yolo5 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt装完后用python -c import torch; print(torch.cuda.is_available())确认 GPU 可用。如果返回 False先查驱动和 CUDA 版本不要急着改代码。最小训练命令# 从预训练权重开始训练柑橘害虫检测 python train.py \ --data ./citrus_pest_dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --project runs/train \ --name citrus_pest--data指向data.yaml--weights用官方预训练权重做迁移学习--img 640是输入尺寸--batch 16按显存调整--epochs 100是训练轮数。训练日志和权重会落在runs/train/citrus_pest/下weights/best.pt是验证集上最好的模型。3.2 关键超参数学习率、批大小与输入尺寸怎么定YOLOv5 的超参数集中在data/hyps/hyp.scratch-low.yaml这类文件里训练时可以用--hyp指定。对柑橘害虫这种小目标偏多的场景几个参数值得单独调参数默认值建议调整原因lr00.010.005~0.01小数据集容易过拟合学习率别太大lrf0.010.01~0.05余弦退火终值影响后期收敛batch168~32按显存太小梯度噪声大img640640~1280小目标多时提高分辨率mosaic1.00.5~1.0增强小目标但虫体太小可能被切碎学习率lr0是初始值lrf是最终值YOLOv5 用余弦退火从lr0降到lrf。柑橘害虫数据集如果只有几千张lr0设 0.01 偏大容易在前期震荡我一般先试 0.005。batch受显存限制16 是 8G 显存的稳妥值。img提到 1280 能显著改善小虫检测但显存和训练时间翻倍需要权衡。mosaic是 YOLOv5 的招牌增强把四张图拼成一张。对柑橘害虫如果虫体本身只有几十像素mosaic 后可能被裁到只剩半只反而引入噪声。常见做法是前期开 1.0最后 10 个 epoch 关掉--close-mosaic 10让模型在真实分布上收尾。3.3 训练过程监控与验证集评估训练时终端会打印每轮的box_loss、obj_loss、cls_loss和 mAP。box_loss下降说明框回归在收敛obj_loss反映目标置信度cls_loss是分类。如果box_loss不降先查标注是否有大量越界或宽高为 0 的框。验证集评估用val.py# 在验证集上评估 best.pt python val.py \ --data ./citrus_pest_dataset/data.yaml \ --weights runs/train/citrus_pest/weights/best.pt \ --img 640 \ --task val输出里关注mAP0.5和mAP0.5:0.95。柑橘害虫检测里两类虫的 AP 可能差很多如果某一类 AP 特别低先看验证集里这类样本是不是太少或者标注里这类框是不是普遍偏小。conf_thres和iou_thres可以在val.py里调默认 0.001 和 0.6评估时用低阈值看召回上限。4. 柑橘害虫检测的避坑与排查标注、路径与显存的血泪经验4.1 图片与标注文件名不匹配导致训练集缩水现象训练日志里train: Scanning ... images后面跟的数量比实际图片少比如放了 3000 张只扫到 2400 张。原因images/train和labels/train里文件名不一致常见于从不同来源拷贝时带了(1)、_copy后缀或者图片是.jpeg而标注是.txt但前缀不同。YOLOv5 按文件名主干配对配不上就跳过。解决写个脚本比对两个目录的文件名集合把差集打印出来。统一重命名时只改主干保留扩展名。处理完再跑一次扫描确认数量一致。4.2 标注越界与零宽高框让损失变 NaN现象训练几个 epoch 后box_loss变成nan或者终端报NaN相关警告。原因标注里存在x_center加width/2超过 1 的框或者width、height为 0。转换脚本没做边界裁剪时容易出现尤其是从 VOC 转过来、原图尺寸读错的情况。解决训练前跑一遍清洗脚本把越界坐标裁剪到 [0,1]丢弃宽高小于 1e-6 的行。清洗后统计一下被修改的标注数量如果比例很高说明转换环节有系统性问题要回头查归一化分母。4.3 显存不足与 batch 设置的取舍现象训练启动就报CUDA out of memory或者跑几十步后爆显存。原因batch或img设得太大或者workers太多导致内存碎片。柑橘害虫数据集图片如果分辨率很高比如 4000x3000即使img 640也会在数据加载时占大量内存。解决先把batch降到 8 或 4img保持 640。如果还爆检查--workersWindows 下设 0 或 2Linux 下 4 到 8。另外可以在train.py里加--nosave先跑通流程确认不是保存权重导致的峰值。4.4 验证集 mAP 虚高或虚低现象验证集mAP0.5高得离谱比如 0.98但实际推理时漏检严重或者低得离谱但肉眼看框挺准。原因虚高常见于验证集和训练集有重复图片模型「背答案」虚低常见于data.yaml里val路径写错实际评估的是空集或错误集。解决先查训练集和验证集的图片哈希有没有重叠有重叠就重新划分。再确认val路径下的图片数量用val.py时加--verbose看每张图的预测情况。如果某类 AP 为 0检查names顺序和标注里的类别编号是否一致。4.5 小目标漏检与输入尺寸的权衡现象大虫能检出小虫几乎全漏或者框位置偏移大。原因柑橘害虫里小目标占比高img 640下几十像素的虫在特征图上只剩几个像素YOLOv5 的 P3 层也难覆盖。解决把img提到 1024 或 1280同时batch相应减小。如果显存不够可以只对训练集做切片增强把大图切成小块分别标注。另外检查anchors是否匹配YOLOv5 默认 anchor 对小目标不算友好可以用--noautoanchor关掉自动锚框手动调小 anchor 尺寸。5. 从跑通到可用柑橘害虫检测的推理部署与效果验证技巧训练出best.pt只是开始真正要判断这个数据集值不值得投入得看推理端的效果。我一般会做三件事单图推理看框、批量推理看统计、视频流推理看稳定性。单图推理用detect.py# 对单张图片推理保存结果 python detect.py \ --weights runs/train/citrus_pest/weights/best.pt \ --source ./test_images/leaf_001.jpg \ --img 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt--conf-thres是置信度阈值柑橘害虫场景建议从 0.25 起调太低会出大量误检太高会漏小虫。--save-txt会把预测框按 YOLO 格式存下来方便和人工标注对比。批量推理把--source换成目录视频流换成视频文件或摄像头编号。验证效果时别只看 mAP。我习惯抽 50 张验证集图片人工数一遍真实虫数再和模型预测数对比算一个「计数误差」。如果 mAP 0.8 但计数误差 30%说明框的质量不够可能是定位偏移导致 IoU 卡在阈值边缘。这时候回头调--iou-thres或者检查标注框是否偏大偏小。还有一个实用技巧用--augment开测试时增强对同一张图做多尺度推理再融合小目标召回通常能提几个点代价是推理变慢。如果部署端算力够这个开关值得开。最后说个我自己的习惯每次换数据集或改标注先跑 10 个 epoch 的短训练看box_loss能不能降到 0.05 以下。降不下去就别急着跑 100 轮先回去查标注。这个「10 轮体检」帮我省过很多通宵。希望帮到你。本文还有配套的精品资源点击获取
返回列表