目标检测26种蔬菜数据集7100张VOC+YOLO:从标注解析到YOLOv8训练全流程
简介这份资源是面向计算机视觉学习者与目标检测工程实践者的蔬菜图像数据集覆盖26类常见蔬菜适合用于模型训练、算法对比与课程实验等场景。数据同时提供Pascal VOC格式的xml标注与YOLO格式的txt标注jpg图片与两种标注文件一一对应可直接接入主流检测框架省去格式转换环节。压缩包共约2000个文件以1999个xml标注文件和1个说明txt为主整体约544MB标注类别涵盖牛油果、豆类、甜菜、甜椒、西兰花、卷心菜、胡萝卜、玉米、黄瓜、茄子、大蒜、洋葱、豌豆、土豆、南瓜、番茄、西葫芦等其中牛油果、甜菜等类别框数较多类别分布存在一定不均衡便于开展数据增强与类别平衡实验。目前已有402人学习下载可作为目标检测入门练手或进阶调参的实用数据基础。1. 7100 张、26 类蔬菜这个数据集到底能扛住什么任务拿到「目标检测26种蔬菜数据集7100张VOCYOLO.zip」这个标题第一反应不该是「哦又一个数据集」而是先问自己三个问题我的检测目标是不是这 26 类蔬菜我的场景是货架、田间、分拣线还是冷链箱我打算用 YOLO 哪一代、要不要转 COCO 或 TFRecord这三个问题决定了这份数据对你到底是「直接能跑」还是「只能当预训练素材」。这份数据的核心信息其实就藏在标题里7100 张图、26 个蔬菜类别、同时提供 VOC 和 YOLO 两种标注格式。VOC 是 Pascal VOC 那套 XML 标注一个图对应一个 XML里面记录每个目标的 bbox 坐标和类别名YOLO 格式则是每张图一个 txt每行class_id cx cy w h坐标全部归一化到 0~1。两种格式同时给意味着你既可以用torchvision.datasets.VOCDetection直接读也可以喂给 ultralytics 的 YOLO 训练管线省掉自己写转换脚本的功夫。适合谁做智慧农业、生鲜分拣、无人零售货架识别、食堂菜品结算的团队最对口。26 类蔬菜这个粒度不算粗能区分到具体品种而不是「蔬菜/非蔬菜」二分类说明标注方是奔着可落地去的。7100 张的体量属于中小规模单卡 8G 显存跑 YOLOv8n/s 完全够但想训大模型或者做开放词汇检测就得掂量一下数据量够不够撑。不适合谁如果你的目标是检测水果、肉类或者熟食这份数据帮不上忙如果你要做实例分割VOC 和 YOLO 检测格式都不带 mask得自己补标注。先想清楚这两点再决定要不要往下走。2. 先搞懂 VOC 与 YOLO 两套标注的差异再决定用哪套2.1 VOC XML 的结构与读取方式VOC 格式的目录结构是固定的Annotations/放 XMLJPEGImages/放原图ImageSets/Main/放 train/val 的 txt 划分文件。一个典型的 XML 长这样annotation folderJPEGImages/folder filenamecabbage_001.jpg/filename size width640/width height480/height depth3/depth /size object namecabbage/name bndbox xmin112/xmin ymin88/ymin xmax340/xmax ymax402/ymax /bndbox /object /annotationname是类别字符串bndbox是左上角和右下角的绝对像素坐标。用 torchvision 读的时候它会自动把 XML 解析成 dict但类别名到 id 的映射要你自己维护。常见做法是先把所有 XML 里的name扫一遍生成一个class_to_id字典训练时再转成 tensor。import os import xml.etree.ElementTree as ET def build_voc_class_map(anno_dir): classes set() for xml_file in os.listdir(anno_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(anno_dir, xml_file)) for obj in tree.findall(object): classes.add(obj.find(name).text) # 排序保证每次运行 id 一致避免训练/推理错位 return {name: idx for idx, name in enumerate(sorted(classes))} class_map build_voc_class_map(Annotations) print(len(class_map), class_map)这段代码的关键点是sorted(classes)。如果不排序set 的遍历顺序在不同 Python 进程里可能不一样导致你训练时 cabbage 是 0推理时变成 3模型输出全乱。这是 VOC 转 YOLO 时最常见的翻车点之一。2.2 YOLO txt 格式与 data.yaml 配置YOLO 格式每张图对应一个同名 txt每行五个值class_id cx cy w h其中 cx、cy 是 bbox 中心点相对图宽高的比例w、h 是 bbox 宽高相对图宽高的比例。转换公式是cx (xmin xmax) / 2 / img_w cy (ymin ymax) / 2 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_hultralytics 训练时需要一份data.yaml指定 train/val 路径、类别数和类别名path: ./vegetables train: images/train val: images/val nc: 26 names: [babycorn, bean, bittergourd, bottle_gourd, brinjal, broccoli, cabbage, capsicum, carrot, cauliflower, cucumber, eggplant, garlic, ginger, green_chili, kale, lemon, lettuce, mushroom, onion, peas, potato, pumpkin, radish, spinach, tomato]nc必须和 names 长度一致names 的顺序必须和 txt 里的 class_id 严格对应。我一般会在转换脚本里把 class_map 直接 dump 成 yaml避免手写时漏一个或者顺序错位。2.3 两套格式怎么选看你的训练框架选 VOC 还是 YOLO本质是看你用哪个框架。用 ultralytics 的 YOLOv5/v8/v11直接上 YOLO 格式省事用 Detectron2、MMDetection 或者 torchvision 的 Faster R-CNNVOC 或 COCO 更顺。如果你要做格式转换VOC 转 YOLO 是单向的、信息无损的只要类别映射对但 YOLO 转 VOC 需要原图尺寸才能还原绝对坐标所以转换前务必确认JPEGImages和 txt 是一一对应的。提示转换完一定要抽查 5~10 张图用可视化脚本把 bbox 画出来确认没有坐标错位或类别错乱。这一步花 5 分钟能省掉后面几小时的排查。3. 从零跑通 YOLOv8 训练环境、命令与参数3.1 环境配置与目录组织ultralytics 的环境配置现在很简单Python 3.8 就行conda create -n veg_det python3.10 -y conda activate veg_det pip install ultralytics opencv-python装完之后yolo checks能跑通就说明环境没问题。目录我一般这样组织vegetables/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── data.yamlimages 和 labels 的 train/val 必须同名对应YOLO 读 label 时是把images替换成labels、后缀换成.txt去找的。如果你把 label 放在别的地方就得改源码或者用 symlink不推荐。3.2 训练命令与关键参数最小训练命令yolo detect train \ datavegetables/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/veg \ nameexp1几个必须调的参数参数建议值说明imgsz640蔬菜目标通常占图比例较大640 够用小目标多可上 960batch8~168G 显存跑 yolov8s 用 16 会 OOM降到 8lr00.01默认值数据量小可以降到 0.005patience2020 轮没提升就早停省时间mosaic1.0默认开启小数据集建议保留做增强modelyolov8s.pt是从 COCO 预训练权重起步对 7100 张的小数据集来说预训练能显著加快收敛。如果你显存只有 4G换yolov8n.pt如果追求精度且显存充足上yolov8m.pt但 7100 张可能撑不住 m 的参数量容易过拟合。3.3 训练过程看什么指标训练日志里重点看三个box_loss、cls_loss、mAP50。box_loss 下降说明 bbox 回归在收敛cls_loss 下降说明分类在学mAP50 是最终指标。如果 box_loss 一直震荡不降检查标注是否有大量越界或宽高为 0 的框如果 cls_loss 降不下去多半是类别不平衡26 类里某些类样本太少。from ultralytics import YOLO model YOLO(runs/veg/exp1/weights/best.pt) metrics model.val(datavegetables/data.yaml, splitval) print(metrics.box.map) # mAP50-95 print(metrics.box.map50) # mAP50val 的时候注意splitval别手滑写成 train否则指标虚高上线就翻车。4. 数据增强、类别不平衡与过拟合三个绕不开的坑4.1 26 类蔬菜的类别分布怎么查7100 张图分 26 类平均每类 273 张但实际分布大概率不均匀。番茄、土豆、白菜这种常见菜可能上千张而秋葵、苦瓜这类可能只有几十张。先统计再决定策略import os from collections import Counter def count_classes(label_dir): counter Counter() for txt in os.listdir(label_dir): if not txt.endswith(.txt): continue with open(os.path.join(label_dir, txt)) as f: for line in f: cls_id int(line.split()[0]) counter[cls_id] 1 return counter dist count_classes(vegetables/labels/train) for cls_id, cnt in sorted(dist.items()): print(fclass {cls_id}: {cnt})如果最大类和最小类差距超过 10 倍就得处理。常见做法有三种对少样本类做 oversampling、用copy_paste增强、或者在 loss 里加 class weight。ultralytics 默认不带 class weight需要自己改 loss 或者用fraction参数控制采样比例。4.2 增强参数怎么设才不帮倒忙YOLO 默认的增强包括 mosaic、mixup、hsv 抖动、随机翻转。对蔬菜数据mosaic 和翻转基本无害但 hsv 的h分量要小心蔬菜颜色是重要特征hue 抖动太大会把绿色叶子变成紫色模型学到的就是错的。我一般把hsv_h从默认 0.015 降到 0.01hsv_s和hsv_v保持默认。yolo detect train \ datavegetables/data.yaml \ modelyolov8s.pt \ epochs100 \ hsv_h0.01 hsv_s0.7 hsv_v0.4 \ degrees10 translate0.1 scale0.5 \ fliplr0.5 mosaic1.0degrees10是随机旋转蔬菜在货架上通常不会大角度倾斜10 度够了scale0.5允许缩放模拟不同拍摄距离。如果你的图都是固定视角拍的这些可以调小甚至关掉。4.3 过拟合的早期信号与对策7100 张训 26 类过拟合风险不低。早期信号是 train loss 持续降但 val mAP 停滞甚至下降。对策按优先级先加数据增强再降模型容量s 换 n最后加 dropout 或 weight decay。ultralytics 的dropout参数默认 0可以设 0.1 试试但只在分类头生效效果有限。注意不要一上来就上大模型。7100 张配 yolov8m 大概率过拟合先用 s 跑通 baseline再考虑要不要换。5. 避坑与排查标注、坐标与评估的 5 个血泪教训现象训练时 loss 正常下降但推理时框全偏了。原因VOC 转 YOLO 时用了错误的图宽高比如把 640x480 的图按 480x640 算cx/cy 全反。 解决转换脚本里用cv2.imread读实际尺寸不要硬编码转完抽查 10 张可视化。现象mAP 一直是 0或者只有 0.0x。原因data.yaml 里 names 顺序和 txt 里的 class_id 不对应模型学的是错位的类别。 解决把 class_map 和 names 打印出来逐行比对确保 id 0 对应 names[0]。现象某些类完全检测不到。原因该类样本太少或者标注时漏标严重。 解决统计每类实例数少于 50 的类考虑合并或补充数据漏标只能重新过一遍标注。现象验证集 mAP 很高但实际图片检测效果差。原因train/val 划分时同一场景的图被分到两边数据泄漏。 解决按拍摄批次或场景划分不要随机分如果图来自同一视频抽帧按视频分。现象训练到一半突然 OOM。原因mosaic 增强会拼接 4 张图实际输入尺寸可能超过 imgsz。 解决降 batch 或关 mosaic8G 显存跑 yolov8s 640 mosaicbatch 别超过 12。6. 把 7100 张用到极致预训练、蒸馏与增量标注这份数据最值钱的用法不是直接训一个 26 类检测器而是当预训练素材。蔬菜的纹理、颜色、形状和很多细粒度检测任务相通先用这 7100 张训一个 backbone再迁移到你的目标域小样本下收敛会快很多。具体做法是把 YOLOv8 的 backbone 权重存下来换掉检测头用你的数据 fine-tune。from ultralytics import YOLO # 用蔬菜数据训一个 base base YOLO(yolov8s.pt) base.train(datavegetables/data.yaml, epochs50, imgsz640, nameveg_base) # 加载训好的权重换数据继续训 model YOLO(runs/veg_base/weights/best.pt) model.train(datayour_data.yaml, epochs100, lr00.001, namefinetune)lr00.001比默认小一个量级因为 backbone 已经有先验大 lr 会把它冲掉。如果你的目标域和蔬菜差异大比如工业零件可以只冻结前几层用freeze10参数。另一个进阶玩法是知识蒸馏用这份数据训一个 yolov8m 当 teacher再蒸馏到 yolov8n 做部署。7100 张足够 teacher 学到不错的特征n 模型在边缘设备上跑 30fps 没问题。蒸馏的关键是让 student 学 teacher 的 soft labelultralytics 不直接支持得自己写 loss但收益在部署端很明显。最后一个习惯每次拿到新数据先花 10 分钟写个可视化脚本随机抽 20 张把 bbox 画出来存成一张 grid 图。这个动作帮我提前发现过标注错位、类别混淆、图片损坏等一堆问题比训完再排查省事得多。数据质量永远比模型结构重要希望帮到你。本文还有配套的精品资源点击获取

