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

26类蔬菜VOC+YOLO数据集实战:YOLOv8训练与避坑指南

发布时间:2026/9/28 3:00:01

资讯中心
01
ARTICLE

26类蔬菜VOC+YOLO数据集实战:YOLOv8训练与避坑指南

26类蔬菜VOC+YOLO数据集实战:YOLOv8训练与避坑指南
简介这份资源是面向计算机视觉学习者与目标检测项目开发者的蔬菜图像数据集覆盖 avocado、beans、beet、bell pepper、broccoli、cabbage、carrot、corn、cucumber、eggplant、garlic、onion、peas、potato、pumpkin、tomato 等 26 个常见蔬菜类别适合用于分类与检测模型的训练、微调及课程实验。压缩包共约 2000 个文件以 1999 个 Pascal VOC 格式 xml 标注文件和 1 个说明 txt 为主并配套同名的 YOLO 格式 txt 标注图片为 jpg整体约 544.19MB可直接接入主流检测框架。数据集共 7155 张图片每张均含对应 xml 与 txt 标注类别框数分布较细如 avocado 1163 框、beet 1004 框等便于按类别统计与均衡采样。目前已有 402 人学习下载适合需要多类别蔬菜检测数据、快速验证模型效果或开展数据增强实验的读者参考使用。1. 7100 张、26 类蔬菜的 VOCYOLO 数据集到底能拿来干什么如果你正在做农业视觉相关的目标检测大概率会遇到一个很现实的问题公开数据集里蔬菜类目少、标注格式不统一、拍出来的图跟自己的场景差太远。这个标题里的「26 种蔬菜、7100 张、VOCYOLO 双格式」恰好卡在了一个很实用的位置上——类目够多、量级够跑通一个 baseline、格式够省事。它解决的不是「发论文刷 SOTA」的问题而是「我手头有个蔬菜分拣/识别/计数需求怎么快速把模型跑起来并验证可行性」的问题。适合谁一是做智慧农业、分拣线、采摘机器人视觉的工程师需要快速搭一个能识别多类蔬菜的检测原型二是学生或转行者想拿一个真实的多类数据集练手 YOLO 训练全流程而不是在 COCO 上跑别人跑烂的 demo。VOC 和 YOLO 两种格式同时给意味着你既能用 XML 做数据清洗和可视化也能直接喂给 YOLOv5/v8 训练省掉格式转换那一步的玄学。接下来我会按「数据集怎么读 → 怎么转 → 怎么训 → 坑在哪」的顺序把这条链路讲透。2. 先搞懂 VOC 与 YOLO 两种标注格式的差异拿到一个「VOCYOLO」双格式数据集第一件事不是急着训练而是搞清楚这两种格式各自长什么样、坐标怎么算。很多人训练时框全歪了根子就在这一步没对齐。2.1 VOC 格式XML 里的绝对坐标VOC 格式每张图对应一个同名 XML 文件核心信息在object节点里bndbox存的是像素绝对坐标xmin/ymin/xmax/ymax。它的好处是可读性强、工具支持广LabelImg 默认就是它缺点是坐标跟图像尺寸绑定换分辨率就得重算。annotation filenamecarrot_001.jpg/filename size width640/width height480/height depth3/depth /size object namecarrot/name !-- 类别名26 类之一 -- bndbox xmin112/xmin !-- 左上角 x绝对像素 -- ymin88/ymin xmax305/xmax !-- 右下角 x -- ymax402/ymax /bndbox /object /annotation这里要盯住两个点一是name必须和你的类别列表严格一致大小写、空格都算二是xmax xmin、ymax ymin如果标注时手抖画反了训练时这个框会被算成负面积直接污染损失。2.2 YOLO 格式归一化的中心点坐标YOLO 格式每张图对应一个同名.txt每行一个目标格式是class_id cx cy w h全部归一化到 0~1。它不存图像尺寸所以换分辨率不影响但你必须保证归一化时用的宽高和实际图像一致。0 0.325000 0.510417 0.301563 0.654167 3 0.712500 0.333333 0.150000 0.208333第一列class_id是从 0 开始的整数对应你的names列表顺序。cx cy是框中心点w h是框宽高都是相对整图的比例。常见翻车点是有人把 VOC 的xmin直接当cx填进去结果框整体偏移半个身位。2.3 两种格式的换算关系换算公式不复杂但必须记牢因为后面写转换脚本全靠它目标公式cx(xmin xmax) / 2 / widthcy(ymin ymax) / 2 / heightw(xmax - xmin) / widthh(ymax - ymin) / height反推回 VOC 就是xmin (cx - w/2) * width以此类推。理解了这个你就能判断数据集里两种格式是否自洽——我一般会抽 5 张图用脚本把 YOLO 反算回 VOC跟原始 XML 比对误差超过 1 像素就说明有一边是错的。提示双格式数据集不一定两种都准。优先信任你打算用的那一种另一种只当参考别混着用。3. 把 7100 张数据整理成可训练的目录结构数据集能不能训起来一半看目录结构对不对。YOLO 训练对路径和文件名有硬性要求图.jpg和标签.txt必须同名同目录层级差一个字符就报「找不到标签」。3.1 标准目录长什么样我一般会整理成下面这样images和labels平行各自再分train/valvegetables/ ├── images/ │ ├── train/ # 约 80% 图片 │ └── val/ # 约 20% 图片 ├── labels/ │ ├── train/ # 与 train 图片同名的 .txt │ └── val/ └── vegetables.yaml # 数据集配置文件划分比例上7100 张按 8:2 大约是 5680 训练、1420 验证。如果某些蔬菜类别样本特别少比如只有几十张建议改成 9:1把更多样本留给训练否则验证集里那几张小类根本学不到。3.2 用脚本做划分和校验手动分文件容易漏直接上脚本。下面这段做三件事按比例划分、复制图片和标签、顺手校验有没有孤儿标签。import os, random, shutil random.seed(42) # 固定种子保证可复现 src_img raw/images src_lbl raw/labels dst vegetables ratio 0.8 imgs [f for f in os.listdir(src_img) if f.lower().endswith((.jpg, .png))] random.shuffle(imgs) split int(len(imgs) * ratio) for phase, files in [(train, imgs[:split]), (val, imgs[split:])]: for f in files: stem os.path.splitext(f)[0] lbl stem .txt # 图片和标签必须成对存在缺一个就跳过并打印 if not os.path.exists(os.path.join(src_lbl, lbl)): print(缺标签:, f) continue shutil.copy(os.path.join(src_img, f), os.path.join(dst, images, phase, f)) shutil.copy(os.path.join(src_lbl, lbl), os.path.join(dst, labels, phase, lbl)) print(划分完成训练集, split, 验证集, len(imgs) - split)参数说明seed42是为了每次划分结果一致方便复现ratio按你的小类分布调continue那行是关键遇到缺标签的图直接跳过而不是报错中断能让你一次性看到所有问题文件。3.3 写对 vegetables.yamlYOLO 训练靠这个 yaml 找数据和类别名写错一个字段就白跑。path: /data/vegetables # 数据集根目录绝对路径最稳 train: images/train val: images/val nc: 26 # 类别数必须和 names 长度一致 names: 0: carrot 1: tomato 2: cucumber # ... 依次列到 25nc和names数量对不上是最常见的启动报错来源。另外names的顺序必须和 YOLO 标签里class_id的编号严格对应错一位模型就把番茄认成黄瓜而且训练 loss 还正常下降属于典型的「静默翻车」。注意path用绝对路径。相对路径在不同工作目录下启动训练时行为不一致是排查半天找不到原因的经典坑。4. 用 YOLOv8 跑通第一个蔬菜检测 baseline数据整理好接下来就是训练。这里以 YOLOv8 为例因为它的命令行和 Python API 都比较顺新手能快速看到结果熟手也方便改参数。4.1 环境准备与最小训练命令先装依赖再一条命令启动训练pip install ultralytics yolo detect train \ datavegetables.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0modelyolov8n.pt用的是官方预训练权重小模型n版本在 7100 张量级上足够跑出可用效果而且训练快。imgsz640是通用起点如果你的蔬菜在图中占比很小比如远景拍摄可以提到 960 或 1280但显存占用会明显上升。batch16在 8G 显存上基本安全爆显存就降到 8。4.2 关键参数怎么调训练参数不是越多越好先盯住这几个参数作用建议值epochs训练轮数100~300看验证 mAP 是否还在涨imgsz输入分辨率640 起步小目标提到 960batch批大小显存允许下尽量大8~32lr0初始学习率默认 0.01小数据集可降到 0.001patience早停耐心值50避免过拟合空跑lr0这个参数值得单独说7100 张属于中小数据集默认 0.01 有时候前期 loss 震荡厉害降到 0.001 收敛更稳代价是训练慢一点。我一般先跑 20 个 epoch 看 loss 曲线震荡就降学习率。4.3 训练过程看什么指标启动后别干等盯住控制台输出的几个量box_loss框回归损失应该整体下降如果一直高位不动多半是标签坐标有问题。cls_loss分类损失下降慢说明类别难分或标注不一致。mAP50IoU 0.5 下的平均精度这是判断模型好坏的直接指标。mAP50-95更严格反映框的精细程度。如果mAP50卡在很低的值不动先别怀疑模型回头查标签格式。我见过太多次「训练不收敛」最后发现是 YOLO 标签里混进了 VOC 的绝对坐标。4.4 推理验证拿几张图看真实效果训练完用最好的权重跑推理眼见为实from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict( sourcetest_images, # 放几张没参与训练的图 conf0.25, # 置信度阈值低了误检多高了漏检多 iou0.45, # NMS 的 IoU 阈值 saveTrue )conf0.25是默认起点蔬菜类目之间颜色形状差异大通常可以调到 0.3~0.4 减少误检。iou0.45控制重叠框合并如果同一颗菜被框了好几次就把它调小。跑完去runs/detect/predict看可视化结果重点看小类蔬菜有没有被漏掉。5. 训练蔬菜检测模型最容易踩的 5 个坑这一章是我自己踩过、也看别人踩过的真实问题每条按「现象 → 原因 → 解决」写照着排查能省不少时间。5.1 现象训练 loss 正常下降但 mAP 一直是 0原因YOLO 标签的class_id从 1 开始编号而 YOLO 要求从 0 开始。数据集里如果混了从 1 开始的标签模型学到的类别全错位但 loss 计算本身不报错。解决写个脚本扫一遍所有.txt找出class_id最大值如果等于nc而不是nc-1说明编号整体偏移了 1全部减 1 即可。5.2 现象报错「No labels found in ...」原因图片和标签没放在对应的images/labels平行目录或者文件名大小写不一致Carrot_01.jpg对carrot_01.txt。解决用第 3 章的校验脚本先跑一遍把所有不成对的文件列出来。Linux 下文件名区分大小写Windows 下不区分跨系统搬数据时特别容易出这个问题。5.3 现象某些蔬菜类别几乎检测不到原因类别样本严重不均衡26 类里可能有的类上千张、有的类只有几十张模型偏向多数类。解决先统计每类样本数对极少样本的类做数据增强旋转、亮度、裁剪或者用 YOLO 的copy_paste增强。实在补不齐的类考虑合并到相近类目别硬训。5.4 现象验证集 mAP 很高实际用新图测试一塌糊涂原因训练集和验证集来自同一批拍摄条件同背景、同光照模型过拟合了背景而不是蔬菜本身。解决划分验证集时按拍摄批次或背景分组别纯随机分。如果数据集本身场景单一实际部署前一定要补拍目标场景的图做微调。5.5 现象训练中途显存爆掉CUDA out of memory原因batch或imgsz设太大或者 dataloader 的workers开太多。解决先把batch减半还不行就降imgsz。workers在 Windows 上建议设 0Linux 上设 4~8开太多反而抢内存。提示显存爆掉不一定是参数问题也可能是某张图分辨率异常大。训练前统一 resize 到接近imgsz的尺寸能避免这种偶发崩溃。6. 让 26 类蔬菜检测更稳的两个进阶技巧baseline 跑通只是起点真正上线前还有优化空间。这里说两个我实际用过、性价比高的技巧。6.1 用类别权重缓解长尾分布26 类蔬菜天然存在长尾与其硬补数据不如在损失里给稀有类加权。YOLOv8 本身不直接暴露类别权重参数但可以通过自定义数据集采样来实现——让稀有类在每轮中被采样的概率更高。简单做法是复制稀有类样本到训练集配合增强效果立竿见影。更讲究的做法是改 dataloader 的 sampler按类别频率的倒数设权重代码量不大但需要你熟悉训练流程。6.2 用混淆矩阵定位「互相认错」的类别训练完 YOLO 会自动生成混淆矩阵别忽略它。蔬菜里像青椒和黄瓜、生菜和白菜颜色形状接近很容易互相误判。看混淆矩阵能直接定位是哪几类在打架然后针对性处理要么补这几类的区分性样本要么在推理时对这几类调高conf阈值。我一般会把混淆矩阵和实际误检图对照看比单纯盯 mAP 有用得多。6.3 一个验证数据集质量的小习惯最后分享一个我养成的习惯正式训练前先随机抽 20 张图把标注框画出来肉眼过一遍。这一步花不了十分钟但能提前发现框歪了、类别标错、漏标这些致命问题。数据集质量决定模型上限7100 张里如果有 5% 的脏标注训出来的模型就会带着这些错误去部署。宁可前期多花时间清洗也别等上线后对着误检结果抓瞎。希望这些步骤和踩坑记录能帮你把这个蔬菜数据集真正用起来而不是停在「下载完就吃灰」的状态。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

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

03
WHY YAOTU

想打造同款高转化官网?

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

◈

场景化定制

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

◐

营销型架构

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

▲

全周期服务

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

免费获取你的建站方案

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