尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

YOLOv8训练水稻褐飞虱数据集:从标注到部署的完整实战指南

发布时间:2026/9/24 18:35:39

资讯中心
01
ARTICLE

YOLOv8训练水稻褐飞虱数据集:从标注到部署的完整实战指南

YOLOv8训练水稻褐飞虱数据集:从标注到部署的完整实战指南
简介菲律宾水稻褐飞虱成虫目标检测数据集来自真实稻田环境共1,458张现场图片训练集941张、验证集304张、测试集213张面向农业AI开发者、植保科研人员与高校智慧农业专业学习者。标注采用YOLO格式聚焦褐飞虱成虫这一主要水稻害虫类别可直接投入YOLO等主流目标检测框架用于构建虫害自动识别模型、物联网实时监测预警系统为精准植保决策提供可靠数据支撑。资源包共2,000个文件1,458个txt标注对应每张图片的边界框与类别信息540张jpg原图1个yaml配置便于快速适配训练环境1个docx文档说明数据集背景与构成整体zip压缩包仅56.36MB轻便易取。已有196人学习使用。标注样本经农业专家校验覆盖水稻不同生长阶段田间真实光照变化与植株遮挡能有效提升模型泛化能力既可支撑高校科研与毕业论文实验也可接入无人机或田间物联网设备实现害虫实时监测预警辅助减少农药滥用、助力粮食安全。1. 为什么拿这份水稻虫害数据集做目标检测1,458 张图能解决什么做农业目标检测的人最怕的不是模型选型而是找不到能直接开训的数据集。这份菲律宾水稻褐飞虱成虫目标检测数据集一共 1,458 张田间实拍图已经划分好训练集 941 张、验证集 304 张、测试集 213 张标注统一为 YOLO 格式的单类目标。解压之后不用再花时间做格式转换直接传给 YOLOv5、YOLOv8 就能开始训练是典型的「yolov8 训练自己的数据集」入口级材料。它能解决两件事一是水稻虫害识别模型的快速验证算法改版、超参对比都能先在这类小规模数据上跑出结论二是给田间虫口监测系统提供一套带真实遮挡和光照变化的基准数据而不是实验室白背景的“理想图”。褐飞虱成虫是水稻主要害虫虫体只有几毫米颜色又贴近稻株这类图像恰好是目标检测里小目标检测的典型场景比 COCO 那种通用数据集更贴农业现场。适合三类人拿 YOLO 练手、想完整走一遍数据到训练的初学者做智慧农业、精准植保项目、需要先验证可行性的研发工程师以及农业院校里带学生做病虫害识别实验的教师。下面就从标注格式讲起把训练、避坑、部署和计数统计一条线走完。2. 读懂 YOLO 标注目录结构、标签 txt 和坐标换算跑训练命令之前先把数据集的「里子」看清楚。很多新手拿到压缩包就急着解压、急着训练结果 loss 降不下去最后发现是标签格式理解错了。YOLO 系列的数据处理流程高度依赖目录约定和 txt 坐标格式这章把关键点拆开讲。2.1 解压之后先看目录train / valid / test 三套目录的约定压缩包用 zip 打包Linux 下直接解压Windows 下用自带解压工具或 7-Zip 都行unzip 菲律宾水稻褐飞虱成虫目标检测数据集.zip解压后先不要急着删压缩包确认目录结构再动手。这个数据集按训练、验证、测试三套目录组织每套下面又有 images 和 labels 两个子目录rice_bph/ ├── train/ │ ├── images/ 941 张 jpg │ └── labels/ 941 个 txt ├── valid/ │ ├── images/ 304 张 jpg │ └── labels/ 304 个 txt └── test/ ├── images/ 213 张 jpg └── labels/ 213 个 txtimages 和 labels 是一一对应的jpg 主名等于 txt 主名。比如 01758_jpg.rf.e7169bd54d4777d1e5ab942ba0afc004.jpg 对过去一定是同名 txt。文件名里带 rf 是导出工具留下的命名痕迹不影响训练但写批处理脚本时不要按前缀过滤直接按主名关联最稳。训练和验证在 train / valid 上进行test 集只做最终评估不要拿来做任何调参。如果你要复现这份数据集的基准结果train / valid / test 的划分比例就别动如果只是练手重排一次也没关系但报告时要注明是自己重划分的。目录图片数作用train/images labels941训练权重valid/images labels304选超参、早停、选 best.pttest/images labels213最终效果评估只碰一次2.2 标签 txt 里那五个数字归一化坐标怎么换算成像素框打开任意一个 txt每行是五个数0 0.4714 0.5382 0.0820 0.1176第一个数是类别 id这份数据集只有一个类别「褐飞虱成虫」所以固定为 0。后面四个数是归一化后的框中心 x、中心 y、宽度、高度全部除以图片宽高以后得到 0~1 之间的浮点数。换算成像素坐标的公式是x_pixel x_center * img_width y_pixel y_center * img_height w_pixel w * img_width h_pixel h * img_height左上角坐标就是 x_pixel - w_pixel / 2 和 y_pixel - h_pixel / 2。拿 1280×720 的图举例cx0.4714 乘 1280 得 603cy0.5382 乘 720 得 387bw0.0820 乘 1280 得 105bh0.1176 乘 720 得 85。也就是说中心点大约在 (603, 387)框宽 105、高 85 像素。这个 105×85 的框只占图面不到 1%是标准的小目标尺寸。如果某张图里有多个目标txt 里就有多行一行一个框。发现某个值小于 0 或大于 1说明标注导出异常发现类别 id 不是 0说明多类别混入后面避坑章会专门展开。2.3 用 Python 抽查标注把框画出来再训练不能只看 txt我一般会抽 20 到 30 张图把框画出来人眼扫一遍比任何指标都直观import cv2 import os img_dir rice_bph/train/images label_dir rice_bph/train/labels for name in [01758_jpg.rf.e7169bd54d4777d1e5ab942ba0afc004, 00337_jpg.rf.b6074241442c5aecf427945e27b2bd68]: img cv2.imread(os.path.join(img_dir, name .jpg)) h, w img.shape[:2] with open(os.path.join(label_dir, name .txt)) as f: for line in f: cid, cx, cy, bw, bh map(float, line.split()) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite(check_ name.split(_jpg)[0] .jpg, img)逻辑说明先读图拿到宽高再逐行解析 txt五个数分别对应类别 id 和归一化坐标乘上实际宽高得到像素坐标最后用 OpenCV 画框。画完存成 check_ 开头的图片直接肉眼看。注意点这份数据是单类画框颜色不用区分如果画出来的框偏到角落、比例畸形或明显只包住虫子的半边身体说明标注坐标异常。缩略图一眼能看出漏标的话直接放弃该图或重新标注不要指望模型自己学回来。多目标图里如果出现大量重叠框也要留意是不是把稻秆误包进了虫框。2.4 标签统计先搞清目标尺寸分布再定训练参数画框只能看局部全量统计目标尺寸分布才能决定训练策略import os import cv2 label_dir rice_bph/train/labels img_dir rice_bph/train/images areas [] for f in os.listdir(label_dir): img cv2.imread(os.path.join(img_dir, f.replace(.txt, .jpg))) h, w img.shape[:2] with open(os.path.join(label_dir, f)) as fp: for line in fp: _, cx, cy, bw, bh map(float, line.split()) areas.append(bw * w * bh * h) areas.sort() print(框数量:, len(areas)) print(最小 10% 框面积:, areas[:int(len(areas) * 0.1)]) print(中位数框面积:, areas[len(areas) // 2])逻辑说明遍历目录里每个 txt按主名找到对应图片用图片宽高把归一化框还原成像素面积收集起来排序。最小 10% 的框代表数据里最难检的那一批中位数代表整体量级。如果中位数框面积不到原图面积的 2%可以按小目标检测方案处理训练 imgsz 提到 640 以上推理阶段用滑窗裁图。这个统计结果是第 3 章参数选择和第 6 章滑窗推理的直接依据建议训练前先跑一遍。3. 训练前把数据喂给 YOLOv8数据集配置与三个关键参数把 YOLOv8 能读懂的data.yaml配好再把训练命令里的 imgsz、batch、epochs 三个参数调到符合这份数据的状态训练基本就成功了一半。很多人死在数据路径和类别数对齐上这一章专门讲清楚。3.1 目录整理用软链接而不是复制粘贴YOLOv8 默认从数据集根目录往下找 images 和 labels标准结构是train/images、train/labels这种。如果压缩包解压出来的目录层级不对我习惯用软链接整理不动原始数据mkdir -p rice_bph_dataset/train rice_bph_dataset/valid rice_bph_dataset/test ln -s /path/to/rice_bph/train/images rice_bph_dataset/train/images ln -s /path/to/rice_bph/train/labels rice_bph_dataset/train/labels ln -s /path/to/rice_bph/valid/images rice_bph_dataset/valid/images ln -s /path/to/rice_bph/valid/labels rice_bph_dataset/valid/labels ln -s /path/to/rice_bph/test/images rice_bph_dataset/test/images ln -s /path/to/rice_bph/test/labels rice_bph_dataset/test/labels逻辑说明软链接只是快捷方式不复制文件省磁盘空间也保证原始解压结果不被误改。Windows 用户可以用mklink /J做目录联接或者直接把 images 和 labels 复制到目标目录效果一样。训练时框架会先在 images 里读图再去对应 labels 目录找同名 txt。如果训练日志出现大量 label file not found十有八九是目录相对位置被改过了比如把 labels 全部塞进一个总文件夹。目录整理好以后运行一次find . -name *.txt | wc -l数量对得上预期再继续。3.2 data.yaml路径、类别数和类别名必须对齐path: /path/to/rice_bph_dataset train: train/images val: valid/images test: test/images nc: 1 names: 0: brown_planthopper_adult说明path 写数据集根目录train / val / test 只写相对路径框架会自动去对应 images 目录找图片再按主名找 labels。nc1 是类别数names 从 0 开始编号。类别名里不要带空格和连字符用下划线连接。原始标注名如果是 brown planthopper - adult写进 yaml 时建议统一成 brown_planthopper_adult避免路径解析时空格被截断。三个最常见的报错是path 写错导致 found 0 imagesnames 个数与 nc 不一致images 和 labels 目录名拼错。检查顺序就是先ls -l确认目录再打开 yaml 逐行对。3.3 训练命令imgsz、batch、epochs 三个参数定生死代码yolo detect train \ data/path/to/rice_bph_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ patience20 \ projectrice_bph_runs \ nameexp1 \ device0参数说明参数含义这份数据的建议model预训练权重yolov8n.pt 或 yolov8s.pt不要从零训练imgsz输入尺寸640 起步显存够用再上 768batch每批图片数16显存不足降到 8epochs训练轮数100配合 patience 提前停patience早停耐心值20验证指标多轮不涨就停deviceGPU 编号0没有 GPU 用 cpu慢很多针对这份单类小目标数据模型选 yolov8n 最合理1,458 张图只够学一个类参数量大的 v8x 很容易过拟合。imgsz 是这张数据集的关键虫体本来就只有几十像素imgsz320 会把目标压到几个像素特征全丢640 是兼顾显存和精度的起点。早停参数 patience20 的意思是验证集 mAP 连续 20 轮不提升就停止。训练日志每轮会打印 box_loss、cls_loss、dfl_loss三项持续下降说明在正常学。如果 cls_loss 震荡不降大概率是标签问题回到第 2 章重新检查。3.4 训练完看什么指标不要只盯 mAP50训练完成后重点看这四个数指标含义单类小目标参考precision检出的框里多少是真的0.85 以上recall真实虫体找回多少0.85 以上mAP50IoU0.5 的平均精度0.80 以上mAP50-95更严格的 IoU 标准0.50 以上precision 和 recall 对虫害检测非常重要recall 低了漏检多后面做虫口计数会被系统性低估precision 低了误检多预警系统天天瞎报。mAP50-95 在小目标上天然吃亏不用过于焦虑重点看 mAP50 和 recall 有没有同时走高。results.png 里还有一组曲线val 的 loss 如果先降后升、train 还在降就是过拟合信号回到 3.3 加正则或减小 epochs。confusion_matrix.png 里如果背景那一格非零比例很高说明误检多检查 imgsz 是否太小、标注框是否太松这正好接上第 4 章的避坑内容。4. 避坑田间小目标检测最常踩的五个坑田间数据训练常见的坑网上很多经验贴说得玄乎本质就那么几个标签脏、尺寸小、划分不均、显存不够硬调参。我把这五个最常遇到的按「现象 → 原因 → 解决」写清楚。4.1 现象模型把稻秆和背景误检成虫precision 一片狼藉原因imgsz 设太小。褐飞虱成虫在原图上常只有 30 到 50 像素imgsz320 一缩放虫体压到十个像素以内纹理特征基本丢失模型只能靠颜色和周围环境猜误检自然爆表。解决imgsz 至少 640更高分辨率配合 batch 折中使用。推理阶段把 confidence 阈值从默认 0.25 提到 0.3 到 0.35能在 precision 和 recall 之间重新找平衡。如果 imgsz 已经 640 还是这样检查标签框是否把稻秆大片包进去了。4.2 现象训练曲线正常换到验证集 mAP 突然崩掉原因数据划分不随机或拍摄时段差异大。如果图片按日期或地块顺序排列划分时可能 train 全是晴天顺光valid 全是阴天逆光田间光照差异直接变成域偏移模型见过的那类光和没见过的光表现天差地别。解决划分前先把文件名打散再按 7:2:1 或 8:2 切。固定划分的数据集想复现报告结果用原始 train / valid 划分就行想自己重训重排一次更稳。跑完 val 如果 precision 和 recall 差距大回看 valid 图片的直方图确认不是整体曝光差异导致的假掉点。4.3 现象loss 正常下降mAP 始终为零原因标签格式有问题。最常见三类类别 id 越界、坐标值超出 0~1、txt 里出现 0 0 0 0 0 空框行。YOLO 会静默跳过坏标签不报错模型在部分图上等于空跑loss 看起来正常精度永远起不来。解决训练前跑一遍 2.3 的脚本把所有 txt 打印出来人工抽查再写循环检查每个 txt 的坐标范围。发现脏标签直接脚本清洗不要手动改几百个文件。清洗完重新统计标签数量和清洗前对比差值就是被修掉的坏样本数。4.4 现象显存不够把 batch 调小结果精度反而掉原因batch 降到 4 以后BN 层统计量不稳定尤其小数据集每个 batch 的分布差异大模型收敛不稳。有人调参调到心态崩以为是模型问题其实是 batch 太小导致的训练不充分。解决优先降 imgsz640 降到 512保持 batch 16或者开梯度累积等效 batch 不变只是多花一点时间。再不行换 yolov8n 这种轻量 backbone不要一上来就用 v8x1,458 张图根本喂不饱大模型。4.5 现象recall 高但 precision 低框比虫多原因标注漏标或框太松。褐飞虱翅膀边缘和稻秆颜色接近标注时容易把稻秆包进框模型学到的框就偏大推理时一个虫被重复框好几个NMS 也压不干净。解决用 2.3 的可视化脚本随机抽 50 张训练图重点看框有没有贴紧虫体。如果大量框明显偏大后处理把 NMS 的 IoU 阈值从 0.5 调低到 0.4 可以缓解但治本还是重新精修边缘样本。框太松的数据就算 mAP 好看用到计数场景也会系统性高估虫口密度。5. 验证与部署用推理结果反推数据质量再导出边缘端模型训练完不等于结束。先用验证命令把模型在 valid 上的表现完整压一遍再根据误检漏检反推数据问题最后导出 ONNX 给田间设备用。这套流程走完你才敢把模型从电脑搬到现场。5.1 用 val 命令批量验证拿到每张图的置信度分布yolo detect val \ data/path/to/rice_bph_dataset/data.yaml \ model/path/to/runs/detect/exp1/weights/best.pt \ conf0.25 \ iou0.5 \ max_det300 \ save_jsonTrue逻辑说明conf 是检出置信度下限低于这个值的框直接丢弃iou 是 NMS 的 IoU 阈值两个框重叠超过 50% 就合并max_det 限制单张图最多输出几个框田间密集场景要调大。save_jsonTrue 会把每张图的预测框、置信度、类别写进 JSON方便后面做漏检分析。输出表格里重点看 per-class 的 precision、recall 和 mAP50。这份数据只有一个类如果 mAP50 上了 0.8 但 recall 只有 0.7说明漏检集中在部分难图进入 5.4 做难例筛选。5.2 阈值怎么调conf 和 iou 在不同场景下的两套经验值我的习惯是预警场景用高阈值统计场景用低阈值场景confioumax_det理由虫害预警0.350.5100宁缺毋滥少制造误报虫口普查0.200.45300多召回后处理过滤噪声科研评估0.250.5300与基线对齐小目标框之间重叠本来就少NMS 的 iou 不用调太高主要靠 conf 卡误检。如果你发现同一只虫被重复框住先把 iou 降到 0.4 试试但优先查是不是标注框本身画太大不然换了阈值也只是治标。5.3 导出 ONNX给无人机和边缘盒子用yolo export \ model/path/to/runs/detect/exp1/weights/best.pt \ formatonnx \ imgsz640 \ simplifyTrue \ opset12逻辑说明ONNX 是边缘部署最常见的中间格式可以再转到 TensorRT、OpenVINO 或 RKNN。opset12 兼容大部分推理框架simplifyTrue 会做计算图简化去掉冗余算子。导出后用小脚本验证一次输入输出和 PyTorch 版本对齐import onnxruntime as ort import numpy as np sess ort.InferenceSession(best.onnx) x np.random.rand(1, 3, 640, 640).astype(np.float32) outs sess.run(None, {sess.get_inputs()[0].name: x}) print([o.shape for o in outs])逻辑说明随机生成一张假图跑一次推理输出形状应该是 [1, 84, 8400] 这种84 是 4 个坐标加 80 个类别再加 1 个置信度的组合。如果类别数对不上回查 3.2 的 nc 设置。导完不验证问题到运行时才暴露排查成本高得多。5.4 从 213 张测试集里挖难例反推数据质量验证完别只看 mAP 就收工。用 5.1 生成的 JSON 和真实标签对比统计漏检率最高的前 20 张图大概率是三类强逆光下虫体颜色和稻秆混在一起、多虫重叠导致 NMS 吞框、叶片反光造成局部过曝。把这几类图单独抽到一个文件夹回看它们的拍摄条件。如果难例集中在某几个时段或某几块田说明数据集在对应条件下有缺口靠调参补不回来只能补拍补标。这个分析过程本身就是数据质量报告的一部分拿去跟甲方沟通时比一个孤零零的 mAP 数字有说服力得多。6. 进阶从「框」到「数」用滑窗推理把结果变成虫口密度单张图推理只能回答「这张图里有几只虫」农户真正关心的是「这块田现在的虫口密度是多少」。无人机拍出来的正射影像是几千像素的大图直接整张缩放小目标全丢直接裁开贴在边缘的虫体会被切成两半。滑窗推理是解决这个问题的常用方案也是这份小目标数据集最能发挥价值的用法。思路很简单把大图按固定步长切成有重叠的小块每块单独送进模型推理再把框坐标映射回原图最后合并去重import cv2 from ultralytics import YOLO model YOLO(best.pt) img_big cv2.imread(field_0425.jpg) H, W img_big.shape[:2] tile_h, tile_w, overlap 640, 640, 80 stride_h, stride_w tile_h - overlap, tile_w - overlap all_boxes [] for y in range(0, H, stride_h): for x in range(0, W, stride_w): x2 min(x tile_w, W) y2 min(y tile_h, H) tile img_big[y:y2, x:x2] res model(tile, conf0.25, iou0.5)[0] for box in res.boxes: cx, cy, bw, bh box.xywh[0].tolist() all_boxes.append((x cx, y cy, bw, bh, float(box.conf[0])))逻辑说明tile 尺寸对齐训练时的 imgszoverlap 取 80 像素保证贴边的虫体不会被裁切砍成两半。每块推理出的框中心坐标加上该块在原图上的偏移量就还原成整图坐标。最后把所有框统一再做一次 NMS去掉重叠区产生的重复框。参数上建议 conf 固定tile 640overlap 80虫体特别密的时候 overlap 提到 128推理时间大约增加三成。拿到每张监测图的虫口数量以后我的习惯是每隔几天同一块田拍一次按同样的滑窗参数统计每平方米虫数拉成一条折线。喷药后曲线断崖下跌说明施药时机正确两三天后反弹说明虫源没切断要复查周边田块。这个比单张图判断有没有虫更能回答「要不要打药、什么时候打药」。说到这里必须讲一个教训滑窗参数一旦定了就不要改尤其 conf。有一次我把 conf 从 0.25 调到 0.15 想多召回一些结果虫口密度基线直接翻了一倍排查了很久才发现是阈值变动导致的不是田里的虫变多了。从那以后所有计数实验我都强制固定推理参数同一批监测数据用完全相同的 conf、tile、overlap前后才可比。希望这个坑你能避开也希望这套从标注到部署的流程帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。