621张番茄图像YOLO数据集:小样本农业视觉落地实践
简介本资源是面向计算机视觉初学者与YOLO算法实践者的番茄目标检测专用数据集适用于YOLOv5至YOLOv11等主流版本的模型训练、验证与测试特别适合农业图像识别、轻量级目标检测项目入门与课程实验。压缩包共1864个文件含621张高质量JPG番茄实拍图、对应621份YOLO格式txt与VOC格式xml双标注文件以及一份开箱即用的data.yaml配置文件完整覆盖数据组织、类别定义与路径设置无需额外转换即可投入训练。资源包仅12.72MB结构简洁高效标签规范清晰中心坐标与宽高均按图像比例归一化处理便于快速理解YOLO标注逻辑并开展端到端实验。目前已有90人学习下载配套文件命名统一、样本多样性良好涵盖不同光照、遮挡与成熟度下的番茄图像为模型泛化能力验证提供可靠基础。1. 621张番茄图像YOLO标签为什么这个小数据集比你手里的“万图大库”更值得先跑通你手上可能正压着一个标注了上万张图的农业数据集但模型在田间实测时连熟番茄和青番茄都分不清——而这个只有621张图、带完整YOLO格式标签的「番茄.zip」恰恰卡在农业视觉落地最痛的那个点上不是数据不够多而是数据够不够“对”。它不追求跨品种、跨光照、跨生长阶段的全覆盖而是聚焦于采摘前72小时内的典型成熟番茄识别场景红果在绿叶背景中半遮半露、果蒂残留、轻微反光、常见枝叶遮挡。621张图全部来自同一产区三个大棚的晨间采集8:00–10:30分辨率统一为1920×1080每张图平均含2.3个目标框标签严格按YOLOv5/v8通用格式class_id x_center y_center width height归一化到[0,1]。这不是玩具数据集是能直接喂进YOLO训练管道、30分钟内跑出第一个可用mAP的最小可行验证集。适合刚搭好环境想验证全流程的新手也适合老手快速做baseline对比或部署前的压力测试——毕竟真正卡住农业AI落地的从来不是模型结构而是第一张图能不能标准、第一轮训练能不能收敛、第一帧推理能不能框住那个该采的番茄。2. 从解压到训练用YOLOv8在本地跑通番茄检测的最小闭环2.1 解压与目录结构校验别让路径问题毁掉前三分钟拿到番茄.zip后不要直接双击解压到桌面。YOLO训练对路径中的空格、中文、特殊字符极度敏感Windows下尤其容易翻车。我习惯用命令行强制规范路径# 创建纯净工作区Linux/macOS mkdir -p ~/yolo_tomato cd ~/yolo_tomato unzip ~/Downloads/番茄.zip -d ./data_raw # Windows PowerShell注意反斜杠转义 mkdir yolo_tomato; cd yolo_tomato Expand-Archive -Path $env:USERPROFILE\Downloads\番茄.zip -DestinationPath .\data_raw解压后必须校验三件事data_raw/下有且仅有images/和labels/两个文件夹images/中所有文件为.jpg或.png无.JPG、.jpeg混用labels/中每个.txt文件名与对应图片名完全一致如IMG_001.jpg↔IMG_001.txt且.txt内每行是5个数字class_id 归一化坐标无空行、无注释、无多余空格。提示用ls data_raw/images | head -n 5和head -n 3 data_raw/labels/IMG_001.txt快速抽检。若发现IMG_001.JPG对应IMG_001.jpg.txt立刻重命名——YOLO读取器不会自动匹配大小写或扩展名变体。2.2 构建YOLOv8兼容的数据配置文件绕过Ultralytics的隐式陷阱YOLOv8官方要求data.yaml必须包含train,val,test三段路径但621张图做严格划分会严重削弱小样本效果。我的做法是用621张全量作为训练集另设20%为验证集不参与训练0%为测试集留作最终上线前盲测。创建data.yaml# data.yaml train: ../data_raw/images # 注意这里是相对路径指向解压后的images文件夹 val: ../data_raw/images # val和train指向同一目录YOLOv8会自动按split比例切分 test: ../data_raw/images nc: 1 # 番茄只有一个类别 names: [tomato] # 类别名必须是字符串列表不能是单个字符串关键细节train/val/test的路径是相对于data.yaml自身位置不是相对于训练脚本位置。把data.yaml放在yolo_tomato/根目录../data_raw/images才能正确找到图片nc: 1和names: [tomato]必须严格匹配——若标签文件里 class_id 是0YOLO标准这里就不能写nc: 0不要加download:字段Ultralytics会试图联网下载导致超时失败。2.3 用ultralytics CLI启动训练参数选择背后的农业场景逻辑YOLOv8默认用yolov8n.ptnano版启动对621张图而言太轻量容易欠拟合。我固定用yolov8s.ptsmall版作为预训练权重# Linux/macOS yolo train datadata.yaml modelyolov8s.pt epochs100 imgsz640 batch16 nametomato_s_640 # WindowsPowerShell yolo train datadata.yaml modelyolov8s.pt epochs100 imgsz640 batch16 nametomato_s_640参数深意epochs100小数据集需足够轮次让模型记住番茄的纹理、高光、边缘特征低于50轮常出现mAP0.5imgsz640原始图1920×1080太大640是平衡精度与显存的甜点RTX3060可跑batch16batch16621张图 ÷ 16 ≈ 39步/轮100轮共3900步足够收敛若显存不足优先降batch而非imgsz降分辨率会丢失番茄表皮细节name生成独立日志目录避免覆盖历史实验。训练过程会自动生成runs/detect/tomato_s_640/里面results.csv记录每轮mAP、precision、recalltrain_batch0.jpg显示首轮数据增强效果——务必打开这张图确认增强后的番茄是否仍保持红-绿对比度遮挡是否模拟了真实枝叶若增强过度导致颜色失真需在训练命令后加--augment参数禁用部分增强。3. 标签格式深度解析为什么621张图的.txt文件必须这样写3.1 YOLO标签的5元组本质不是坐标是几何约束YOLO格式.txt文件每行5个数字class_id x_center y_center width height全部归一化到[0,1]。很多人误以为这是“缩放后的像素坐标”其实它是对图像平面的几何约束描述x_center,y_center目标中心点占整图宽/高的比例width,height目标宽高占整图宽/高的比例class_id整数索引对应data.yaml中names列表的序号番茄是第0个所以必为0。以一张1920×1080的图为例若番茄框左上角(800,300)右下角(1100,650)宽 1100−800 300 →width 300/1920 ≈ 0.15625高 650−300 350 →height 350/1080 ≈ 0.32407中心x 800 300/2 950 →x_center 950/1920 ≈ 0.49479中心y 300 350/2 475 →y_center 475/1080 ≈ 0.43981→ 正确标签行0 0.49479 0.43981 0.15625 0.32407注意YOLO不关心像素精度小数点后5位足够Ultralytics内部只保留5位。用Python计算时务必用round(x, 5)避免浮点误差导致框错位。3.2 用Python脚本批量校验标签合法性3分钟扫清621张图隐患手动检查621个.txt不现实。写一个校验脚本放在yolo_tomato/目录下# check_labels.py import os from pathlib import Path label_dir Path(data_raw/labels) image_dir Path(data_raw/images) for label_path in label_dir.glob(*.txt): # 检查是否有对应图片 img_stem label_path.stem if not any(img_path.stem img_stem for img_path in image_dir.glob(*.*)): print(f⚠️ 缺失图片: {img_stem} (无对应.jpg/.png)) continue # 读取标签行 with open(label_path, r) as f: lines [line.strip() for line in f if line.strip()] for i, line in enumerate(lines): try: parts list(map(float, line.split())) if len(parts) ! 5: print(f❌ 行{i1}格式错误: {label_path.name} - 非5个数字) continue cls_id, xc, yc, w, h parts # 检查归一化范围 if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): print(f❌ 行{i1}越界: {label_path.name} - (xc,yc,w,h)({xc:.3f},{yc:.3f},{w:.3f},{h:.3f})) if cls_id ! 0: # 番茄必须是class 0 print(f❌ 行{i1}类别错误: {label_path.name} - class_id{int(cls_id)} ≠ 0) except ValueError: print(f❌ 行{i1}解析失败: {label_path.name} - {line})运行python check_labels.py输出所有异常行。常见问题某些.txt末尾有空行 → 脚本自动跳过标注工具导出时用了科学计数法如1.23e-02→ YOLO读取器会报错需用文本编辑器全局替换为小数多目标框中某个框w或h为0 → 实际是标注失误需人工修正。3.3 当标签与图像尺寸不匹配时如何安全重算归一化值若发现某批图被错误地以不同分辨率导出比如部分图是1280×720部分是1920×1080而标签仍按原尺寸归一化会导致训练时框偏移。不要重标用脚本批量重算# recalc_labels.py from PIL import Image import os label_dir data_raw/labels image_dir data_raw/images for label_path in os.listdir(label_dir): if not label_path.endswith(.txt): continue img_path os.path.join(image_dir, label_path.replace(.txt, .jpg)) if not os.path.exists(img_path): img_path os.path.join(image_dir, label_path.replace(.txt, .png)) if not os.path.exists(img_path): continue # 获取真实图像尺寸 with Image.open(img_path) as img: orig_w, orig_h img.size # 读取原标签假设按1920×1080归一化 with open(os.path.join(label_dir, label_path), r) as f: lines f.readlines() # 重写为当前图像尺寸归一化 with open(os.path.join(label_dir, label_path), w) as f: for line in lines: if not line.strip(): continue parts line.strip().split() cls_id, xc_old, yc_old, w_old, h_old map(float, parts) # 原归一化基准1920×1080 xc_new xc_old * 1920 / orig_w yc_new yc_old * 1080 / orig_h w_new w_old * 1920 / orig_w h_new h_old * 1080 / orig_h f.write(f{int(cls_id)} {xc_new:.5f} {yc_new:.5f} {w_new:.5f} {h_new:.5f}\n)运行前确认所有图片真实尺寸已知且原标签统一按1920×1080计算。脚本会自动适配每张图的实际宽高保证归一化一致性。4. 训练避坑指南621张图最容易栽的5个坑及血泪解法4.1 现象训练loss曲线震荡剧烈100轮后mAP仍0.3原因YOLOv8默认启用mosaic数据增强对小数据集易造成过拟合——模型记住了马赛克拼接的伪影而非番茄本身。解决在训练命令后加--mosaic 0关闭马赛克改用更温和的--degrees 10 --translate 0.1 --scale 0.5旋转±10°、平移10%、缩放±50%。4.2 现象验证集precision高0.9、recall低0.4大量番茄漏检原因置信度阈值conf默认0.25对小目标番茄过于苛刻同时iou阈值iou默认0.7田间番茄常因枝叶遮挡导致预测框IoU0.7。解决训练后推理时用model.predict(..., conf0.15, iou0.45)或在训练时加--conf 0.15 --iou 0.45强制模型学习低置信度下的判别能力。4.3 现象results.csv中box_loss持续下降但cls_loss停滞模型只框不分类原因621张图中番茄类别单一只有tomatocls_loss天然趋近于0Ultralytics的loss权重分配会让分类分支退化。解决在data.yaml中添加flipud: 0.0和fliplr: 0.5强制水平翻转增强类别区分感或手动在标签中加入极少量“非番茄”负样本如空枝条图但需谨慎——本数据集设计初衷就是单类检测强行加负样本可能破坏场景真实性。4.4 现象训练中途报错CUDA out of memory即使batch1也崩溃原因YOLOv8默认启用amp自动混合精度某些老旧显卡驱动不兼容FP16运算。解决加--amp False关闭混合精度或升级CUDA驱动至11.8并确保PyTorch版本匹配Ultralytics v8.0.200 推荐 torch 2.0.1cu118。4.5 现象训练完成但val_batch0.jpg中预测框全部偏右上角原因标签文件中x_center,y_center被错误计算为左上角坐标而非中心点。解决用3.2节脚本扫描所有.txt定位问题文件手动修正公式x_center (x_min x_max) / 2 / img_widthy_center (y_min y_max) / 2 / img_height。玄学提示用LabelImg打标时务必勾选“Use default label”并确认类别ID为0否则导出时可能错位。5. 部署前的关键验证用三张图测出模型是否真能下田5.1 构造“压力测试三件套”覆盖田间最棘手的三种情况不要用训练集里的图做测试——那只是记忆。我固定用这三张图做上线前终审遮挡图番茄被3片以上绿叶半覆盖仅露出1/3果面背景有强光反射密集图一簇5个番茄紧挨生长最小间距2cm像素级需检验NMS是否误删低质图手机拍摄非专业相机分辨率仅1280×720白平衡偏黄果面有水珠反光。提示这三张图必须从未出现在训练/验证集中。我通常从同产区另拍30张新图人工筛选出最具挑战性的3张单独存入test_images/。5.2 用YOLOv8原生API做端到端推理避开OpenCV加载陷阱很多教程用cv2.imread()加载图但OpenCV默认BGR顺序YOLOv8期望RGB。直接调用Ultralytics API最稳from ultralytics import YOLO model YOLO(runs/detect/tomato_s_640/weights/best.pt) results model(test_images/occluded_tomato.jpg, conf0.2, iou0.4, saveTrue, projecttest_output, nameoccluded_test) # 提取关键指标 result results[0] boxes result.boxes.xyxy.cpu().numpy() # [x1,y1,x2,y2] confidences result.boxes.conf.cpu().numpy() classes result.boxes.cls.cpu().numpy() print(f检测到{len(boxes)}个番茄置信度均值: {confidences.mean():.3f}) # 输出检测到1个番茄置信度均值: 0.821关键参数说明conf0.2降低阈值捕获更多疑似目标iou0.4放宽NMS合并条件避免密集番茄被误删saveTrue自动生成带框图存入test_output/occluded_test/直观验证框是否贴合果实边缘。5.3 定量评估用COCO-style AP0.5计算真实可用率Ultralytics训练日志里的metrics/mAP50是验证集上的需用测试集重算。写一个评估脚本# eval_testset.py from ultralytics.models.yolo.detect import DetectionValidator from ultralytics.utils import DEFAULT_CFG cfg DEFAULT_CFG.copy() cfg.data data.yaml # 复用训练配置 cfg.model runs/detect/tomato_s_640/weights/best.pt cfg.val_data test_images/ # 指向测试图目录 cfg.save_json True validator DetectionValidator(argscfg) validator() # 输出AP0.5, AP0.5:0.95等运行后生成test_output/val_json/results.json用cocoapi解析即可得标准COCO AP。农业场景下AP0.5 ≥ 0.75 即可进入田间试采若0.6优先检查遮挡图的漏检率而非盲目增大数据量。5.4 模型瘦身与加速把best.pt压缩到15MB内供边缘设备部署best.pt默认约35MB对Jetson Nano或树莓派4B太重。用Ultralytics内置导出# 导出ONNX通用性强 yolo export modelruns/detect/tomato_s_640/weights/best.pt formatonnx imgsz640 # 导出TensorRTNVIDIA设备最快 yolo export modelruns/detect/tomato_s_640/weights/best.pt formatengine imgsz640 halfTrue导出的.engine文件约12MB推理速度提升3倍。血泪经验导出前务必用yolo val确认ONNX/TensorRT模型精度损失0.01 mAP否则宁可多花2MB保精度。我坚持用这个621张番茄数据集跑通全流程不是因为它“小”而是它逼我直面农业AI最硬的骨头光照干扰、遮挡鲁棒性、小样本泛化。每次看到模型准确框住那颗带水珠的熟番茄就知道这条路没走歪。希望帮到你。本文还有配套的精品资源点击获取