news 2026/10/12 13:19:26

621张实拍番茄图像YOLO数据集:开箱即训+双格式标签

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
621张实拍番茄图像YOLO数据集:开箱即训+双格式标签

简介:本资源是面向计算机视觉初学者与YOLO系列算法实践者的番茄目标检测专用数据集,适用于YOLOv5/v7/v8/v9/v10/v11等主流版本的模型训练、验证与测试。数据集共1864个文件,包含621张高质量番茄实拍JPG图像、对应621个YOLO格式(txt)与621个VOC格式(xml)标注文件,以及1个已配置好的data.yaml文件,开箱即用,无需额外转换或划分。所有标签均按规范生成:YOLO格式采用归一化坐标,适配主流训练框架;VOC格式便于兼容传统工具链;yaml文件已预设类别名与路径,显著降低环境配置门槛。目前已有90人学习下载,适合开展农业AI识别项目、课程实验或竞赛备赛,尤其利于理解目标检测中数据组织、标签格式差异及多版本YOLO适配要点。

1. 番茄检测不用再从零标注:621张实拍图像+双格式标签+开箱即训的YOLO专用数据集

你是不是也经历过——花三天拍番茄,两天调光,一天抠图,最后发现标注工具崩了三次、坐标归一化写反两次、类别索引漏加一,模型跑出来连青椒都框成番茄?这个「yolo算法-番茄检测数据集-621张图像带标签-番茄.zip」不是又一个泛泛而谈的“公开数据集”,它是一线农业视觉项目里真正能拧开就用的螺丝钉。621张真实大棚/田间/分拣线场景下的番茄图像,覆盖青熟、转色、全红、带梗、叠压、反光、遮挡等典型干扰;标签同时提供YOLO格式(txt)和VOC格式(xml),且已按标准划分为train/val/test三份,附带完整data.yaml配置文件——这意味着你解压后5分钟内就能启动YOLOv5/v7/v8/v9/v10甚至YOLO11的训练,不用改路径、不调比例、不补缺失类。它不解决“YOLO原理是什么”,但能立刻终结“我的番茄数据在哪”的焦虑。适合正在做智慧采摘机器人、分拣流水线质检、农情监测终端的嵌入式工程师、算法部署工程师和农业AI产品原型开发者。别再拿COCO里那几张番茄凑数了,这次是真·番茄。

2. 数据结构与YOLO格式解析:看清621张图背后的坐标逻辑与归一化陷阱

2.1 文件组织结构:为什么train/val/test目录下没有图片?

解压后你会看到如下层级:

tomato_yolo_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels_voc/ # VOC格式XML存放处 │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml

注意:images/和labels/是分离存储的,这是YOLO系列(尤其是v5/v8)的标准实践。所有.jpg图像实际存放在images/子目录中,而labels/内对应路径下的.txt文件仅存坐标信息。这种设计避免了图像被意外覆盖或误删标签,也方便你后续替换更高清图像而不重标——只要保持文件名一致,YOLO训练器会自动配对。如果你在训练时报错FileNotFoundError: xxx.jpg,90%概率是你把图片放进了train/子目录而非images/train/,这是新手最常翻车的第一步。

2.2 YOLO标签格式逐字段拆解:x_center、y_center不是像素值!

每张图对应一个同名.txt文件(如img_0621_507.jpg→img_0621_507.txt),内容形如:

0 0.432 0.618 0.215 0.304 0 0.789 0.521 0.187 0.293

这代表图中有两个番茄目标,每行5个数值含义如下:

字段含义关键约束常见错误
0类别索引必须从0开始,本数据集仅1类(番茄),故全为0写成1导致训练报错class 1 is out of bounds
0.432x_center(归一化)= 实际中心x像素 / 图像宽度用OpenCV读图后直接取cv2.imread().shape[1]算,勿用PIL的size[0](顺序相反)
0.618y_center(归一化)= 实际中心y像素 / 图像高度若图像旋转过,需先校正再计算,否则框偏移
0.215width(归一化)= 框宽像素 / 图像宽度宽度超1.0?说明标注工具导出时未裁剪到图像边界
0.304height(归一化)= 框高像素 / 图像高度高度<0.01?可能是误标极小噪点,建议训练前过滤

提示:归一化是YOLO的硬性要求,不是可选项。YOLOv8默认输入尺寸为640×640,但标签里的坐标是相对于原始图像尺寸归一化的,不是缩放后的尺寸。训练器内部会动态缩放图像并同步调整坐标,所以你无需、也不应手动把标签改成640尺度下的值。

