YOLO草莓成熟度检测数据集构建与训练实战
发布时间:2026/9/12 22:07:28来源:尧图网络
简介本资源是一套专为计算机视觉初学者与农业AI应用开发者设计的YOLO格式草莓成熟度检测数据集聚焦果实分级识别这一典型农业场景可直接用于YOLOv5/v8等主流目标检测模型的训练与验证。数据集共1063个文件包含530张高质量草莓实拍JPG图像、531个对应YOLO格式TXT标签含归一化中心坐标与宽高、1个class.txt类别定义文件明确区分“成熟”“未成熟”两类、1个辅助Python脚本及1张示例可视化PNG图整体压缩包仅22.96MB轻量易部署。已有258人学习下载资源结构严格遵循YOLOv5标准目录规范训练集400张、验证集100张、测试集50张标注一致性高图像涵盖不同光照、遮挡与生长阶段的草莓植株具备较强泛化基础。用户可开箱即用快速完成数据加载、模型微调与效果评估全流程。1. 草莓成熟度检测不是“拍个照打个标”就能跑通的 YOLO 任务在农业智能化落地场景中草莓采摘机器人、分拣流水线、温室巡检系统都依赖一个关键能力在复杂光照、重叠果簇、绿叶遮挡下准确区分青绿、转色、全红三类成熟度状态。但直接把手机拍的草莓图扔进 YOLOv8 训练90% 的失败不是因为模型不行而是数据集结构不满足 YOLO 系列对「空间一致性」和「标签语义对齐」的硬性要求——训练集里一张图对应一个.txt标签文件每个目标框必须用归一化坐标x_center, y_center, width, height class_id 表达验证集不能只是训练集的随机切片而要覆盖不同大棚、不同采收时段、不同品种如红颜、章姬的分布偏移class 文件必须严格按0: unripe,1: turning,2: ripe顺序定义且所有图像路径、标签路径、类别索引三者在训练脚本中必须零偏差映射。本文不讲抽象原理只拆解从拿到这个「YOLO 数据集草莓成熟度检测」压缩包开始到本地启动训练、验证 mAP、导出 ONNX 模型部署的完整链路每一步都给出可粘贴执行的命令、必调参数说明、以及新手最容易卡住的三个校验点。2. 解压后第一件事验证 YOLO 格式合规性与目录结构完整性YOLO 训练流程对数据集结构极其敏感任何路径错位或格式偏差都会导致ValueError: No labels found或AssertionError: image not found。拿到数据集压缩包后不能直接运行yolo train必须先完成三项强制校验。2.1 检查标准 YOLO 目录树是否符合 Ultralytics 官方规范Ultralytics v8.2 要求数据集必须为以下结构注意大小写与斜杠方向strawberry_maturity/ ├── train/ │ ├── images/ # 所有训练图像.jpg/.png │ └── labels/ # 对应 .txt 标签文件文件名与图像一致 ├── val/ │ ├── images/ │ └── labels/ ├── test/ # 可选若提供则需同结构 └── strawberry.yaml # 数据集配置文件含 train/val 路径、nc、names提示若原始压缩包中train目录下混有images和labels子目录说明已按标准组织若所有图片和标签平铺在同一级则需手动创建images/和labels/子目录并迁移。使用find . -name *.jpg | head -5快速确认图像位置。2.2 验证每个.txt标签文件是否符合 YOLO 坐标格式YOLO 标签文件必须满足每行一个目标格式为class_id x_center y_center width height所有值为 0~1 的浮点数归一化到图像宽高。执行以下命令批量检查# 进入 labels/ 目录后执行 for f in *.txt; do awk { if (NF ! 5) print ERROR: FILENAME line NR has NF fields, expected 5; if ($1 0 || $1 2) print ERROR: FILENAME line NR class_id $1 out of range [0,2]; if ($2 0 || $2 1 || $3 0 || $3 1 || $4 0 || $4 1 || $5 0 || $5 1) print ERROR: FILENAME line NR coordinate out of [0,1] range; } $f done2.2.1 常见错误及修复方法错误类型1class_id为1,2,3→ 实际应为0,1,2YOLO 索引从 0 开始修复命令sed -i s/^1 /0 /; s/^2 /1 /; s/^3 /2 / *.txt错误类型2坐标未归一化如x240 y180 w120 h90→ 需除以图像原始宽高修复逻辑先用identify -format %w %h\n image.jpg获取尺寸再用 Python 脚本批量转换见下文2.3 校验strawberry.yaml配置文件的四个核心字段该文件是训练入口的“地图”缺一不可。典型内容如下train: ../train/images val: ../val/images test: ../test/images # 若无测试集可删除此行 nc: 3 names: [unripe, turning, ripe]注意train和val路径必须是相对于strawberry.yaml文件所在目录的相对路径且必须指向images/目录不是labels/Ultralytics 自动拼接labels/。ncnumber of classes必须等于names列表长度且与标签中class_id最大值一致0~2 → nc3。2.3.1 快速生成缺失的 yaml 文件若压缩包未提供strawberry.yaml用以下命令一键生成假设数据集根目录名为strawberry_maturitycat strawberry.yaml EOF train: ./train/images val: ./val/images nc: 3 names: [unripe, turning, ripe] EOF3. 用 YOLOv8n 启动最小可行训练参数选择与日志解读验证完数据集结构后即可启动训练。不建议直接用yolov8m或yolov8x小模型yolov8n能在 1 小时内完成首轮验证快速暴露数据或环境问题。3.1 安装与环境准备仅需 pip install ultralytics避免 conda 环境冲突推荐新建虚拟环境python -m venv yolo_env source yolo_env/bin/activate # Linux/macOS # yolo_env\Scripts\activate # Windows pip install --upgrade pip pip install ultralytics8.2.47 # 固定版本避免 API 变更提示Ultralytics 8.2.x 是当前最稳定的生产版本8.3.x 引入了model.export()新参数但部分自定义数据集存在兼容问题。ultralytics包自动处理 CUDA、OpenCV 依赖无需手动安装 torch。3.2 执行训练命令并理解每个参数的实际作用yolo detect train \ datastrawberry.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namestrawberry_v8n \ projectruns/detect \ workers4 \ device0 \ patience10 \ save_period103.2.1 关键参数逐项说明参数必填说明草莓场景建议值data✓指向strawberry.yaml的路径必须是相对或绝对路径不能是 URLstrawberry.yamlmodel✓预训练权重路径.pt文件。yolov8n.pt体积小、推理快适合初期验证yolov8n.pt自动下载epochs✓训练轮数。草莓数据集若含 2000 张图100 轮足够收敛100imgsz✓输入图像尺寸。640 是平衡精度与速度的默认值若图像普遍较小400px可设320640batch✓每批图像数。受 GPU 显存限制RTX 3090 可设32GTX 1660 设816name✗输出子目录名用于区分多次实验strawberry_v8nproject✗日志和权重保存根目录runs/detect默认workers✗数据加载进程数。设为 CPU 核心数-1避免 IO 瓶颈4device✗指定 GPU ID0为第一块卡多卡用0,10patience✗早停轮数。当验证 mAP50 连续patience轮未提升则停止10save_period✗每 N 轮保存一次权重便于回溯最佳模型103.2.2 训练日志中必须关注的三类指标BoxLoss/ClsLoss/DflLoss分别代表边界框回归损失、分类损失、分布焦点损失。训练初期BoxLoss应快速下降1.0若长期 2.0 说明标注质量差或图像分辨率过低。metrics/precision(B)/metrics/recall(B)精确率与召回率。草莓场景因果实密集召回率易偏低0.7此时需检查val/labels/中是否漏标小目标。metrics/mAP50-95(B)核心指标。mAP50 达 0.75 为可用mAP50-950.5~0.95 IoU 区间平均达 0.55 为优秀。若 50 轮后 mAP50 0.4立即暂停检查数据集。4. 验证模型效果用验证集图像做推理并可视化检测框训练完成后runs/detect/strawberry_v8n/weights/best.pt即为最优权重。下一步是验证其在真实场景中的泛化能力而非仅看日志数字。4.1 在验证集上运行推理并保存带框图像yolo detect predict \ modelruns/detect/strawberry_v8n/weights/best.pt \ source./val/images \ conf0.25 \ iou0.45 \ saveTrue \ save_txtTrue \ projectruns/predict \ namestrawberry_val_pred4.1.1 参数含义与草莓场景调优逻辑conf0.25置信度阈值。草莓成熟度判别需高召回故设较低值默认 0.25若误检过多如把叶子当果实可提至0.4。iou0.45NMS非极大值抑制IoU 阈值。果实常重叠设0.45可保留更多相邻框若框合并过度可降至0.3。save_txtTrue生成pred/labels/下的.txt预测结果格式与训练标签一致可用于后续评估。4.2 手动检查预测结果三个必须人工核验的图像类型进入runs/predict/strawberry_val_pred/目录打开predict/子目录下的图像重点查看图像类型检查要点处理方式单果清晰图框是否精准包裹果实中心class_id 是否正确青果标0红果标2若框偏移说明标注时x_center/y_center计算错误需修正labels/重叠果簇图是否出现同一果实被多个框重复检测或相邻果实被合并为一个大框调整iou参数或启用agnostic_nmsTrue忽略类别做 NMS低光照/阴影图是否大量漏检尤其转色期果实颜色与叶片接近需增强训练集用albumentations添加RandomBrightnessContrast变换4.3 计算验证集 mAP 并与训练日志对比Ultralytics 默认在训练结束时计算验证集 mAP但手动验证可排除缓存干扰yolo detect val \ modelruns/detect/strawberry_v8n/weights/best.pt \ datastrawberry.yaml \ plotsTrue \ taskval注意plotsTrue会生成confusion_matrix.png混淆矩阵和PR_curve.png精确率-召回率曲线。重点关注confusion_matrix.png中unripe→turning的误判率——若 15%说明转色期果实特征学习不足需在训练时增加hsv_h0.015色调扰动增强。5. 部署前的关键优化调整损失函数权重与导出轻量化模型训练得到的best.pt适合继续微调但部署到边缘设备如 Jetson Nano 或树莓派需进一步优化。本节聚焦两个实操动作一是通过修改损失权重提升成熟度分类精度二是导出 ONNX 格式适配推理引擎。5.1 修改detect/train.py中的损失权重以强化分类任务YOLOv8 默认loss_box7.5,loss_cls0.5,loss_dfl1.5但草莓成熟度检测中分类错误代价远高于定位误差把青果当红果分拣会导致经济损失。需提高loss_cls权重# 在 ultralytics/engine/trainer.py 的 __init__ 方法中找到 self.loss_names [box_loss, cls_loss, dfl_loss] self.loss_weights {box: 7.5, cls: 0.5, dfl: 1.5} # ← 修改此处 # 改为 self.loss_weights {box: 5.0, cls: 2.0, dfl: 1.5}提示此修改需重新安装 ultralyticspip install -e .或使用--cfg参数指定自定义配置文件。更安全的做法是继承DetectionTrainer类重写get_model方法但对初学者直接改源码更快。5.2 导出 ONNX 模型并验证输入输出一致性yolo export \ modelruns/detect/strawberry_v8n/weights/best.pt \ formatonnx \ imgsz640 \ batch1 \ opset12 \ simplifyTrue \ dynamicTrue5.2.1 导出参数详解formatonnx目标格式支持 TensorRT、ONNX Runtime 等引擎。imgsz640必须与训练imgsz一致否则推理尺寸错位。batch1ONNX 默认固定 batch设1适配单图推理。opset12ONNX 算子集版本兼容性最好TensorRT 8.5 支持。simplifyTrue启用 onnx-simplifier移除冗余节点减小模型体积约 30%。dynamicTrue使batch和height/width维度动态便于不同尺寸输入。5.2.2 用 Python 加载 ONNX 并测试推理import cv2 import numpy as np import onnxruntime as ort # 加载模型 session ort.InferenceSession(runs/detect/strawberry_v8n/weights/best.onnx) input_name session.get_inputs()[0].name # 读取验证集一张图 img cv2.imread(./val/images/IMG_001.jpg) img cv2.resize(img, (640, 640)) img img.astype(np.float32) / 255.0 img np.transpose(img, (2, 0, 1)) # HWC → CHW img np.expand_dims(img, axis0) # 添加 batch 维度 # 推理 outputs session.run(None, {input_name: img}) print(Output shape:, outputs[0].shape) # 应为 (1, 84, 8400)84431*77YOLOv8 输出结构注意ONNX 输出为(1, 84, 8400)其中8400是 anchors 数量84是xywh class_probs dfl总维度。实际解析需调用ultralytics/utils/ops.py中的non_max_suppression函数或使用onnxruntimenumpy手动实现 NMS。5.3 针对草莓场景的三个部署级技巧图像预处理加速在嵌入式端cv2.resize比torch.nn.functional.interpolate快 3 倍。将 resize 步骤移至 CPUGPU 仅做推理。类别后处理逻辑成熟度判断需结合cls_id与conf。例如conf 0.6 and cls_id 2才判定为“可采摘红果”避免低置信度误判。标签映射固化导出 ONNX 时names信息不嵌入模型。需在部署代码中硬编码CLASS_MAP {0: unripe, 1: turning, 2: ripe}确保与训练时一致。本文还有配套的精品资源点击获取
网站建设高端定制企业官网