ARTICLE DETAIL

资讯详情

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

塑料瓶缺陷检测数据集实战:YOLO训练从classes文件到部署

塑料瓶缺陷检测数据集实战:YOLO训练从classes文件到部署 简介本资源为面向工业质检与计算机视觉方向的塑料瓶缺陷目标检测数据集采用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 是 0neck_missing是 1bottom_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(encodingutf-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. 把数据集接进 YOLOdata.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 \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/bottle \ namebaseline逐项说明modelyolov8n.pt是最小的预训练权重缺陷检测这种单场景任务n 版通常够用先跑通再换 s/m。imgsz640是输入分辨率塑料瓶缺陷如果是细小黑点可以提到 960 或 1280但显存和速度要权衡。batch16在 8G 显存上跑 640 分辨率比较稳爆显存就降到 8。device0指定第一块 GPUCPU 训练把这里改成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 阈值。默认conf0.25、iou0.7不一定适合你的场景漏检多就降 conf误检多就升 conf重叠框多就降 iou。用验证集跑一组阈值扫描画 PR 曲线找拐点比拍脑袋定值靠谱。第三件是导出并测速。产线关心的是节拍不是 mAP。用yolo export modelbest.pt formatonnx导出 ONNX再用 ONNX Runtime 或 TensorRT 测实际推理耗时。640 分辨率下一张图从预处理到后处理的总耗时才是决策依据。如果单帧超过产线节拍就得考虑降分辨率、换更小的模型或者用批处理摊薄开销。# 导出 ONNX 并做一次推理测速 yolo export modelruns/bottle/baseline/weights/best.pt formatonnx imgsz640 yolo predict modelbest.onnx sourcetest_images imgsz640 conf0.3导出时imgsz要和训练一致否则精度会掉。conf0.3是推理时的置信度门槛比训练默认略高能压掉一部分低质量框。测速要在目标硬件上做开发机的数字没有参考价值。我自己的习惯是每拿到一份新数据集先花半小时跑校验脚本和 10 epoch 试训确认数据没问题再投入正式训练。这个习惯帮我挡掉过至少三次「训练几天才发现标签错位」的翻车。数据集的质量决定模型的上限YOLO 只是把这个上限逼近的工具。希望帮到你。本文还有配套的精品资源点击获取
返回列表