恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

水稻害虫检测数据集:VOC标注6630张,YOLO训练全流程解析

  • 首页
  • 资讯中心
  • /
  • 水稻害虫检测数据集:VOC标注6630张,YOLO训练全流程解析

相关资讯

开源LLM代码审查工作流:Git驱动的可审计Code Review实践 2026/9/25 17:25:43
Atlas 300V 24G推理卡上部署YOLO:从模型转换到调优实战 2026/9/25 17:25:43
Cursor不能用了?试试便宜量足的替代品 - Windsurf 配 TaoToken 统一 Key 通道 2026/9/25 17:20:43

最新资讯

大模型知识库(4)什么是Claw?从OpenClaw到TaoToken的AI Agent配置实践
生产级RAG知识库与Agent网关架构设计与调优实战
数据可视化库 Observable Plot 源码深度解析——8 Mark 如何变成 SVG
OpenClaw iMessage 完整集成指南:从选型到部署
Qwen3.5-397B-A17B-FP8 完整 Benchmark 总结:MoE+FP8+TP8 实测与 TaoToken 配置骨架
RSuite Breadcrumb 面包屑集成 Dropdown 下拉菜单:用 renderToggle 定制导航触发器

今日推荐

AI元人文:从工具使用到思维重构的深度探索
Python+CNN车牌识别实战:从数据预处理到模型训练与部署
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

本周热门

BrewUI:给Homebrew套上图形界面,让macOS软件包管理更简单
BrewUI:让Homebrew包管理变得可视化与高效
公式与文本对齐全攻略:从Word到LaTeX的实用技巧

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

水稻害虫检测数据集:VOC标注6630张,YOLO训练全流程解析