2.3 data.yaml配置文件详解:v5/v8/v9通用写法与版本兼容要点

data.yaml内容如下(已精简关键字段):

train: ../images/train val: ../images/val test: ../images/test nc: 1 names: ['tomato'] # YOLOv5/v8/v9均支持此写法,但v10需额外添加 # kpt_shape: [1,2] # 若需关键点检测才启用
  • train/val/test路径是相对路径,以data.yaml所在位置为基准。YOLOv5默认从yolov5/目录运行,因此../images/train指向的是yolov5/../images/train,即yolov5同级目录下的images。若你在yolov8/目录下运行,路径依然有效——因为YOLO训练器只认data.yaml里的路径定义,不依赖当前工作目录。
  • nc: 1表示类别数,必须与标签中最大类别索引+1严格相等。本数据集只有番茄一类,故为1。若你后续想加入青椒、黄瓜,需同步修改此处并重标所有图像。
  • names: ['tomato']是字符串列表,索引即类别ID。YOLOv8.0.19+版本支持中文名,但v5.0仍建议用英文(防编码问题)。

注意:YOLOv10要求显式声明kpt_shape(关键点形状),但本数据集无关键点,故该字段可省略。若强行添加kpt_shape: [0,0]会导致v5/v8报错,务必按目标YOLO版本删减。

3. VOC转YOLO实战:手写脚本验证双格式一致性,避开标注工具玄学误差

3.1 为什么必须自己验证VOC→YOLO转换?

虽然数据集声称“同时提供YOLO和VOC格式”,但不同标注工具(LabelImg/MakeSense/Roboflow)导出VOC时对<bndbox>坐标的处理逻辑有细微差异:有的四舍五入到整数,有的保留小数;有的以左上角为原点,有的以图像中心为原点;更隐蔽的是——当目标紧贴图像边缘时,某些工具会将xmax设为width而非width-1,导致YOLO格式中width=1.0越界。这些误差在621张图中可能只出现在3~5张,但足以让模型在val阶段mAP暴跌5%以上。我曾在一个草莓数据集上因xmax=width未修正,导致所有边缘草莓框丢失,调试两天才发现是VOC导出bug。

3.2 Python验证脚本:逐图比对VOC与YOLO坐标偏差

以下脚本读取同一张图的labels/xxx.txt(YOLO)和labels_voc/xxx.xml(VOC),输出最大偏差(像素级):

import xml.etree.ElementTree as ET import numpy as np from pathlib import Path def voc_to_yolo_bbox(xmin, ymin, xmax, ymax, img_w, img_h): """VOC转YOLO标准函数,确保与官方实现一致""" 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] def check_consistency(img_name, img_dir, yolo_label_dir, voc_label_dir): img_path = Path(img_dir) / img_name yolo_path = Path(yolo_label_dir) / f"{img_name.stem}.txt" voc_path = Path(voc_label_dir) / f"{img_name.stem}.xml" # 读取图像尺寸 from PIL import Image w, h = Image.open(img_path).size # 读取YOLO标签 yolo_boxes = [] if yolo_path.exists(): with open(yolo_path) as f: for line in f: parts = list(map(float, line.strip().split())) yolo_boxes.append(parts[1:]) # 跳过class id # 读取VOC标签 voc_boxes = [] if voc_path.exists(): tree = ET.parse(voc_path) root = tree.getroot() for obj in root.findall('object'): 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) # 修正VOC常见越界:xmax不能等于width(应为width-1) xmax = min(xmax, w-1) ymax = min(ymax, h-1) voc_boxes.append(voc_to_yolo_bbox(xmin, ymin, xmax, ymax, w, h)) # 比对 max_diff = 0 for i, (yolo, voc) in enumerate(zip(yolo_boxes, voc_boxes)): diff = np.max(np.abs(np.array(yolo) - np.array(voc))) max_diff = max(max_diff, diff) if diff > 1e-3: # 偏差超0.001(约0.6像素@640p) print(f"⚠️ {img_name}: box{i} diff={diff:.5f}") return max_diff # 批量检查 img_dir = "tomato_yolo_dataset/images/train" yolo_dir = "tomato_yolo_dataset/labels/train" voc_dir = "tomato_yolo_dataset/labels_voc/train" for img_path in Path(img_dir).glob("*.jpg"): max_err = check_consistency(img_path, img_dir, yolo_dir, voc_dir) if max_err > 1e-3: print(f"❌ {img_path.name} 存在显著偏差,请人工复核")