相关新闻

NMOS与PMOS本质差异及高边驱动/防反接实战指南

NMOS与PMOS本质差异及高边驱动/防反接实战指南

1. 为什么NMOS和PMOS不是“两个差不多的开关”,而是电路设计的底层语言你翻过任何一本模拟电路教材,NMOS和PMOS大概率是第二章就登场的“老熟人”。但奇怪的是,很多做了三年硬件的工程师,在画Buck电路时还在纠结:为什么…

2026/10/7 6:17:38 阅读更多 →
Django医疗挂号系统:MySQL事务锁与高并发号源控制实战

Django医疗挂号系统:MySQL事务锁与高并发号源控制实战

简介:这是一套面向计算机专业本科生的高分毕业设计级医院挂号诊疗管理系统,基于PythonDjango框架与MySQL数据库实现,完整覆盖患者挂号、医生排班、门诊接诊、病历管理及后台统计等核心业务流程,适合毕业设计、课程设计与期末大作业…

2026/10/7 6:17:38 阅读更多 →
小麦种子图像分类数据集:从标注结构到PyTorch训练避坑指南

小麦种子图像分类数据集:从标注结构到PyTorch训练避坑指南

简介:面向图像分类入门及种子表型识别场景的小麦种子图像分类数据集,共4个类别,已按训练集、测试集划分,JPG原图经预处理可直接作为分类网络输入。资源共包含2000个文件,其中1998张JPG图片、1个类别配置文件&#xff0…

