模塑玻璃瓶缺陷识别数据集:28类缺陷与YOLOv5实战

发布时间:2026/10/11 22:26:55
模塑玻璃瓶缺陷识别数据集:28类缺陷与YOLOv5实战 简介这份资源是面向工业质检与计算机视觉方向的模塑玻璃瓶缺陷识别数据集适合从事缺陷检测算法研发、YOLO模型训练及产线视觉方案验证的工程师与学习者使用。数据集覆盖黑点、泡泡颈、破损、刮痕、裂缝等28类常见玻璃瓶缺陷标注信息完整可直接用于目标检测模型的训练与评估官方给出的识别率为75.9%并明确支持YOLO v5框架便于快速接入现有检测流程。压缩包共包含2000个文件以1999个txt标注文件和1个yaml配置文件为主txt文件对应各图像的缺陷类别与位置信息yaml则用于定义数据集路径与类别名称整体约45.53MB体量轻便、结构清晰方便按类别检索与划分训练集、验证集。目前已有21人学习下载适合需要真实工业缺陷样本、希望复现或改进YOLO v5检测效果的研究者参考使用。1. 模塑玻璃瓶缺陷识别数据集28 类缺陷、75.9% 识别率这份标注数据到底能不能直接上产线模塑玻璃瓶的质检线上最让人头疼的不是设备贵而是缺陷样本攒不起来。黑点、泡泡颈、破损、刮痕、裂缝这些缺陷单条产线一天可能就出几十个等你攒够能训模型的量产品早就换型了。这份带标注的模塑玻璃瓶缺陷识别数据集覆盖 28 种缺陷类型官方给出的识别率是 75.9%直接支持 YOLOv5 训练格式。它解决的不是从零标注的问题而是让你跳过最耗时的数据采集和标注环节把精力放在模型调优和产线适配上。适合做工业质检的算法工程师、想快速验证玻璃瓶缺陷检测方案的团队以及需要一份真实工业缺陷数据做 benchmark 的研究者。但 75.9% 这个数字背后有前提能不能直接用得看你的缺陷定义和产线光照条件跟数据集是否对齐。2. 数据集拆解28 类缺陷怎么分、标注格式长什么样2.1 缺陷类别体系与模塑工艺的对应关系模塑玻璃瓶的缺陷不是随机分布的它跟成型工艺强相关。这份数据集的 28 类缺陷大致可以归到四个工艺环节成型阶段泡泡颈、瓶颈变形、瓶身椭圆度超差。泡泡颈是玻璃液在初模中分布不均导致的表现为瓶颈处出现气泡聚集或颈径异常。表面处理阶段黑点、刮痕、划痕、麻点。黑点通常是原料杂质或窑炉耐火材料脱落刮痕和划痕则是模具磨损或输送带摩擦造成的。退火阶段裂缝、内应力纹、退火不完全导致的微裂。这类缺陷在可见光下不一定明显但数据集里做了标注说明采集时用了特定角度的光源。后道工序破损、缺口、崩边。多发生在抓取、传送、包装环节。28 类里黑点、泡泡颈、破损、刮痕、裂缝这五类是出现频率最高的也是产线质检最关注的。数据集对每类缺陷都给了边界框标注不是简单的图像分类标签。这意味着你可以直接拿来做目标检测训练而不是先做分类再定位。提示拿到数据集后第一件事是统计每类缺陷的实例数量。如果某几类只有几十个样本训练时要么做过采样要么在 loss 里给类别权重否则模型会偏向多数类。2.2 YOLOv5 标注格式与目录结构数据集按 YOLOv5 的标准格式组织每张图片对应一个同名的.txt标注文件。标注文件里每行是一个缺陷实例格式为class_id x_center y_center width height其中坐标都是归一化到 0~1 的相对值。class_id 从 0 到 27对应 28 类缺陷。目录结构常见做法是dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yamldata.yaml里需要配置train、val、test的路径以及nc: 28和names列表。names 的顺序必须跟标注文件里的 class_id 严格对应错一个位整类缺陷的标签就全乱了。# data.yaml 示例 train: ./dataset/images/train val: ./dataset/images/val test: ./dataset/images/test nc: 28 names: 0: black_spot 1: bubble_neck 2: breakage 3: scratch 4: crack # ... 其余 23 类按实际顺序补全这里有个容易翻车的地方YOLOv5 的标注文件里class_id 是从 0 开始的整数但有些标注工具导出时会写成浮点数或者从 1 开始。训练前用脚本扫一遍所有 label 文件确认 class_id 的范围和整数格式。2.3 图像采集条件与 75.9% 识别率的边界75.9% 的识别率不是随便跑出来的。它跟图像分辨率、光照条件、缺陷尺寸都有关系。数据集里的图像大概率是在固定工位、特定光源下采集的背景比较干净瓶体位置相对固定。如果你的产线是动态拍摄、背景杂乱、光照变化大直接拿这个数据集训出来的模型mAP 会掉得很明显。我一般会先做两件事一是把数据集里的图片按缺陷类别抽样看一遍确认缺陷的视觉特征跟自己的场景差多少二是用val集跑一遍预训练权重看每类缺陷的 AP 分布。如果黑点和刮痕的 AP 都在 0.8 以上但泡泡颈只有 0.4那说明泡泡颈的样本可能太少或者特征不明显需要针对性补充数据。注意75.9% 这个数字大概率是在val集上的 mAP0.5 或者类似指标。不要把它当成产线漏检率。产线上还要考虑误检、节拍、光照衰减实际部署时指标会打折扣。3. 用 YOLOv5 跑通训练从环境配置到第一轮推理3.1 环境搭建与依赖版本锁定YOLOv5 对 PyTorch 和 CUDA 版本比较敏感版本不对容易出各种玄学错误。我一般用 Python 3.8 PyTorch 1.10 CUDA 11.3 这个组合比较稳。先建虚拟环境conda create -n bottle_defect python3.8 -y conda activate bottle_defect然后装 PyTorch 和 YOLOv5 的依赖# 安装 PyTorchCUDA 11.3 版本 pip install torch1.10.0cu113 torchvision0.11.1cu113 -f https://download.pytorch.org/whl/torch_stable.html # 克隆 YOLOv5 仓库用 v6.0 或 v7.0 都行v7.0 对小目标更友好 git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txtrequirements.txt里会装opencv-python、matplotlib、pyyaml这些。如果后面要导出 ONNX 或者 TensorRT再额外装onnx和onnxruntime-gpu。3.2 数据配置与类别名对齐把数据集放到 YOLOv5 目录下或者用绝对路径在data.yaml里指定。关键是names列表的顺序必须跟标注文件里的 class_id 一一对应。我一般会写个小脚本验证import os import yaml # 读取 data.yaml with open(data.yaml, r) as f: data yaml.safe_load(f) # 检查 names 数量和 nc 是否一致 assert len(data[names]) data[nc], names 数量与 nc 不一致 # 扫描所有 label 文件确认 class_id 范围 label_dir ./dataset/labels/train class_ids set() for fname in os.listdir(label_dir): if fname.endswith(.txt): with open(os.path.join(label_dir, fname), r) as f: for line in f: cid int(line.split()[0]) class_ids.add(cid) print(f实际出现的 class_id: {sorted(class_ids)}) print(fdata.yaml 定义的类别数: {data[nc]}) if max(class_ids) data[nc]: print(警告存在超出 nc 范围的 class_id需要检查标注文件)这个脚本跑完如果class_ids的最大值小于nc且没有负数说明标注文件的类别索引没问题。如果有超出范围的要么是标注工具导出时加了偏移要么是类别映射表写错了。3.3 训练命令与关键参数设置YOLOv5 的训练入口是train.py。针对玻璃瓶缺陷检测我一般会调整这几个参数python train.py \ --data data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --device 0 \ --workers 4 \ --optimizer Adam \ --lr0 0.001 \ --lrf 0.01 \ --patience 20 \ --project runs/train \ --name bottle_defect_v1--img 640输入分辨率。玻璃瓶缺陷里黑点和刮痕尺寸偏小640 是底线如果显存够可以上 1280小目标召回会好一些。--batch-size 16根据显存调。如果报 OOM降到 8 或者 4。--optimizer AdamYOLOv5 默认是 SGD但工业缺陷数据量通常不大Adam 收敛更快前期 loss 下降更稳。--lr0 0.001初始学习率。Adam 下用 0.001 比较合适SGD 的话可以设 0.01。--patience 20如果 20 个 epoch 验证集指标没提升就早停防止过拟合。训练过程中重点看mAP0.5和每类的AP。如果整体 mAP 卡在 0.6 左右上不去先别急着调模型回去看数据——大概率是某几类缺陷的样本太少或者标注质量有问题。3.4 推理验证与单张图片测试训练完用detect.py跑推理python detect.py \ --weights runs/train/bottle_defect_v1/weights/best.pt \ --source ./test_images \ --img 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt \ --project runs/detect \ --name bottle_test--conf-thres 0.25置信度阈值。产线上如果漏检代价高可以降到 0.15如果误检太多提到 0.4。--iou-thres 0.45NMS 的 IoU 阈值。玻璃瓶缺陷有时候会重叠比如刮痕和裂缝挨在一起这个值可以适当调高到 0.5。--save-txt把检测结果保存成 txt方便后续跟标注文件对比算漏检和误检。跑完看runs/detect/bottle_test里的可视化结果。重点看两类错误一是黑点被漏检通常是置信度阈值太高二是把瓶身反光误判成刮痕这种一般是训练集里反光样本太少需要补充负样本。4. 避坑与排查标注、训练、部署里最容易翻车的五件事4.1 标注文件里的 class_id 偏移现象训练 loss 正常下降但验证集 mAP 一直很低推理时所有缺陷都被识别成同一类。原因标注工具导出时 class_id 从 1 开始而 YOLOv5 默认从 0 开始。或者data.yaml里names的顺序跟标注时的类别映射表不一致。解决用 3.2 节的脚本扫一遍所有 label 文件确认 class_id 范围。如果发现从 1 开始批量减 1如果顺序不对重新生成data.yaml的names列表。4.2 小目标缺陷在 640 分辨率下丢失现象黑点和细小刮痕的 AP 明显低于破损、裂缝这些大缺陷。原因YOLOv5 的 P3 特征图下采样 8 倍640 输入下小于 8x8 像素的缺陷在特征图上几乎消失。解决把--img提到 1280或者改用 YOLOv5m/l 这种更大的模型。另一个办法是在数据增强里加--mosaic 0关掉马赛克增强因为马赛克会把小目标缩得更小。4.3 类别不平衡导致模型偏向多数类现象黑点、刮痕的 AP 很高但泡泡颈、退火纹的 AP 接近 0。原因这几类缺陷在数据集里样本量太少模型在训练时被多数类主导少数类的梯度被淹没。解决在train.py里加--cls-pw 1.0开启类别权重或者在数据加载时对少数类做过采样。更彻底的办法是单独收集这几类缺陷的图片补充到训练集里。4.4 验证集和训练集分布不一致现象训练集 loss 降到很低但验证集 mAP 波动很大有时候高有时候低。原因划分训练集和验证集时没有按缺陷类别分层抽样导致验证集里某些类别的样本跟训练集差异大。解决重新划分数据集确保每个类别在训练集和验证集里的比例大致相当。如果数据集本身是按时间顺序采集的还要注意不要让同一批次的图片同时出现在训练集和验证集里。4.5 部署时预处理不一致现象训练时 mAP 有 0.75部署到产线上漏检率却很高。原因训练时的图像预处理归一化、通道顺序、resize 方式跟部署时的预处理不一致。比如训练时用的是 RGB部署时摄像头输出的是 BGR。解决把训练时的预处理逻辑固化成一个函数部署时直接调用同一个函数。YOLOv5 的detect.py里用的是letterbox缩放部署时也要用同样的方式不能直接 resize。5. 进阶技巧用 TTA 和类别阈值把 75.9% 再往上推一推75.9% 是基线不是天花板。在不重新标注数据的前提下有两个技巧能把这个数字往上推几个点。测试时增强TTA。YOLOv5 的detect.py支持--augment参数开启后会对每张图片做水平翻转、缩放等多尺度推理然后把结果融合。代价是推理速度慢 2~3 倍但 mAP 通常能涨 1~3 个点。产线上如果节拍允许这个技巧值得开。python detect.py \ --weights runs/train/bottle_defect_v1/weights/best.pt \ --source ./test_images \ --img 640 \ --augment \ --conf-thres 0.2 \ --iou-thres 0.5按类别设置信度阈值。YOLOv5 默认对所有类别用同一个conf-thres但不同缺陷的检测难度不一样。黑点容易误检阈值可以设高一点0.35泡泡颈容易漏检阈值可以设低一点0.15。实现方式是在推理后处理阶段对每个类别单独过滤import torch # 假设 pred 是模型输出shape 为 [batch, num_anchors, 5nc] # 对每个类别单独设阈值 class_thresholds { 0: 0.35, # black_spot 1: 0.15, # bubble_neck 2: 0.25, # breakage 3: 0.30, # scratch 4: 0.20, # crack # ... 其余类别按实际调 } # 伪代码遍历每个类别用对应阈值过滤 for cls_id, thres in class_thresholds.items(): cls_mask pred[..., 5 cls_id] thres # 保留满足条件的检测框这个策略在产线上特别实用因为不同缺陷的漏检代价不一样。破损和裂缝漏检可能导致客户投诉阈值可以低一点黑点误检太多会影响产线节拍阈值可以高一点。还有一个习惯每次训练完我都会把val集的预测结果和标注结果叠在一起看逐类统计漏检和误检。如果某一类的漏检集中在某个光照条件或者某个瓶体位置那就不是模型的问题是数据采集的问题。从那以后我每次拿到新的缺陷数据集都强制走一遍「类别分布统计 → 标注格式校验 → 小目标可视化 → 单类 AP 分析」这四步少一步后面都可能翻车。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询