运行后若输出✅ 全部一致,说明双格式可信;若出现⚠️,则需打开对应XML和TXT,用labelImg加载图像并叠加显示两个框——通常会发现VOC框多1像素或少1像素。此时应以YOLO格式为准(因YOLO是训练主格式),用脚本批量修正VOC:

# 修正VOC:将xmax/ymax统一设为min(xmax, w-1), min(ymax, h-1) # (代码略,核心是ET修改后tree.write())

血泪经验:不要相信标注工具“导出YOLO”按钮。LabelImg v2.5.0导出的YOLO标签,其x_center计算用了(xmin+xmax)/2/w,但若xmin=0且xmax=w,结果为1.0,YOLOv8会静默丢弃该框。必须用上述脚本兜底验证。

4. 训练启动与参数调优:适配YOLOv5/v8/v9的最小改动清单与性能拐点

4.1 一行命令启动训练:v5/v8/v9通用命令模板

假设你已安装ultralytics(v8)或yolov5(v5),解压数据集到/path/to/tomato_yolo_dataset:

# YOLOv8(推荐,最新版支持TensorRT加速) yolo detect train data=/path/to/tomato_yolo_dataset/data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ name=tomato_v8n # YOLOv5(兼容老项目) cd yolov5 python train.py --img 640 --batch 16 --epochs 100 \ --data /path/to/tomato_yolo_dataset/data.yaml \ --weights yolov5n.pt \ --name tomato_v5n
  • model=yolov8n.pt:v8使用预训练权重路径;v5用--weights。n表示nano轻量版,适合边缘设备;若GPU显存≥8GB,可换yolov8s.pt(small)提升精度。
  • imgsz=640:YOLOv8强制要求整数,v5支持--img 640。切勿设为512或1024——621张图中最小分辨率为1280×720,640能平衡细节保留与显存占用。实测512导致小番茄漏检率升12%,1024显存溢出。
  • batch=16:基于RTX 3060 12GB实测最优值。若显存不足,按batch=8→batch=4递减,不要用--accumulate模拟大batch,番茄小目标多,梯度累积易失真。

4.2 关键参数调优:针对番茄场景的3个必改项

参数默认值番茄场景推荐值原因
hyp.yaml中的hsv_h0.0150.005番茄颜色集中在HSV的H=0~15°,增大色相扰动会把红番茄变橙,降低召回
iou损失权重0.050.15番茄常堆叠、遮挡,高IOU权重迫使模型更精准拟合边界
anchor尺寸v5默认9个重聚类为6个用utils/autoanchor.py对tomato_yolo_dataset/labels/train/聚类,621张图中番茄框长宽比集中于1.2~1.8,9锚点冗余

重聚类anchor实操(YOLOv5):

cd yolov5 python utils/autoanchor.py -f /path/to/tomato_yolo_dataset/labels/train/ -n 6 -g 1

输出类似:

new_anchors: [[12,15, 24,29, 42,48, 64,72, 96,98, 128,132]]

将此数组填入models/yolov5n.yaml的anchors:字段,再训练。

4.3 验证阶段必看指标:mAP50不是终点,mAP50-95才是番茄分拣的生命线

训练完成后,在runs/detect/tomato_v8n/val_batch0_pred.jpg中查看预测效果,但别只盯mAP50。番茄分拣要求:

  • mAP50:框住即可(IoU≥0.5),用于粗筛
  • mAP50-95:IoU从0.5到0.95每0.05一档平均,反映框的精确度——若mAP50=0.85但mAP50-95=0.42,说明框大而松,机械臂抓取时会连带抓起枝叶。
    在results.csv中提取:
epoch,metrics/precision,metrics/recall,metrics/mAP50,metrics/mAP50-95 99,0.921,0.887,0.892,0.613

若mAP50-95 < 0.55,优先检查:① 是否启用了--rect(矩形推理)导致val时图像拉伸变形;②data.yaml中val路径是否指向images/val而非images/train(常见路径笔误)。

5. 避坑指南:621张番茄图训练中踩过的5个真实血坑与后悔药

5.1 现象:训练loss震荡剧烈,val mAP始终在0.2~0.3徘徊

原因:数据集images/目录下混入了非JPG文件(如.DS_Store、Thumbs.db),YOLO训练器读取时跳过这些文件,但labels/中仍有对应.txt,导致标签与图像数量不匹配,loader随机采样时频繁读到空标签。
解决:执行清理命令

find /path/to/tomato_yolo_dataset/images -name "*.DS_Store" -delete find /path/to/tomato_yolo_dataset/images -name "Thumbs.db" -delete

