简介:YOLOv5水果检测数据集收录数百张已标注的常见水果图片,涵盖菠萝、李子、红番茄和西瓜四个类别,面向计算机视觉初学者和基于YOLO系列检测框架的开发者,省去自行采集图像、人工标注类别和整理数据目录的繁琐工作。压缩包内共1107个文件,主要包括553张JPG格式的图像及对应的553个TXT格式标签,另附一个data.yaml配置文件;训练集、验证集、测试集已在目录中划分完毕,图片与标签一一对应,解压后即可按照YOLOv5、YOLOv7、YOLOv8等常见模型的规范直接开展训练。资源包整体大小约31.72MB,便于下载和本地部署。目前已有839人学习下载,适合用于快速上手YOLO系列工具链、理解YOLO格式的标注原理,以及进行水果检测相关的课程实验或竞赛调优。借助该数据集,可以完整经历从数据读取、参数配置到模型训练、结果验证的实践流程,有效缩短环境准备和数据预处理的时间,提升学习与开发效率。
1. 这个水果检测数据集,省掉的是你调格式的两小时
刚拿到一批图片就急着训练yolov5,通常会在两个地方卡住:一是标注文件还是Pascal VOC或者LabelMe的JSON格式,需要自己写脚本转成YOLO的txt;二是图片和标签没有按train/valid/test分好目录,训练时要么手写split脚本,要么干脆全扔进train导致验证集失真。这套yolov5水果检测数据集data5,几百张图已经按Roboflow的导出规范整理完毕,菠萝、李子、红番茄、西瓜四类,train、valid、test目录划分明确并附带可直接读取的data.yaml,拿过来指向yolov5项目的data参数就能开训。不再需要处理格式转换和目录结构,把精力全部留给训练参数和数据质量本身。适合正在做目标检测课程设计、毕设,或者需要快速验证yolov5系列模型在果蔬识别场景下效果的人。
2. 目录结构与data.yaml的配置逻辑,看懂之后再也不怕换数据集
拿到压缩包解压以后,第一件事不是急着训练,而是把目录结构和yaml文件的写法看明白。这份数据集采用的是YOLO系列最常见的组织方式,图片存到images,标签存到labels,二者通过文件名一一对应。压缩包内核心路径如下:
data5/ ├── train/ │ ├── images/ # 训练图片,jpg格式,640x640左右 │ └── labels/ # 同名txt,每行一个目标 ├── valid/ │ ├── images/ │ └── labels/ ├── test/ │ ├── images/ │ └── labels/ └── data.yaml # 类别和路径配置这是yolov5、yolov7、yolov8通用的数据组织方式。打开data.yaml,内容对应的是四个类别:
names: ['pineapple', 'plum', 'redtomato', 'semangka'] train: ./train/images val: ./valid/images test: ./test/images注意几个细节。第一,train和val指向的是images目录而非labels目录,yolov5会依据图片路径自动查找同级路径下的labels文件夹。第二,路径用了相对路径,这意味着训练时必须把data.yaml的路径作为参数传给train.py,且运行目录相对固定,我一般建议改成绝对路径防止换机器后路径失效。第三,names的排序必须和txt标注里的类别id严格对应,比如某个plum的txt内容第一行若开头是1,那它就是指plum,换成第0个类就是pineapple,混乱会导致损失下降但精度始终上不去。
标注txt的格式依托归一化坐标,每行结构是“类别id x_center y_center width height”,全部除以图片宽高,取值在0到1之间。例如一个李子的标注可能是:
1 0.4562 0.3187 0.2834 0.4215这行数字的含义是:类别id为1,目标中心在图像水平方向45.62%、垂直方向31.87%的位置,宽占整幅图的28.34%,高占42.15%。yolov5训练时通过等比缩放和padding把输入图统一到640×640,归一化坐标在这个过程里天然是安全的,不需要二次换算。因此从标注格式来看,这份数据已经接近开箱即用状态。
训练之前建议验证一下标注是否有越界或空文件问题,常见做法是写一个快速检查脚本:
import os for split in ['train', 'valid', 'test']: label_dir = f'data5/{split}/labels' empty_cnt = 0 for f in os.listdir(label_dir): path = os.path.join(label_dir, f) if os.path.getsize(path) == 0: empty_cnt += 1 print(f'{split}: empty label -> {f}') print(f'{split} total empty: {empty_cnt}')这段脚本循环检查每个划分下的labels目录,找出内容为空的txt。空标注文件会让yolov5训练时对应图片沦为纯背景样本,少量还好,多了直接拉低召回率。运行后如果没有任何输出,说明数据标注完整,可以直接进入训练阶段。
3. 从头复现yolov5水果模型的训练流程,命令与参数逐项说明
训练yolov5的第一步是准备好环境。yolov5基于PyTorch,推荐Python 3.8以上、CUDA 11.3以上的环境。先克隆官方仓库到本地:
git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txtrequirements.txt里包含torch、opencv-python、matplotlib等依赖,装完之后建议检查一下PyTorch的GPU版本是否与CUDA匹配,用python -c "import torch; print(torch.cuda.is_available())"输出True再继续。训练命令相对固定,从yolov5项目根目录执行:
python train.py \ --img 640 \ --batch 16 \ --epochs 100 \ --data /path/to/data5/data.yaml \ --cfg yolov5s.yaml \ --weights yolov5s.pt \ --name fruit_detect \ --cache这句命令做了这几件事:--img 640把输入统一缩放到640×640,和不失真Resize不同,yolov5会先等比缩放再填充灰边,属于训练时的标准预处理;--batch 16按显存容量决定,8GB显存配yolov5s选16可用,12GB以上可以上32;--cfg yolov5s.yaml指定网络结构,s是small版本,训练最快,在几百张的小数据集上不太容易过拟合到无法收敛;--weights yolov5s.pt加载COCO预训练权重做迁移学习,这对小数据集极其重要,如果不加载预训练权重,几十个epoch内模型可能都学不到有效的底层特征;--cache把图片加载进内存,对这个规模的水果数据集来说可以显著减少IO等待时间,几乎不占多少内存。
训练过程中runs/train/fruit_detect目录会持续写入weight、results.csv和训练曲线图。这个数据集的图片数量在几百张级别,100个epoch对yolov5s来说训练时间大约在20到40分钟之间,取决于显卡型号。如果只想验证流程能跑通,先把epochs改成10,确认损失下降趋势出现再加大轮数。若使用yolov7或yolov8,数据集部分不需要改动,data.yaml的字段完全兼容,只需要替换对应仓库的模型配置文件即可。这样设计的好处是当你想横向对比yolov5、yolov7、yolov8在水果检测上的精度差异时,仅切换算法框架和训练脚本,出图结果可以直接做横向对比,不需要为每个框架重做数据集。
4. 训练日志和验证指标怎么读,参数为什么这么设
训练结束后不要只看最后的mAP数字,要按顺序看三个东西:损失曲线、PR曲线、混淆矩阵。以results.png为例,从上到下的曲线包括train/box_loss、train/obj_loss、train/cls_loss、val/box_loss、val/obj_loss、val/cls_loss、metrics/precision、metrics/recall以及metrics/mAP@0.5和metrics/mAP@0.5:0.95。正常情况下,训练和验证损失应该同步下降且最终趋于平缓,mAP@0.5稳定在0.9以上就算这个数据集规模下的正常水平。要是val损失在第30个epoch后反弹而train损失还在降,那就是过拟合信号,常见处理是加--patience 20配合早停,或者把--epochs降到60。
mAP的判读要结合类别看。数据集中红番茄、西瓜、菠萝的色彩和形状相对鲜明,李子是深紫色小果,容易和红番茄产生混淆,尤其是远距离小目标场景。更直接的办法是打开confusion_matrix.png,数值会展示具体是哪两类互相误判。若李子被大量识别成红番茄,可以到对应图片上检查标注框是否框住了果柄或叶片,框大了会把相近颜色背景学进来。
针对内存比较小的机器,以下参数可以按需调整:
| 参数 | 默认值 | 建议调整方向 |
|---|---|---|
| --batch | 16 | 显存不够降到8,不要降到4以下 |
| --img | 640 | 小目标多时试1280,帧率敏感时试416 |
| --epochs | 100 | 过拟合就减到60,欠拟合加到150 |
| --cache | False | 小数据集建议开启 |
| --workers | 8 | Windows下设为4,避免DataLoader报错 |
这里重点说明--img参数的双刃剑效应。--img 640在训练时把图片统一拉伸到640×640,而推理时也可以用--img 640保持一致性。数据源图片本身是640左右,因此无需担心增采样带来的特征损失。若把--img改成1280,虽然小目标特征更清晰,mAP会略有提升,但训练和推理速度会下降一半以上,部署阶段需要仔细权衡。对于这几百张图片的训练集规模,我倾向于保持640不变,模型容量和输入分辨率都处于合适区间,学习率超参数不需要格外处理。超参数文件data/hyps/hyp.scratch-low.yaml中默认的学习率0.01、动量0.937、权重衰减0.0005足以适配这类中低规模数据集,除非出现梯度爆炸或收敛过慢才需要调整,例如把lr0降低到0.005或把warmup_epochs从3增加到5。
5. 数据增强对泛化能力的加成,以及小样本扩充的可行做法
数据增强是yolov5在小数据集上获得稳定精度的关键。yolov5内置的增强策略集中在hyperparameters里,包括hsv_h、hsv_s、hsv_v(色调、饱和度、明度扰动)、degrees(旋转)、translate(平移)、scale(缩放)、fliplr(水平翻转)和mosaic。实际操作中,yolov5在训练前会执行Mosaic-4增强,即把四张图拼接成一张再随机裁剪,这让模型在每一轮迭代看到的上下文远远多于原始图片数量,一个epoch对于模型而言相当于识别了更多组合场景。因此即使只有几百张图片,在mosaic的加持下也不容易出现严重欠拟合。
对于自己扩充数据的情况,一个直接可用的做法是用yolov5自身做半自动标注。先用手头少量样本训练一个粗糙模型,用它去预测未标注图片,再把置信度高于0.6的预测结果转成标注文件,人工只修正错误框和漏检框。推理命令沿用detect.py:
python detect.py \ --weights runs/train/fruit_detect/weights/best.pt \ --source /path/to/new_images/ \ --save-txt \ --conf-thres 0.6--save-txt会把每个目标的类别和归一化坐标写入result标签目录下的同名txt,--conf-thres 0.6控制只保留高置信度预测。生成后的txt格式和data5中的标签完全一致,直接拷贝到labels目录即可完成一轮数据补充。人工检查的重点是漏检的小李子,它们在远处会出现几个像素级别的目标,这类样本按经验至少需要单独裁剪放大后再加入训练集。
另外验证模型跑出来的效果,推荐用单张图测试加批量验证组合的方式。单张图测试看框的位置是否准确贴合水果轮廓,批量验证则是统计mAP的变化趋势,两者结合才能确认参数的调整方向正确。除了精度,检查一下不同光照条件下的推理效果,自然光直射时李子表面会产生高光反射,模型如果在这个场景下漏检,说明训练集中高光样本不足,需要回补数据。若压缩包中图片偏暗或偏亮,可以在扩充阶段加一层亮度抖动,这是让模型适应真实环境成本最低的手段。
本文还有配套的精品资源,点击获取