简介:本资源为面向工业质检与计算机视觉方向的塑料瓶缺陷目标检测数据集,适用于YOLO系列模型训练与算法验证,可帮助读者快速搭建缺陷检测实验环境。数据按YOLOv5标准目录结构组织,已划分训练集、验证集与测试集,包含凹陷、缺口、扭曲三类缺陷,标签为YOLO格式txt文件,可直接投入检测任务使用。压缩包共约2000个文件,以1999个txt标注文件与1个Python可视化脚本为主,整体约117MB,其中txt文件承载图像标注信息,py脚本可随机读取图片并绘制边界框,无需修改即可运行查看标注效果。目前已有91人学习下载,适合需要真实缺陷样本进行模型训练、数据增强或改进实验的开发者参考,配套的YOLOv5改进实战内容也可为后续调优提供思路。
1. 塑料瓶缺陷检测数据集:从拿到手到跑通第一轮训练
产线上塑料瓶的凹陷、缺口、扭曲这三类缺陷,靠人眼在高速传送带上盯,漏检率随班次直线上升。这份资源就是冲着这个场景来的:一套已经按 YOLO 格式标注并划分好的塑料瓶缺陷图像数据集,类别数为 3,训练集约 3200 张、验证集约 130 张、测试集约 60 张,每张图片配一个同名 txt 标签,目录结构直接对齐 YOLOv5 的images/labels约定,还附带一个可视化脚本show.py,随机传一张图就能把边界框画出来存到当前目录。适合两类人:一是想快速验证缺陷检测方案可行性的算法工程师,二是拿它当 YOLO 训练流程练手、需要一份真实工业缺陷数据的学生和转行者。下面按「数据长什么样 → 怎么接进训练 → 坑在哪 → 怎么验证」的顺序拆开讲。
2. 数据集结构与 YOLO 标注格式:先看懂再动手
2.1 目录布局与文件命名
这份数据按 YOLOv5 的标准文件夹组织,常见形态是这样:
plastic_bottle_defect/ ├── images/ │ ├── train/ # 约 3200 张 jpg │ ├── val/ # 约 130 张 jpg │ └── test/ # 约 60 张 jpg ├── labels/ │ ├── train/ # 与 train 图片同名的 txt │ ├── val/ │ └── test/ ├── classes.txt # 三行:凹陷、缺口、扭曲 └── show.py # 可视化脚本图片名带TicketID-xxxx-...jpg这种前缀,是采集工单号,标签文件名必须和图片名完全一致(只换扩展名)。YOLO 找标签靠的是「同名替换」,图片叫a.jpg,标签就得叫a.txt,放在labels/下对应子目录里。很多人第一次接数据翻车就翻在这——图片和标签分在两个平行目录,靠文件名对齐,不是靠顺序。
2.2 标签文件里到底存了什么
每个 txt 里一行一个目标,格式是:
class_id x_center y_center width height五个值用空格分隔,后四个都是归一化到 0~1 的浮点数,相对的是整张图的宽高,不是像素。举个例子:
0 0.512 0.437 0.086 0.121 2 0.301 0.688 0.145 0.093第一行表示类别 0(凹陷),框中心在图片宽度 51.2%、高度 43.7% 的位置,框宽占整图 8.6%、高占 12.1%。第二行是类别 2(扭曲)。这里有个容易忽略的点:classes.txt里的顺序就是 class_id 的映射,凹陷=0、缺口=1、扭曲=2,顺序错了标签含义就全乱,训练出来的模型会把凹陷认成扭曲。
2.3 用 show.py 先做一次肉眼校验
拿到数据别急着开训,先跑可视化确认标注没跑偏。脚本用法很直接:
python show.py --image images/train/TicketID-10344-h1-asb250_3_exh-_jpg.jpg如果脚本是随机抽图模式,直接python show.py也行,它会在当前目录生成一张画了框的图。核心逻辑无非是读图、按同名找 txt、把归一化坐标乘回像素、cv2.rectangle画框。自己写一版也就十几行:
import cv2, os img_path = "images/train/TicketID-10344-h1-asb250_3_exh-_jpg.jpg" label_path = img_path.replace("images", "labels").rsplit(".", 1)[0] + ".txt" img = cv2.imread(img_path) h, w = img.shape[:2] with open(label_path) as f: for line in f: c, xc, yc, bw, bh = map(float, line.split()) # 归一化坐标还原成像素左上角和右下角 x1 = int((xc - bw / 2) * w) y1 = int((yc - bh / 2) * h) x2 = int((xc + bw / 2) * w) y2 = int((yc + bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.imwrite("check.jpg", img)参数说明:xc/yc是框中心归一化坐标,bw/bh是归一化宽高,乘回w/h得到像素值。跑完打开check.jpg,重点看三件事——框有没有整体偏移(说明归一化基准搞错了)、框是不是只框住缺陷局部(标注质量)、有没有图片压根没框(漏标)。这一步花五分钟,能省掉后面几小时的白跑。
3. 接进 YOLOv5 训练:配置文件与启动命令
3.1 写对 data.yaml
YOLOv5 训练靠一个 yaml 描述数据位置和类别。按这份数据的结构,常见写法:
path: ./plastic_bottle_defect train: images/train val: images/val test: images/test nc: 3 names: ['凹陷', '缺口', '扭曲']path是数据集根目录,train/val/test是相对它的子路径。nc是类别数,这里 3。names顺序必须和classes.txt一致,否则标签语义错位。有个细节:names用中文在某些终端和日志里会乱码,训练本身不受影响,但看混淆矩阵时对不上号,稳妥点可以写成['dent', 'gap', 'distort']再在报告里映射回中文。
3.2 选模型和启动训练
YOLOv5 提供 s/m/l/x 几个尺度,缺陷检测这种目标偏小、纹理细的任务,建议从yolov5s起步验证流程,再换yolov5m或l提精度。启动命令:
python train.py \ --data data/plastic_bottle.yaml \ --weights yolov5s.pt \ --img 640 \ --batch 16 \ --epochs 100 \ --device 0参数逐个说:--img 640是输入分辨率,缺陷区域小的话可以提到 960 或 1280,但显存占用按平方涨;--batch 16在 8G 显存上跑 640 分辨率基本够,爆显存就降到 8;--epochs 100对这种三千张规模的数据集通常够收敛,看results.csv里 mAP 不再涨就可以停;--device 0指定第一块 GPU,没卡就写cpu,但三千张图 CPU 训到天亮。预训练权重yolov5s.pt建议用官方 COCO 权重,小数据集上从头训几乎不可能收敛好。
3.3 训练过程盯什么
启动后终端会打印每个 epoch 的 box_loss、obj_loss、cls_loss 和 mAP@0.5。前几个 epoch loss 下降快是正常的,重点看验证集 mAP 有没有稳步爬。如果 box_loss 一直不降,八成是标签坐标有问题,回头用 2.3 的脚本再查一遍。训练完权重存在runs/train/exp/weights/,best.pt是验证集最优,last.pt是最后一轮,推理用best.pt。
4. 避坑与排查:这几处最容易翻车
4.1 图片和标签对不上号
现象:训练报No labels found或者 mAP 恒为 0。原因:图片在images/train,标签却在labels/train之外的位置,或者文件名大小写、扩展名不一致(.jpgvs.JPG)。解决:写个脚本核对两边文件名集合是否完全相等,差集打印出来逐个修。
4.2 类别顺序和 classes.txt 不一致
现象:模型能检出框,但类别全错,凹陷被认成扭曲。原因:data.yaml里names顺序和标注时用的classes.txt顺序不同。解决:以classes.txt为准,逐行核对names,顺序必须一模一样。
4.3 验证集太小导致指标抖动
现象:mAP 一会儿 0.7 一会儿 0.5,波动大。原因:验证集只有约 130 张,样本量小,单张难例就能拉动整体指标。解决:把训练集里划一部分进验证集,或者用 K 折交叉验证看平均表现,别拿单次结果下结论。
4.4 小目标缺陷被漏检
现象:大凹陷能检出,细小缺口漏检严重。原因:640 分辨率下小缺陷只有几个像素,特征被下采样吃掉。解决:提高--img到 960/1280,或在模型里加 P2 小目标检测层,这是 YOLOv5 改进里最常见的操作之一。
4.5 中文类别名引发日志乱码
现象:混淆矩阵、预测图上类别名显示成方块。原因:绘图库默认字体不支持中文。解决:要么把names换成英文,要么在绘图代码里指定中文字体路径,训练本身不受影响。
5. 验证与进阶:把这份数据用出第二层价值
跑通第一轮训练只是起点,真正决定这份数据值不值得深挖的,是验证环节和后续改进空间。训练结束后先别急着看 mAP 数字,用val.py在测试集上单独跑一遍:
python val.py \ --data data/plastic_bottle.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --task test--task test会切到测试集那 60 张上评估,这个集合训练全程没碰过,指标更接近真实泛化能力。跑完会输出每类的 P、R、mAP@0.5 和 mAP@0.5:0.95,重点看三类里哪类拖后腿——通常缺口这种细长目标召回最低。
想进一步压榨精度,几个方向按性价比排:一是提分辨率到 960,小缺陷召回一般能涨几个点,代价是显存和推理时间;二是加数据增强,YOLOv5 自带 mosaic、mixup,缺陷检测里 mosaic 对小目标友好,但 mixup 可能把缺陷纹理糊掉,建议关掉试对比;三是换更大 backbone 或加注意力模块,这是 YOLOv5 改进实战里的常规套路,但三千张数据量下容易过拟合,加之前先把 baseline 跑扎实。
验证时还有个习惯值得养成:把best.pt在测试集上的预测结果可视化出来,逐张看漏检和误检。指标是黑匣子,图才是真相。我一般会写个小脚本批量推理测试集、把预测框和真值框叠在一张图上,红绿对比一眼就能看出模型是「框歪了」还是「压根没看见」。框歪多半是回归损失没收敛,没看见就是特征提取不够,两种问题的解法完全不同。
从那以后我每次拿到新数据集,都强制先跑一遍可视化校验再开训,宁可多花十分钟看图,也不愿训完发现标签是错的。希望这份塑料瓶缺陷数据集能帮你把缺陷检测这条路走顺。
本文还有配套的精品资源,点击获取