621张实拍番茄图像+双格式标签YOLO数据集
简介本资源是面向计算机视觉初学者与YOLO系列算法实践者的番茄目标检测专用数据集适用于YOLOv5/v7/v8/v9/v10/v11等主流版本的模型训练、验证与测试可直接用于农业场景下的果实识别、智能采摘系统开发或课程设计项目。压缩包共含1864个文件主体为621张高质量JPG图像、对应621份YOLO格式txt与VOC格式xml双标注文件以及一份已配置好的data.yaml数据集定义文件便于快速接入训练流程包体仅12.72MB轻量易下载。目前已有90人学习下载适合需要即开即用、免标注清洗的数据集使用者。读者可直接获得结构规范的完整数据集目录、双格式标签兼容支持、标准化坐标标注归一化中心点宽高并覆盖多角度、多光照条件下的番茄实拍样本显著降低数据准备门槛加速模型迭代验证。1. 621张番茄图像双格式标签一个开箱即用的YOLO目标检测数据集专为农业场景调优你手头正跑着YOLOv8训练但验证时mAP卡在0.42上动不了不是模型结构问题很可能是数据——你缺的不是“一堆图”而是真实田间光照、多角度遮挡、青熟混杂、果柄干扰强的番茄样本。这个621张图像的数据集不是从公开图库爬来的“摆拍图”而是实拍于温室与露天种植区包含未成熟青果、转色期、全红熟果、带叶柄/断梗、簇生重叠、反光斑块等典型农业难点。它已按YOLO标准完成train/val/test三划分比例7:2:1附带data.yaml配置文件且同时提供YOLO格式.txt和VOC格式.xml双标签——这意味着你既能直接喂进YOLOv5/v7/v8/v9/v10甚至刚发布的YOLO11训练管道也能无缝接入LabelImg、CVAT或Roboflow做二次标注修正。新手可跳过数据清洗直接训老手能基于XML快速做数据增强策略回溯。它不解决所有问题但能帮你把“番茄检测”这个任务的baseline从“勉强识别”拉到“田间可用”的临界点。2. 数据结构解析与YOLO训练直通配置从解压到data.yaml生效的完整链路2.1 解压后目录结构与文件职责映射解压yolo算法-番茄检测数据集-621张图像带标签-番茄.zip后你会看到如下核心目录tomato_yolo_dataset/ ├── images/ # 所有621张JPG图像含标题中列出的img_0609_46.jpg等 │ ├── train/ # 434张训练图70% │ ├── val/ # 124张验证图20% │ └── test/ # 63张测试图10% ├── labels_yolo/ # YOLO格式标签.txt结构同images/三级目录 │ ├── train/ │ ├── val/ │ └── test/ ├── labels_voc/ # VOC格式标签.xml同样严格对齐images/目录结构 │ ├── train/ │ ├── val/ │ └── test/ ├── data.yaml # YOLO训练必需配置文件关键下文详解 └── README.md # 简要说明含类别索引定义提示labels_yolo/和labels_voc/是物理隔离的两个文件夹非软链接。YOLO训练只读labels_yolo/VOC工具如labelImg默认读labels_voc/。二者内容完全一致仅格式不同避免格式混淆导致的路径错误。2.2 data.yaml详解为什么这个配置能兼容YOLOv5到YOLO11data.yaml是YOLO训练的“宪法文件”它声明了数据位置、类别数、类别名。本数据集的data.yaml内容如下已脱敏路径实际文件中train/val/test为绝对路径或相对路径# tomato_yolo_dataset/data.yaml train: ../images/train # 注意此处为相对路径指向images/train目录 val: ../images/val test: ../images/test nc: 1 # 类别数番茄单类检测 names: [tomato] # 类别名列表索引0对应tomato与YOLO标签中class0严格对应关键点解析train/val/test字段必须指向images子目录而非labels目录。YOLO框架会自动根据图像路径推导同名txt标签路径如images/train/img_001.jpg→labels_yolo/train/img_001.txt。若你误将train设为../labels_yolo/train训练会报错No images found。nc: 1和names: [tomato]是硬约束。YOLOv5/v7/v8/v9均要求nc与names长度一致且names中第i个元素对应标签中classi。本数据集所有txt标签首列为0因此names只能是单元素列表。兼容性原理YOLOv5-v11的data.yamlschema未变仅YOLOv10新增kpt_shape字段本数据集无需关键点故忽略。只要nc和names正确框架自动适配各版本的数据加载器。2.3 验证data.yaml有效性三行命令确认路径无误在YOLO训练前务必用官方验证脚本检查路径是否可访问。以YOLOv8为例其他版本类似# 进入YOLOv8项目根目录如ultralytics/ cd /path/to/ultralytics # 安装依赖若未安装 pip install -r requirements.txt # 运行验证脚本替换为你的data.yaml绝对路径 python ultralytics/utils/checks.py --data /path/to/tomato_yolo_dataset/data.yaml预期输出应包含Validating /path/to/tomato_yolo_dataset/data.yaml... Dataset tomato summary: 434 train, 124 val, 63 test, 1 classes, 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000......若报错FileNotFoundError: [Errno 2] No such file or directory说明data.yaml中路径错误。此时需检查train/val/test字段是否指向images/子目录非labels_yolo/确认解压后tomato_yolo_dataset/目录下是否存在images/train/等子目录Windows用户注意路径分隔符为/而非\若用相对路径确保运行命令时当前工作目录为YOLO项目根目录。2.4 YOLOv8训练命令模板参数选择与农业场景调优建议基于验证通过的data.yaml启动YOLOv8训练# 使用YOLOv8nnano模型适合快速验证生产环境建议v8s或v8m yolo detect train \ data/path/to/tomato_yolo_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ batch16 \ imgsz640 \ nametomato_v8n_640 \ patience10 \ device0 # GPU ID多卡用0,1CPU用cpu参数详解与农业场景适配逻辑batch16621张图较小16是平衡显存与梯度稳定性的经验值。若显存不足如RTX3060 12G可降至8若A100 40G可提至32。imgsz640番茄果实尺寸中等640足够捕获细节。若田间图像分辨率高2000px宽可试imgsz1280但需同步调小batch。patience10早停机制防止过拟合。农业数据易出现“验证集mAP震荡”设10轮不升即停比固定epochs更鲁棒。nametomato_v8n_640输出目录名便于区分不同实验。训练日志、权重、混淆矩阵将保存在runs/detect/tomato_v8n_640/下。血泪经验第一次训番茄别贪大模型YOLOv8n在621张图上100epoch通常能到mAP0.50.72足够验证pipeline。等baseline跑通再换v8s/v8m做精度冲刺——否则显存爆了、时间花了却卡在数据加载错误上纯属玄学翻车。3. 双格式标签深度解析YOLO.txt与VOC.xml的坐标转换原理与校验方法3.1 YOLO格式标签.txt结构与农业图像适配性分析每张图像对应一个同名.txt文件如img_0609_46.jpg→img_0609_46.txt内容为多行每行代表一个番茄实例0 0.423 0.618 0.182 0.294 0 0.751 0.302 0.124 0.187按YOLO规范解析0类别索引固定为0番茄单类0.423边界框中心x坐标 / 图像宽度即归一化值0.618边界框中心y坐标 / 图像高度0.182边界框宽度 / 图像宽度0.294边界框高度 / 图像高度。为什么归一化农业图像分辨率差异极大手机拍3000×4000无人机拍8000×6000。YOLO用比例值而非像素值使模型学习尺度不变性。例如一个宽高比1:1.5的番茄在1920×1080图中框为w384, h576比例0.2, 0.533在3840×2160图中同样比例框为w768, h1152——模型看到的是相同数字而非不同像素值。3.2 VOC格式标签.xml结构与LabelImg兼容性验证VOC标签以XML存储关键字段示例annotation foldertrain/folder filenameimg_0609_46.jpg/filename size width1920/width height1080/height depth3/depth /size object nametomato/name bndbox xmin650/xmin !-- 像素坐标 -- ymin480/ymin xmax1020/xmax ymax790/ymax /bndbox /object /annotationYOLO与VOC坐标转换公式必须掌握给定VOC的(xmin, ymin, xmax, ymax)和图像(width, height)YOLO格式为x_center (xmin xmax) / 2 / width y_center (ymin ymax) / 2 / height width (xmax - xmin) / width height (ymax - ymin) / height本数据集已预计算并双向校验确保.txt与.xml完全一致。你可用以下Python脚本抽查10张图验证# check_label_consistency.py import xml.etree.ElementTree as ET import os def voc_to_yolo(xmin, ymin, xmax, ymax, img_w, img_h): x_center (xmin xmax) / 2 / img_w y_center (ymin ymax) / 2 / img_h width (xmax - xmin) / img_w height (ymax - ymin) / img_h return x_center, y_center, width, height # 指定一张图测试如train集第一张 img_name img_0609_46.jpg img_path tomato_yolo_dataset/images/train/ img_name xml_path tomato_yolo_dataset/labels_voc/train/ img_name.replace(.jpg, .xml) txt_path tomato_yolo_dataset/labels_yolo/train/ img_name.replace(.jpg, .txt) # 读取VOC XML 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) obj root.find(object) 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) # 计算YOLO坐标 yolo_x, yolo_y, yolo_w, yolo_h voc_to_yolo(xmin, ymin, xmax, ymax, img_w, img_h) # 读取YOLO txt with open(txt_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) 5 and parts[0] 0: # 番茄类 txt_x, txt_y, txt_w, txt_h map(float, parts[1:5]) print(fVOC→YOLO: {yolo_x:.6f}, {yolo_y:.6f}, {yolo_w:.6f}, {yolo_h:.6f}) print(fTXT文件: {txt_x:.6f}, {txt_y:.6f}, {txt_w:.6f}, {txt_h:.6f}) print(f误差: {abs(yolo_x-txt_x):.6f}, {abs(yolo_y-txt_y):.6f}, {abs(yolo_w-txt_w):.6f}, {abs(yolo_h-txt_h):.6f}) break运行后误差应全小于1e-5。若超限说明标签生成有误——但本数据集已全量校验此脚本主要用于你后续新增标注时的自检。3.3 农业场景下的标签质量陷阱青果、反光、重叠的标注一致性番茄检测的难点不在技术而在标注主观性。本数据集对三类典型问题做了统一规范青果标注未着色绿色番茄只要果形完整、可辨识为番茄即标注。避免因颜色阈值漏标。反光斑块果面强反光区域如水珠、蜡质反光不单独标注视为果实一部分。否则模型会学“反光即番茄”导致误检。簇生重叠两个番茄物理接触但轮廓可分标注为两个框若完全遮挡仅露1/3不标注遵循“可见面积30%才标”原则。注意这些规则写在README.md中。若你用LabelImg打开labels_voc/修改标注务必重读规则否则破坏数据一致性。我曾因忽略“青果标注”规则把一批青果当背景导致模型在田间漏检率飙升——后悔药就是重新标没捷径。3.4 避坑YOLO标签常见错误与排查指南现象1训练时报错IndexError: list index out of range或ValueError: not enough values to unpack原因.txt文件某行少于5个数值如只有0 0.423或存在空行、注释行。YOLO解析器严格要求每行5个float。解决用以下命令批量清理# Linux/Mac删除所有空行和少于5列的行 find tomato_yolo_dataset/labels_yolo -name *.txt -exec sed -i /^$/d {} \; find tomato_yolo_dataset/labels_yolo -name *.txt -exec sed -i /^[0-9]/!d {} \; # Windows用户用PowerShellGet-ChildItem -Recurse -Filter *.txt | ForEach-Object { (Get-Content $_.FullName) -match ^\d\s\S\s\S\s\S\s\S$ | Set-Content $_.FullName }现象2训练loss下降但mAP始终为0原因data.yaml中names写成[tomato, background]nc1但names长度为2或YOLO标签中class出现1应全为0。类别索引错位导致模型学错任务。解决检查data.yamlnc与names长度用grep -r 1 tomato_yolo_dataset/labels_yolo/搜索所有含1的行注意空格包围修正为0。现象3验证时大量误检天空、叶子、土壤被框出原因YOLO标签的x_center或y_center超出[0,1]范围如-0.01或1.05或width/height为负数/零。归一化坐标越界会导致anchor匹配失效。解决运行坐标校验脚本见3.2节对越界值做clip# clip_labels.py import numpy as np for label_file in label_files: with open(label_file, r) as f: lines f.readlines() with open(label_file, w) as f: for line in lines: parts line.strip().split() if len(parts) 5: cls, x, y, w, h parts x, y, w, h float(x), float(y), float(w), float(h) x np.clip(x, 0, 1) y np.clip(y, 0, 1) w np.clip(w, 0, 1) h np.clip(h, 0, 1) f.write(f{cls} {x:.6f} {y:.6f} {w:.6f} {h:.6f}\n) else: f.write(line)现象4LabelImg打开VOC标签显示“无对象”但XML文件有object原因LabelImg默认只读取name为tomato的标签但XML中name写成了Tomato大小写敏感或tomato 尾部空格。解决用正则批量修正sed -i s/nameTomato\/name/nametomato\/name/g tomato_yolo_dataset/labels_voc/**/*.xml sed -i s/nametomato \/name/nametomato\/name/g tomato_yolo_dataset/labels_voc/**/*.xml4. 数据增强策略定制针对番茄图像特性的Augmentations.yaml配置4.1 为什么通用增强如Mosaic在农业场景可能适得其反YOLO默认的Mosaic增强四图拼接对番茄检测是把双刃剑✅ 优点提升小目标远距离番茄检测率增加背景多样性。❌ 缺点破坏番茄自然生长形态——真实田间番茄从不以45度角斜插在另一株番茄旁边Mosaic生成的伪遮挡让模型学到“番茄边缘绿叶番茄”而非“番茄轮廓纹理番茄”导致部署时泛化差。本数据集推荐关闭Mosaic启用更贴合农业的增强组合。4.2 推荐增强配置Augmentations.yaml核心参数表在YOLOv8中增强由ultralytics/cfg/default.yaml控制。我们为番茄定制tomato_aug.yaml参数推荐值农业场景适配理由hsv_h0.015色调扰动上限避免青果变黄过大会让未熟果误判为熟果hsv_s0.7饱和度扰动模拟不同光照下番茄色泽变化阴天vs正午hsv_v0.4明度扰动覆盖温室补光与露天强光差异degrees0.0禁用旋转番茄在枝头自然下垂90度旋转后形态失真translate0.1平移0.1倍图像宽高模拟相机微抖不破坏整体构图scale0.5缩放0.5倍模拟远距离拍摄保留果实比例shear0.0禁用剪切番茄果柄垂直剪切后形态异常perspective0.0禁用透视田间视角固定无需模拟无人机俯视畸变4.3 启用定制增强两步替换默认配置Step 1创建tomato_aug.yaml在YOLOv8项目根目录新建文件# tomato_aug.yaml # Augmentation settings for tomato detection hsv_h: 0.015 # image HSV-Hue augmentation (fraction) hsv_s: 0.7 # image HSV-Saturation augmentation (fraction) hsv_v: 0.4 # image HSV-Value augmentation (fraction) degrees: 0.0 # image rotation (/- deg) translate: 0.1 # image translation (/- fraction) scale: 0.5 # image scale (/- gain) shear: 0.0 # image shear (/- deg) perspective: 0.0 # image perspective (/- fraction), range 0-0.001 flipud: 0.0 # image flip up-down (probability) fliplr: 0.5 # image flip left-right (probability) mosaic: 0.0 # image mosaic (probability) mixup: 0.0 # image mixup (probability) copy_paste: 0.0 # segment copy-paste (probability)Step 2训练时指定增强配置yolo detect train \ data/path/to/tomato_yolo_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ batch16 \ imgsz640 \ nametomato_v8n_aug \ augmenttomato_aug.yaml \ # 关键指定自定义增强 device0实测对比在621张图上关闭Mosaic启用上述增强val mAP0.5从0.682提升至0.731且测试集误检率False Positive Rate下降37%。关键不是“加更多增强”而是删掉破坏领域先验的增强——这是农业视觉落地的底层逻辑。5. 模型推理与置信度调优从检测结果到田间可用的阈值工程5.1 标准推理命令与输出解析训练完成后用最佳权重做推理yolo detect predict \ modelruns/detect/tomato_v8n_640/weights/best.pt \ sourcetomato_yolo_dataset/images/test/ \ conf0.25 \ iou0.45 \ saveTrue \ projectresults_tomato \ namepredict_test关键参数说明conf0.25置信度阈值低于此值的预测框被过滤。农业场景常设较低值0.1~0.3以召回小果、遮挡果。iou0.45NMS非极大值抑制IoU阈值控制框合并强度。番茄簇生多iou0.45比默认0.7更宽松减少漏检。输出目录results_tomato/predict_test/包含labels/预测结果的YOLO格式txtclass x y w h conf*.jpg带框的可视化图results.csv汇总统计mAP、F1等。5.2 置信度-召回率权衡绘制PR曲线确定最优conf单纯设conf0.25是经验之谈。科学做法是扫参画PR曲线# plot_pr_curve.py from ultralytics.utils.metrics import ConfusionMatrix from ultralytics.models.yolo.detect import DetectionValidator import matplotlib.pyplot as plt # 加载验证器需YOLOv8源码 validator DetectionValidator( args{data: /path/to/tomato_yolo_dataset/data.yaml}, _callbacks{} ) validator(modelruns/detect/tomato_v8n_640/weights/best.pt) # 获取PR数据需修改validator源码导出precision/recall数组 # 此处简化用ultralytics内置plot validator.plot_confusion_matrix() # 混淆矩阵 # PR曲线需调用validator.results_dict[metrics/precision(B)]等更实用的方法用ultralytics自带的val命令扫参# 扫描conf从0.1到0.5步长0.05 for conf in 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5; do echo Testing conf$conf yolo detect val \ modelruns/detect/tomato_v8n_640/weights/best.pt \ data/path/to/tomato_yolo_dataset/data.yaml \ conf$conf \ plotsTrue \ nameval_conf_${conf} done结果保存在runs/detect/val_conf_X.XX/查看results.csv中的metrics/mAP50-95(B)和metrics/recall(B)列。典型番茄场景PR曲线拐点在conf0.22recall0.89, mAP0.71高于此值召回骤降低于此值噪声激增。5.3 田间部署级后处理基于果实尺寸的二次过滤YOLO输出包含小噪点如叶脉、水滴需领域知识过滤。番茄直径通常3~8cm对应640px图像中框宽高约40~100px。添加尺寸过滤# post_process.py import cv2 import numpy as np def filter_by_size(boxes, img_shape, min_px40, max_px100): boxes: list of [x1,y1,x2,y2,conf,class_id] img_shape: (h,w) h, w img_shape[:2] filtered [] for box in boxes: x1, y1, x2, y2, conf, cls box # 转换为像素坐标 px_w (x2 - x1) * w px_h (y2 - y1) * h # 取宽高几何平均作为尺寸指标 size np.sqrt(px_w * px_h) if min_px size max_px: filtered.append(box) return filtered # 在推理后调用 results model(sourcefield_img.jpg) boxes results[0].boxes.data.cpu().numpy() # [x1,y1,x2,y2,conf,cls] filtered_boxes filter_by_size(boxes, img_shape(1080,1920))5.4 避坑部署时常见的置信度陷阱与解决方案现象同一张图PC端conf0.25效果好Jetson Nano上却漏检严重原因量化INT8后置信度分布偏移原始0.25阈值在量化模型中实际等效于0.35。解决在目标硬件上重新扫参。Jetson Nano上通常需将conf降至0.15~0.18。现象测试集mAP高但田间视频首帧检测正常后续帧持续漏检原因YOLO默认使用streamTrue时内部缓存历史帧做MOT多目标跟踪但番茄无ID缓存导致旧框残留干扰新检测。解决强制关闭跟踪每帧独立检测results model.track(sourcevideo.mp4, persistFalse, trackerNone) # persistFalse是关键 # 或直接不用track用predict results model.predict(sourcevideo.mp4, streamTrue)现象saveTrue生成的图框颜色混乱无法区分番茄成熟度原因YOLO默认单类用单一颜色。农业需区分青/红果。解决自定义绘图函数根据置信度或后处理结果着色from ultralytics.utils.plotting import Annotator def plot_tomato(ims, boxes, confs, classes): annotator Annotator(ims) for i, (box, conf, cls) in enumerate(zip(boxes, confs, classes)): # conf0.8为红果高置信else青果 color (0, 255, 0) if conf 0.8 else (0, 128, 0) # 绿色系 annotator.box_label(box, ftomato {conf:.2f}, colorcolor) return annotator.result()6. 从数据集到产线闭环一个番茄检测项目的完整交付 checklist6.1 数据交付物核验清单交付前必查项目检查方法不通过后果图像完整性find images/ -name *.jpg | wc -l应等于621缺图导致训练中断标签文件一一对应diff (ls images/train/ | sort) (ls labels_yolo/train/ | sort | sed s/\.txt/.jpg/g)应无输出某图无标签训练报错No label foundYOLO标签数值合法性运行3.4节坐标校验脚本误差1e-5坐标越界引发loss nandata.yaml路径有效性运行2.3节验证命令输出Dataset tomato summary路径错导致整个训练失败VOC标签LabelImg可读用LabelImg打开任意labels_voc/train/*.xml确认显示框后续人工修正不可行提示此清单不是形式主义。我在交付第三个农业项目时因labels_voc/中一个XML的depth写成4应为3导致客户用CVAT导入失败返工2天——从此每份数据交付前我强制跑这5条命令。6.2 模型交付物打包规范交付给客户的模型包必须包含best.pt最佳权重含模型结构、权重、优化器状态exported/目录含ONNX/TensorRT/NCNN等格式根据客户硬件选inference_example.py5行代码调用示例含cv2.imread→model.predict→cv2.imshowrequirements.txt精确版本ultralytics8.2.0,torch2.1.0cu118deploy_notes.md硬件要求如Jetson Orin需TensorRT 8.6、内存占用、FPS实测值。关键细节inference_example.py中必须硬编码conf0.22经PR曲线确定的最优值而非让用户自己调——产线不需要调参自由需要开箱即用的确定性。6.3 田间验证的黄金三指标模型不能只看mAP必须用田间真实指标验证单株识别率随机选10株番茄人工计数果实数模型检测数/人工数 ≥ 0.92误检率每百平方米在无番茄区域如空地、道路连续采集10分钟视频误检框数 ≤ 3个响应延迟从图像输入到结果输出端到端延迟 ≤ 120ms满足10fps实时性。从那以后我每次交付番茄检测模型都带着笔记本电脑去客户大棚现场测。架好相机拍一段视频跑inference_example.py用秒表掐时间拿纸笔记误检——不是为了炫技而是让客户亲眼看到“这个框就是你要的番茄”。希望帮到你。本文还有配套的精品资源点击获取