简介为训练和评估焊缝质量检测模型而整理的YOLO格式数据集面向目标检测开发人员、科研人员及机器视觉学习者适用于焊接接头自动识别、缺陷分类等工业质检场景。压缩包共3403个文件包含1134张JPG焊缝图像、1134个YOLO格式的TXT标注文件以及1134个VOC格式的XML标注文件整体约105.86MB。其中TXT标签描述边界框位置与类别XML文件提供额外结构化信息可直接用于YOLO系列模型的训练、验证与测试。已有2366人学习下载资源覆盖面较广。利用该数据集可完成从训练集/验证集划分、数据增强到mAP、召回率等指标评估的全流程实践帮助构建自动化、高效率的焊缝质检方案推动智能制造的落地。1. YOLO焊缝检测数据集这份 zip 里装的不是图片是能直接开训的标注资产做焊缝 X 光缺陷检测的人应该都有同感模型结构不是瓶颈标注数据才是。一个缺陷类别动辄要标几千张底片气孔、夹渣、未熔合、裂纹这些缺陷在 200 分辨率的灰度图里往往只有几十个像素标起来又费眼又费时间。这份名为 dataset-11 的 YOLO 焊缝检测数据集解压后就是一套 YOLO 格式的完整训练包——图像、txt 标签、类别定义都按 YOLO 的训练约定排好了拿来就能对接 YOLOv5、YOLOv8 或 YOLOv11 的训练入口。它解决的核心问题是跳过从零标注的漫长阶段直接进入模型验证和参数调优。适合刚接触 YOLO 目标检测的学生、需要快速验证焊缝缺陷检测方案的算法工程师以及想用真实工业图像评估 YOLO 系列模型效果的从业者。2. 拆包看结构dataset-11 的文件布局与 YOLO 标注真相2.1 解压后的目录长什么样images 和 labels 的对应关系拿到 zip 后第一步是解压并检查目录结构。YOLO 数据集的目录约定非常固定train 和 val 下分别有 images 和 labels 两个子目录images 放原始图像labels 放同名 txt 标注文件。标注文件文件名与图像文件名完全一致只是扩展名从 .jpg 变成 .txt。这个对应关系是 YOLO 训练脚本的硬性约定任何一张图如果没有对应的 txt 文件训练时会被直接跳过。我一般会用下面的命令快速校验解压后的目录结构unzip dataset-11.zip -d weld_dataset cd weld_dataset find . -type d | sort ls train/images | head -5 ls train/labels | head -5unzip 解压后通过 find 列出所有子目录确认 train 和 val 下是否都有 images 和 labels。ls 查看文件名时注意对比 images 和 labels 下的文件名是否一一对应比如 train/images/0001.jpg 对应 train/labels/0001.txt。如果发现 labels 下文件数量比 images 少说明有缺标注的图这类图在训练中会被静默跳过但会造成训练样本数量的隐性缩水。接下来检查 labels 目录下的 txt 内容。YOLO 格式的每一行代表一个目标框格式为类别 id、归一化中心 x、归一化中心 y、归一化宽度 w、归一化高度 h。前四个是浮点数归一化指的是除以图像的宽和高。用 head 命令看一个标注文件的实际内容head -3 train/labels/0001.txt如果看到类似0 0.4521 0.6234 0.1532 0.0877这样的行说明标注格式正常。类别 id 是整数从 0 开始递增。如果遇到空 txt 文件说明这张图没有任何缺陷标注这类文件是否保留要根据实际需求决定——统一保留会让模型学到“这张图没有目标”的背景信息删除则会让训练集更纯粹。2.2 用脚本核对标注质量类别 id、坐标归一化与越界检测目录结构只是第一步标注质量才是决定模型上限的变量。YOLO 官方训练代码对标注格式有一定容忍度但坐标越界、类别 id 超出范围这类问题不会直接报错而是默默影响损失计算和检测效果。我每拿到一个新数据集都会先写一段 Python 脚本做标注质量体检。import os def check_yolo_labels(label_dir, img_dir, num_classes): issues [] for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue img_name fname.replace(.txt, .jpg) img_path os.path.join(img_dir, img_name) if not os.path.exists(img_path): issues.append(fmissing image: {img_name}) continue img_w, img_h 640, 640 # 实际应从图像读取此处为占位 with open(os.path.join(label_dir, fname), r) as f: lines f.readlines() if len(lines) 0: issues.append(fempty label: {fname}) continue for line in lines: parts line.strip().split() if len(parts) ! 5: issues.append(fbad format: {fname} - {line}) continue cls_id int(parts[0]) x_c, y_c, w, h map(float, parts[1:]) if cls_id num_classes: issues.append(fclass id out of range: {fname} - {cls_id}) if x_c 0 or x_c 1 or y_c 0 or y_c 1: issues.append(fcenter out of bounds: {fname}) if w 0 or h 0: issues.append(fnon-positive size: {fname}) return issues issues check_yolo_labels(train/labels, train/images, num_classes2) print(ffound {len(issues)} issues) for issue in issues[:20]: print(issue)这段脚本的核心逻辑是遍历 labels 目录下所有 txt 文件逐一校验格式完整性、类别 id 是否越界、中心坐标是否在 [0,1] 区间内、宽高是否为正。脚本里的 img_w 和 img_h 我做了占位处理实际使用时应该用 PIL 或 cv2 读取真实图像尺寸做精确校验。越界标注的常见原因是标注工具导出时没有按图像尺寸归一化或者标注过程中误操作导致框超出图像边界这类数据混进训练集会让模型在推理时预测出大量超出图像边界的框。2.3 数据分布与样本量评估先看类别统计再决定要不要改校验完格式后还需要统计类别分布和每类的样本量。焊缝缺陷检测的特殊性在于缺陷类别天然不均衡——气孔往往占了大头而裂纹这类严重缺陷数量很少。如果直接拿原始分布去训练模型会严重偏向样本量大的类别小样本类别的召回率会非常低。from collections import Counter def count_classes(label_dir): counter Counter() for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue with open(os.path.join(label_dir, fname), r) as f: for line in f: parts line.strip().split() if len(parts) 5: counter[int(parts[0])] 1 return counter train_counter count_classes(train/labels) val_counter count_classes(val/labels) print(train class distribution:, dict(train_counter)) print(val class distribution:, dict(val_counter))这段统计代码把所有标注文件中的类别 id 逐行累加得到每个类别在 train 和 val 中的实例数量。拿到统计结果后重点关注两点一是类别数量是否与数据集的类别定义一致比如定义为 2 类但统计出来只有 1 类有标注说明某个类别的样本被漏标或文件名映射出错二是 train 和 val 的分布比例是否接近如果 val 中某个类别的占比和 train 相差悬殊验证结果就不具备参考意义。实际训练中样本不均衡的处理方式有几种按类别加权损失、对尾部类别做过采样、或者用 mosa 增强让模型在小样本类别的学习上获得更多迭代机会。这些决策都要建立在准确的分布统计之上所以不要跳过这一步。3. 把数据集喂给 YOLO数据 YAML、预训练权重与训练超参数3.1 数据 YAML 的写法与路径陷阱YOLO 系列训练入口统一要求一个 YAML 配置文件来声明数据集的路径、类别名称和类别数量。这个文件看起来简单却是很多人第一次跑训练就翻车的地方。常见错误包括路径写错、类别名和标注中的类别 id 不对应、以及使用相对路径时启动目录不一致导致找不到数据集。# dataset.yaml path: /abs/path/to/weld_dataset # 数据集根目录建议写绝对路径 train: train/images val: val/images names: 0: porosity 1: slagpath 字段指向数据集根目录train 和 val 是相对 path 的图像目录路径。names 从 0 开始按顺序列出类别名这个顺序必须和标签文件里的类别 id 顺序完全一致。如果数据集里标注的类别 id 0 是气孔names 里 0 就必须对应气孔否则训练不会报错但测试输出的类别标签会错位。我习惯把命名规范写成类别id_类别名的对照表贴在项目 README 里。YOLOv5 和 YOLOv8 对 YAML 的解析有些微差别v5 需要显式指定 nc 参数v8 会自动从 names 列表长度推断。如果两个版本切换使用建议都把名称写在文件名开头。3.2 预训练权重选 coco 还是从头训迁移学习的边界焊缝 X 光图像和 COCO 数据集里的自然图像差异极大灰度、低对比度、纹理特征完全不同。这个差异直接影响预训练权重的选择策略。一种做法是用 COCO 预训练权重做微调让模型在初期就具备基础特征提取能力另一种做法是放弃预训练权重从零开始训练避免源域特征对工业灰度图像的干扰。从结果看焊缝检测场景中 COCO 预训练权重带来的增益不如自然场景明显。因为底层卷积核学到的是自然图像的边缘、纹理、颜色特征而 X 光底片是单通道灰度图颜色特征完全派不上用场。但 COCO 预训练权重也不是完全没有价值它让模型在早期就具备较强的梯度流动能力训练收敛速度比从零开始快 20% 到 30%。我一般会先跑一个从零训练的小实验做 baseline再用 coco 预训练权重跑相同配置对比前 20 个 epoch 的 loss 下降曲线。如果两者差距不大就优先用 COCO 预训练权重白拿的收敛速度没有必要放弃。注意 YOLOv8 的预训练权重文件名是 yolo11n.pt、yolov8n.pt 这类格式下载后放在项目根目录或指定路径训练时会自动加载。3.3 训练超参数图像尺寸、batch、epoch 和损失函数的取舍焊缝缺陷尺寸普遍较小气孔可能只有十几个像素。YOLO 默认的训练尺寸是 640x640但对于小目标检测常见做法是提高输入分辨率到 1024 或 1280让模型有更多像素可以提取缺陷特征。代价是显存占用和训练时间同步上升。在 V100 16GB 或 24GB 显存条件下yolov8n 在 1024 分辨率下 batch size 可以开到 16 到 32yolov8m 则建议降到 8 到 16。yolo train datadataset.yaml modelyolov8n.pt epochs200 imgsz1024 batch16 device0训练命令的关键参数含义data 指向 3.1 节中的 YAML 文件model 指定基础模型结构或预训练权重epochs 在焊缝缺陷数据上通常需要 150 到 300 轮才能充分收敛imgsz 是训练图像尺寸batch 受显存限制而设的批量大小device0 指定用第一块 GPU。如果显存不足不要直接把 batch 降得太低这会显著影响 BatchNorm 统计量的稳定性。正确做法是先降低 imgsz 到 896或者启用 YOLO 的自动混合精度训练。损失函数方面YOLOv8 默认使用 CIoU 作为框回归损失配合分类的 BCE 损失。对焊缝这种类别不均衡的场景可以调高分类损失的权重比例这在 YOLOv8 的 loss 配置项里有对应参数不过新手先用默认就好等 baseline 建立后再动。4. 避坑YOLO 焊缝数据集最常见的 5 个坑4.1 类别 id 错位没报错但结果全错现象训练正常完成mAP 也很高但验证集输出的类别名和实际缺陷类型完全不搭。比如推理结果把气孔识别成夹渣而且持续稳定地错。原因数据集的类别定义顺序和训练 YAML 中 names 的排列顺序不一致。标签文件里类别 id 0 代表气孔但 YAML 里 names[0] 写成了夹渣模型学到的是 id 和缺陷类型之间的错误映射。解决训练前用 2.3 节的统计脚本打印类别 id 分布再人工抽查每个 id 对应的图像内容确认 id 与类别名的对应关系无误后再写 YAML。不要信任任何第三方工具自动生成的 names 排序。4.2 标注框越界导致 loss 异常现象训练前期的 box_loss 奇高且下降速度极慢甚至出现 lossnan 的崩溃情况。原因2.2 节提到的坐标越界问题。当某个标注框的中心坐标或宽高超出 [0,1] 区间时YOLO 在计算 IoU 时会产生异常值导致损失值溢出。特别是标注框大面积超出图像边界时归一化坐标会变得极其不合理。解决先跑 2.2 节的校验脚本列出问题标注然后做清洗。对越界轻微的框把坐标裁剪到 [0,1] 区间内对越界严重的标注比如中心点落在图像外直接删除该标注并复核对应图像。这类问题标注一般集中在少数几张图上清洗成本不高但对训练稳定性的改善非常明显。4.3 类别严重不均衡大类别吞掉小类别现象训练后气孔的 AP 很高裂纹的 AP 接近零。验证集上几乎检测不到裂纹即使裂纹在图像里清晰可见。原因焊缝缺陷天然不均衡气孔样本可能是裂纹的上百倍。模型在大量气孔标注的梯度更新下把注意力全部集中在气孔特征上裂纹类别的特征表达被压制。解决采用两阶段策略。第一阶段用全部数据训练 baseline拿到各类别的 AP 指标第二阶段对尾部类别做针对性增强具体做法是把尾部类别的样本复制 3 到 5 份混入训练集或者对这些样本使用更强的 mosaic 和随机仿射增强。注意不要在训练集之外额外引入没有 label 增强的原始图片这不会给小样本类别带来增益。4.4 zip 解压路径带中文导致数据加载失败现象训练脚本启动时报找不到图像文件但手动打开路径明明存在。原因部分 YOLO 版本在 Windows 下对路径编码处理不够健壮中文路径或包含特殊字符的路径会导致图像的 glob 匹配失败。解压时如果父级目录带了中文torchvision 的读图接口在某些环境下会报文件不存在尽管实际文件就在那里。解决解压和训练路径全部用纯英文目录比如 D:\yolo_projects\weld_dataset。这是 Windows 下最省心的做法没有之一。Linux 下问题不大但团队协作时统一路径规范仍然值得养成习惯。4.5 BN 崩溃与梯度爆炸先查学习率再查数据现象训练到几十个 epoch 时 loss 突然飙升到 nan之后无法恢复。原因焊缝图像对比度低模型在训练后期可能出现 BatchNorm 统计量漂移叠加学习率设置不当引发梯度爆炸。焊缝数据集规模通常不大过大的学习率会让模型在收敛后期震荡过大。解决先把初始学习率从默认的 0.01 降到 0.002 到 0.005观察 loss 曲线是否平稳。如果仍然崩溃检查训练集是否混入了纯黑或纯白图像——这类图像输入 BN 层时会产生极端的归一化输出实操中这类坏数据是 BN 崩溃的最大嫌疑。5. 验证与选型用混淆矩阵和 mAP 决定模型去留训练完成后不要只看总的 mAP一定要拆到每个类别看 AP。焊缝缺陷检测的难点在小目标和不均衡总 mAP 高有时候只是气孔一个类别撑起来的。用 YOLO 自带的 val 命令输出每个类别的 AP 和混淆矩阵这一步是决定模型能否落地的关键。yolo detect val modelruns/train/exp/weights/best.pt datadataset.yaml imgsz1024观察混淆矩阵时注意一个反直觉的细节矩阵中各行的总和可能不等于 1这不是 bug而是置信度阈值过滤后部分预测框被丢弃导致的统计结果。这个现象说明模型对某些类别的预测信心中位数偏低有调整置信度阈值的空间。工业部署场景中对裂纹这类安全关键缺陷宁可把阈值调低换取更高召回也不要为了追求精确度而漏检。模型选型上我的习惯是拿 yolov8n、yolov8s 和 yolov11n 各跑一个短实验对比小目标召回率。yolov8n 推理速度快但在裂纹这类极小目标上表现往往不如 yolov11n。如果样本量不足 2000 张不要直接上 yolov8x 这类大模型过拟合的风险远大于精度收益。那次做焊缝气孔检测翻车之后我每次拿到新数据集都强制走一遍标注体检、类别统计、短实验对比三步流程再急都不跳。希望帮到你。本文还有配套的精品资源点击获取