2026/10/7 6:16:38 阅读更多 →

最新新闻

广告传媒AI Agent搭建实战:素材整理与方案辅助双落地

广告传媒AI Agent搭建实战:素材整理与方案辅助双落地

广告传媒公司里最磨人的,往往不是创意本身,而是素材和方案这两个"隐形消耗"。我接手内部效率优化的时候,第一件事就是给团队做了一次时间统计:一个策划平均每天要花40分钟到1小时去翻素材、找案例、整理参考资料&#x…

2026/10/7 6:39:59 阅读更多 →
Agent-Reach 实战:CLI 驱动的 AI Agent 工具链搭建与避坑指南

Agent-Reach 实战:CLI 驱动的 AI Agent 工具链搭建与避坑指南

1. 从"Agent-Reach"这个名字说起:它到底想解决什么问题第一次看到 Agent-Reach 这个项目名,我的直觉是:这大概率是一个围绕 AI Agent 能力边界做文章的工具,而不是又一个"套壳聊天框"。原因很简单——"R…

2026/10/7 6:39:59 阅读更多 →
AI智能体Office套件实战:从自然语言到文档自动化的完整链路

AI智能体Office套件实战:从自然语言到文档自动化的完整链路

做了大半年这个项目,我最大的体会是:所谓"AI智能体Office套件",不是说在Office里塞一个能聊天的窗口就完了。真正难的地方,是让大模型在理解你意图之后,能可靠地把Word、Excel、PPT这些老牌办公软件当成&quo…

2026/10/7 6:39:59 阅读更多 →
impeccable:基于Playwright的轻量级CLI网页自动化工具

impeccable:基于Playwright的轻量级CLI网页自动化工具

1. 项目概述:一个被误读却极具潜力的 CLI 工具生态入口“impeccable”这个词本身在英语里是“无懈可击、完美无瑕”的意思,但放在当前开发者工具链语境下,它早已不是形容词,而是一个正在快速演化的开源 CLI 工具代号——准确地说&…

2026/10/7 6:39:59 阅读更多 →
动态图神经网络用于网络流量异常检测实战

动态图神经网络用于网络流量异常检测实战

简介:本资源是一套基于动态图神经网络(DGNNG)实现的异常流量检测完整项目,面向计算机、网络安全及人工智能方向的本科生与研究生,特别适合作为毕业设计、课程设计或期末大作业的实战参考。项目采用Python开发&#xff…

2026/10/7 6:39:59 阅读更多 →
FPGA高扇出网络时序优化:从XDC约束到RTL寄存器复制的完整实战

FPGA高扇出网络时序优化:从XDC约束到RTL寄存器复制的完整实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 6:38:59 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 6:26:51 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →