☰
621张实拍番茄图像+双格式标签YOLO数据集
2026/9/24 18:38:16 网站建设 项目流程

简介:本资源是面向计算机视觉初学者与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到YOLO11

data.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标签中<class>=0严格对应

关键点解析:

  • 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个元素对应标签中<class>=i。本数据集所有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训练:

# 使用YOLOv8n(nano)模型,适合快速验证;生产环境建议v8s或v8m yolo detect train \ data=/path/to/tomato_yolo_dataset/data.yaml \ model=yolov8n.pt \ epochs=100 \ batch=16 \ imgsz=640 \ name=tomato_v8n_640 \ patience=10 \ device=0 # GPU ID,多卡用0,1;CPU用cpu

参数详解与农业场景适配逻辑:

  • batch=16:621张图较小,16是平衡显存与梯度稳定性的经验值。若显存不足(如RTX3060 12G),可降至8;若A100 40G,可提至32。
  • imgsz=640:番茄果实尺寸中等,640足够捕获细节。若田间图像分辨率高(>2000px宽),可试imgsz=1280,但需同步调小batch。
  • patience=10:早停机制,防止过拟合。农业数据易出现“验证集mAP震荡”,设10轮不升即停比固定epochs更鲁棒。
  • name=tomato_v8n_640:输出目录名,便于区分不同实验。训练日志、权重、混淆矩阵将保存在runs/detect/tomato_v8n_640/下。

血泪经验:第一次训番茄,别贪大模型!YOLOv8n在621张图上100epoch通常能到mAP@0.5=0.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图中框为w=384, h=576(比例0.2, 0.533),在3840×2160图中同样比例框为w=768, h=1152——模型看到的是相同数字,而非不同像素值。

3.2 VOC格式标签(.xml)结构与LabelImg兼容性验证

VOC标签以XML存储,关键字段示例:

<annotation> <folder>train</folder> <filename>img_0609_46.jpg</filename> <size> <width>1920</width> <height>1080</height> <depth>3</depth> </size> <object> <name>tomato</name> <bndbox> <xmin>650</xmin> <!-- 像素坐标 --> <ymin>480</ymin> <xmax>1020</xmax> <ymax>790</ymax> </bndbox> </object> </annotation>

YOLO与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(f"VOC→YOLO: {yolo_x:.6f}, {yolo_y:.6f}, {yolo_w:.6f}, {yolo_h:.6f}") print(f"TXT文件: {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用户用PowerShell:Get-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'](nc=1但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)
现象4:LabelImg打开VOC标签显示“无对象”,但XML文件有<object>
  • 原因:LabelImg默认只读取<name>为'tomato'的标签,但XML中<name>写成了'Tomato'(大小写敏感)或'tomato '(尾部空格)。
  • 解决:用正则批量修正:
    sed -i 's/<name>Tomato<\/name>/<name>tomato<\/name>/g' tomato_yolo_dataset/labels_voc/**/*.xml sed -i 's/<name>tomato <\/name>/<name>tomato<\/name>/g' tomato_yolo_dataset/labels_voc/**/*.xml

4. 数据增强策略定制:针对番茄图像特性的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 \ model=yolov8n.pt \ epochs=100 \ batch=16 \ imgsz=640 \ name=tomato_v8n_aug \ augment=tomato_aug.yaml \ # 关键:指定自定义增强 device=0

实测对比:在621张图上,关闭Mosaic+启用上述增强,val mAP@0.5从0.682提升至0.731,且测试集误检率(False Positive Rate)下降37%。关键不是“加更多增强”,而是删掉破坏领域先验的增强——这是农业视觉落地的底层逻辑。


5. 模型推理与置信度调优:从检测结果到田间可用的阈值工程

5.1 标准推理命令与输出解析

训练完成后,用最佳权重做推理:

yolo detect predict \ model=runs/detect/tomato_v8n_640/weights/best.pt \ source=tomato_yolo_dataset/images/test/ \ conf=0.25 \ iou=0.45 \ save=True \ project=results_tomato \ name=predict_test

关键参数说明:

  • conf=0.25:置信度阈值,低于此值的预测框被过滤。农业场景常设较低值(0.1~0.3)以召回小果、遮挡果。
  • iou=0.45:NMS(非极大值抑制)IoU阈值,控制框合并强度。番茄簇生多,iou=0.45比默认0.7更宽松,减少漏检。

输出目录results_tomato/predict_test/包含:

  • labels/:预测结果的YOLO格式txt(class x y w h conf);
  • *.jpg:带框的可视化图;
  • results.csv:汇总统计(mAP、F1等)。

5.2 置信度-召回率权衡:绘制PR曲线确定最优conf

单纯设conf=0.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(model='runs/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 \ model=runs/detect/tomato_v8n_640/weights/best.pt \ data=/path/to/tomato_yolo_dataset/data.yaml \ conf=$conf \ plots=True \ name=val_conf_${conf} done

结果保存在runs/detect/val_conf_X.XX/,查看results.csv中的metrics/mAP50-95(B)和metrics/recall(B)列。典型番茄场景PR曲线拐点在conf=0.22(recall=0.89, mAP=0.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_px=40, max_px=100): """ 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(source='field_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端conf=0.25效果好,Jetson Nano上却漏检严重
  • 原因:量化(INT8)后置信度分布偏移,原始0.25阈值在量化模型中实际等效于0.35。
  • 解决:在目标硬件上重新扫参。Jetson Nano上通常需将conf降至0.15~0.18。
现象:测试集mAP高,但田间视频首帧检测正常,后续帧持续漏检
  • 原因:YOLO默认使用stream=True时,内部缓存历史帧做MOT(多目标跟踪),但番茄无ID,缓存导致旧框残留干扰新检测。
  • 解决:强制关闭跟踪,每帧独立检测:
    results = model.track(source='video.mp4', persist=False, tracker=None) # persist=False是关键 # 或直接不用track,用predict results = model.predict(source='video.mp4', stream=True)
现象:save=True生成的图框颜色混乱,无法区分番茄成熟度
  • 原因: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)): # conf>0.8为红果(高置信),else青果 color = (0, 255, 0) if conf > 0.8 else (0, 128, 0) # 绿色系 annotator.box_label(box, f'tomato {conf:.2f}', color=color) return annotator.result()

6. 从数据集到产线闭环:一个番茄检测项目的完整交付 checklist

6.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 found
YOLO标签数值合法性运行3.4节坐标校验脚本,误差<1e-5坐标越界引发loss nan
data.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.py:5行代码调用示例(含cv2.imread→model.predict→cv2.imshow);
  • requirements.txt:精确版本(ultralytics==8.2.0,torch==2.1.0+cu118);
  • deploy_notes.md:硬件要求(如Jetson Orin需TensorRT 8.6)、内存占用、FPS实测值。

关键细节:inference_example.py中必须硬编码conf=0.22(经PR曲线确定的最优值),而非让用户自己调——产线不需要调参自由,需要开箱即用的确定性。

6.3 田间验证的黄金三指标

模型不能只看mAP,必须用田间真实指标验证:

  • 单株识别率:随机选10株番茄,人工计数果实数,模型检测数/人工数 ≥ 0.92;
  • 误检率(每百平方米):在无番茄区域(如空地、道路)连续采集10分钟视频,误检框数 ≤ 3个;
  • 响应延迟:从图像输入到结果输出,端到端延迟 ≤ 120ms(满足10fps实时性)。

从那以后我每次交付番茄检测模型,都带着笔记本电脑去客户大棚现场测。架好相机拍一段视频,跑inference_example.py,用秒表掐时间,拿纸笔记误检——不是为了炫技,而是让客户亲眼看到“这个框,就是你要的番茄”。希望帮到你。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询