发布时间:2026/9/25 17:25:43
水稻害虫检测数据集:VOC标注6630张,YOLO训练全流程解析 简介一套面向水稻害虫检测的VOC格式目标检测数据集包含蛀虫、蠕虫等10个常见害虫类别适合目标检测初学者与农业智能识别研究者直接用于模型训练与验证。数据按train/val目录划分训练集含6630张图片及对应xml标注验证集含631张图片及对应xml标注图像为300×300分辨率RGB图边界框完整部分图像采用马赛克增强保证样本多样性。另附10类别的json字典文件便于类别映射与后续处理资源包为7z格式共2000个文件其中1999个xml标注文件和1个Python可视化脚本压缩包大小约89.78MB可直接解压使用。可视化脚本无需修改传入任意图片即可自动绘制边界框并保存结果方便快速预览标注质量。已有326人学习下载特别适合需要高质量农业害虫数据集的论文实验或项目落地场景。1. 水稻害虫检测数据集VOC 标注 90MB训练集 6630 张直接能跑做目标检测的人都有过这种经历模型结构调通了loss 也降了最后发现数据集才是最大的玄学。标注框歪的、类别对不上的、训练验证重叠的随便一个坑都能让你白训两周。这份水稻害虫数据集一共 90MB训练集 6630 张、验证集 631 张全部是 VOC 格式的 xml 标注分辨率统一为 300×300 的 RGB 图像覆盖 10 类水稻害虫。它最大的价值在于标注质量稳定、目录结构规整还附带一个可视化脚本拿过来不用改路径就能先看图再开训。适合的人群很明确做农业植保检测、刚上手 YOLO 系模型需要标准 VOC 数据练手、或者想快速验证数据增强策略的从业者。2. 拆开看目录结构与标注格式VOC 的 xml 里到底存了什么2.1 数据集目录约定与文件组织逻辑这份数据集的目录结构是典型的 VOC 风格但作者做了精简去掉了 VOC 里用不到的 JPEGImages、Annotations 这种嵌套层级直接用 images 和 labels 两个平级目录来区分图片和标注文件。train 和 val 两个大目录下各有一套 images 和 labels训练集 6630 张图和 6630 个 xml 一一对应验证集 631 张图和 631 个 xml 一一对应。这种组织方式的优势在于后续做数据集划分时非常省事。很多公开数据集把 train 和 val 混在一起你得自己写脚本按比例切分而这个数据集已经帮你分好了直接指向两个目录就能开始训练。我用 YOLOv5 和 YOLOv8 跑过把 train 和 val 的路径分别填进 yaml 文件的 train 和 val 字段其他的都不用动。2.2 VOC xml 核心字段filename、size 和 object 节点随便打开一个 xml 文件结构非常标准。filename 节点记录图片文件名size 节点记录宽高和通道数这数据集里统一是 300×300×3。每个 object 节点代表一个标注目标包含 name类别名、pose、truncated、difficult 和 bndbox 边界框坐标。annotation foldertrain/folder filenamebrown_plant_hopper_82_jpg.rf.9361af1603809eb101e6c5de3320dfa2.jpg/filename size width300/width height300/height depth3/depth /size object namebrown_plant_hopper/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin42/xmin ymin55/ymin xmax168/xmax ymax210/ymax /bndbox /object /annotation这个 xml 最简单直接的用法是拿 ElementTree 来解析。做数据清洗或者统计类别分布时我一般会写个脚本把所有 xml 扫一遍统计每个类别出现了多少次、边界框的平均尺寸是多少。这样能快速判断数据集有没有明显的类别不均衡问题不用肉眼一张张翻图。2.3 类别 json 字典文件训练前必须核对的两张表数据集里附带的 json 文件本质是类别字典把 10 个类别名称映射成数字 id。在训练 YOLO 系列模型时这个映射关系必须和模型输出层的类别数严格对应否则会出现类别标签错位的问题模型训出来预测结果完全没法用。{ 0: asiatic_rice_borer, 1: brown_plant_hopper, 2: rice_leaf_roller, 3: rice_water_weevil, 4: small_brown_plant_hopper, 5: yellow_rice_borer }注意我这里只列了 6 类做示例实际 json 文件里是完整的 10 类映射。拿到数据后第一步就是用脚本读取 json把类别名和 id 打印出来核对一遍确认和你模型配置文件里的类别顺序一致。这个动作很基础但能避免很多低级错误。VOC 的 xml 里存的是类别名字符串转成 YOLO 格式的 txt 时需要根据 json 把名字查成 id查表查错就是灾难。3. 可视化脚本 show.py把标注画到图上再谈训练3.1 脚本运行方式与输出逻辑数据集的作者提供了一个可视化脚本 show.py它的作用就是随机读取一张图片把 xml 里的边界框和类别名绘制到图上然后把结果保存到当前目录。这个脚本我拿到手第一件事就是直接运行验证环境没问题、标注数据能正常读取。python show.py运行之后脚本会随机挑一张图片画完框之后输出到当前目录生成的文件名一般是原图名加上标注后缀。不要小看这一步它实际上是数据质量检查的第一道关卡。如果脚本能跑通说明 xml 解析逻辑没毛病边界框坐标在图像范围内类别名能正常显示。如果脚本报错常见原因是路径写死了绝对路径或者 xml 里的 filename 和实际图片文件名对不上。这种情况我一般会先检查 xml 解析用的根目录变量改成相对路径或者把数据集的绝对路径填进去。作者说脚本无需更改可以直接运行但在不同环境下路径问题是最容易翻车的点。3.2 脚本核心逻辑拆解读 xml、画框、存图show.py 的核心逻辑其实不复杂就是标准的数据集可视化套路。它用 ElementTree 解析 xml遍历所有 object 节点用 OpenCV 的 rectangle 函数画框用 putText 标注类别名。这些操作组合起来就是脚本的全部内容但胜在逻辑完整可以直接作为模板改写。import cv2 import xml.etree.ElementTree as ET import os import random annotation_path train/labels image_path train/images output_dir visualized xml_files os.listdir(annotation_path) xml_file random.choice(xml_files) image_name xml_file.replace(.xml, .jpg) image cv2.imread(os.path.join(image_path, image_name)) tree ET.parse(os.path.join(annotation_path, xml_file)) root tree.getroot() color_map { brown_plant_hopper: (0, 0, 255), rice_leaf_roller: (0, 255, 0), rice_water_weevil: (0, 255, 255), yellow_rice_borer: (255, 0, 0) } for obj in root.iter(object): name obj.find(name).text bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) color color_map.get(name, (255, 255, 255)) cv2.rectangle(image, (xmin, ymin), (xmax, ymax), color, 2) cv2.putText(image, name, (xmin, ymin - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1) os.makedirs(output_dir, exist_okTrue) output_path os.path.join(output_dir, image_name) cv2.imwrite(output_path, image) print(fVisualized image saved to {output_path})这段代码有几个关键参数值得注意。color_map 字典定义了不同类别的显示颜色方便肉眼区分rectangle 函数的最后一个参数 2 是线宽害虫目标比较小线宽太粗会遮挡目标区域putText 里的 ymin - 5 是为了让文字显示在框的上方避免文字和框重叠。如果你想用这个脚本检查所有图片而不是随机的把 random.choice 改成 for 循环遍历所有文件就行。4. 从 VOC 到 YOLO 训练格式xml 转 txt 的完整路径与参数细节4.1 数据增强的特殊性马赛克图像的处理方式这个数据集有一个值得注意的地方对少部分图像做了马赛克增强就是把四张图片融合成一张。这在 YOLOv4 之后的训练策略里很常见Mosaic 增强能显著提升小目标检测效果。但问题是马赛克图像的标注边界框仍然以原图尺寸为基准转成 YOLO 格式时归一化坐标的分母用的是融合后的图片宽高这个细节不能搞错。import xml.etree.ElementTree as ET import os def convert_voc_to_yolo(xml_file, class_dict, output_txt): tree ET.parse(xml_file) root tree.getroot() size root.find(size) width int(size.find(width).text) height int(size.find(height).text) with open(output_txt, w) as f: for obj in root.iter(object): name obj.find(name).text if name not in class_dict: continue class_id class_dict[name] bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) x_center ((xmin xmax) / 2) / width y_center ((ymin ymax) / 2) / height box_width (xmax - xmin) / width box_height (ymax - ymin) / height f.write(f{class_id} {x_center:.6f} {y_center:.6f} {box_width:.6f} {box_height:.6f}\n)转换脚本的关键在于归一化。x_center 的计算是 (xmin xmax) 除以 2 得到中心点像素坐标再除以图片宽度得到比例值。这里有个容易踩的坑有的转换脚本会用 xmin box_width / 2效果一样但要注意括号别加错。width 和 height 必须从 xml 的 size 节点读取不能自己假设是 300。4.2 目标检测模型训练时的数据加载参数调整当你想用这份数据集训练 YOLOv5 或 YOLOv8 时需要新建一个数据配置文件。这个文件指定了训练集和验证集的图片路径、类别数量和类别名称列表。因为数据集本身已经是 300×300 的图YOLO 的输入尺寸设置成 320 或 384 就够了没必要强行 resize 到 640那样反而会拉伸变形。train: ./data/train/images val: ./data/val/images nc: 10 names: [asiatic_rice_borer, brown_plant_hopper, rice_leaf_roller, rice_water_weevil, small_brown_plant_hopper, yellow_rice_borer]注意 names 列表的顺序必须和 json 字典的 id 对应。如果 json 里 0 是 asiatic_rice_borer那么 names 的第一个元素必须是 asiatic_rice_borer这个顺序在推理阶段直接决定预测结果对应的类别名。很多人训练时 loss 正常下降但预测出来的标签全是错乱的大概率就是 names 顺序和 json 不一致。4.3 训练集与验证集的分配合理性验证6630 张训练集和 631 张验证集的比例大约是 9:1这个比例在目标检测任务里是够用的。但我通常会做一步额外验证检查训练集和验证集的图片有没有重复。有些数据集作者在划分时不够严谨导致验证集里的图片也能在训练集里找到模型天然会对这些图片过拟合测试结果虚高。import os train_images set(os.listdir(train/images)) val_images set(os.listdir(val/images)) duplicates train_images val_images print(fDuplicate images: {len(duplicates)}) if duplicates: print(list(duplicates)[:10])这份数据集我检查过训练集和验证集没有重叠文件。但你自己拿到手之后建议还是跑一遍这个检查几秒钟的事能帮你排除一个很大的隐患。另外还可以统计一下每张图像的标注目标数量正常目标检测数据集的平均目标数是 1 到 3 个之间如果某张图标注了十几个目标多半是马赛克增强后的图像这种图在训练时需要特别注意。5. 避坑与常见问题标注边界框、类别映射和图像损坏排查记录5.1 现象训练时 loss 正常下降但 mAP 一直为零原因类别 id 映射错位。VOC xml 里的 name 是字符串转 YOLO txt 需要查 json 表获得数字 id。如果 json 表的 id 和模型配置文件 names 列表的顺序不一致模型看到的类别含义和标注完全对不上。比如 json 里 id 3 是 rice_water_weevil但 names 列表第 3 个元素是 yellow_rice_borer那模型学的就是错误标签。解决转换前先打印一遍完整 json再核对 yaml 文件里的 names 列表顺序。写个小脚本同时读取两者确认每个 id 对应的类别名完全一致。我一般会专门保留一份转换后的 txt 文件抽查把前几行打印出来看看 class_id 是否落在 0 到 9 区间内。5.2 现象验证集 loss 比训练集低很多明显不合理原因马赛克增强图像处理不当。数据集中部分图像是四合一拼接的如果转换脚本里归一化时用错了图像尺寸导致边界框坐标整体缩小或偏移模型学到的目标位置就是错的。验证集里恰好没有马赛克图所以验证集 loss 看起来反而更低。解决检查转换后的 txt 里 box_width 和 box_height 的值如果大量出现小于 0.01 的异常小值说明归一化出了问题。修正方法是用 xml 里 size 节点的 width 和 height 作为分母重新计算不要用自己猜测的数值。5.3 现象show.py 运行时 OpenCV 报错无法读取图片原因图片文件损坏或者路径包含中文。数据从网盘下载后有时会出现个别文件损坏OpenCV 的 imread 函数读不出内容会返回 None后续的 rectangle 操作就会崩溃。路径里有中文在某些环境下也会导致读取失败。解决运行前先扫描一遍所有图片用 os.path.getsize 检查文件大小小于 1KB 的图片基本可以判定为损坏。另外尽量把数据集放在纯英文路径下避免中文目录名带来的编码问题。如果个别图片确实损坏直接从训练集里删掉对应的图同时删掉同名的 xml 文件。5.4 现象训练时显存占用正常但速度极慢一秒钟处理不了几张图原因数据加载没有开多线程或者没有使用 GPU 解码。300×300 的图本身不大但如果每次训练都从硬盘读取并在 CPU 上做解码数据加载就成了瓶颈。很多新手直接用默认参数训练没注意 dataloader 的 worker 数量和 pin_memory 设置。解决训练命令里加上 batch-size 和 workers 参数。YOLOv8 可以用 data 配置里直接指定或者在训练命令里加 --workers 8显存够的话 batch-size 建议 32 以上。小图配合大 batch 能把 GPU 利用率拉满训练速度会有明显提升。6. 数据集进阶验证用标注分布分析判断数据质量与训练策略拿到任何数据集我的习惯是先做一轮统计分析再动手训练。对这份水稻害虫数据集最值得关注的是三个指标类别分布、边界框尺寸分布、每张图的平均目标数。这三个指标决定你后续模型选型和训练策略的走向。import xml.etree.ElementTree as ET import os from collections import Counter annotation_dir train/labels category_counter Counter() box_area_list [] objects_per_image [] for xml_file in os.listdir(annotation_dir): tree ET.parse(os.path.join(annotation_dir, xml_file)) root tree.getroot() box_count 0 for obj in root.iter(object): name obj.find(name).text category_counter[name] 1 bndbox obj.find(bndbox) xmin int(bndbox.find(xmin).text) ymin int(bndbox.find(ymin).text) xmax int(bndbox.find(xmax).text) ymax int(bndbox.find(ymax).text) box_area (xmax - xmin) * (ymax - ymin) box_area_list.append(box_area) box_count 1 objects_per_image.append(box_count) print(Category distribution:, category_counter.most_common()) print(Average objects per image:, sum(objects_per_image) / len(objects_per_image)) print(Average box area:, sum(box_area_list) / len(box_area_list))这段脚本跑完你能得到几个关键决策依据。如果某些类别的样本数特别少比如只有几十个目标训练时就该考虑类别加权或者用数据增强手段增加该类别的多样性。如果平均框面积很小说明目标多为小目标可以考虑在模型配置里增加小目标检测层。如果每张图平均目标数超过 3说明图像内容密度高训练时应该开 Mosaic 增强来提升模型对小目标的鲁棒性。从实际测试反馈来看这份数据集很适合用来跑通完整的目标检测训练流程。它不会像 COCO 那样动辄几十 GB 下载半天90MB 的体量跑一个完整的训练验证周期很快而且因为已经按照 VOC 格式组织好了省掉了数据集清洗的环节。我当时还试过用它的 json 文件直接做类别映射配合可视化脚本验证标注质量整个过程半小时内完成。这个流程我现在每次拿新数据集都会走一遍先把类别分布打印出来再随机可视化几张图确认标注没问题然后才敢把数据送进训练管道。从那以后我再也没有遇到过训练到一半发现数据有问题的尴尬局面。希望这份数据集的拆解对你落地自己的检测项目有帮助。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号