ARTICLE DETAIL

资讯详情

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

谷物害虫目标检测数据集:687张YOLO图片训练实战指南

谷物害虫目标检测数据集:687张YOLO图片训练实战指南 简介谷物害虫目标检测数据集是一份专为农业害虫识别开发的YOLO格式标注数据面向需要构建粮食仓储害虫监测系统的算法工程师、农业物联网开发者以及开展目标检测教学与课题研究的高校师生。数据集包含687张真实拍摄的谷物害虫图片及对应txt标注文件标注类别统一为pest边界框精确覆盖常见仓储害虫形态可直接用于YOLOv5、YOLOv8等模型训练也可作为迁移学习与数据增强实验的基准数据。压缩包共1376个文件其中687个jpg图片、687个txt标签另附yaml配置与docx说明文档整体体积仅22.76MB方便快速下载与部署。当前已有230人学习使用。该数据集可支撑AI模型自动识别谷物害虫应用于粮食仓储实时监控、智能农业机器人等场景能减少粮食损失、优化存储管理同时适合作为农业AI课程的项目实战素材帮助开发者省去数据采集与标注成本专注模型调优与落地验证。1. 谷物害虫目标检测数据集687 张图能把仓储监测做到什么程度去年帮一个粮库做虫害监测预研最大的卡点不是算法而是数据。网上公开的害虫数据集要么是昆虫分类图集要么标注格式五花八门想直接喂给目标检测模型根本跑不起来。这份谷物害虫目标检测数据集不一样它是 YOLO 格式的农业场景数据集687 张训练图片全部来自真实谷物存储环境单类别标注pest边界框已经归一化好拿到手可以直接丢进 YOLOv5 或 YOLOv8 开始训练。对正在做智能粮库、仓储害虫监测系统开发或者拿农业 AI 做毕设和学术基线的人来说这个资源能省掉最痛苦的“数据清洗手工标注”阶段。别小看单类别这个设定实际仓储场景里绝大多数业务只需要回答“有没有虫、在哪一区”而不是“这是什么虫”。2. 先拆数据格式YOLO 标注与真实场景图的底细2.1 标注文件结构一个 txt 对应一张图五行数字代表一个框这份数据集落地的第一个关键点是先搞懂它的标注格式。解压后每一张.jpg图片都会配一个同名.txt标注文件文件名里带rf.前缀和一串 hash看特征是从 Roboflow 平台导出的标准结构。每个 txt 文件里的每一行代表一个目标框格式固定为class_id x_center y_center width height前四列不是像素坐标而是归一化坐标取值范围 0 到 1。比如一行数据是0 0.3452 0.6781 0.1234 0.0987含义是类别编号为 0对应pest边界框中心点在图片横向 34.52% 的位置纵向 67.81% 的位置框宽占图片宽度 12.34%框高占图片高度 9.87%。这个格式是 YOLO 系列模型的通用输入不需要再做任何转换。我习惯在训练之前先随机抽一张图把标注可视化出来确认一下坐标是否正确免得数据集本身有问题还蒙头训练。用一个小脚本就能完成import cv2 import numpy as np img_path train/images/09511_jpg.rf.f2759c021c30e9fc07d030319c195313.jpg label_path train/labels/09511_jpg.rf.f2759c021c30e9fc07d030319c195313.txt img cv2.imread(img_path) h, w img.shape[:2] with open(label_path, r) as f: lines f.readlines() for line in lines: cls_id, x_center, y_center, box_w, box_h map(float, line.strip().split()) # 还原成像素坐标注意 YOLO 格式的 x_center 和 y_center 是归一化比例 x1 int((x_center - box_w / 2) * w) y1 int((y_center - box_h / 2) * h) x2 int((x_center box_w / 2) * w) y2 int((y_center box_h / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 0, 255), 2) cv2.putText(img, fpest {box_w:.2f}x{box_h:.2f}, (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1) cv2.imwrite(check_annotation.jpg, img) print(标注可视化已生成请人工检查框是否贴合害虫本体)这段脚本的逻辑很简单读取图片尺寸把归一化坐标还原成像素坐标再画框。参数里最需要注意的是x_center - box_w / 2和y_center - box_h / 2这步换算YOLO 格式存的是中心点加宽高OpenCV 画矩形需要左上角坐标。如果你打开可视化图片发现框大面积偏移或框住的是背景说明标注数据有问题趁早排查。2.2 图片质量与目录结构先别急着训练花五分钟做体检解压之后的目录结构一般是 Roboflow 导出的标准三件套目录内容train/训练集图片和对应 txt 标注valid/验证集图片和对应 txt 标注test/测试集图片和对应 txt 标注不过摘要里只提到了训练集 687 张我建议用命令先扫一遍实际目录看 valid 和 test 是否齐全find . -type f -name *.jpg | wc -l find . -type f -name *.txt | wc -l这两条命令分别统计 jpg 图片数和 txt 标注数。正常情况下两者数量应该完全一致因为 YOLO 格式要求每张图都有对应标注文件。结果对不上的时候八成是某些图片没有目标框Roboflow 导出的空标注会生成空 txt 文件不影响训练但如果 txt 缺失YOLOv8 训练时会直接把这张图跳过。图片本身是 JPEG 格式来源于真实农业场景这意味着画面里会有谷物颗粒、粮仓结构、光照不均、局部遮挡等干扰因素。我一般会再跑一个脚本统计所有图片的分辨率分布因为 YOLOv8 默认输入 640x640如果原图分辨率参差不齐训练时会被强制缩放导致小目标变形。2.3 单类别的优势与边界知道它能做什么也要知道它不该做什么这份数据集只标了一个类别pest这个设计对落地非常友好。单类别检测任务只需要回答“这里有没有害虫、虫在哪里”模型容量可以集中在一类目标上收敛更快误检率更容易控制。对于仓储管理系统来说一线业务并不需要区分玉米象、谷蠹、赤拟谷盗只需要触发“这个区域有虫害风险”的告警就够了。但边界也很明显。如果你想做的是按害虫种类精准分类比如区分米象和锯谷盗这个数据集满足不了。单类别数据里的pest标签把所有害虫混为一谈类别粒度不够细。另外 687 张训练图对于单类检测是够起步的但场景多样性有限——如果目标部署环境是面粉厂、大米加工线光照、背景、害虫个体大小和训练集差异较大直接拿来用泛化能力会打折扣最好用迁移学习加自采数据做二次微调。3. 用 YOLOv8 跑通训练环境准备、目录重组与超参数设置3.1 环境安装与依赖版本先统一 Python 和 CUDA拿到数据集先别急着写代码把环境装利索。常见做法是用ultralytics这个开箱即用的库跑 YOLOv8它把训练、验证、导出、推理一条链路全包了。创建独立虚拟环境是必要动作因为 PyTorch 和 CUDA 版本一旦混装后患无穷conda create -n pest_det python3.10 -y conda activate pest_det pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 pip install ultralytics第一行创建 Python 3.10 的环境第二行激活。第三行安装带 CUDA 11.8 支持的 PyTorch这里有个值得注意的参数--index-url指定了 PyTorch 官方的 CUDA 版本源比默认源装机更稳妥。最后一行安装 ultralytics 库它会自动把 YOLOv8 的模型定义、训练器、推理器一起装好。安装完成后我用一个简单命令确认 GPU 可用import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))输出True和显卡型号说明环境是通的。如果打印False大概率是 CUDA 版本和显卡驱动不匹配回退到 CPU 版能跑但训练极慢687 张图也不至于完全跑不动只是心态会崩。3.2 目录重组与 data.yaml不整理好目录训练报错退回来找你是迟早的事YOLOv8 训练时靠一个data.yaml文件指定数据集路径和类别信息。这个文件写错是新手翻车重灾区尤其是nc和names这两项。目录建议整理成下面的结构dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── valid/ │ ├── images/ │ └── labels/ └── data.yamlRoboflow 导出的目录如果已经是这个结构直接改路径即可。data.yaml 的内容按下方写法path: /home/user/pest_det/dataset train: train/images val: valid/images test: test/images nc: 1 names: [pest]path是数据集根目录的绝对路径建议写绝对路径不要图省事写相对路径否则换目录跑训练就得改。train和val填的是相对path的图片目录路径nc等于 1 表示只有一个类别names列表必须和标注文件里的class_id对应——这个数据集只有 0对应pest如果顺序写错训练时标签会全部错位。3.3 训练命令与超参数从预训练权重出发而不是从零开始YOLOv8 的核心优势是有预训练权重打底。用 COCO 预训练权重yolov8n.pt做初始化比从随机权重开始训练收敛速度快得多这是整个谷物害虫检测项目里最省时间的一步yolo detect train \ data/home/user/pest_det/dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ patience20 \ project./runs \ namepest_exp1逐项拆一下参数含义data指向刚写好的 yaml 文件model填预训练权重路径yolov8n.pt是 nano 版本模型体积最小、训练最快对单类别任务完全够用epochs100是最大训练轮数imgsz640是输入分辨率与预训练权重默认值一致batch16取决于显存大小8GB 显存跑这个参数没问题patience20表示连续 20 轮验证集指标没有提升就提前结束省时间又不浪费算力。训练的中间产物都在runs/pest_exp1/下其中weights/best.pt和last.pt是后面要用到的关键文件。best.pt 是验证集上指标最好的权重优先用这个做推理。训练日志里重点盯Box(P)、R、mAP50这几个指标如果训练结束时mAP50低于 0.5别急着加数据先把第 5 章的坑排查一遍再重训。4. 验证与推理mAP 指标怎么读、单图推理和实时监测怎么接4.1 验证集指标解读mAP 是参考现场不漏检才是硬道理训练结束后runs/pest_exp1/目录下会生成results.png和confusion_matrix.png但最直接的判断依据是控制台打印的验证表格指标含义参考标准Precision检出的框里真正是害虫的比例越高误报越少建议 0.85Recall真实害虫里被检出来的比例越高漏检越少建议 0.8mAP50IoU 阈值 0.5 下的平均精度0.7 以上算能用的模型mAP50-95更严格的 IoU 从 0.5 到 0.95 平均难度大0.4 以上就算合格这里有个误区只看 mAP50 高就认为模型能上线是大忌。病虫害监测场景里漏检一批害虫可能导致整个粮仓区域误判为安全业务代价远高于误报。所以我在验证时更看重 Recall。如果 Precision 高但 Recall 低说明模型很保守十只虫只报七只宁可多调低置信度阈值再试。4.2 单图推理实战conf 和 iou 两个参数决定输出质量训练完权重先拿验证集里的真实图片跑一次推理确认模型行为符合预期from ultralytics import YOLO model YOLO(/home/user/pest_det/runs/pest_exp1/weights/best.pt) results model.predict( source/home/user/pest_det/dataset/valid/images/09897_jpg.rf.4a1ead90abc9e798d3d982e3a221b472.jpg, conf0.25, iou0.5, saveTrue, project./runs/detect, namepest_infer, imgsz640 )这段代码用最优权重对指定图片做推理。conf0.25是置信度阈值低于 0.25 的检测框会被丢弃这个值调低会召回更多目标但误报也会增多调高则相反。iou0.5是 NMS 的 IoU 阈值控制重叠框的合并力度目标密集场景建议保持 0.5追求少框可以把 iou 调低到 0.3。saveTrue会把带框的推理结果图存到runs/detect/pest_infer/下直接肉眼观察框的位置和置信度。推理完成后我习惯抽三张图做人工核对一张虫在谷物表面、一张虫在阴影里、一张谷物堆特写。如果这三张都有稳定检测模型大概率能进入试点应用。4.3 从单图到实时监测视频流推理要做哪些改动做仓储监测系统的人往往会问模型能不能直接接摄像头。YOLOv8 的predict接口天然支持视频流输入把source换成 RTSP 地址或本地视频文件即可。但流式推理有几个实际问题首屏延迟、CPU 占用、漏检积累。我一般会在predict参数里加vid_stride2意思是每两帧处理一帧。这个参数对 25fps 摄像头来说等效检测频率约 12.5fps人眼已经觉得是实时了GPU 功耗和发热显著下降。配合conf0.3在粮仓这种背景相对干净的场景里使用误报和漏检可以打到平衡点。摄像头视角下害虫在画面里往往很小imgsz640可能不够用。我踩过的坑是直接用 640 推理导致小目标被漏检后来把推理尺寸提升到imgsz1024小目标召回确实提升了但速度也明显下降。实时性和召回率之间没有魔法只能按实际摄像头距离去权衡。若是部署在定点粮仓摄像头离粮面近640 够用若是全景巡航摄像头就得配合切片推理了。5. 谷物害虫检测常见问题与避坑从标注到部署的五个现场5.1 数据解压、文件配对与标注正确性现象一解压后文件夹里 jpg 数量和 txt 数量对不上。Roboflow 导出的 zip 在 Windows 下解压偶发中文路径问题或者某些解压工具把空 txt 文件当成空文件跳过导致部分图片没有对应标签。训练时 YOLOv8 会跳过这些图片表现为训练 loss 突然跳变但 mAP 上不去。原因就是图片与标注文件不对齐。解决方式是解压后用命令强制重置目录再做一次配对校验find . -name *.jpg -exec basename {} .jpg \; | sort jpg_list.txt find . -name *.txt -exec basename {} .txt \; | sort txt_list.txt diff jpg_list.txt txt_list.txt如果 diff 输出有差异把缺失 txt 名单导出再删除对应图片保证两边一一对应。做这一步的成本极低却能避免训练时莫名其妙掉点。现象二自己的脚本读标注画框发现 box 尺寸为 0 或者坐标超界。个别标注行的 width 或 height 是 0或者 x_center 加 width/2 超过 1.0。YOLO 格式标注要求边界框完全落在图内且宽高大于 0Roboflow 导出理论上不会出现但编辑过的数据可能残留这类脏数据。解决方式是训练前跑一次校验脚本把不合法的行直接过滤或告警不要抱有侥幸心理。脏标注训练出来的权重推理阶段会反复在某个区域出现空心框。5.2 训练异常、推理空框与类别错位现象三训练正常跑完但推理什么都检不到。第一反应检查data.yaml的 names 顺序。假设标注文件里写的 class_id 是 0YOLOv8 的 names 列表写了[pest]没问题。但如果数据集其实有 id1 的标注而你 names 只写了一个类那所有 id1 的目标都会被强制忽略。这个数据集摘要声称单类别但自己总是要再抽样确认一遍cat train/labels/*.txt | awk {print $1} | sort -u这条命令统计所有标注文件里出现过的类别编号。如果只有 0说明确实是单类别如果出现其他数字说明资源内部混入了多类别标注训练前必须决定是过滤还是扩类。现象四训练到一半 loss 变成 nan或者 loss 一直不下降。nan 大概率是学习率过高或 batch 过大导致梯度爆炸。YOLOv8 默认学习率 0.01 对预训练权重是安全的但如果把 batch 拉到 64 且没做学习率缩放就可能翻车。常见做法是把学习率降到 0.001 再试yolo detect train ... lr00.001还有另一种可能数据里存在损坏的 JPEG 文件。OpenCV 在读取损坏图片时不会报错但返回的数组全为 0训练器无法感知。我通常用PIL扫一遍所有 jpg 文件能不能正常打开。现象五模型在验证集上 mAP 很高但拿到粮库现场误检爆炸。照片是近距离拍摄的异物照、背景噪声在训练集里没见过模型就把它们当成害虫。这属于场景漂移问题不是模型本身坏了。解决思路有两个在数据增强阶段加背景负样本或者在实际部署侧加一个“感兴趣区域”遮罩只检测粮面区域把货架反光和人员走动排除在外。后者的实现成本远低于重新采集数据。6. 进阶技巧数据增强、切片推理与现场微调让模型更扛造数据集只有 687 张图就算迁移学习起步场景覆盖依然有限。我的习惯是先用默认增强参数训练一轮拿到 baseline 指标再针对这个数据集的短板做定向强化。YOLOv8 的增强参数里hsv_h、degrees、scale、mosaic对这类室内近景场景最有效。谷物环境有不同色温的灯光hsv_h0.02、hsv_s0.7可以模拟色温偏移让模型对灯光变化不敏感degrees15允许小角度旋转适应摄像头安装倾斜的情况scale0.6模拟害虫尺寸波动。这些值不要盲目拉大超过合理范围反而会污染真实分布。切片推理是针对“害虫小、图片大”场景的高性价比方案。如果现场摄像头分辨率是 2592x1944直接把整张图缩到 640 推理一只虫可能只有 10x10 像素几乎无法检测。常见做法是把原图切成 640x640 的格子每个格子独立推理再把框坐标映射回原图坐标系拼接。YOLOv8 的predict不直接支持切图分块需要自己写逻辑但思路很简单用滑窗把大图切块每块对应一个原图偏移量推理后把xyxy坐标加上偏移量即可。代价是推理次数按块数倍增粮库巡检相机每秒处理一帧足够用。评估这件事最容易被忽略。训练集 mAP 只能说明模型在已见场景里的表现真实粮库的光线、虫种、堆放密度和数据集会有差异。我拿到 best.pt 后专门跑到粮库拍了 20 分钟视频抽了 40 帧做人工标注跑一次推理对比漏检数再决定要不要现场微调。微调的做法是用这几个月的自采数据在 best.pt 权重基础上再训 30 轮学习率降到lr00.0001只用少量数据就能拟合新场景。从那以后我每次做目标检测项目都强制把“现场抽帧验证”作为上线前的起点而不是终点。这个习惯救过我很多次希望帮到你。本文还有配套的精品资源点击获取
返回列表