☰
管道焊缝缺陷检测数据集:YOLOv5格式解析与训练实战
2026/10/11 19:47:30 网站建设 项目流程

简介:这份资源面向从事工业质检、缺陷识别方向的目标检测学习者与工程人员,提供管道焊接缝缺陷检测数据集,按YOLOV5目录格式整理,可直接投入训练,省去格式转换与标注清洗的繁琐环节。数据为800×800的RGB图像,共2个类别good与bad,覆盖正常与缺陷两类焊缝状态,适合二分类检测任务的快速验证与模型调优。压缩包内共1995个文件,以jpg图像与同名txt标注为主,另附1个可视化py脚本和1张png示意图,整体约93.27MB;其中训练集908张图片及对应标签,验证集206张图片及对应标签,划分明确,便于直接开展训练与评估。可视化脚本无需修改即可运行,随机传入一张图片便能绘制边界框并保存到当前目录,方便检查标注质量与类别分布。目前已有196人学习下载,适合需要快速搭建管道焊缝缺陷检测基线、验证YOLOV5训练流程的读者参考使用。

1. 管道焊接缝缺陷检测数据集:2 类别 YOLOv5 目录格式到底怎么用

管道焊接缝缺陷检测这个场景,很多人第一次接触是在工业质检的项目里。焊缝表面有气孔、夹渣、未熔合、裂纹这些典型缺陷,传统做法靠老师傅拿放大镜看片子,效率低且漏检率随疲劳度上升。换成目标检测的思路,就是把每一处缺陷框出来并分类,让模型替代人眼做初筛。这个数据集提供的就是 YOLOv5 目录格式的标注,2 个类别,拿来就能直接喂给 YOLOv5 训练。适合谁?做工业缺陷检测的算法工程师、想拿真实产线数据练手的学生、以及需要快速验证焊缝检测方案可行性的团队。它解决的核心问题是:你不用从零标注几千张焊缝图,省掉最耗时的数据准备环节,直接进入模型调参和部署验证。

2. YOLOv5 目录格式拆解:2 类别焊缝数据的组织逻辑

2.1 目录结构长什么样

YOLOv5 要求的数据集目录不是随便放几个文件夹就行,它有固定的层级约定。拿到一个标注为「YOLOv5 目录格式」的焊缝数据集,解压后通常看到这样的结构:

weld_defect_dataset/ ├── images/ │ ├── train/ │ │ ├── 001.jpg │ │ ├── 002.jpg │ │ └── ... │ ├── val/ │ │ ├── 101.jpg │ │ └── ... │ └── test/ # 可选 │ └── ... ├── labels/ │ ├── train/ │ │ ├── 001.txt │ │ ├── 002.txt │ │ └── ... │ ├── val/ │ │ ├── 101.txt │ │ └── ... │ └── test/ │ └── ... └── data.yaml

关键点在于images和labels是平级目录,且内部的train、val、test子目录名必须完全一致。图片和标注文件通过文件名一一对应,比如images/train/001.jpg对应labels/train/001.txt。这个对应关系是硬约束,文件名不一致模型就找不到标签,训练直接报错。

2.2 标注文件里的 5 个数字

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

<class_id> <x_center> <y_center> <width> <height>

这 5 个值都是归一化到 0~1 之间的浮点数。class_id从 0 开始计数,2 类别就是 0 和 1。x_center和y_center是框中心点相对于图片宽高的比例,width和height是框的宽高相对于图片宽高的比例。举个例子,一张 640×640 的焊缝图,某个缺陷框在像素坐标下是左上角 (100, 200)、右下角 (300, 400),那么:

  • 中心点像素坐标:x=200, y=300
  • 宽高像素:w=200, h=200
  • 归一化后:x_center=200/640=0.3125, y_center=300/640=0.46875, width=200/640=0.3125, height=200/640=0.3125

标注行就是:0 0.3125 0.46875 0.3125 0.3125

这里有个血泪经验:很多自己标注的数据集翻车就翻在归一化上。有人直接填像素坐标,训练时 loss 不降,排查半天才发现格式错了。YOLOv5 不会帮你自动转换,它默认你给的就是归一化值。

2.3 data.yaml 的 4 个必填字段

data.yaml是 YOLOv5 训练时的数据配置文件,2 类别焊缝数据集的最小配置如下:

# 数据集根路径,建议用绝对路径避免相对路径歧义 path: /home/user/weld_defect_dataset # 训练集和验证集的图片目录,相对于 path train: images/train val: images/val # 类别数量,焊缝数据集是 2 nc: 2 # 类别名称,顺序必须和标注文件里的 class_id 对应 names: 0: porosity # 气孔 1: crack # 裂纹

names里的顺序不能乱。如果标注时把气孔标为 0、裂纹标为 1,这里就必须一致。顺序搞反了,模型会把气孔预测成裂纹,mAP 看着还行但实际全错。nc必须等于names的条目数,写错了 YOLOv5 会在初始化检测头时直接抛维度不匹配的错误。

3. 用 YOLOv5 训练焊缝缺陷检测模型:从环境到推理的完整链路

