简介这份资源是面向计算机视觉学习者与目标检测项目开发者的蔬菜图像数据集覆盖26类常见蔬菜适合用于模型训练、算法验证与课程实验。数据同时提供Pascal VOC与YOLO两种标注格式jpg图片、xml文件与txt标注一一对应可直接接入主流检测框架省去格式转换环节。压缩包共约2000个文件以1999个xml标注文件和1个说明txt为主整体约544MB标注类别涵盖牛油果、豆类、甜菜、甜椒、西兰花、卷心菜、胡萝卜、花椰菜、芹菜、玉米、黄瓜、茄子、大蒜、辣椒、洋葱、豌豆、土豆、南瓜、萝卜、沙拉菜、番茄、西葫芦等其中牛油果、甜菜等类别框数较多类别分布存在一定不均衡便于开展数据增强与类别平衡实验。目前已有402人学习下载可作为目标检测训练、迁移学习与标注格式转换练习的实用素材。1. 26类蔬菜目标检测数据集7155张VOCYOLO双格式到底能跑出什么拿到一个标注好的数据集最怕两件事一是类别定义混乱二是格式转换踩坑。这份蔬菜数据集把这两个问题都提前解决了——7155张jpg图片每张都配了同名的VOC格式xml和YOLO格式txt26个蔬菜类别从avocado到vegetable marrow全覆盖标注框总数过万。你不需要自己从零标注也不需要写脚本做格式转换解压完就能直接喂给YOLO系列训练。适合谁用如果你在做智慧农业、菜品识别、零售结算台或者厨房自动化相关的目标检测项目这份数据集能帮你省掉至少两周的标注时间。26个类别里有番茄、黄瓜、洋葱、土豆这些高频蔬菜也有avocado、broccoli、asparagus这类相对少见的品类类别分布不算均匀但足够真实。新手可以拿它跑通YOLOv8训练全流程熟手可以拿它做类别不平衡实验或者迁移学习预训练。需要提前说清楚的是数据集只包含jpg图片和对应的xml、txt标注文件没有分割路径的txt也没有预训练权重。你需要自己准备YOLO的配置文件自己划分训练集和验证集。下面从目录结构开始一步步拆到训练和验证。2. 数据集结构与VOC/YOLO格式解析从xml到txt的对应关系2.1 目录组织与文件命名规则解压后的目录结构通常是扁平的所有图片和标注文件放在同一级或者按类别分文件夹。从项目正文给出的文件列表看图片和标注文件以xyxr_images_为前缀加数字编号命名比如xyxr_images_1642.xml对应xyxr_images_1642.jpg和xyxr_images_1642.txt。这种命名方式的好处是图片和标注天然对齐不需要额外维护映射表。常见做法是先把所有文件按扩展名分开图片放images/xml放annotations/txt放labels/。但YOLO训练时要求图片和txt在同一目录下且同名所以更省事的做法是保持扁平结构训练脚本里直接指定图片目录和标签目录的路径。注意如果解压后发现某些图片没有对应的xml或txt先别急着删。用脚本统计一下缺失情况可能是标注时漏了也可能是文件传输损坏。缺失比例低于1%可以直接跳过高于5%建议重新下载。2.2 VOC xml的字段含义与解析要点VOC格式的xml文件结构固定核心字段包括filename、size、object。size里的width和height是图片原始尺寸object里每个标注框有name、xmin、ymin、xmax、ymax。解析时要注意两个坑一是xmax和ymax是包含边界的计算宽高时用xmax - xmin而不是xmax - xmin 1二是有些标注工具会写出xmin xmax的异常框训练前必须过滤。import xml.etree.ElementTree as ET import os def parse_voc_xml(xml_path): tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w int(size.find(width).text) img_h int(size.find(height).text) boxes [] for obj in root.findall(object): name obj.find(name).text bbox obj.find(bndbox) xmin int(bbox.find(xmin).text) ymin int(bbox.find(ymin).text) xmax int(bbox.find(xmax).text) ymax int(bbox.find(ymax).text) # 过滤异常框 if xmax xmin or ymax ymin: continue boxes.append((name, xmin, ymin, xmax, ymax)) return img_w, img_h, boxes这段代码返回图片宽高和所有有效标注框。参数说明xml_path是单个xml文件路径返回的boxes列表里每个元素是(类别名, xmin, ymin, xmax, ymax)。实际使用时可以批量遍历所有xml统计每个类别的框数和图片数和摘要描述里的数字对一下确认数据完整性。2.3 YOLO txt格式与归一化坐标YOLO格式的txt每行一个目标格式是class_id x_center y_center width height所有坐标都归一化到0到1之间。class_id从0开始对应类别列表的索引。比如avocado是第0类beans是第1类以此类推。归一化公式是x_center (xmin xmax) / 2 / img_wy_center (ymin ymax) / 2 / img_hwidth (xmax - xmin) / img_wheight (ymax - ymin) / img_h。def voc_to_yolo(boxes, img_w, img_h, class_names): lines [] for name, xmin, ymin, xmax, ymax in boxes: if name not in class_names: continue class_id class_names.index(name) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h # 裁剪到0-1范围防止越界 x_center max(0, min(1, x_center)) y_center max(0, min(1, y_center)) width max(0, min(1, width)) height max(0, min(1, height)) lines.append(f{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}) return lines这段代码把VOC框转成YOLO格式字符串列表。参数说明class_names是类别名列表顺序必须和训练时的names配置一致。:.6f保留6位小数足够精度且不会让文件过大。裁剪操作是保险措施防止个别标注框超出图片边界导致训练时报错。2.4 类别列表与标注框数统计26个类别的英文名和对应的框数如下表。从框数分布能看出明显的类别不平衡avocado有1163个框beet有1004个框而beans只有307个框。训练时需要对少数类做数据增强或者调整损失函数权重。类别名框数类别名框数avocado1163onion待统计beans307peas待统计beet1004potato待统计bell pepper待统计pumpkin待统计broccoli待统计rediska待统计brus capusta待统计redka待统计cabbage待统计salad待统计carrot待统计squash-patisson待统计cayliflower待统计tomato待统计celery待统计vegetable marrow待统计corn待统计cucumber待统计eggplant待统计fasol待统计garlic待统计hot pepper待统计提示摘要描述里只给出了前三个类别的完整框数其余类别需要自己跑统计脚本补全。建议在训练前生成完整的类别分布表方便后续做消融实验时对比。3. 从零跑通YOLOv8训练配置文件、数据划分与训练命令3.1 安装环境与准备YOLOv8YOLOv8用ultralytics包安装命令很简单。建议用Python 3.8以上CUDA 11.8或12.1都兼容。如果只是跑通流程CPU也能训但速度会慢很多。pip install ultralytics pip install opencv-python pillow numpy tqdm安装完成后用yolo checks验证环境。常见问题是torch版本和CUDA不匹配报错信息通常是CUDA error: no kernel image is available。解决办法是去PyTorch官网找对应CUDA版本的安装命令重装torch。3.2 划分训练集、验证集和测试集7155张图片按7:2:1划分训练集约5000张验证集约1430张测试集约715张。划分时要保证每个类别在三个集合里的比例大致一致避免某个类别只在训练集出现。import os import random import shutil def split_dataset(img_dir, label_dir, output_dir, ratios(0.7, 0.2, 0.1)): random.seed(42) all_files [f for f in os.listdir(img_dir) if f.endswith(.jpg)] random.shuffle(all_files) n len(all_files) n_train int(n * ratios[0]) n_val int(n * ratios[1]) splits { train: all_files[:n_train], val: all_files[n_train:n_train n_val], test: all_files[n_train n_val:] } for split, files in splits.items(): img_out os.path.join(output_dir, split, images) lbl_out os.path.join(output_dir, split, labels) os.makedirs(img_out, exist_okTrue) os.makedirs(lbl_out, exist_okTrue) for f in files: shutil.copy(os.path.join(img_dir, f), os.path.join(img_out, f)) txt_f f.replace(.jpg, .txt) if os.path.exists(os.path.join(label_dir, txt_f)): shutil.copy(os.path.join(label_dir, txt_f), os.path.join(lbl_out, txt_f)) print(ftrain: {len(splits[train])}, val: {len(splits[val])}, test: {len(splits[test])})参数说明ratios控制三个集合的比例random.seed(42)保证每次划分结果一致方便复现。输出目录结构是output/train/images、output/train/labels这种标准YOLO格式。3.3 编写data.yaml配置文件YOLOv8训练需要一个yaml文件指定数据路径和类别名。路径可以用绝对路径也可以用相对路径。类别名必须和txt里的class_id顺序完全一致。path: /path/to/dataset train: train/images val: val/images test: test/images names: 0: avocado 1: beans 2: beet 3: bell pepper 4: broccoli 5: brus capusta 6: cabbage 7: carrot 8: cayliflower 9: celery 10: corn 11: cucumber 12: eggplant 13: fasol 14: garlic 15: hot pepper 16: onion 17: peas 18: potato 19: pumpkin 20: rediska 21: redka 22: salad 23: squash-patisson 24: tomato 25: vegetable marrow注意names里的类别名如果和txt里的class_id对不上训练时loss会正常下降但mAP极低。建议先用小样本过拟合测试确认类别映射正确后再跑全量训练。3.4 启动训练与关键参数设置YOLOv8n是轻量模型适合快速验证。如果追求精度可以用YOLOv8m或YOLOv8l。输入尺寸默认640蔬菜图片里小目标不多640够用。batch size根据显存调整8G显存用1612G显存用32。yolo detect train \ data/path/to/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ device0 \ projectruns/vegetable \ nameyolov8n_640参数说明epochs100配合patience20如果20轮验证集mAP没提升就早停。lr00.01是初始学习率YOLOv8默认用余弦退火调度。device0指定第一块GPU多卡用device0,1。训练日志和权重保存在runs/vegetable/yolov8n_640/下。3.5 验证与推理训练完成后用yolo detect val验证或者直接加载best.pt做推理。验证时关注mAP50和mAP50-95两个指标。蔬菜数据集类别多且不平衡mAP50能到0.7以上就算不错。yolo detect val \ modelruns/vegetable/yolov8n_640/weights/best.pt \ data/path/to/data.yaml \ imgsz640 \ batch16推理单张图片yolo detect predict \ modelruns/vegetable/yolov8n_640/weights/best.pt \ source/path/to/test_image.jpg \ conf0.25 \ saveTrueconf0.25是置信度阈值低于这个值的框会被过滤。蔬菜识别场景建议调到0.3到0.4减少误检。4. 避坑与排查标注异常、类别不平衡和训练崩溃4.1 标注框越界导致训练报错现象训练启动后报RuntimeError: invalid argument 0: Sizes of tensors must match或者AssertionError: negative width。原因个别xml里的xmax小于xmin或者归一化后坐标超出0到1范围。解决在转换脚本里加过滤逻辑把异常框直接跳过同时记录异常文件列表人工复查。4.2 类别不平衡导致少数类mAP为0现象训练完发现beans、peas、rediska这几个类别的mAP接近0但avocado和beet的mAP很高。原因少数类样本太少模型倾向于预测多数类。解决在data.yaml里给少数类加class_weights或者用YOLOv8的copy_paste增强把少数类实例复制粘贴到其他图片上。常见做法是先把少数类过采样到和多数类同一量级再跑训练。4.3 图片和标签不匹配导致漏检现象训练loss正常下降但验证时某些图片的标注框完全没被检测到。原因图片和txt文件名不一致或者txt内容为空。解决写脚本检查每张图片是否有对应的txt以及txt是否至少有一行有效标注。空txt文件在YOLO里表示负样本但如果大量图片都是空txt说明标注有问题。4.4 显存不足导致训练中断现象训练到一半报CUDA out of memory。原因batch size太大或者图片尺寸太大。解决把batch从16降到8或者把imgsz从640降到512。YOLOv8支持ampTrue自动混合精度能省30%左右显存。如果还不行用yolov8n而不是yolov8m。4.5 验证集mAP波动大现象每轮验证的mAP忽高忽低没有稳定上升趋势。原因验证集太小或者类别分布不均匀。解决增大验证集比例到20%确保每个类别在验证集里至少有50个实例。另外把batch设大一点验证时用batch32减少批次间的随机性。5. 进阶技巧用这份数据集做迁移学习和类别增量实验这份数据集的26个类别天然适合做迁移学习实验。我一般会先用COCO预训练的YOLOv8权重在蔬菜数据集上微调然后冻结backbone只训head对比两种策略的mAP差异。冻结backbone时把freeze10加进训练命令意思是冻结前10层。实测下来冻结训练收敛更快但最终mAP低2到3个点适合快速验证想法。另一个玩法是类别增量先拿10个类训练一个模型再逐步加入新类别观察旧类别的mAP下降多少。蔬菜数据集里avocado、beet、tomato这些类别的特征差异大增量学习时旧类别遗忘比较明显。常见做法是加一个蒸馏损失让新模型在旧类别上的输出尽量接近旧模型。验证模型是否真正学到了蔬菜特征而不是靠背景颜色作弊可以做一个简单测试把验证集图片的背景全部换成灰色再跑一遍验证。如果mAP下降超过15个点说明模型过度依赖背景。解决办法是在训练时加hsv_h0.015、hsv_s0.7、hsv_v0.4做颜色增强强迫模型关注形状和纹理。yolo detect train \ data/path/to/data.yaml \ modelyolov8n.pt \ epochs50 \ imgsz640 \ batch16 \ freeze10 \ hsv_h0.015 \ hsv_s0.7 \ hsv_v0.4 \ projectruns/vegetable \ nameyolov8n_freeze10从那以后我每次拿到新数据集都强制先跑一遍背景替换测试确认模型没有走捷径。这个习惯帮我省了很多次返工。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
PX4+Gazebo+ROS2无人机轨迹跟踪仿真环境搭建实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:55:01
计算机组成原理:程序中断方式与中断系统核心考点解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 1:55:00
拒绝域名服务器坑:3套Wordpress架设教程方案对比评测 拒绝域名服务器坑:3套Wordpress架设教程方案对比评测 域名买好了,服务器租了,为什么网站还是打不开? 这是我在后台看到最多的崩溃留言。 很多老板觉得 Wordpress 简单,点几下就能用,结果卡在环境配置这一步。… · 2026/9/28 1:55:00
Python搭建QQ聊天机器人极简教程 随着QQ粉丝群管理需求的不断增长,简单的群管工具难以满足复杂的信息响应和自动化需求。现有的自动回复机器人虽然功能强大,但其高昂的年费成为不少用户的顾虑。因此,通过搭建一个自定义机器人来实现自动回复,成为解决这一问题的有效途径。
基于此需求,本文介绍了使用go-c… · 2026/9/28 2:14:08
Python整理百度云盘文件大量重复无用文件 百度云盘容量有限,当文件数量逐渐增多,空间很容易被填满。删除重复文件可以帮助释放大量空间。通过获取云盘缓存目录并使用Python脚本来整理数据,可以高效识别重复文件并避免手动操作的繁琐。
此方法基于 sqlite3 和 pandas 进行数据处理,简单快捷。 文章目录 云盘数据整理… · 2026/9/28 2:14:07
Python实现将图片转化为具有视觉震撼效果的字符图 字符画是一种将图片转化为字符的艺术表现形式,它通过字符的密度和排列来模拟图片的色彩和形状效果。这种技术不仅在视觉上充满了创造力,还在文字处理领域展示了字符的丰富表现力。通过Python,可以将图片转换为字符画,生成具有视觉冲击力的字符艺术。
本文将通过具体步骤和… · 2026/9/28 2:13:48
Python实现将目录下的图片合并成PDF文件 在图像处理和文档管理中,经常需要将一系列图片文件合并为PDF格式,以便于传输、存档和阅读。Python凭借其丰富的第三方库,为图像处理和PDF操作提供了便捷的解决方案。
本文将详细介绍如何通过Python脚本,将目录中的所有图片合并为一个PDF文件,内容包括从基础环境配置到代码… · 2026/9/28 2:13:48
Python实现文件移动到指定文件夹 在编程过程中,经常需要对文件进行整理和管理,将不同类型的文件分类存放在指定文件夹中。Python提供了强大的文件操作模块,使得文件的移动操作变得简单高效。这篇教程将详细讲解如何使用Python实现将文件移动到指定文件夹的功能,帮助理解并掌握文件操作的基本方法和常见应用… · 2026/9/28 2:13:47
【PyQt】PyQT6制作一个Django项目启动器 在现代的桌面和Web应用开发中,Python以其简单高效的特点获得了广泛的应用。通过集成PyQt和Django框架,将桌面应用的便捷操作与Django项目的后端处理相结合,不仅能够提升用户体验,更能显著提高开发的便利性和效率。
本文将聚焦于如何构建一个基于PyQt的Django项目启动器,实… · 2026/9/28 2:13:40
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
制作网页比较方便的软件怎么选?一文搞懂避坑指南 制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25