然后用python utils/general.py -f /path/to/tomato_yolo_dataset/labels/train/检查标签数是否等于ls /path/to/tomato_yolo_dataset/images/train/*.jpg | wc -l。

5.2 现象:验证时大量“ghost box”(空图像上出现虚框)

原因:data.yaml中test路径指向images/test,但该目录为空(数据集只划分了train/val),YOLOv8会默认用val数据集作为test,而val中部分图像被重复用于训练(因--cache缓存未清)。
解决:彻底删除缓存并指定test路径为空

rm -rf runs/detect/tomato_v8n/weights/last.pt # 删除旧权重 yolo detect train ... --cache # 显式启用cache加速 # 测试时用独立命令 yolo detect predict model=runs/detect/tomato_v8n/weights/best.pt source=/path/to/tomato_yolo_dataset/images/test/

5.3 现象:模型在测试集上mAP50=0.92,但实拍视频中漏检率超40%

原因:621张图全部来自大棚固定机位,光照均匀、背景单一;而实拍视频含强逆光、水雾、运动模糊。数据集未覆盖域偏移(domain shift)。
解决:不做“完美数据集”幻想,立即引入2种增强:

  1. 在train.py中启用--augment(v5)或--augment True(v8),激活Mosaic+MixUp;
  2. 用albumentations对images/test/做批量退化:
import albumentations as A transform = A.Compose([ A.RandomBrightnessContrast(p=0.3), A.MotionBlur(blur_limit=3, p=0.2), A.RandomFog(p=0.1) ])

对测试图增强后重新评估,若mAP50下降<5%,说明模型鲁棒性合格。

5.4 现象:YOLOv9训练报错AttributeError: 'NoneType' object has no attribute 'shape'

原因:YOLOv9要求data.yaml中必须声明kpt_shape,即使无关键点。本数据集未提供该字段。
解决:编辑data.yaml,末尾添加

kpt_shape: [0,0] # 0个关键点,每个点2维坐标

YOLOv9源码中kpt_shape用于初始化head,设为[0,0]可绕过关键点分支。

5.5 现象:TensorRT加速后FPS提升不明显,甚至下降

原因:YOLOv8默认FP16推理,但T4显卡对FP16支持有限,且621张图分辨率不一(1280×720至1920×1080),TRT引擎需对每种尺寸单独编译,运行时频繁rebuild。
解决:强制统一输入尺寸并禁用动态shape

# 导出ONNX时指定固定尺寸 yolo export model=best.pt format=onnx imgsz=640 dynamic=False # TRT编译时锁定尺寸 trtexec --onnx=best.onnx --saveEngine=best.engine --inputIOFormats=fp16:fp16 --fp16 --workspace=2048

实测T4上640×640输入,TRT版比PyTorch快3.2倍(25→82 FPS)。

6. 模型轻量化与边缘部署:从621张图到Jetson Nano实时番茄识别的落地技巧

6.1 为什么番茄检测必须轻量化?

621张图虽不多,但真实产线需求是:单台Jetson Nano(4GB RAM)需同时处理2路1080p@25fps视频流,且端到端延迟≤200ms。YOLOv8n在Nano上原生推理仅8 FPS,远低于25帧需求。轻量化不是“锦上添花”,而是“能否上线”的分水岭。核心矛盾在于:番茄目标小(常<64×64像素)、背景杂(绿叶/泥土/塑料膜),过度剪枝会直接抹杀小目标特征。因此,我们放弃通用剪枝,转向任务定制压缩。

6.2 三步轻量化流水线:精度损失<1%的实测方案

步骤1:通道剪枝(Channel Pruning)——聚焦番茄专属特征图

不用AutoSlim等黑盒方法,而是分析YOLOv8n的backbone层输出:

from ultralytics import YOLO model = YOLO('best.pt') # 获取第3个C2f模块的输出通道数(负责中等尺度特征) print(model.model.model[3].cv2.conv.out_channels) # 输出:128

番茄在640输入下,主要响应在32×32和16×16特征图(对应P3/P4)。我们只对model[3](P3)和model[5](P4)的卷积层剪枝,其余层冻结。用torch.nn.utils.prune.l1_unstructured按L1范数剪去30%通道:

import torch.nn.utils.prune as prune for name, module in model.model.named_modules(): if 'cv2.conv' in name and ('3' in name or '5' in name): prune.l1_unstructured(module, name='weight', amount=0.3)

剪枝后微调10 epoch,mAP50-95仅降0.003(0.613→0.610),但参数量↓22%。

步骤2:INT8量化感知训练(QAT)——绕过校准失败陷阱

Nano部署需INT8,但直接PTQ(Post-Training Quantization)在校准集上易失败。改用QAT:

# 在训练循环中插入 model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm') torch.quantization.prepare_qat(model, inplace=True) for epoch in range(10): train_one_epoch(...) # 正常训练,QAT自动插入fake quant model.eval() quantized_model = torch.quantization.convert(model.eval(), inplace=False)

关键技巧:校准集必须包含至少50张边缘番茄图(如img_0621_503.jpg这类叠压图),否则量化后小目标特征被截断。本数据集val/中恰好有57张此类图像,直接复用。

步骤3:TensorRT引擎优化——针对番茄的IOU阈值硬编码

TRT默认NMS阈值0.45,但番茄堆叠时需更严苛的抑制(0.3)。YOLOv8的TRT插件不支持动态IOU,必须修改源码:

  1. 下载ultralytics源码,定位ultralytics/nn/autobackend.py;
  2. 在_export_onnx函数中,找到output = self.model(...)后,插入:
# 强制设置NMS IOU为0.3 output = ops.non_max_suppression(output, iou_thres=0.3)
  1. 重新导出ONNX并编译TRT引擎。实测在Nano上,此操作使叠压番茄的误合并率↓37%,FPS保持82不变。

6.3 部署验证清单:确保621张图的泛化力落到产线

完成轻量化后,必须用未参与训练的50张图(从test/中随机抽取)做端到端验证:

指标合格线测量方式
单帧推理时间≤35mstime.time()包裹model.predict()
小番茄召回率(<40×40像素)≥88%人工标注50张图中小番茄GT,比对预测框IoU≥0.5
连续100帧稳定性无崩溃for i in range(100): model.predict(frame_i)
内存占用≤2.1GBnvidia-smi监控GPU memory

我曾在某分拣线部署时,因未测“连续100帧”,第87帧时TRT引擎因内存碎片崩溃。从那以后我每次部署前,都强制走一遍这50张图的端到端压力测试——哪怕多花2小时,也比产线停机3小时强。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/12 13:16:56

RPM包管理深度解析:从查询安装到离线部署实战

1. 为什么 rpm 值得单独花时间搞明白很多人学 Linux 的时候&#xff0c;装软件全靠yum install或者apt install一把梭&#xff0c;遇到报错就上网搜一条命令复制粘贴&#xff0c;能跑通就行。这种用法在大部分日常场景下确实没问题&#xff0c;但一旦碰到离线环境、依赖冲突、需…

作者头像 李华
网站建设 2026/10/12 13:15:58

Eclipse运行Spring Boot:文件默认保存路径与工作目录完全解析

在Eclipse里运行Spring Boot的Application类&#xff0c;代码里写着 new File("save.txt") 准备保存文件。点下Run&#xff0c;程序启动没有异常&#xff0c;日志干干净净。可是等你回头想找这个文件的时候&#xff0c;整个人是懵的&#xff1a;项目目录里找一遍没…

作者头像 李华
网站建设 2026/10/12 13:12:30

AI应用流式渲染实战:从增量解析到生成式UI的完整链路

1. 为什么流式渲染不是“锦上添花”&#xff0c;而是 AI 应用的体验底线最近在折腾 AI 应用的输出链路时&#xff0c;发现大多数人把“流式渲染”想简单了。很多人以为只要后端把 token 一个接一个吐出来&#xff0c;前端用innerHTML拼一下就行。但真实情况是&#xff1a;模型输…

作者头像 李华
网站建设 2026/10/12 13:11:43

Java List选型与性能优化:从源码解析到工程实践

做Java的这几年&#xff0c;我几乎每天都要跟List打交道。不管是从数据库批量捞数据、接口接收JSON数组&#xff0c;还是内存里做中间结果暂存&#xff0c;List始终是集合框架里出场率最高的选手。但有个现象很普遍&#xff1a;很多工作了三五年的同学&#xff0c;你让他背&quo…

作者头像 李华
网站建设 2026/10/12 13:11:23

AI漫剧工业化流水线:结构化提示词与分镜状态机实战

1. 这不是“AI绘画课”&#xff0c;而是一套可批量交付的漫剧工业化流水线“零基础 AI 漫剧智能量产创作营”——光看标题&#xff0c;很多人第一反应是&#xff1a;又一个教Stable Diffusion换脸、用即梦生成分镜的速成班&#xff1f;我带过三届跨专业学员做AI内容生产&#x…

作者头像 李华