3.1 环境准备与依赖安装

YOLOv5 对 PyTorch 版本有要求,建议用 Python 3.8 以上、PyTorch 1.8 以上。以下是经过验证的安装流程:

# 创建虚拟环境,避免污染系统 Python conda create -n weld_yolo python=3.8 -y conda activate weld_yolo # 安装 PyTorch,根据 CUDA 版本选择,这里以 CUDA 11.3 为例 pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 \ --extra-index-url https://download.pytorch.org/whl/cu113 # 克隆 YOLOv5 仓库(用官方仓库,不要用来路不明的 fork) git clone https://github.com/ultralytics/yolov5.git cd yolov5 # 安装依赖,requirements.txt 里锁定了兼容版本 pip install -r requirements.txt

安装完成后用python -c "import torch; print(torch.cuda.is_available())"验证 GPU 是否可用。返回True才能用 GPU 训练,否则会退到 CPU,训练时间从几小时变成几天。

3.2 用 train.py 启动训练:关键参数怎么设

YOLOv5 的训练入口是train.py,针对 2 类别焊缝数据集,我一般这样起命令:

python train.py \ --data /home/user/weld_defect_dataset/data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --workers 4 \ --device 0 \ --project runs/train \ --name weld_exp1 \ --exist-ok

逐项说明:

  • --data:指向你的data.yaml绝对路径,不要用相对路径,否则从不同目录启动会找不到文件。
  • --weights:预训练权重。焊缝数据集通常几千张,从yolov5s.pt开始比从头训练收敛快得多。如果显存够,可以换yolov5m.pt或yolov5l.pt,精度会高一些但速度慢。
  • --img 640:输入分辨率。焊缝缺陷通常比较小,640 是起点。如果缺陷在图中占比很小,可以提到 1280,但显存占用会翻倍。
  • --batch-size 16:批大小。显存 8G 用 16,11G 用 32,不够就往下调,调到不报 OOM 为止。
  • --epochs 100:2 类别任务通常 100~300 轮足够。看验证集 mAP 曲线,如果 50 轮后还在涨就继续加。
  • --workers 4:数据加载线程数。设成 CPU 核心数的一半左右,太多反而拖慢。
  • --device 0:用第 0 号 GPU。多卡用0,1。
  • --project和--name:输出目录,训练日志、权重、混淆矩阵都存这里。

训练启动后,终端会打印每轮的 box_loss、obj_loss、cls_loss 和验证集的 P、R、mAP@0.5。重点盯 mAP@0.5,如果 20 轮后还在 0.1 以下,大概率是数据格式或标注有问题,先回去检查 labels 目录。

3.3 训练过程监控与早停判断

YOLOv5 自带 TensorBoard 支持,训练时另开终端:

tensorboard --logdir runs/train

浏览器打开localhost:6006能看到 loss 曲线和 mAP 曲线。几个判断经验:

  • box_loss和obj_loss应该在前 10 轮快速下降,如果平着不动,检查学习率或数据标注。
  • mAP@0.5在 50 轮左右应该到 0.6 以上(焊缝 2 类别任务,数据质量正常的情况下)。如果卡在 0.3 以下,多半是类别不平衡或标注框太松。
  • 验证集 loss 开始上升而训练集 loss 还在降,就是过拟合了,加数据增强或减模型复杂度。

YOLOv5 默认没有早停,但可以用--patience参数,比如--patience 30表示 30 轮 mAP 没提升就停。这个参数能省不少电费。

3.4 推理验证:用 detect.py 看实际效果

训练完在runs/train/weld_exp1/weights/下会有best.pt和last.pt。用best.pt跑推理:

python detect.py \ --weights runs/train/weld_exp1/weights/best.pt \ --source /home/user/test_weld_images \ --img 640 \ --conf-thres 0.25 \ --iou-thres 0.45 \ --save-txt \ --project runs/detect \ --name weld_test
  • --source:可以是单张图、图片目录、视频文件或摄像头编号。
  • --conf-thres 0.25:置信度阈值。焊缝检测建议从 0.25 起调,漏检比误检代价高的话往下调到 0.15。
  • --iou-thres 0.45:NMS 的 IoU 阈值。缺陷框重叠多的话调到 0.5~0.6,避免把相邻缺陷合并。
  • --save-txt:把检测结果存成 YOLO 格式的 txt,方便后续做统计分析。

推理结果图存在runs/detect/weld_test/下,直接看框得准不准。如果发现大量漏检,先别急着调模型,把--conf-thres降到 0.1 看看是不是阈值卡太高了。

4. 焊缝缺陷检测的避坑指南:5 个真实翻车现场

4.1 现象:训练 loss 正常下降但 mAP 始终为 0

原因:data.yaml里的names顺序和标注文件里的class_id对不上。比如标注时气孔是 0、裂纹是 1,但 yaml 里写反了。模型学到的类别和验证时计算的类别错位,mAP 计算时匹配不上。

解决:打开几个标注 txt 文件,确认 class_id 的分布,然后和data.yaml的names逐条核对。最稳妥的办法是写个脚本统计所有标注文件里出现的 class_id 集合,确保和names的 key 完全一致。

