
简介这份资源面向从事工业质检、缺陷检测方向的目标检测学习者与工程人员提供管道焊接缝缺陷检测数据集按YOLOV5目录格式整理可直接投入训练省去格式转换与标注清洗的繁琐环节。数据为800×800的RGB图像共2个类别good与bad覆盖合格与缺陷两类焊缝状态适合二分类检测任务与模型对比实验。压缩包内共1995个文件以jpg图像与同名txt标注为主另含1个可视化py脚本和1个png说明图整体约93.27MB训练集908张图片配908个标签验证集206张图片配206个标签划分清晰。可视化脚本随机传入一张图片即可绘制边界框并保存到当前目录无需修改即可运行便于快速核验标注质量。目前已有196人学习下载适合需要现成数据快速验证YOLO系列模型效果、搭建缺陷检测流程的读者参考使用。1. 管道焊缝缺陷检测数据集908 张训练图能跑出什么名堂管道焊接缝的缺陷检测在工业质检里属于典型的「小目标 高误检代价」场景。焊缝上一条几毫米的裂纹、一个气孔肉眼在强光下都未必看得清但一旦漏检后续打压测试直接爆管。这份数据集把问题简化成了最朴素的二分类good 和 bad。训练集 908 张图配 908 个 txt 标签验证集 206 张配 206 个全部是 800×800 的 RGB 图像按 YOLOV5 的目录格式组织总大小 94MB。拿到手不需要做格式转换改个 data.yaml 就能开训。适合谁手上已经有 YOLOv5 或 YOLOv8 训练环境、想快速验证焊缝缺陷检测可行性的工程师以及需要一个小规模工业缺陷数据集做课程设计或算法对比的从业者。它不解决「缺陷分类细化」的问题只回答一件事这张焊缝图里有没有缺陷。2. YOLOV5 目录结构与标签格式为什么拿到就能训2.1 目录树拆解与文件对应关系这份数据集的核心价值在于「零预处理」。YOLOV5 对数据集的目录结构有固定要求很多人在这一步翻车——图片和标签对不上、路径写错、类别索引从 1 开始导致训练时类别越界。先看它的实际组织方式datasets/ ├── images/ │ ├── train/ # 908 张 jpg │ └── val/ # 206 张 jpg ├── labels/ │ ├── train/ # 908 个 txt │ └── val/ # 206 个 txt └── data.yaml # 类别配置图片和标签是严格同名的IMG (1128).jpg对应IMG (1128).txt。YOLOv5 在加载时会把images路径替换成labels再找同名 txt所以文件名里带空格和括号不影响但如果你手动重命名时改了编号标签就丢了。训练集 908 对、验证集 206 对比例大约是 8:2对于二分类缺陷检测来说验证集 206 张够看出过拟合趋势但不够做精细的阈值调优。2.2 标签 txt 的归一化坐标与类别索引每个 txt 文件里是一行或多行标注格式为class_id x_center y_center width height全部是归一化到 0~1 的浮点数。这份数据集只有 2 类good 和 bad类别索引通常是 0 和 1。这里有一个高频翻车点如果你自己写脚本生成标签时把类别写成 1 和 2YOLOv5 训练时会报Label class 2 exceeds nc2。检查方法很简单# 统计所有标签文件里出现过的类别 id cat datasets/labels/train/*.txt | awk {print $1} | sort -u正常输出应该只有0和1。如果出现其他数字要么是类别定义错了要么是标签文件混入了其他数据集。另外注意YOLOv5 的标签里不允许出现空行或纯空格行有些标注工具导出时会留空行训练时虽然不报错但会浪费一个 batch 位置。2.3 data.yaml 的最小配置与路径陷阱YOLOv5 训练时必须指定一个 data.yaml里面至少包含train、val、nc、names四个字段。这份数据集没有附带 yaml需要自己写# data.yaml train: ../datasets/images/train val: ../datasets/images/val nc: 2 names: [good, bad]路径写法有两个坑。第一train和val指向的是图片目录不是标签目录YOLOv5 会自动推导标签路径。第二相对路径是相对于train.py的运行目录不是 yaml 文件所在目录。我一般直接用绝对路径省得排查半天「为什么找不到图片」。如果是在 Docker 里跑注意挂载路径要和 yaml 里一致否则会报No labels found。3. 从零跑通训练命令行参数与可视化验证3.1 环境准备与依赖版本YOLOv5 对 PyTorch 和 CUDA 版本比较敏感但这份数据集只有 1114 张图CPU 也能跑只是慢。常见做法是# 创建环境 conda create -n weld python3.9 conda activate weld # 安装 PyTorch根据你的 CUDA 版本选 pip install torch1.13.1 torchvision0.14.1 # 克隆 YOLOv5 git clone https://github.com/ultralytics/yolov5 cd yolov5 pip install -r requirements.txt注意不要用最新的 torch 2.x 配老版 YOLOv5有些算子会报ATen相关错误。如果只是验证数据集能不能用装 CPU 版 torch 就行训练 100 epoch 大概 20 分钟。3.2 启动训练关键参数怎么设python train.py \ --data data.yaml \ --weights yolov5s.pt \ --img 800 \ --batch-size 16 \ --epochs 100 \ --device 0 \ --project runs/weld \ --name exp1逐项说明--img 800必须和数据集分辨率一致YOLOv5 默认 640如果强行用 640 训练焊缝上的小缺陷会被缩放到几乎看不见。--batch-size 16在 8GB 显存下比较稳如果 OOM 就降到 8。--weights yolov5s.pt用预训练权重小数据集上从头训很容易过拟合。--epochs 100是起步值实际看 mAP 曲线如果 50 epoch 后验证集 mAP 还在涨可以加到 200。--device 0指定第一块 GPUCPU 训练改成--device cpu。训练过程中重点看三个指标train/box_loss是否稳定下降、val/box_loss有没有反弹、metrics/mAP_0.5的爬升趋势。如果 val loss 在 20 epoch 后开始上升而 train loss 继续降就是过拟合需要加数据增强或减模型复杂度。3.3 可视化脚本随机抽图验证标注质量数据集附带了一个可视化 py 文件随机传入一张图片就能画边界框并保存到当前目录。这个脚本的价值在于训练前先肉眼确认标签有没有画错。焊缝缺陷的标注尤其容易出问题——有些 bad 样本的框只框了缺陷的一部分有些 good 样本被误标了框。脚本无需更改直接运行python visualize.py它会在当前目录生成一张带框的图。我一般会跑 10 次每次随机抽一张重点看 bad 类的框是否完整覆盖缺陷区域。如果发现框明显偏移或漏标说明标签质量有问题这时候直接训练就是在拟合噪声。另一个用法是训练后拿预测结果和这个脚本画的 GT 框对比能快速判断模型是「没学好」还是「标签本身有问题」。4. 避坑与排查焊缝缺陷检测的五个血泪经验4.1 现象训练 loss 正常但 mAP 始终为 0原因类别索引和 names 顺序不匹配。YOLOv5 在计算 mAP 时会按 names 列表的顺序匹配类别如果标签里 0 是 bad、1 是 good但 yaml 里写的是[good, bad]模型学到的类别就反了验证时全部判错。解决用awk {print $1}统计标签类别分布确认 0 和 1 分别对应什么再改 names 顺序。4.2 现象验证集图片加载报错cannot identify image file原因图片文件名里的空格和括号在某些 OpenCV 版本下会被截断。IMG (1128).jpg在 Linux 下没问题但在 Windows 或某些 Docker 镜像里路径解析可能把空格当分隔符。解决批量重命名把空格和括号去掉# 在 images 和 labels 目录下分别执行 for f in *; do mv $f $(echo $f | tr -d ()); done注意图片和标签要同步重命名否则对不上。4.3 现象训练到一半报CUDA out of memory原因--img 800比默认 640 多占约 56% 显存加上 batch-size 168GB 卡容易爆。解决先降 batch-size 到 8如果还爆就开梯度累积--accumulate 2等效 batch-size 不变但显存占用减半。另一个办法是用--img 640训练但焊缝小缺陷的召回会明显下降不建议。4.4 现象验证集 mAP 很高但实际推理漏检严重原因验证集和训练集来自同一批数据分布206 张验证图可能和训练图拍摄条件高度相似。解决自己额外留 20~30 张不同光照、不同角度的焊缝图做测试集不要混入训练。如果测试集 mAP 比验证集低 15 个点以上说明模型泛化能力不足需要加更多数据增强--augment或换更大的模型。4.5 现象可视化脚本画出的框和实际缺陷位置对不上原因YOLO 格式的坐标是归一化的但可视化脚本可能按原图尺寸还原时用了错误的宽高。800×800 的图如果被 resize 过坐标还原就会偏。解决确认脚本里读取图片后没有做 resize直接用cv2.imread的原始尺寸乘归一化坐标。如果脚本里写了cv2.resize(img, (640,640))把这一行删掉。5. 进阶技巧用 206 张验证图做阈值调优与模型导出5.1 置信度阈值与 IoU 阈值的联合调参YOLOv5 默认推理阈值是--conf-thres 0.25、--iou-thres 0.45。在焊缝缺陷检测里bad 类的漏检代价远高于误检所以应该降低 conf 阈值提高召回。我一般会跑一组对比# 在验证集上批量测试不同阈值组合 for conf in 0.1 0.15 0.2 0.25; do for iou in 0.4 0.45 0.5; do python val.py --data data.yaml --weights runs/weld/exp1/weights/best.pt \ --img 800 --conf-thres $conf --iou-thres $iou --task val done done重点看metrics/precision和metrics/recall的平衡。如果 recall 低于 0.85继续降 conf 到 0.1如果 precision 掉到 0.6 以下说明误检太多需要检查 good 类里是不是混入了标注错误的 bad 样本。206 张验证图虽然不多但足够看出阈值变化的趋势。5.2 导出 ONNX 与推理速度测试训练完成后导出 ONNX 方便部署到 C 或边缘设备python export.py --weights runs/weld/exp1/weights/best.pt \ --include onnx --img 800 --batch 1导出后可以用onnxruntime测单张推理耗时import onnxruntime as ort import numpy as np import time sess ort.InferenceSession(best.onnx) img np.random.randn(1, 3, 800, 800).astype(np.float32) # 预热 for _ in range(5): sess.run(None, {images: img}) # 计时 start time.time() for _ in range(50): sess.run(None, {images: img}) print(f平均耗时: {(time.time()-start)/50*1000:.1f} ms)800×800 输入在 RTX 3060 上大约 12~15msCPU 上 80~120ms。如果部署到树莓派这类设备建议先导出 FP16 或 INT8但要注意焊缝小缺陷的精度损失量化后一定要用验证集重新跑一遍 mAP。5.3 一个习惯训练前先跑一遍标签检查脚本从那以后我每次拿到新数据集都强制走一遍标签检查统计类别分布、检查空标签文件、确认图片和标签数量一致、随机抽 10 张可视化。这份数据集虽然标称 908206 对但实际用的时候还是自己数一遍最踏实。尤其是工业缺陷数据标注质量参差不齐花 10 分钟检查能省下几小时的无用训练。希望帮到你。本文还有配套的精品资源点击获取