ARTICLE DETAIL

资讯详情

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

菲律宾稻田褐飞虱成虫数据集:1458张实拍图与YOLO小目标检测实战

菲律宾稻田褐飞虱成虫数据集:1458张实拍图与YOLO小目标检测实战 简介这份菲律宾水稻褐飞虱成虫目标检测数据集面向智能农业监测、精准植保与农业AI科研人员聚焦水稻主要害虫褐飞虱成虫的自动识别难题。数据采集自菲律宾真实稻田覆盖不同生长阶段与光照、遮挡等复杂环境共1458张现场图片按训练941张、验证304张、测试213张划分标注为YOLO格式边界框可直接接入主流检测框架训练与验证。资源包共2000个文件以1458个txt标注文件、540张jpg图像为主另含1个yaml数据配置与1份docx说明文档压缩包约56.36MB目录结构清晰便于快速加载。已有196人学习下载。借助该数据集读者可构建虫害实时监测预警模型为农药喷洒定位提供依据也可用于农业院校教学与算法对比实验推动AI在病虫害防治中的落地。1. 菲律宾稻田里的 1458 张实拍这个褐飞虱成虫数据集到底能干什么如果你正在做农业虫害识别大概率遇到过这种尴尬网上能找到的公开数据集要么是实验室摆拍背景干净得像证件照要么类别标注粗到只分「虫」和「非虫」训出来的模型一放到真实稻田里就集体翻车。这份菲律宾水稻褐飞虱成虫目标检测数据集恰好卡在一个很实用的位置上——1458 张真实农田现场图训练集 941 张、验证集 304 张、测试集 213 张全部按 YOLO 格式标注只有一个类别brown planthopper - adult也就是褐飞虱成虫。它不追求类别数量而是把「单一害虫在复杂田间环境下的定位」这件事做扎实。适合谁做智能农业监测、植保无人机、田间物联网虫情预警的团队以及拿它当农业目标检测课程设计或算法验证基线的同学。你不需要从零标注几千张图直接就能跑通一条从数据到模型的链路。2. 拆开压缩包先看什么目录结构、标注格式与训练集划分逻辑拿到一个目标检测数据集最忌讳的就是解压完直接train.py一把梭。我一般会先花十分钟把目录和标注摸清楚不然后面报错全是玄学。2.1 目录结构与文件命名规律从项目正文给出的文件列表能看出图片命名是「五位数字编号 _jpg.rf. 一串哈希.jpg」的形式比如01758_jpg.rf.e7169bd54d4777d1e5ab942ba0afc004.jpg。这种带.rf.的命名是 Roboflow 导出时的典型特征说明这份数据大概率经过了一次在线标注与增强流水线。压缩包里除了图片还有一份.docx说明文档里面通常写着类别定义、采集背景和划分比例。解压后你大概率会看到这样的结构不同导出批次可能略有差异以实际为准dataset/ ├── train/ │ ├── images/ # 941 张训练图 │ └── labels/ # 对应的 .txt 标注 ├── valid/ │ ├── images/ # 304 张验证图 │ └── labels/ ├── test/ │ ├── images/ # 213 张测试图 │ └── labels/ └── data.yaml # 类别与路径配置如果解压出来是扁平的images/和labels/两个大文件夹那就需要自己按编号或按比例切分后面 2.3 会讲怎么切。2.2 YOLO 标注格式逐字段解读YOLO 的标注是每张图对应一个同名.txt每行一个目标格式固定为五个字段class_id x_center y_center width height以这份数据集为例只有一个类别所以class_id恒为0。后面四个值全部是归一化到 0~1 的浮点数x_center、y_center是边界框中心点相对整图宽高的比例width、height是框的宽高比例。举个实际会出现的行0 0.5123 0.4478 0.0312 0.0289这说明目标框很小——宽高只占整图的 3% 左右。褐飞虱成虫体型本来就小在整株水稻的图里往往只占几十个像素这是这份数据集最核心的难点也是它比那些「大目标」数据集更有训练价值的地方。你拿到标注后第一件事应该是统计框的尺寸分布确认没有大量异常值比如宽高为 0 或接近 1 的脏标注。2.3 训练/验证/测试划分是否合理941 / 304 / 213 这个比例大约是 6.5 : 2 : 1.5属于比较常规的划分。但要注意一点如果这些图是从同一段连续视频里抽帧得到的那么训练集和验证集之间可能存在高度相似的近邻帧导致验证指标虚高。判断方法很简单算一下训练集和验证集图片的感知哈希pHash相似度如果大量图片两两相似度超过 0.95就说明划分有泄漏风险。我一般会跑这么一段检查import os import imagehash from PIL import Image from collections import defaultdict def phash_set(folder): hashes {} for name in os.listdir(folder): if name.lower().endswith((.jpg, .png)): path os.path.join(folder, name) hashes[name] imagehash.phash(Image.open(path)) return hashes train_h phash_set(dataset/train/images) val_h phash_set(dataset/valid/images) # 统计验证集每张图与训练集最相似图的汉明距离 leak 0 for vname, vh in val_h.items(): min_dist min((vh - th) for th in train_h.values()) if min_dist 4: # 距离越小越相似4 基本可视为近邻帧 leak 1 print(f疑似泄漏图片数: {leak} / {len(val_h)})imagehash.phash把图片压成一个 64 位指纹汉明距离小于等于 4 通常意味着视觉上几乎一样。如果泄漏比例超过 10%建议重新按采集批次或时间划分而不是随机切分。这一步不做后面模型在验证集上 mAP 冲到 0.9一上真实设备就露馅这种血泪经验我踩过不止一次。3. 从零跑通 YOLO 训练环境、配置与第一个 baseline数据摸清楚了接下来就是把它喂给模型。这份数据集是标准 YOLO 格式主流框架都能直接吃下面以 Ultralytics 的 YOLOv8 为例走一遍完整流程其他版本v5、v11 等配置逻辑基本一致。3.1 环境搭建与依赖版本先建一个干净的虚拟环境避免和系统里的老版本 torch 打架conda create -n planthopper python3.10 -y conda activate planthopper # 安装 PyTorch按你的 CUDA 版本选这里以 CUDA 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics装完验证一下 GPU 是否可用import torch print(torch.cuda.is_available()) # 应为 True print(torch.cuda.get_device_name(0)) # 显示你的显卡型号如果返回 False先别急着怀疑数据集八成是 CUDA 版本和驱动不匹配。用nvidia-smi看驱动支持的最高 CUDA 版本再回头选对应的 torch 轮子。3.2 data.yaml 怎么写才不出错YOLO 训练全靠这个配置文件指路路径写错是最常见的翻车点。在数据集根目录建一个data.yamlpath: /absolute/path/to/dataset # 数据集根目录强烈建议写绝对路径 train: train/images val: valid/images test: test/images nc: 1 names: 0: brown_planthopper_adult几个关键点path用绝对路径相对路径在不同工作目录下启动训练时经常找不到文件train、val是相对path的子路径nc是类别数这份数据集只有一类所以是 1names的键必须从 0 开始且和标注里的class_id对应。类别名建议用英文下划线避免中文或空格在某些版本里引发解析问题。3.3 启动训练与关键超参设置配置好了直接开跑yolo detect train \ data/absolute/path/to/dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/planthopper \ namebaseline逐项说明一下为什么这么设。modelyolov8n.pt用 nano 版先跑 baseline速度快、显存占用低适合快速验证数据管线通不通imgsz640是默认输入尺寸但褐飞虱目标极小640 下可能只剩十几个像素后面第 5 章会专门讲怎么调batch16在 8G 显存上比较稳显存不够就降到 8lr00.01是 SGD 的初始学习率如果换成 AdamW 建议降到 0.001patience20表示 20 轮验证指标不提升就早停省得白跑。训练过程中重点盯三个输出box_loss是否稳定下降、mAP50是否在涨、有没有出现nan。如果 loss 一开始就 nan多半是学习率太大或标注里有非法值坐标超出 0~1。跑完在runs/planthopper/baseline/weights/下会得到best.pt和last.pt验证和推理都用best.pt。3.4 验证与推理确认模型真的学到了东西训练完先别高兴跑一遍验证看分类别指标yolo detect val \ modelruns/planthopper/baseline/weights/best.pt \ data/absolute/path/to/dataset/data.yaml \ imgsz640输出里会给出mAP50、mAP50-95、precision、recall。对单类别小目标任务mAP50能到 0.7 以上算及格0.85 以上算不错。但指标好看不代表能用一定要拿几张真实图做推理可视化from ultralytics import YOLO model YOLO(runs/planthopper/baseline/weights/best.pt) results model.predict( sourcedataset/test/images, conf0.25, # 置信度阈值小目标可适当降低 iou0.5, # NMS 的 IoU 阈值 saveTrue, projectruns/predict, nametest_vis ) # 统计每张图检出的目标数判断是否有漏检 for r in results: print(r.path, len(r.boxes))conf0.25是默认值但小目标经常因为置信度偏低被过滤掉可以试着降到 0.1 看召回能不能提上来代价是误检增多。iou0.5控制重叠框合并虫体密集时调高到 0.6 能减少误合并。把saveTrue的可视化结果翻一遍重点看漏检和误检分别出现在什么场景——逆光、叶片遮挡、虫体与背景颜色接近这些都是后面优化的方向。4. 小目标检测的避坑清单五个真实翻车现场褐飞虱成虫这个任务难点几乎全集中在「目标小」三个字上。下面五条是我在类似农业小目标数据集上反复踩过的坑每条按现象、原因、解决来说。4.1 现象训练 loss 正常下降但 mAP 死活上不去原因输入分辨率太低。640×640 下一个原本在原图里占 40 像素的虫子缩放后可能只剩 15 像素特征图到 P3 层时几乎被下采样抹平网络根本学不到有效特征。解决把imgsz提到 1024 甚至 1280同时batch相应调小。更彻底的做法是改检测头增加一个更高分辨率的 P2 层。YOLOv8 可以通过自定义 yaml 加 P2但改动较大先用大输入尺寸验证收益更划算。4.2 现象验证集 mAP 很高实际部署到设备上大量漏检原因训练集和验证集存在近邻帧泄漏或者验证集场景过于单一。模型记住的是「这一批图长什么样」而不是「虫子长什么样」。解决回到 2.3 的 pHash 检查重新按采集批次划分。另外把测试集单独留出来训练全程不碰最后只用它做一次评估这个数字才可信。4.3 现象模型把叶片上的斑点、水滴误检成褐飞虱原因单类别数据集缺少负样本模型没见过「像虫但不是虫」的干扰物把背景纹理也学成了目标特征。解决往训练集里掺入一定比例的纯背景图无标注的负样本或者收集误检截图作为难例重新标注。YOLO 支持空标注文件放几张只有背景的图进去能明显压低误检率。4.4 现象密集虫群时框大量重叠NMS 后只剩一个原因NMS 的 IoU 阈值设太低相邻虫体的框互相抑制。褐飞虱聚集时框本来就挨得近默认 0.5 太激进。解决推理时把iou提到 0.6~0.7或者改用 Soft-NMS。训练阶段则要检查标注是否把多只虫标成了一个框这种标注错误会让模型学出「大框」倾向。4.5 现象换一台机器或换个框架指标掉一大截原因数据增强策略、归一化方式、甚至图像解码库PIL vs OpenCV的差异都会影响结果。农业图像色彩偏绿不同解码器的色彩空间处理不一致时输入分布就变了。解决固定一套预处理管线训练和推理用同一个库读图。把增强参数HSV 抖动、翻转、mosaic写进配置文件而不是散在代码里换环境时直接复用。这份数据集本身已经过一轮增强训练时建议把 mosaic 关掉或降低概率避免二次增强过度。5. 把这份数据用出上限分辨率、切片推理与迁移策略baseline 跑通只是起点真正决定这份数据集价值的是你能不能在小目标这个约束下把指标再往上推一截。下面三个方向是我实际验证过收益比较明显的。5.1 输入分辨率与 P2 检测头的取舍前面提过提分辨率但 1280 的输入对显存要求翻倍训练时间也线性增长。一个折中方案是训练用 1024推理用 1280配合rectTrue保持长宽比减少 padding 浪费。如果显存实在吃紧可以试试 SAHISlicing Aided Hyper Inference切片推理把大图切成带重叠的小块分别检测再合并结果。对褐飞虱这种小目标切片推理往往比单纯提分辨率更划算。from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model AutoDetectionModel.from_pretrained( model_typeyolov8, model_pathruns/planthopper/baseline/weights/best.pt, confidence_threshold0.2, devicecuda:0 ) result get_sliced_prediction( dataset/test/images/01758_jpg.rf.e7169bd54d4777d1e5ab942ba0afc004.jpg, detection_model, slice_height512, slice_width512, overlap_height_ratio0.2, # 切片重叠比例防止目标被切断 overlap_width_ratio0.2 ) result.export_visuals(export_dirruns/sahi_vis)slice_height/width设成 512 意味着把原图切成若干 512 的小块overlap保证跨边界的目标至少完整出现在一块里。代价是推理变慢但小目标召回提升通常很可观。5.2 用这份数据做迁移学习的正确姿势如果你手头还有其他农业虫害数据这份菲律宾稻田数据是很好的预训练起点。策略是先用它训一个通用「稻田小目标」特征提取器再冻结 backbone只微调检测头去适配新类别。这样在小样本新任务上收敛快很多。策略适用场景关键参数全量微调新数据量 1000 张lr00.001epochs50冻结 backbone新数据量 200~1000 张freeze10lr00.005仅训检测头新数据量 200 张freeze全部 backbonelr00.01freeze10表示冻结前 10 层具体层数看模型结构YOLOv8n 总共也就几十层冻一半左右比较常见。冻结太多会导致欠拟合冻结太少又失去小样本优势这个平衡点得靠验证集试出来。5.3 一个容易被忽略的验证习惯最后说个我自己的教训。早期做虫害检测我总盯着 mAP 一个数字直到有次把模型部署到田间设备发现它对逆光图片几乎全漏。回头查才发现验证集里逆光样本占比不到 5%mAP 被大量顺光样本拉高了。从那以后我每次评估都会按光照、遮挡程度、虫体密度分桶统计指标而不是只看一个总数。具体做法是在验证脚本里加一段按图片亮度分组的逻辑import cv2 import numpy as np def brightness_bucket(img_path): img cv2.imread(img_path) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) mean_b gray.mean() if mean_b 80: return dark elif mean_b 160: return normal else: return bright # 把验证集图片按亮度分三桶分别跑 val 看各桶 mAP分桶之后你大概率会发现某一桶的指标明显拖后腿那就是下一步该补数据或调增强的方向。这个习惯帮我省下了大量「指标好看但没法用」的返工时间。希望这份菲律宾褐飞虱数据集和上面这套流程能帮你把农业小目标检测这条路走得顺一点。本文还有配套的精品资源点击获取
返回列表