4.2 现象:训练报错AssertionError: train and val directories do not exist

原因:data.yaml里的train和val路径写的是相对于path的相对路径,但path本身写错了,或者目录名大小写不一致(比如Imagesvsimages)。Linux 下大小写敏感,Windows 下不敏感,跨平台迁移时容易翻车。

解决:用ls逐级确认目录存在,path用绝对路径,train和val用相对于path的路径。如果还报错,在 Python 里import os; os.path.exists(...)打印一下实际解析的路径。

4.3 现象:显存溢出 OOM,batch-size 降到 1 还是报错

原因:--img设太大,或者模型选了yolov5x.pt这种大模型。焊缝图如果本身分辨率很高(比如 4000×3000),YOLOv5 会先 resize 到--img指定的大小,但数据加载时的内存占用仍然和原图尺寸相关。

解决:先把--img降到 416 跑通,确认不是代码问题后再逐步往上加。同时检查--workers是不是设太高导致内存爆了,降到 2 试试。如果必须用高分辨率,换yolov5s.pt并开--rect减少 padding。

4.4 现象:验证集 mAP 很高但实际推理漏检严重

原因:训练集和验证集是从同一批图里随机切的,分布太接近。实际产线上的焊缝图光照、角度、背景和训练集差异大,模型过拟合了训练集的特定模式。

解决:验证集要按时间、批次或设备来源划分,不要随机切。如果数据集本身来源单一,做交叉验证或者留出一部分完全不同工况的图做测试。另外检查--augment参数,推理时开增强能提升一些鲁棒性。

4.5 现象:标注框看起来对但训练后框偏移明显

原因:标注时用的工具(比如 labelImg)默认输出的是 Pascal VOC 的xmin, ymin, xmax, ymax格式,有人手动转 YOLO 格式时归一化算错了,或者忘了减 1(像素坐标从 0 开始还是从 1 开始)。

解决:写个校验脚本,把 YOLO 格式的标注反算回像素坐标,画到原图上肉眼检查。重点看框是不是正好套住缺陷。如果整体偏移一个固定值,就是坐标原点问题;如果框大小不对,就是宽高算错了。

5. 把 2 类别焊缝检测推到产线:进阶技巧与验证习惯

5.1 用混淆矩阵定位类别混淆

YOLOv5 训练完会在输出目录生成confusion_matrix.png。2 类别任务看这个矩阵特别直观:对角线是正确分类,非对角线是混淆。如果气孔和裂纹互相混淆严重,说明这两个类别的视觉特征在模型看来太接近。解决办法有两个:一是回去检查标注,是不是有些气孔被标成了裂纹;二是加更多难例,专门找那些模棱两可的图重新标。

5.2 用测试时增强(TTA)榨出最后几个点

推理时加--augment开启 TTA,模型会对同一张图做翻转、缩放等变换后综合结果。代价是推理速度慢 2~3 倍,但 mAP 通常能涨 1~3 个点。产线如果对节拍要求不苛刻,这个参数值得开。命令很简单:

python detect.py \ --weights runs/train/weld_exp1/weights/best.pt \ --source /home/user/test_weld_images \ --augment \ --conf-thres 0.2

5.3 导出 ONNX 做部署前的精度对齐

训练完的.pt权重不能直接上产线,通常要转成 ONNX 或 TensorRT。导出 ONNX:

python export.py \ --weights runs/train/weld_exp1/weights/best.pt \ --include onnx \ --img 640 \ --batch-size 1 \ --simplify

导出后务必做一件事:用同一张图分别跑 PyTorch 和 ONNX 推理,对比输出的框坐标和置信度。如果差异超过 1%,检查--img和--batch-size是否和导出时一致。ONNX 对动态 batch 的支持有时会引入数值误差,产线部署前这一步不能省。

5.4 我自己的验证习惯

每次训完一个焊缝模型,我不会只看 mAP 数字。我会从验证集里挑 20 张图,手动跑一遍推理,把结果图拼成一张大图,肉眼过一遍。重点看三类:漏检的、误检的、框歪的。漏检的图单独存一个文件夹,下次加数据时优先补这类场景。误检的图看是不是背景干扰,比如焊缝旁边的划痕被误判成裂纹。这个习惯帮我省了很多次「指标好看但上线翻车」的后悔药。

另外,data.yaml里的names我习惯用英文加注释,比如porosity # 气孔,这样换电脑或换人接手时不会因为中文编码问题翻车。标注文件我定期用脚本做完整性校验:每张图必须有对应的 txt,每个 txt 的行数不能为 0(除非是负样本),坐标值必须在 0~1 之间。这些检查写成脚本跑一遍只要几秒钟,但能挡住 90% 的低级错误。

焊缝缺陷检测这个方向,数据质量比模型结构重要得多。2 类别看起来简单,但工业场景的类内差异大、类间差异小,标注的一致性直接决定天花板。把数据格式吃透、把验证做扎实,比换更大的模型管用。希望帮到你。

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

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

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

立即咨询