十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

YOLOv5橘子成熟度检测数据集:从标注到训练落地全解析

YOLOv5橘子成熟度检测数据集:从标注到训练落地全解析 简介面向YOLOv5训练直接可用的橘子成熟度目标检测数据集适用于柑橘识别、成熟度分级和农业采摘机器人开发等场景能有效免除数据收集、格式转换和标注整理的低效工作。压缩包共177个文件以171张jpg图像为主配合YOLO格式txt标签、可视化脚本show.py及项目辅助文件整体仅13.29MB目录结构采用标准images/labels划分直接拷贝即可接入YOLOv5训练流程。资源已有38人学习下载。图片统一为640×640 RGB格式标注类别明确区分‘成熟’与‘未成熟’边界框清晰完整附带show.py可视化脚本无需修改参数即可随机加载图片并叠加显示标注框运行结果自动保存到当前目录方便快速核验数据质量。对于正在准备目标检测数据集或需要迁移训练YOLOv5模型的开发者这是一个开箱即用的轻量选择。 做农业方向的视觉检测项目最难的不是模型选型而是数据本身。我最近整理了一个橘子成熟度检测的数据集专门按 YOLOv5 的格式做好了标注和划分包含 ripe/unripe 两类标签自带 train/val 划分和一个可视化校验脚本。这篇文章就把这个数据集从结构设计到训练落地的完整思路拆开讲讲给正准备做果蔬成熟度识别、或者想用 YOLOv5 跑自己数据集的朋友一份可以直接参考的实操笔记。1. 项目概述为什么需要一个 YOLOv5-ready 的橘子成熟度数据集1.1 核心需求解析果园产量预估、采摘机器人视觉定位、分选线成熟度分级这三个场景都要先解决同一个问题让模型从画面里准确认出哪些橘子熟了、哪些还没熟。成熟度检测和通用目标检测有个明显区别——它的类别差异往往是渐变的青果和熟果在颜色、纹理上的边界并不总是那么清晰有时候一个果子上同时有绿色和橙色区域标注的人自己都会犹豫。做这个数据集时我把问题刻意简化成了 2 类ripe 和 unripe。这么做不是偷懒而是从落地角度考虑。第一二分类任务标注一致性更容易保证多人协作标注时分歧会小很多第二初期模型的 baseline 更容易跑通先验证检测管线可行再往后扩展成 4 类比如半熟、过熟也来得及。很多项目一上来就标七八个类别结果类别之间特征重叠严重模型怎么调都学不好最后还得回头简化得不偿失。1.2 为什么选 YOLOv5 作为基准框架这个数据集标题里就带了 YOLOv5-ready说明所有标签格式、目录结构都是按 YOLOv5 的训练要求准备的。选 YOLOv5 而不是更新的 YOLOv8 或 YOLOv11核心原因有三个。第一是生态成熟度。YOLOv5 的仓库文档、issue 讨论、第三方教程数量在目标检测框架里是最多的遇到问题基本搜一下都有答案对入门者极其友好。第二是资源占用可控。橘子成熟度检测最终要跑到采摘机器人或分选设备上这类边缘设备的算力通常有限YOLOv5s 或 YOLOv5n 这种轻量模型在 CPU 上也能跑到可用的帧率部署压力小。第三是官方仓库本身就带了一整套数据检查、训练、验证、导出的工具链data.yaml 写好后一条命令就能训练减少了大量工程适配工作。所谓 ready就是拿到数据集后不用写任何格式转换脚本直接改一下 data.yaml 里的路径就能开训这个体验对新手来说非常关键。2. 数据集结构拆解与标注规范2.1 目录结构与 data.yaml 配置数据集的目录组织是标准的 YOLOv5 风格图片和标签分开存放train 和 val 各自独立orange_maturity_dataset/ ├── images/ │ ├── train/ │ │ ├── img_001.jpg │ │ ├── img_002.jpg │ │ └── ... │ └── val/ │ ├── img_101.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── img_001.txt │ │ └── ... │ └── val/ │ └── ... ├── data.yaml └── visualize_annotations.pydata.yaml 是训练入口的核心文件内容非常直接train: /path/to/orange_maturity_dataset/images/train val: /path/to/orange_maturity_dataset/images/val nc: 2 names: [unripe, ripe]类别顺序这一点特别重要。names 列表里的索引必须和标签文件里的 class id 一一对应如果顺序写反了模型会把熟果当青果、青果当熟果训练过程还不会报错只有看结果时才会发现。我见过不止一个人在这上面栽跟头所以第一次跑之前建议先拿可视化脚本确认一遍。2.2 标注格式与工具选型标签文件用的是 YOLO 标准格式每行对应一个目标框class_id x_center y_center width height其中坐标值全部归一化到 0~1 之间。比如一行1 0.5234 0.4187 0.2145 0.2631表示类别是 ripeid1框中心点在图像宽度的 52.34%、高度的 41.87% 处框宽占整张图的 21.45%框高占整张图的 26.31%。标注工具我用过三个LabelImg、LabelStudio、X-AnyLabeling。LabelImg 是老牌工具界面朴素但够用LabelStudio 适合团队协作有 Web 界面X-AnyLabeling 支持半自动标注可以用预训练模型先跑一遍再人工修正效率最高。就这个项目而言如果数据量在几百张级别直接用 LabelImg 就够了没必要上复杂工具。标注橘子的时候有几个实操标准值得注意。第一bbox 要紧贴果实边缘宁紧勿松框得太大容易把背景叶子包进去把特征学脏。第二果实被遮挡超过一半的样本直接跳过不要硬标否则会给模型引入大量模糊的学习信号。第三边缘被截断的果实要标但要保证截断后露出的部分仍然占框面积的 70% 以上。第四最难的是青果和叶子颜色非常接近肉眼都容易看错所以标注时建议把图像亮度调高一点青果轮廓会清楚很多。2.3 训练集与验证集的划分策略划分比例和划分逻辑比数字本身更重要。这个数据集按约 8:2 划分 train/val但划分时不是简单随机打乱而是按“场景隔离”来做——同一棵树、同一拍摄批次、光线条件相近的照片尽量归到同一个集合里。这样做是为了避免一种假象模型记住的是某个特定果园的背景纹理而不是橘子本身的特征。如果随机切分train 和 val 里都出现同一棵树的照片模型在 val 上表现很好但一到新果园就崩因为它的泛化能力被高估了。场景隔离会让 val 的分数看起来略低一些但这个分数才是模型真实能力的反映。3. 可视化脚本训练前必须做的数据质检3.1 为什么可视化这步省不掉标签格式对不对、坐标归一化有没有反、类别 id 有没有错位这些问题靠肉眼翻 txt 文件根本发现不了。可视化脚本做的事情就是把每一张图片和它的标签框画在一起让你直接看到标注长什么样。这一步的工作量不大但价值极高。我每次拿到新数据集第一件事永远是可视化抽查不把标注质量确认清楚就开训练后面排查问题的时间一定比省下来的时间多得多。3.2 脚本核心逻辑与实现这个数据集自带的 visualize_annotations.py核心逻辑就是三个步骤加载图片、解析同名 txt 标签、用 OpenCV 画框画类别名。import cv2 import os import numpy as np from collections import Counter def load_labels(label_path, img_w, img_h): boxes [] with open(label_path, r) as f: for line in f.readlines(): parts line.strip().split() if len(parts) ! 5: continue cls_id int(parts[0]) x_center float(parts[1]) * img_w y_center float(parts[2]) * img_h w float(parts[3]) * img_w h float(parts[4]) * img_h x1 int(x_center - w / 2) y1 int(y_center - h / 2) x2 int(x_center w / 2) y2 int(y_center h / 2) boxes.append((cls_id, x1, y1, x2, y2)) return boxes def visualize_one(image_path, label_path, class_names, output_dir): img cv2.imread(image_path) img_h, img_w img.shape[:2] boxes load_labels(label_path, img_w, img_h) colors [(0, 0, 255), (0, 165, 255)] # unripe红色, ripe橙色 for cls_id, x1, y1, x2, y2 in boxes: color colors[cls_id] if cls_id len(colors) else (255, 0, 0) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) label f{class_names[cls_id]} cv2.putText(img, label, (x1, max(0, y1 - 5)), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) out_path os.path.join(output_dir, os.path.basename(image_path)) cv2.imwrite(out_path, img) def scan_and_visualize(img_dir, label_dir, output_dir): os.makedirs(output_dir, exist_okTrue) class_names [unripe, ripe] total_boxes [] for img_name in os.listdir(img_dir): if not img_name.lower().endswith((.jpg, .jpeg, .png)): continue stem os.path.splitext(img_name)[0] img_path os.path.join(img_dir, img_name) label_path os.path.join(label_dir, stem .txt) if not os.path.exists(label_path): print(f[WARN] 标签文件缺失: {label_path}) continue visualize_one(img_path, label_path, class_names, output_dir) with open(label_path, r) as f: for line in f: parts line.strip().split() if len(parts) 5: total_boxes.append(int(parts[0])) counter Counter(total_boxes) print(f类别统计: {dict(counter)}) print(f样本总数: {sum(counter.values())})脚本会遍历指定目录下的所有图片为每张图生成一张画好框的可视化结果同时打印类别分布统计。用起来就是一条命令python visualize_annotations.py --img_dir images/train --label_dir labels/train --out_dir viz_output3.3 实操心得可视化时最容易暴露的问题我实际跑完可视化之后发现过三个典型问题。第一是标签框和物体明显错位通常是标注时点到旁边了这类问题在 300 张图里可能有个五六处需要回头修正。第二是某些图的框明显偏大或偏小偏大通常是标注习惯问题偏小往往是漏标了部分果实。第三是类别分布严重不均比如 unripe 的框占了 80%这种情况下直接训练模型会对少数类产生明显偏见需要在训练时通过调整类别权重或采样策略来缓解。可视化脚本跑完确认标注质量没问题了才可以进入训练环节。4. 基于该数据集的 YOLOv5 训练全流程4.1 环境配置与依赖安装训练环境搭建是新手最容易卡住的地方多数问题出在版本匹配上。我的建议是直接用 YOLOv5 官方仓库提供的 requirements.txt不要手动一个个装。git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txtPython 版本建议 3.8~3.10PyTorch 版本根据显卡驱动来选。这里有个容易踩的坑显卡驱动版本和 CUDA 版本不匹配会导致 torch 装好了但 GPU 不可用。可以先跑nvidia-smi看驱动支持的 CUDA 版本再决定装哪个版本的 PyTorch。如果只是 CPU 训练那 PyTorch 的 CPU 版本就够用但训练速度会慢很多橘子这种小数据集几百张图勉强能接受数据集一大还是建议上 GPU。4.2 训练参数与超参数设置训练命令本身不复杂python train.py --data /path/to/orange_maturity_dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 150 \ --name orange_exp几个关键参数的选择逻辑如下。--img我选的是 640。橘子目标在画面中通常不算特别小640 的输入分辨率能在速度和精度之间取得平衡。如果果实特别小或者密集可以试 960但训练和推理耗时都会明显上涨。--batch取决于显存大小。显存不够的时候优先降低 batch而不是降低分辨率。8G 显存跑 yolov5s 用 batch 16 比较稳显存不够就调到 8 或 4。--epochs建议 150 起步。小数据集上 100 epoch 可能不够收敛300 epoch 又容易过拟合。可以在训练时打开早停机制让模型在 val 指标不再提升时自动停下来。YOLOv5 的超参数文件是 data/hyps/hyp.scratch-low.yaml里面有几个值得关注的点。lr0初始学习率默认 0.01小数据集上如果 loss 震荡明显可以调到 0.005。mosaic默认是 1.0也就是每张图都做 mosaic 增强这对小数据集提升泛化能力很有帮助但要注意如果数据集里目标本身就小mosaic 后目标会变得更小反而难学这时候可以适当降到 0.5。fliplr水平翻转对于果园场景基本无害可以保持默认。4.3 训练结果评估与常见性能指标训练完成后重点看 runs/train/orange_exp 目录下的三个东西results.png、confusion_matrix.png 和 val_batch0_pred.jpg。results.png 里最关键的是 mAP0.5 曲线和 val loss 曲线。mAP0.5 在二分类成熟度检测任务里能到 0.85 以上就具备了基本的可用性。混淆矩阵要重点看 unripe 和 ripe 之间的互相误判情况如果混得很厉害说明两类特征差异不够明显可能需要采集更多极端样本比如半熟果并单独标注成独立类别或者增加图像增强来强化颜色纹理差异。val_batch0_pred.jpg 是验证集图片的预测结果可视化直接看预测框的位置和置信度比看数字更直观。我会重点检查两类错误漏检的果实没画框和误检的背景把叶子或树干当成橘子。漏检多说明模型召回不够可以考虑降低置信度阈值或增加训练轮次误检多说明特征学习有问题需要回到数据层面解决。4.4 从训练到部署边缘设备的适配思路训练完成的模型最终要跑到实际设备上。这个数据集如果要用在采摘机器人或分选设备上常见路径是PyTorch 模型导出 ONNX再转成目标平台所需的格式。python export.py --weights runs/train/orange_exp/weights/best.pt \ --img 640 \ --include onnx导出后可以用 ONNX Runtime 做 CPU 推理也可以转成 TensorRT 在 NVIDIA 平台加速。如果目标平台是树莓派 5 这类 ARM 设备ONNX Runtime 配合合适的后端也能跑到可用帧率如果是 NXP i.MX8MP 这类带 NPU 的芯片通常还需要额外的模型转换工具链把模型量化成 INT8 格式。量化后精度会有一定损失所以训练时不能只看 float 精度要把量化后的指标也纳入评估。5. 常见问题与排查技巧实录5.1 训练时 loss 出现 NaNNaN 问题多见于学习率过大或 batch size 太小导致梯度爆炸。排查思路很简单先把--lr0降到 0.001 试一下如果恢复稳定说明是学习率问题。如果仍然 NaN检查标签文件里有没有 width 或 height 为 0 的异常框——坐标值异常是最被忽略的原因早期数据集中我出现过 y 坐标写反导致框跑到画面外的情况loss 直接爆掉。可视化脚本能在训练前就拦截掉这类问题。5.2 mAP 很高但实际预测效果差mAP 高但视频实测差几乎可以断定是数据划分出了问题。最常见的是 train 和 val 之间有重复或高度相似的图片导致 val 分数虚高。解决办法就是按场景隔离重新划分并且可视化抽查 val 集的预测结果看实际错误长什么样。5.3 类别不平衡导致熟果漏检如果数据里 unripe 占了绝大多数模型会偏向预测 unripe 来提高整体 loss 的优化效率。第一批训练结果往往是熟果大量漏检。解决方向有三个第一是补采熟果数据第二是训练时调整 class weights让少数类的 loss 权重更大第三是增强时对少数类做过采样。实际操作中我用过 YOLOv5 的--cls参数设置合理的类别损失权重熟练果的召回率能明显提升。5.4 可视化脚本画框位置偏了如果画出来的框和物体对不上而且所有框的偏移方向一致先检查标签坐标是不是归一化方式出了问题。YOLO 格式要求归一化到 0~1 之间如果某些标注工具导出的是像素坐标脚本又没做转换框就会完全错位。还有一个可能jpg 图片带了 EXIF 旋转信息OpenCV 读取时不会自动应用旋转导致宽高互换。这种情况建议预处理时先把图片统一转正再标注省得后面所有环节都要处理旋转问题。写在最后的一点体会做这个数据集的过程让我越来越确信一件事目标检测项目里数据质量对最终效果的影响通常大于模型结构的选择。再好的模型也扛不住标签乱、划分不合理、类别分布失控的数据。所以不管项目多急我都建议在训练前老老实实跑一遍可视化脚本把每一张图的标注框都过一遍眼睛。这个习惯帮我避免了很多次“训练两小时、排查一整天”的尴尬。如果你手头也在做类似的果蔬检测项目这套数据集的结构、标注规范和可视化流程都可以直接抄作业数据换成你自己的场景就行。后续如果想扩展可以在这个基础上增加半熟类别、加入不同光照条件下的重拍样本或者用半自动标注工具把数据集规模翻一倍这些都是性价比很高的优化方向。本文还有配套的精品资源点击获取
返回列表