☰
塑料瓶缺陷检测数据集实战:YOLO训练从classes文件到部署
2026/10/7 18:54:04 网站建设 项目流程

简介:本资源为面向工业质检与计算机视觉方向的塑料瓶缺陷目标检测数据集,采用YOLO格式标注,适合从事缺陷检测算法训练、模型调优及课程实践的学生与工程师使用。数据集已按YOLOv5目录结构划分完毕,包含训练集约3200张、验证集约130张、测试集约60张图片及对应标签文件,类别涵盖凹陷、缺口、扭曲三类,并附有classes文件明确类别定义。压缩包共约2000个文件,以1999个txt标签与1个可视化py脚本为主,整体约117MB,其中txt文件承载标注信息,py脚本可随机读取图片并绘制边界框,无需修改即可直接运行查看标注效果。目前已有91人学习下载,配套YOLOv5改进实战专栏,便于读者快速接入训练流程、验证数据质量并开展缺陷检测实验。

1. 塑料瓶缺陷检测数据集:从 classes 文件到 YOLO 训练的第一公里

产线上吹瓶机每分钟吐出上百个 PET 瓶,瓶身黑点、瓶口缺料、瓶底裂纹这些缺陷靠人眼盯,漏检率随班次直线上升。你要做的不是从零标注几万张图,而是拿到一份已经划分好 train/val、带 YOLO 标注、还附了 classes 文件的塑料瓶缺陷图像目标检测数据集,直接跑通训练。这份数据集解决的核心问题就一个:把「找数据、标数据、切数据」这三件最耗时的脏活前置掉,让你把精力放在模型选型、超参和部署上。适合谁?适合刚接触 YOLO 目标检测、手头没有标注团队、又需要快速验证缺陷检测可行性的工程师和在校做课题的人。classes 文件决定了你后面所有类别索引的生死,先把它读明白,比急着敲训练命令重要得多。

2. 拆开数据集:目录结构、标注格式与 classes 文件到底管什么

2.1 一个划分好的 YOLO 数据集长什么样

拿到压缩包解压后,常见做法是看到这样的目录树。不同来源会有细微差异,但 YOLO 训练能直接吃的结构基本固定:

plastic_bottle_defect/ ├── images/ │ ├── train/ # 训练集图片 │ └── val/ # 验证集图片 ├── labels/ │ ├── train/ # 训练集标注 txt │ └── val/ # 验证集标注 txt ├── classes.txt # 类别名列表,一行一个 └── data.yaml # 数据集描述文件(部分数据集自带)

images 和 labels 必须同名对应:images/train/bottle_001.jpg对应labels/train/bottle_001.txt。YOLO 靠文件名匹配,不靠顺序,所以改名时两边要同步,否则训练时会出现「图片找不到标签」的静默丢样本。

classes.txt 里每一行是一个类别名,行号从 0 开始就是类别索引。比如:

black_spot neck_missing bottom_crack

那么black_spot的 class_id 是 0,neck_missing是 1,bottom_crack是 2。标注 txt 里每行的第一个数字就是这个 id。这里有个血泪经验:classes 文件的行顺序一旦和标注里的 id 对不上,模型学到的就是错位标签,训练 loss 照样下降,但推理时把黑点认成裂纹,你还以为是模型不行。

2.2 YOLO 标注 txt 的五个数字怎么读

每个标注文件里,一行代表一个目标框,格式是:

class_id x_center y_center width height

后四个都是归一化到 0~1 的浮点数,相对的是图片宽高,不是像素。举例:

0 0.512 0.334 0.086 0.121

意思是类别 0,框中心在图片宽度 51.2%、高度 33.4% 的位置,框宽占图宽 8.6%,框高占图高 12.1%。换算成像素要乘回原图尺寸。这个格式和 COCO 的x_min y_min w h完全不同,直接拿 COCO 标注改后缀是跑不通的,必须做坐标转换。

提示:用wc -l labels/train/*.txt能快速看每个标注文件有几行,行数为 0 说明这张图是负样本(无缺陷),YOLO 允许空标注文件,但别把空文件和缺失文件搞混。

2.3 校验数据集完整性的最小脚本

在训练前花两分钟跑一遍校验,能省掉后面几小时的排查。下面这段脚本检查图片与标签是否一一对应、类别 id 是否越界、坐标是否越界:

import os from pathlib import Path root = Path("plastic_bottle_defect") classes = (root / "classes.txt").read_text(encoding="utf-8").split() num_classes = len(classes) print(f"类别数: {num_classes}, 类别: {classes}") for split in ["train", "val"]: img_dir = root / "images" / split lbl_dir = root / "labels" / split imgs = {p.stem for p in img_dir.glob("*.jpg")} | {p.stem for p in img_dir.glob("*.png")} lbls = {p.stem for p in lbl_dir.glob("*.txt")} # 图片有、标签无 -> 会被当负样本;标签有、图片无 -> 直接报错 missing_lbl = imgs - lbls missing_img = lbls - imgs print(f"[{split}] 图片 {len(imgs)} 张, 标签 {len(lbls)} 个, 缺标签 {len(missing_lbl)}, 缺图片 {len(missing_img)}") bad = 0 for lbl in lbl_dir.glob("*.txt"): for line in lbl.read_text().strip().splitlines(): parts = line.split() if len(parts) != 5: bad += 1; continue cid = int(parts[0]) coords = list(map(float, parts[1:])) if cid < 0 or cid >= num_classes: bad += 1 if any(v < 0 or v > 1 for v in coords): bad += 1 print(f"[{split}] 异常标注行: {bad}")

逻辑说明:先读 classes.txt 确定类别总数,再对 train/val 分别做集合差,找出图片和标签的不匹配。最后逐行解析标注,检查字段数、类别 id 范围、归一化坐标范围。参数上,root改成你解压后的实际目录名;如果图片是.jpeg或.bmp,在 glob 里补上对应后缀。跑出来「缺图片」不为 0 就必须先修,否则训练直接中断。

3. 把数据集接进 YOLO:data.yaml 配置与训练命令

3.1 data.yaml 的四个关键字段

YOLOv8/v11 系列用 data.yaml 描述数据集位置和类别。数据集如果没自带,就自己写一个,放在项目根目录:

path: /abs/path/to/plastic_bottle_defect # 数据集根目录,建议绝对路径 train: images/train # 相对 path 的训练图片目录 val: images/val # 相对 path 的验证图片目录 nc: 3 # 类别数,必须等于 classes.txt 行数 names: # 类别名,顺序必须和 classes.txt 一致 0: black_spot 1: neck_missing 2: bottom_crack

四个字段里最容易翻车的是nc和names的顺序。nc写错会直接报维度不匹配;names顺序错了不报错,但类别全乱。path用绝对路径最稳,相对路径在不同工作目录下启动训练时经常找不到文件。

3.2 用命令行跑通第一次训练

环境装好 ultralytics 后,最小训练命令:

yolo detect train \ data=data.yaml \ model=yolov8n.pt \ epochs=100 \ imgsz=640 \ batch=16 \ device=0 \ project=runs/bottle \ name=baseline

逐项说明:model=yolov8n.pt是最小的预训练权重,缺陷检测这种单场景任务,n 版通常够用,先跑通再换 s/m。imgsz=640是输入分辨率,塑料瓶缺陷如果是细小黑点,可以提到 960 或 1280,但显存和速度要权衡。batch=16在 8G 显存上跑 640 分辨率比较稳,爆显存就降到 8。device=0指定第一块 GPU,CPU 训练把这里改成cpu。project和name决定权重和日志落盘位置,方便你对比多次实验。

3.3 训练日志里该盯哪几个数

启动后终端会刷每个 epoch 的指标,重点看三个:box_loss持续下降说明框回归在学;cls_loss下降说明分类在学;mAP50是 IoU 0.5 下的平均精度,缺陷检测里这个数比 mAP50-95 更直观。如果 box_loss 降但 mAP 不涨,多半是标注框质量差或类别不平衡。验证集指标在每个 epoch 末计算,如果 val 的 loss 开始上升而 train 还在降,就是过拟合,早停或加数据增强。

注意:第一次训练建议先跑 10 个 epoch 看曲线趋势,别一上来就 300 epoch。曲线不对,跑再久也是浪费电。

4. 塑料瓶缺陷检测的避坑与排查:五条踩出来的经验

4.1 类别 id 错位:loss 正常但预测全乱

现象:训练 loss 平稳下降,mAP 也有数值,但推理时把黑点框成裂纹,类别完全对不上。原因:classes.txt 的行顺序和标注 txt 里的 class_id 不一致,或者 data.yaml 的 names 顺序和 classes.txt 不同。解决:用 2.3 的校验脚本确认每个 id 都在[0, nc)内,再人工抽 5 张图,把标注框画回原图核对类别名。这一步别省,错位标签是玄学问题的头号来源。

4.2 图片标签不同名:样本被静默丢弃

现象:训练集明明有 2000 张图,日志里train: Scanning只扫到 1800 张。原因:images 和 labels 里文件名不一致,比如图片叫bottle_001.jpg,标签叫bottle_001_.txt,或者大小写、前后空格差异。YOLO 匹配不上就跳过,不报错。解决:跑 2.3 脚本看missing_lbl和missing_img,用rename批量统一。批量改名时先备份,改错了没有后悔药。

4.3 小目标缺陷被下采样吃掉

现象:瓶身大裂纹检测很好,细小黑点几乎检不出。原因:640 分辨率下,几个像素的黑点经过 backbone 多次下采样后特征几乎消失。解决:把imgsz提到 960 或 1280;或者在 data.yaml 里开启copy_paste、mosaic增强提升小目标出现频率;模型侧可以换带 P2 检测头的配置,P2 层保留更高分辨率特征。代价是显存和推理耗时上升,产线节拍紧的话要实测。

4.4 类别不平衡:缺陷样本远少于正常样本

现象:某一类缺陷 mAP 很高,另一类几乎为 0。原因:数据集中各类缺陷数量差异大,模型偏向多数类。解决:先统计每个类别的框数量,用grep -h "^0 " labels/train/*.txt | wc -l这类命令按 id 计数。数量差一个数量级时,可以复制少数类图片做过采样,或在训练时用cls损失权重调整。别盲目上 focal loss,先确认是不是数据本身的问题。

4.5 验证集泄漏:mAP 虚高

现象:验证集 mAP 高得离谱,上线后一塌糊涂。原因:划分数据集时同一只瓶子的多张连拍图被分到了 train 和 val 两边,模型见过近似样本。解决:按瓶子或按批次划分,而不是随机按图片划分。如果数据集已经划分好,抽几张 val 图去 train 里做相似度比对,确认没有近乎重复的样本。这个坑在工业检测里特别常见,因为连拍图长得太像。

5. 从跑通到可用:提升塑料瓶缺陷检测精度的三个进阶动作

第一版模型跑通只是起点。想让它在产线上真正可用,我一般会做三件事。第一件是用混淆矩阵定位类别混淆。训练完 ultralytics 会在 runs 目录生成confusion_matrix.png,横轴预测、纵轴真实。如果黑点和裂纹互相混淆严重,说明这两类在特征上太接近,要么合并成一类「表面缺陷」,要么补充更多区分性样本。第二件是调推理置信度和 IoU 阈值。默认conf=0.25、iou=0.7不一定适合你的场景,漏检多就降 conf,误检多就升 conf,重叠框多就降 iou。用验证集跑一组阈值扫描,画 PR 曲线找拐点,比拍脑袋定值靠谱。

第三件是导出并测速。产线关心的是节拍,不是 mAP。用yolo export model=best.pt format=onnx导出 ONNX,再用 ONNX Runtime 或 TensorRT 测实际推理耗时。640 分辨率下,一张图从预处理到后处理的总耗时才是决策依据。如果单帧超过产线节拍,就得考虑降分辨率、换更小的模型,或者用批处理摊薄开销。

# 导出 ONNX 并做一次推理测速 yolo export model=runs/bottle/baseline/weights/best.pt format=onnx imgsz=640 yolo predict model=best.onnx source=test_images imgsz=640 conf=0.3

导出时imgsz要和训练一致,否则精度会掉。conf=0.3是推理时的置信度门槛,比训练默认略高,能压掉一部分低质量框。测速要在目标硬件上做,开发机的数字没有参考价值。

我自己的习惯是:每拿到一份新数据集,先花半小时跑校验脚本和 10 epoch 试训,确认数据没问题再投入正式训练。这个习惯帮我挡掉过至少三次「训练几天才发现标签错位」的翻车。数据集的质量决定模型的上限,YOLO 只是把这个上限逼近的工具。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询