尧图精选

西红柿成熟度检测数据集:VOC+YOLO双格式与YOLOv8实战

🕒 发布时间:2026/10/1 6:10:19 📁 来源:尧图网络
简介这份西红柿成熟度检测数据集面向计算机视觉学习者与农业智能化项目开发者用于训练和评估番茄成熟度分类与目标检测模型。数据同时提供Pascal VOC与YOLO两种标注格式包含jpg原图及一一对应的xml、txt标注文件可直接接入主流检测框架省去格式转换环节。压缩包共约2000个文件以1999个xml标注文件和1个说明用txt为主整体约34.62MB体积轻便便于快速下载与本地部署。标注共分5类涵盖tomato_unripe、tomato_half_ripe、tomato_ripe、tomato_overripe与tomato_rotten完整覆盖从青涩到腐烂的成熟度梯度适合做多阶段分级识别研究。目前已有709人学习下载读者可据此搭建训练与验证流程对比不同检测模型在细粒度成熟度任务上的表现也可用于数据增强、类别不平衡分析与农业分拣场景的算法验证。1. 西红柿成熟度检测数据集3241 张 VOCYOLO 双格式5 类成熟度怎么落地做过农业视觉项目的都知道西红柿成熟度识别是个典型的“看着简单、做起来翻车”的场景。大棚里光照不均、果实互相遮挡、青果和转色果颜色接近用普通分类模型根本分不开。这份西红柿成熟度检测数据集给了 3241 张标注图同时提供 VOC 和 YOLO 两种格式覆盖 5 个成熟度类别直接省掉了从零采集和标注的时间。它适合做智慧农业检测、采摘机器人视觉、果蔬分拣线这类项目的从业者也适合想拿真实农业数据练 YOLO 训练流程的人。数据集不是玩具样本类别之间有真实的颜色渐变过渡拿来跑 baseline 和验证模型鲁棒性都够用。2. VOC 与 YOLO 双格式拆解目录结构、标注差异与选型理由2.1 两种格式到底差在哪VOC 格式和 YOLO 格式的核心差异在标注文件的组织方式和坐标表示。VOC 用 XML 文件每个目标一个object节点坐标是绝对像素值xmin, ymin, xmax, ymaxYOLO 用 txt 文件每行一个目标格式是class_id x_center y_center width height全部归一化到 0~1 之间。这不是简单的格式转换问题涉及到训练框架的数据加载器怎么读、类别索引怎么映射。这份数据集同时给了两套意味着你可以用 YOLOv5/v8 直接吃 txt也可以用 Faster R-CNN 或 SSD 的 VOC 管线直接读 XML。常见做法是先用 YOLO 格式快速跑一版 baseline确认类别可分性再决定要不要换更重的检测头。2.2 目录结构长什么样解压后典型结构如下不同打包方式可能略有差异以实际为准tomato_dataset/ ├── VOCdevkit/ │ └── VOC2007/ │ ├── Annotations/ # XML 标注文件 │ ├── JPEGImages/ # 原始图片 │ ├── ImageSets/ │ │ └── Main/ # train/val/test 划分文件 │ └── SegmentationClass/ # 可能为空 ├── images/ # YOLO 格式图片 ├── labels/ # YOLO 格式 txt 标注 ├── train.txt # 训练集图片路径列表 ├── val.txt # 验证集图片路径列表 └── data.yaml # YOLO 训练配置文件VOC 那套是标准 PASCAL VOC 布局ImageSets/Main/里通常有train.txt、val.txt、trainval.txt每行是图片名不含扩展名。YOLO 那套更扁平images/和labels/平行放文件名一一对应。2.3 5 个类别怎么映射数据集标了 5 个成熟度类别常见命名是green、breaker、turning、pink、red这类具体以data.yaml或classes.txt为准。YOLO 的class_id从 0 开始VOC 的name是字符串转换时必须保证映射一致。我一般会先跑一段脚本把两边的类别名和数量对一遍import os import xml.etree.ElementTree as ET from collections import Counter # 统计 VOC 标注里各类别出现次数 voc_dir tomato_dataset/VOCdevkit/VOC2007/Annotations counter Counter() for xml_file in os.listdir(voc_dir): if not xml_file.endswith(.xml): continue tree ET.parse(os.path.join(voc_dir, xml_file)) for obj in tree.findall(object): name obj.find(name).text counter[name] 1 print(VOC 类别分布:, counter)这段代码遍历所有 XML统计每个类别名出现的总次数。如果某个类别数量明显偏少比如turning只有几十个训练时就要考虑过采样或 focal loss。参数上注意Annotations路径要对准你解压后的实际位置Windows 下路径分隔符用os.path.join自动处理。2.4 选 VOC 还是 YOLO 起步如果你用 Ultralytics 系的 YOLOv8直接走 YOLO 格式data.yaml里写好train、val、nc、names就能开训。如果你用 Detectron2 或 MMDetectionVOC 格式转 COCO 更顺。我的建议是先花十分钟把 YOLO 格式跑通确认数据没有损坏、类别没有错位再决定要不要折腾 VOC 那条线。反过来先搞 VOC 再转 YOLO容易在坐标归一化那步引入精度损失。3. 用 YOLOv8 跑通训练data.yaml 配置、命令行参数与首轮验证3.1 环境准备与依赖安装假设你已经有一台带 NVIDIA 显卡的机器驱动和 CUDA 正常。先建虚拟环境装 ultralyticspython -m venv venv_tomato source venv_tomato/bin/activate # Windows 用 venv_tomato\Scripts\activate pip install ultralytics opencv-python matplotlibultralytics会自动拉 PyTorch 和 torchvision版本兼容性一般没问题。如果你要指定 CUDA 版本先去 PyTorch 官网拿对应命令单独装 torch再装 ultralytics。装完跑yolo checks确认 GPU 被识别到。3.2 data.yaml 怎么写在数据集根目录建一个tomato.yaml或直接用自带的data.yaml改内容如下path: /home/user/tomato_dataset # 数据集根目录绝对路径最稳 train: images/train # 训练集图片目录相对 path val: images/val # 验证集图片目录 nc: 5 # 类别数 names: # 类别名顺序必须和 class_id 一致 0: green 1: breaker 2: turning 3: pink 4: redpath用绝对路径能避免很多“找不到文件”的玄学问题。train和val可以是目录也可以是 txt 列表文件。如果你的图片没有按 train/val 分目录而是用train.txt列路径就把train写成train.txt的路径。nc和names的键值对必须和标注里的class_id严格对应错一个就是全盘错位。3.3 启动训练与关键参数yolo detect train \ datatomato.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/tomato \ nameexp1modelyolov8n.pt是 nano 版预训练权重适合先跑通流程数据量 3000 多张n 或 s 都够用。imgsz640是默认输入尺寸如果图片里西红柿占比较小可以提到 800 或 1024但显存要跟上。batch16在 8G 显存上跑 640 尺寸基本安全爆显存就降到 8。patience20表示 20 轮没提升就早停省时间。lr00.01是初始学习率YOLOv8 默认会用余弦退火一般不用大改。训练开始后看第一轮输出重点确认三件事nc5对不对、names打印出来是不是你的 5 个类别、train和val的图片数是否合理。如果val显示 0 张说明路径写错了。3.4 首轮验证与指标解读训练完在runs/tomato/exp1/weights/下会有best.pt和last.pt。跑验证yolo detect val \ modelruns/tomato/exp1/weights/best.pt \ datatomato.yaml \ imgsz640 \ batch16输出里看mAP50和mAP50-95。农业检测场景下mAP50能到 0.85 以上算正常低于 0.7 就要查标注质量或类别不平衡。mAP50-95通常比mAP50低 0.15~0.25如果差距过大说明框的位置回归不准可能是标注框太松或太紧。混淆矩阵在runs/tomato/exp1/下重点看green和breaker之间有没有大量互混——这两个类别颜色最接近混了就得考虑加数据或改损失函数。4. 避坑与排查坐标越界、类别错位、显存崩溃的 5 个血泪记录4.1 现象训练报错 “Label class X is not in the data.yaml”原因YOLO 标注 txt 里的class_id超出了nc范围或者names的键和实际 id 对不上。常见于数据集打包时类别索引从 1 开始但 YOLO 要求从 0 开始。解决跑一段脚本扫描所有 txt 的最大 class_idimport os label_dir tomato_dataset/labels max_id -1 for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fh: for line in fh: cid int(line.split()[0]) max_id max(max_id, cid) print(最大 class_id:, max_id)如果max_id等于nc说明索引从 1 开始要么改data.yaml的nc和names要么批量把 txt 里的 id 减 1。4.2 现象验证集 mAP 正常但推理时框全偏了原因VOC 转 YOLO 时坐标归一化用错了分母或者图片被 resize 后没有同步更新标注。常见于手动转换脚本里把width和height搞反。解决抽 5 张图用 OpenCV 把 YOLO 框画出来肉眼对import cv2 img cv2.imread(tomato_dataset/images/val/001.jpg) h, w img.shape[:2] with open(tomato_dataset/labels/val/001.txt) as f: for line in f: cid, xc, yc, bw, bh map(float, line.split()) x1 int((xc - bw / 2) * w) y1 int((yc - bh / 2) * h) x2 int((xc bw / 2) * w) y2 int((yc bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite(check.jpg, img)框和果实对不上就是坐标问题重点查xc和yc是不是用了xmin/w而不是(xminxmax)/2/w。4.3 现象训练到一半 loss 变 NaN原因学习率太大、batch 太小导致 BN 层统计量崩了或者数据里有坏图全黑、全白、尺寸为 0。解决先降lr0到 0.001加warmup_epochs5。再扫一遍图片完整性import cv2 import os img_dir tomato_dataset/images/train bad [] for f in os.listdir(img_dir): img cv2.imread(os.path.join(img_dir, f)) if img is None or img.shape[0] 10 or img.shape[1] 10: bad.append(f) print(坏图:, bad)坏图直接删或替换别留着。4.4 现象显存溢出 “CUDA out of memory”原因imgsz或batch太大或者workers开太多导致内存泄漏。解决先把batch减半再把imgsz降到 512 试一轮。如果还爆加ampTrue混合精度和cacheFalse。workers在 Windows 上设 0 或 2Linux 上可以 8但别超过 CPU 核数。4.5 现象某个类别 AP 始终为 0原因该类别样本太少比如turning只有 20 个框或者标注时漏标严重。解决先统计各类别框数少于 100 的考虑过采样或复制粘贴增强。如果数量够但 AP 还是 0检查names里该类别的 id 是不是被别的类别占了。用yolo detect val输出的 per-class 指标确认。5. 进阶技巧用 SAHI 切片推理提升小目标召回与标注复核5.1 为什么需要切片推理3241 张图里如果西红柿在画面中占比很小比如远景大棚监控直接 resize 到 640 会丢失细节小目标召回率掉得厉害。SAHISlicing Aided Hyper Inference的思路是把大图切成重叠的小块每块单独推理再合并结果。这对农业场景特别有用因为果实密集时遮挡严重切片能缓解漏检。5.2 安装与基本用法pip install sahifrom sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model AutoDetectionModel.from_pretrained( model_typeyolov8, model_pathruns/tomato/exp1/weights/best.pt, confidence_threshold0.3, devicecuda:0 ) result get_sliced_prediction( test_big.jpg, detection_model, slice_height512, slice_width512, overlap_height_ratio0.2, overlap_width_ratio0.2 ) result.export_visuals(export_dirsahi_out/)slice_height和slice_width控制切片大小一般设成训练imgsz的 0.8~1.0 倍。overlap比例 0.2 能保证边缘目标不被切丢。confidence_threshold可以比正常推理低一点因为切片后误检会在合并时被 NMS 过滤。5.3 用切片结果反查标注质量SAHI 的另一个用途是复核标注。把切片推理的高置信度结果和原始标注对比如果模型在某处稳定检出但标注里没有大概率是漏标。我一般会跑一遍全量验证集把 FP 和 FN 的图各抽 20 张出来看漏标严重的类别就回去补标。这个流程走一轮mAP 通常能再涨 3~5 个点。5.4 参数对照与选择建议参数作用建议值注意slice_height切片高度512显存小就降到 384slice_width切片宽度512和高度保持一致overlap_height_ratio高度重叠比0.2目标密集时提到 0.3overlap_width_ratio宽度重叠比0.2同上confidence_threshold置信度阈值0.25~0.3比常规推理低 0.05从那以后我每次拿到新数据集都强制先跑一遍类别分布统计和标注可视化确认没有错位和漏标再开训。这份西红柿成熟度数据集的双格式设计省了不少转换功夫但坐标和类别映射那几步还是得自己盯一遍。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →