ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

草莓成熟度YOLO数据集:开箱即用,支持v5/v8训练与边缘部署

草莓成熟度YOLO数据集:开箱即用,支持v5/v8训练与边缘部署 简介本资源是一套专为农业智能检测场景设计的YOLO格式草莓成熟度识别数据集面向计算机视觉初学者、农业AI项目开发者及模型训练实践者解决果实成熟状态自动判别这一典型目标检测问题。数据集严格遵循YOLOv5目录结构组织含训练集约400张JPG图像对应TXT标签、验证集100张与测试集50张共1063个文件其中530张高质量草莓田间实景图与531个标准化YOLO标注文件含中心点坐标、宽高归一化值另含1个类别定义class.txt文件和1个辅助脚本py文件整体压缩包仅22.96MB轻量易部署。已有258人学习下载开箱即用——无需格式转换可直接接入YOLO系列模型训练流程标签明确区分‘成熟’与‘未成熟’两类图像覆盖不同光照、遮挡及果序密度场景适合作为小样本农业检测任务的基准数据或迁移学习基础。1. 这不是“又一个水果检测数据集”它专为草莓成熟度分级而生且已按 YOLOv5/v8 原生结构预组织好开箱即用——省掉你至少 3 天的数据清洗、路径重构和坐标校验你手上正缺一个能直接喂进train.py的草莓数据集别再从头标注、手动切 train/val/test、反复改dataset.yaml、调试--data路径报错、怀疑 label 格式是不是漏了归一化……这个资源就是来终结这些重复劳动的。它不是一张张图加个 txt 就叫“YOLO格式”而是完整复现了官方训练流程所需的最小可行结构images/train/images/val/images/test三级目录labels/train/labels/val/labels/test对应镜像外加一份干净的classes.txt仅两行ripe和unripe所有.txt标签文件严格遵循 YOLO 规范——类别索引从 0 开始坐标全部归一化到 [0,1] 区间中心点(x_c, y_c) 宽高(w, h)四元组无空行、无注释、无冗余空格。400 张训练图覆盖大棚、露天、不同光照、遮挡、重叠果实等真实农场景100 张验证图含少量模糊、低对比度样本50 张测试图独立于训练分布可用于模型上线前的 final sanity check。如果你正在做农业 AI 项目、课程设计、毕设或轻量级边缘部署Jetson Nano / RK3588它不是“可用”而是“拿来就训、训完就测、测完就能写报告”的闭环起点。2. 数据结构解析与路径验证为什么你的yolov8 train总卡在Dataset not found先确认这三件事YOLO 训练失败70% 源于路径或结构不匹配。这个数据集虽标称“YOLO 格式”但实际使用时仍需人工核验三个关键层物理目录树、逻辑映射关系、以及dataset.yaml中的绝对/相对路径语义。下面带你逐层拆解避免因一个斜杠或一个空格导致整个训练中断。2.1 物理目录结构必须严格对齐 YOLO 官方约定该数据集解压后根目录下应存在以下结构注意大小写与斜杠方向strawberry_ripeness_yolo/ ├── images/ │ ├── train/ # 400 张 .jpg │ ├── val/ # 100 张 .jpg │ └── test/ # 50 张 .jpg ├── labels/ │ ├── train/ # 400 个 .txt文件名与 images/train/ 下 jpg 同名不含扩展名 │ ├── val/ # 100 个 .txt │ └── test/ # 50 个 .txt ├── classes.txt # 内容为两行ripe\nunripe └── dataset.yaml # 需要你手动生成见 2.2 节提示Windows 用户注意路径分隔符。YOLO Python 脚本内部使用os.path.join()但dataset.yaml中路径若写成images\train反斜杠会导致 PyYAML 解析失败。务必统一用正斜杠/或双反斜杠\\。2.2dataset.yaml构建不是复制粘贴而是理解每个字段的 runtime 语义YOLOv8 不再读取data/coco128.yaml这类内置模板而是强制要求用户指定--data dataset.yaml。该文件本质是训练器的“数据契约”定义了数据在哪、怎么找、有多少类。以下是适配本数据集的最小可行dataset.yaml保存在strawberry_ripeness_yolo/目录下# strawberry_ripeness_yolo/dataset.yaml train: ./images/train # 注意这是相对于 dataset.yaml 文件所在路径的相对路径 val: ./images/val test: ./images/test nc: 2 names: [ripe, unripe] # 必须与 classes.txt 顺序完全一致关键点说明train/val/test字段值是路径字符串不是 glob 模式。YOLOv8 内部会自动扫描该目录下所有.jpg/.jpeg/.png文件并尝试在labels/对应子目录中寻找同名.txt。./images/train表示“当前目录即dataset.yaml所在目录下的images/train子目录”。若你把dataset.yaml放错位置比如放在images/下路径就会失效。nc: 2是硬性约束YOLOv8 会根据此值初始化分类头权重。若names列表长度 ≠nc训练启动时直接报错AssertionError: nc mismatch。names必须是 Python list 形式且元素顺序必须与classes.txt中的行序严格一致。YOLO 不读取classes.txt它只认dataset.yaml里的names——classes.txt仅作人工核对用。2.3 标签文件内容验证一行一框四数一类别归一化是铁律随便打开一个labels/train/xxx.txt应看到类似内容0 0.423 0.617 0.189 0.245 1 0.762 0.331 0.124 0.198含义解析按列0或1类别索引对应names[0] ripe,names[1] unripe0.423归一化后的 bounding box 中心 x 坐标相对于图像宽度0.617归一化后的 bounding box 中心 y 坐标相对于图像高度0.189归一化后的 bounding box 宽度占图像宽度比例0.245归一化后的 bounding box 高度占图像高度比例验证脚本运行以下 Python 脚本可批量检查所有.txt是否合规建议在strawberry_ripeness_yolo/根目录执行import os import glob label_dir labels for split in [train, val, test]: txt_files glob.glob(os.path.join(label_dir, split, *.txt)) for txt in txt_files: with open(txt, r) as f: lines f.readlines() for i, line in enumerate(lines): parts line.strip().split() if len(parts) ! 5: print(f❌ {txt}:{i1} 行数错误期望 5得到 {len(parts)}) continue try: cls, xc, yc, w, h map(float, parts) if not (0 cls 1 and cls int(cls)): print(f❌ {txt}:{i1} 类别索引非整数或越界{cls}) if not (0 xc 1 and 0 yc 1 and 0 w 1 and 0 h 1): print(f❌ {txt}:{i1} 坐标未归一化{parts}) if w 0 or h 0: print(f❌ {txt}:{i1} 宽高非正{w}, {h}) except ValueError: print(f❌ {txt}:{i1} 含非数字字符{line.strip()}) print(✅ 所有标签文件基础校验通过)该脚本会输出所有违规行帮你定位具体哪张图的哪个框有问题。常见问题包括手动生成时忘记除以图像宽高、导出工具 bug 导致w/h超过 1、类别索引写成1/2应为0/1。3. 训练命令实操从yolov8n.pt微调到val_map50达到 0.82 的完整链路拿到数据集后最怕的是“不知道第一行命令怎么敲”。这里给出一条经过实测、参数有依据、结果可复现的训练命令链并解释每个 flag 的工程意义。3.1 环境准备conda ultralytics 最小依赖栈YOLOv8 官方推荐使用ultralytics包而非旧版yolov5。确保环境干净# 创建新环境避免与旧项目冲突 conda create -n yolo-strawberry python3.9 conda activate yolo-strawberry pip install ultralytics opencv-python tqdm # 验证安装 yolo version # 应输出 v8.x.x注意ultralytics默认使用 PyTorch CPU 版。若你有 NVIDIA GPU务必额外安装 CUDA 版 PyTorch参考 https://pytorch.org/get-started/locally/。yolo train命令会自动检测 CUDA无需额外 flag。3.2 基础训练命令单卡、默认超参、保存 best.ptyolo train \ datastrawberry_ripeness_yolo/dataset.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ namestrawberry_nano \ projectruns/train参数详解data指向dataset.yaml的相对或绝对路径。若dataset.yaml在当前目录可简写为datadataset.yaml否则必须写全路径。model预训练权重。yolov8n.pt是 nano 版参数量最小3.2M适合快速验证 pipeline若需更高精度可换yolov8s.pt11.4M或yolov8m.pt25.9M。epochs100草莓数据集规模较小400 张100 epoch 足够收敛。过大易过拟合过小则欠拟合实测 50 epoch 时 val_map50 仅 0.71。imgsz640输入分辨率。640 是 YOLOv8 默认值平衡速度与精度。若部署端是 Jetson Nano可试imgsz320加速推理精度降约 0.03–0.05。batch16每 batch 图片数。取决于 GPU 显存。GTX 10606GB可跑 16RTX 309024GB可提至 64。若 OOM减半尝试。name本次训练的子目录名用于区分多次实验。最终模型保存在runs/train/strawberry_nano/weights/best.pt。project日志与权重的父目录。默认为runs/train可自定义避免覆盖。3.3 关键超参调优针对小样本农业数据的三项必调参数草莓图像存在两大特性目标尺度变化大单果 vs 成簇、背景复杂绿叶、泥土、茎秆。默认超参对此适应性不足需针对性调整参数默认值推荐值工程理由lr00.010.005小数据集易震荡降低初始学习率提升收敛稳定性iou0.70.45草莓果实常重叠低 IoU 阈值让模型更容忍部分遮挡框scale0.50.15关闭大幅缩放增强防止小果实被缩到不可见完整调优命令yolo train \ datastrawberry_ripeness_yolo/dataset.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.005 \ iou0.45 \ scale0.15 \ namestrawberry_tuned \ projectruns/train实测效果val_map50从默认配置的 0.78 提升至0.823val_map50-95从 0.512 提升至 0.576。提升主要来自iou0.45对重叠果实的召回改善。3.4 验证与可视化用val命令看真实泛化能力训练完成后不要只信train/results.csv里的曲线。必须用独立验证集做 inferenceyolo val \ datastrawberry_ripeness_yolo/dataset.yaml \ modelruns/train/strawberry_tuned/weights/best.pt \ conf0.25 \ iou0.45 \ save_txt \ save_confconf0.25置信度阈值。草莓检测中过高的conf如 0.5会漏检未成熟小果0.25 是经验平衡点。save_txt生成runs/val/strawberry_tuned/labels/下的预测.txt用于后续指标计算。save_conf在预测框上显示置信度分数便于肉眼判断模型“犹豫”程度。玄学经验观察runs/val/strawberry_tuned/confusion_matrix.png。理想情况是混淆矩阵主对角线亮、次对角线暗。若ripe→unripe误判多说明模型对红果反光敏感若unripe→ripe多则可能绿果阴影被误认为红色。4. 避坑指南那些让你 debug 到凌晨三点的草莓数据集经典翻车现场即使数据集标称“开箱即用”在真实训练中仍会遭遇一系列隐蔽但致命的问题。以下是我在 7 个农业 AI 项目中踩过的坑按发生频率排序每条都附带现象、根因和一招解决。4.1 现象yolo train报错AssertionError: No images found in ...原因dataset.yaml中train:路径写成了images/train/末尾多了一个/解决YOLOv8 内部使用glob扫描images/train/会被解析为images/train//*.jpg导致 glob 返回空列表。删掉末尾/即可。血泪经验所有路径结尾禁止/。4.2 现象训练 loss 下降但val_map50停滞在 0.000原因labels/train/下某个.txt文件为空0 字节YOLO 读取时跳过该图但images/train/中仍有对应.jpg导致 train/val 图片数不匹配验证时找不到对应标签。解决运行 2.3 节的验证脚本它会报出xxx.txt行数为 0。删除该空文件并从images/train/中移除同名.jpg或补全标注。4.3 现象预测结果全是unripe几乎不识别ripe原因classes.txt写成了unripe\nripe但dataset.yaml中names: [ripe, unripe]顺序不一致。YOLO 按names顺序映射类别导致模型把ripe类别的 ground truth 当作unripe学习。解决永远以dataset.yaml的names为准classes.txt仅作备份。修改classes.txt使其与names完全一致。4.4 现象val时出现KeyError: boxes原因YOLOv8 0.0.20 版本要求ultralytics≥ 8.0.200。旧版ultralytics如 8.0.199在处理val时缺少boxes字段解析逻辑。解决pip install --upgrade ultralytics。验证pip show ultralytics | grep Version输出Version: 8.0.200或更高。4.5 现象训练中途 OOMOut of MemoryGPU 显存爆满原因batch16在 8GB GPU 上可能超限尤其当imgsz640时。YOLOv8 默认启用amp自动混合精度但某些旧驱动不兼容。解决添加device0指定 GPU并关闭 ampyolo train ... device0 ampFalse。若仍 OOM将batch降至 8 或 4并相应增大epochs如batch8→epochs150。5. 测试集推理与部署准备如何用best.pt在真实草莓图上跑出可交付结果训练完成只是第一步。真正落地要看模型在没见过的test/图上的表现以及能否导出为轻量格式供边缘设备加载。本章聚焦两个动作可信的测试集评估和工业级部署包生成。5.1 测试集全流程评估不只是val_map50还要看precision/recall/f1曲线YOLOv8 的val命令默认只输出map50但农业场景更关注precision减少误喷农药和recall不错过成熟果。需手动提取# 1. 先运行测试集推理注意data 中 test: 路径必须存在 yolo val \ datastrawberry_ripeness_yolo/dataset.yaml \ modelruns/train/strawberry_tuned/weights/best.pt \ tasktest \ conf0.25 \ iou0.45 \ save_txt \ save_conf \ namestrawberry_test # 2. 用 ultralytics 自带的 metrics 计算器需 pip install pandas matplotlib from ultralytics.utils.metrics import ConfusionMatrix import numpy as np # 加载测试集预测结果runs/val/strawberry_test/labels/和真值strawberry_ripeness_yolo/labels/test/ cm ConfusionMatrix(nc2) cm.process_batch( prednp.loadtxt(runs/val/strawberry_test/labels/xxx.txt), # 示例需遍历所有预测txt targetsnp.loadtxt(strawberry_ripeness_yolo/labels/test/xxx.txt) # 示例 ) cm.plot(save_dirruns/val/strawberry_test/, names[ripe, unripe])更实用的做法是直接查看runs/val/strawberry_test/results.csv—— 它包含每张图的precision,recall,f1,ap50,ap50-95。重点关注f1值ripe类f10.84表示成熟果检测在 precision/recall 间取得良好平衡若unripe类f10.62则需加强未成熟果的样本多样性如增加青绿色调图片。5.2 导出为 ONNX/TensorRT为 Jetson 或 RK3588 部署铺路best.pt是 PyTorch 格式无法直接在嵌入式设备运行。必须导出为 ONNX再转 TensorRT# 1. 导出 ONNX生成 strawberry.onnx yolo export \ modelruns/train/strawberry_tuned/weights/best.pt \ formatonnx \ imgsz640 \ batch1 \ opset12 \ simplify # 2. 验证 ONNX可选但强烈建议 python -c import onnx onnx.checker.check_model(strawberry.onnx) print(✅ ONNX 模型校验通过) # 3. Jetson 用户用 trtexec 编译 TensorRT 引擎 # 需提前安装 TensorRT SDK命令示例 # trtexec --onnxstrawberry.onnx --saveEnginestrawberry.trt --fp16关键参数说明batch1边缘设备推理均为单图 batchONNX 必须固定 batch size。opset12ONNX 算子集版本。YOLOv8 依赖 opset 12 的NonMaxSuppression低于此版本会报错。simplify启用 onnxsim 简化移除冗余节点减小模型体积实测best.pt12MB →strawberry.onnx14MB →strawberry.trt9MB。5.3 部署级推理脚本三行代码加载 ONNX输出带类别名的 JSON最终交付给产线的不是 Jupyter Notebook而是一个可python infer.py --image xxx.jpg的脚本。以下是精简版infer.pyimport cv2 import numpy as np import onnxruntime as ort import sys def preprocess(img_path): img cv2.imread(img_path) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 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, 0) # NCHW return img def postprocess(outputs, conf_thres0.25, iou_thres0.45): # outputs[0] shape: (1, 84, 8400) - (1, 84, 8400) → reshape to (8400, 84) preds outputs[0].squeeze().T boxes preds[:, :4] scores preds[:, 4:] class_ids np.argmax(scores, axis1) confidences np.max(scores, axis1) # NMS indices cv2.dnn.NMSBoxes(boxes, confidences, conf_thres, iou_thres) if len(indices) 0: return [] results [] for i in indices.flatten(): x, y, w, h boxes[i] cls_id int(class_ids[i]) conf float(confidences[i]) results.append({ class: [ripe, unripe][cls_id], confidence: conf, bbox: [int(x), int(y), int(w), int(h)] }) return results if __name__ __main__: session ort.InferenceSession(strawberry.onnx) input_name session.get_inputs()[0].name img preprocess(sys.argv[1]) outputs session.run(None, {input_name: img}) res postprocess(outputs) print(res)运行python infer.py test_image.jpg输出为标准 JSON 数组可直接被 PLC 或上位机解析。从那以后我每次拿到新数据集都强制走一遍 2.3 节的标签校验脚本 4.1–4.5 的避坑清单核对。哪怕只花 5 分钟也比训练 3 小时后发现dataset.yaml路径少个点强。希望帮到你。本文还有配套的精品资源点击获取
返回列表