
简介面向YOLO系列算法在工业焊缝质量检测场景中的目标检测数据集适合算法工程师、学生快速上手训练与验证。内含131张jpg原图标注焊接不良与焊接良好两个类别已划分好训练验证集并附带data.yaml配置文件可直接用于YOLOv5、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11等常见框架。压缩包共394个文件除原图外还有txt格式的yolo标签和xml格式的voc标签各131个便于在不同标注工具与训练流程间切换另含1个yaml配置整体仅7.12MB轻量易下载。目前已有229人学习下载。数据集标签格式规范yolo标签中说明了类别索引以及中心点、宽高的归一化坐标含义有助于理解目标检测标注规则、降低上手门槛资源规模不大但类别均衡可快速跑通检测流程也可用作焊缝质量检测入门练习或迁移学习的基础数据。数据划分合理、注释清晰开箱即用。1. 131 张图做焊缝二分类YOLO 在这个场景下的真实角色焊缝质量检测在工业视觉里是个典型的“小而专”落地场景管道、压力容器、钢结构现场拍回来的 X 光片或红外图往往只有几百张正负样本比例还不均匀。拿到标题里这个「yolo算法-焊缝质量检测数据集-131张图像带标签-焊接不良-焊接良好.zip」先别被数字吓住——131 张图训练一个二分类检测模型在 2025 年的 YOLO 生态里完全做得起关键不在“多”而在“怎么组织标注、怎么设训练策略、怎么用小样本把过拟合摁住”。这篇就按我平时接到这类数据集的标准流程走一遍格式怎么整理、模型选哪个、参数设多少、训练完拿什么指标说话。适合手里刚拿到焊缝图、想快速出一版可演示模型的质检工程师或算法工程师如果你以为 131 张图必须堆到几千张才能训看完这篇大概会换个思路。2. 焊缝数据集的 YOLO 格式整理目录、标签映射与校验脚本2.1 131 张图的目录结构长什么样无论是 yolov5、yolov8 还是 mmrotate 系工具消费一个带标签数据集的第一步都是先把文件摆成约定目录。常见做法是images/与labels/同级子集拆成train/、val/。焊缝数据集里只有两个类别——焊接不良、焊接良好建议标签映射固定为0: weld_defect不良、1: weld_ok良好。类别顺序一旦进入训练就不能再改否则权重文件里的类别索引全错。weld_dataset/ ├── images/ │ ├── train/ │ │ ├── weld_001.jpg │ │ └── ... │ └── val/ │ ├── weld_120.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── weld_001.txt │ │ └── ... │ └── val/ │ └── weld_120.txt ├── data.yaml └── classes.txt这段命令展示的是我整理此类数据集的基线布局。data.yaml是训练入口配置必须包含path、train、val、nc、names五个键classes.txt供标注工具读取两行内容对应上述映射。注意标注文件名与图像文件名必须严格一致仅扩展名不同YOLO 系工具通过前缀匹配定位 txt。2.2 txt 标注的归一化坐标结构与常见错误YOLO 格式的每一行标注是class_id center_x center_y width height全部基于图像宽高做归一化取值区间为 0.0 到 1.0。例如一条焊接不良标注0 0.5138 0.4721 0.1267 0.3983这表示类别是 0weld_defect目标框中心位于图像横向 51.38%、纵向 47.21% 处框宽占图像宽 12.67%、高占图像高 39.83%。对焊缝这种细长缺陷形态宽高比经常达到 1:3 甚至更高手动标注时容易把框画得过紧导致宽高为 0后面处理时要不做校验训练会出现 loss 为 nan。import os label_dir weld_dataset/labels/train for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f), r) as fp: lines fp.readlines() for line in lines: parts line.strip().split() if len(parts) ! 5: print(f{f} 格式异常: {line.strip()}) continue cid, cx, cy, w, h parts cx, cy, w, h map(float, (cx, cy, w, h)) if w 0 or h 0: print(f{f} 含零宽高: {line.strip()}) if cx - w/2 0 or cx w/2 1 or cy - h/2 0 or cy h/2 1: print(f{f} 坐标越界: {line.strip()})这段脚本遍历训练标签逐个检查每行标注的类别数、宽高正值与是否越出图像边界。核心筛选顺序是先看字段数量是否等于 5排除空行与多空格污染再检测宽高是否为非正数防止后续计算 IoU 除零最后做边界检查捕获标注工具导出偏移。对于 131 张的小数据集任何一条异常标注都会显著影响最终 mAP这类脚本必须最先跑。2.3 把 131 张图拆出满足 yolov5 要求的训练集与验证集131 张图像不能直接全部丢进训练验证集至少要保留 15% 到 20%否则调阈值时没有依据。我一般按照stratified split逻辑确保两个类别在 train 与 val 中的比例接近全局分布。python -c import random, shutil, os from collections import defaultdict imgs [f for f in os.listdir(weld_dataset/images) if f.endswith(.jpg)] meta defaultdict(list) for f in imgs: label_file os.path.join(weld_dataset/labels, f.replace(.jpg, .txt)) with open(label_file) as fp: cats set(l.split()[0] for l in fp if l.strip()) meta[tuple(sorted(cats))].append(f) random.seed(42) train_imgs, val_imgs [], [] for cat, files in meta.items(): random.shuffle(files) val_n max(1, round(len(files) * 0.2)) val_imgs files[:val_n] train_imgs files[val_n:] print(len(train_imgs), len(val_imgs)) 脚本按“图像包含的类别组合”做分组再在组内按 20% 抽取验证样本。这样避免了随机切分可能导致的某类只在训练或只在验证中出现。random.seed(42)保证可复现后续换模型或调参时对比结果才有效。3. 焊接不良检测的 YOLO 训练配置模型选型与超参数对照3.1 小样本二分类下选 yolov5s 还是 yolov8n焊缝缺陷检测的目标框大且形态显著区别于遥感影像里密密麻麻的小目标不需要依赖大感受野或超高分辨率输入。131 张图的规模决定了我们更怕过拟合而不是欠拟合。综合对比yolov5s在社区资源、部署兼容性上更稳而yolov8n在训练 pipeline 里自带更多增强策略对尺寸变化更鲁棒。对比项yolov5syolov8n模型参数量7.2M3.2M默认输入尺寸640640内置 mosaic 增强支持支持且默认开启训练收敛速度较慢更快端侧部署支持极广较好对焊缝检测这类类别少、目标尺度集中、工业现场往往用 GPU 而非边缘盒子的场景两者都可用。但yolov8n参数量少一半在小数据集上更不容易把噪声特征学进去。3.2 基于 131 张图像训练焊缝二分类的完整命令安装好 ultralytics 后训练命令的形态如下yolo detect train \ data/path/to/weld_dataset/data.yaml \ modelyolov8n.pt \ epochs300 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ momentum0.937 \ weight_decay0.0005 \ patience50 \ cacheTrue \ projectweld_runs \ nameexp_weld逐项说明参数意图epochs300不是真的期望跑满 300 轮而是给足上限配合patience50在验证集指标连续 50 轮不提升时自动早停。batch16基于 131 张图训练集约 105 张每个 epoch 约 7 个 stepbatch 再大会导致每轮权重更新次数过少难以收敛。lr00.01是 SGD 系优化器在 8 卡环境下的常用值单卡小数据集建议下调到 0.005 更稳。cacheTrue将图像一次性载入显存或内存省去每轮磁盘 IO这对小数据集尤其重要131 张图全部缓存所占空间按 640×640 JPEG 算通常在几十 MB 级别。3.3 data.yaml 的针对性写法与类别权重处理path: /abs/path/to/weld_dataset train: images/train val: images/val nc: 2 names: 0: weld_defect 1: weld_okpath建议写绝对路径避免不同工作目录启动训练时相对路径解析失败。焊接不良与焊接良好两个类别如果数量差异超过 3:1就需要在loss层面给予少样本类别更高权重——不过 131 张图若二分类各占一半左右保持默认即可。注意names的索引值与标注 txt 里的 class_id 严格对应反了会导致模型把不良学成良好推理结果完全颠倒。from collections import Counter def count_classes(label_dir): counter Counter() import os for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f)) as fp: for line in fp: if line.strip(): counter[int(line.split()[0])] 1 return counter print(count_classes(weld_dataset/labels/train))这个计数脚本在训练前运行输出形如Counter({0: 68, 1: 82})的结果用于决定是否开启类别平衡采样。如果发现焊接不良只有 20 个框而焊接良好有 90 个框就需要在训练配置里开启class_weights或采用过采样。4. 小样本焊缝数据集的防过拟合增强策略、迁移学习与多模态融合视角4.1 为什么 mosaic 和 mixup 在 105 张训练图上要谨慎启用YOLOv8 默认开启 mosaic 增强把 4 张图拼成一张训练样本。这个策略对目标检测有明显收益但也带来两个副作用一是拼接后目标尺度被压缩焊缝这种长条状目标在 mosaic 中可能缩到 20×60 像素以下丢失关键纹理特征二是 131 张图经过 mosaic 后模型看到的“组合场景”与真实产线单张图像分布偏移。常见做法是把mosaic概率从默认的 1.0 降到 0.5 或 0.3mixup从默认 0.0 视情况开启到 0.2。# ultralytics 的增强参数可直接写入训练配置 mosaic: 0.5 mixup: 0.1 hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 0.0 translate: 0.1 scale: 0.5 fliplr: 0.5hsv_h/s/v分别控制色调、饱和度、亮度的随机扰动幅度。焊缝 X 光图中灰度占主导把hsv_s调高意义不大如果是红外或可见光焊缝图hsv_h0.015的小扰动可以模拟不同焊材的轻微色差。degrees0.0表示不做旋转增强——焊缝缺陷方向往往有物理意义如横向裂纹 vs 纵向未熔透随意旋转会破坏标签语义。fliplr0.5水平翻转对多数焊缝场景安全但要注意标注框随图像同步翻转的逻辑在 YOLO 中是自动处理的。4.2 加载预训练权重并冻结 backbone 的训练策略针对 131 张图这种规模从头训练 YOLO 几乎不可能收敛到可用指标。加载 COCO 预训练权重是标准起手式。使用方式有两种# 方式一加载 COCO 预训练权重仅适配 2 类输出头 yolo detect train \ data/path/to/weld_dataset/data.yaml \ modelyolov8n.pt \ epochs300 \ freeze10freeze10表示冻结前 10 层backbone 部分的权重只训练 neck 和 head。这个策略适合焊缝缺陷与 COCO 类别在底层纹理上有共享特征边缘、纹理、梯度的场景防止小数据集把 backbone 带偏。训练 50 轮后可以解冻全部层以更低学习率微调。# 方式二在训练脚本中按轮次动态解冻 from ultralytics import YOLO model YOLO(yolov8n.pt) for epoch in range(1, 301): if epoch 1: for param in model.model.model[:10].parameters(): param.requires_grad False elif epoch 51: for param in model.model.model[:10].parameters(): param.requires_grad True # 这里省略实际训练循环生产环境用命令行配置更省事方式二的控制粒度更细但平时跑实验我倾向于直接用freeze参数少写代码少出错。冻结 backbone 时观察 loss 曲线如果训练 50 轮后box_loss仍在下降且验证集 mAP 同步上升说明特征提取已经足够解冻后用小学习率微调如果冻结状态下验证 mAP 停滞超过 30 轮应提前解冻或换更大的预训练模型。4.3 外部数据集与职业安全场景的迁移边界提醒热词里出现“施工安全数据集”“桥墩病害数据集”这类数据源注意别与焊缝质量检测混淆。它们的共性是“工业场景缺陷检测”但成像模态、缺陷形态、背景纹理差异极大。用 131 张焊缝图做迁移学习时源域应为通用目标检测数据集COCO 或 Objects365而非另一个垂类检测数据集。垂类数据集的预训练权重稀疏迁移收益不稳定。5. 焊缝检测模型的评估口径与落地部署要点5.1 混淆矩阵与置信度阈值选取二分类目标检测的评估不能只看 mAP。焊缝场景中“焊接不良被漏检”的代价远高于“焊接良好被误报”因为漏检直接流向安全风险而误报只是增加人工复检量。训练完成后运行yolo predict \ modelruns/detect/exp_weld/weights/best.pt \ source/path/to/weld_dataset/images/val \ conf0.25 \ save_txtTrue \ save_confTrueconf0.25是默认阈值但在生产线落地时要根据混淆矩阵重新标定。观察每个验证图像输出的conf值统计weld_defect类别的置信度分布选取能让 recall 达到 0.95 的最低阈值。比如某验证样本中不良焊缝的置信度集中在 0.4 到 0.9 之间而良好焊缝的误检集中在 0.2 到 0.45阈值设在 0.45 较合适。这是一个工程决策不是模型训练能自动替你完成的。import numpy as np def find_threshold(scores, labels, target_recall0.95): order np.argsort(-scores) tp 0 total_pos sum(labels) for i, idx in enumerate(order): if labels[idx] 1: tp 1 recall tp / total_pos if recall target_recall: return scores[idx] return 0.0这段脚本输入所有验证样本的置信度分数与真实标签按分数降序遍历找到第一个让正样本召回率达到 95% 的分数作为阈值。它的核心逻辑等价于 PR 曲线上目标 recall 对应的 precision 点。注意这只是一个粗略的阈值建议如果样本量不足 50 个正样本95% 召回阈值可能极端偏低需要人工复核。5.2 导出为 ONNX 并在产线环境推理实验确认指标后导出部署格式是常规操作。YOLOv8 直接支持 ONNX 导出yolo export \ modelruns/detect/exp_weld/weights/best.pt \ formatonnx \ imgsz640 \ simplifyTruesimplifyTrue通过onnx-simplifier 消除冗余算子减少推理耗时。导出后的 ONNX 文件用 ONNXRuntime 或 TensorRT 部署在工业相机端到端推理通常在 10-30 毫秒量级视 GPU 而定。焊缝检测的产线部署不同于学术竞赛输入图像的分辨率、相机曝光参数与训练数据不一致时推理前需要做归一化预处理匹配YOLO 默认除以 255 归一化若现场图像是 12 位深紫外成像需要先转为 8 位再送模型。5.3 用 A/B 验证持续迭代数据集131 张图训练出的模型只能作为 v1 基线。部署后的正确迭代方式是将现场推理结果中置信度在 0.4 到 0.6 之间的“犹豫样本”定期抽样保存人工标注后并入训练集。每两周追加 20-30 张图比一次性堆到 500 张再训练更可控。模型更新的评价口径应与初始验证集保持一致避免换数据集导致指标不可比。本文还有配套的精品资源点击获取