工业焊缝场景 焊缝缺陷数据集 6400张图片 支持YOLO格式 YOLO模型如何训练焊缝缺陷检测数据集
焊缝缺陷数据集 6400张图片 支持YOLO格式
图片清晰,带标注,直接可以用YOLO系列模型训练
适合做焊缝检测、裂纹、孔洞、飞溅、焊接线等目标识别
标注:
Crack 裂纹
Porosity 气孔
Spatters 焊渣
Welding line 熔接线
焊缝缺陷目标检测数据集 完整说明 + YOLO训练代码
一、数据集核心信息表
| 项目 | 详情 |
|---|---|
| 数据总量 | 6400张 工业焊缝实拍图像 |
| 标注格式 | 标准YOLO .txt 格式,每张图对应同名标签文件 |
| 目标类别 | 4类焊缝缺陷+1类焊接线,共4个检测类别 |
| 适用场景 | 工业焊缝质量检测、缺陷识别、智能制造项目、学业研究实验 |
| 图像特点 | 工业现场实拍,覆盖不同光照、角度、焊缝类型,画面清晰,缺陷特征明确 |
| 数据划分 | 推荐训练集:验证集:测试集 = 8:1:1,可直接使用预设划分 |
| 适配模型 | YOLOv5/YOLOv8/YOLOv11 全系列目标检测模型 |
二、数据集类别详情表
| 类别ID | 英文名称 | 中文名称 | 检测目标 |
|---|---|---|---|
| 0 | Crack | 裂纹 | 焊缝表面的裂纹、开裂缺陷 |
| 1 | Porosity | 气孔 | 焊缝内部/表面的气孔、空洞缺陷 |
| 2 | Spatters | 焊渣/飞溅 | 焊缝表面的焊渣、焊接飞溅物 |
| 3 | Welding line | 熔接线/焊缝 | 焊缝的熔合线、焊接轨迹 |
三、标注格式说明表
| 格式类型 | 规则说明 | 示例 |
|---|---|---|
| YOLO TXT | 每行格式:类别ID x y w h,坐标为归一化值(0-1之间),顺序为:类别ID、中心点x、中心点y、宽度w、高度h | 0 0.425 0.318 0.224 0.196(裂纹)1 0.510 0.422 0.081 0.075(气孔) |
| VOC XML | (可选兼容)标准PASCAL VOC格式,包含图片尺寸、目标边界框、类别名称 | 见下方格式转换脚本 |
四、数据集目录结构(标准YOLO格式)
weld_defect_dataset/ ├── images/ │ ├── train/ # 训练集图片(约5120张) │ ├── val/ # 验证集图片(约640张) │ └── test/ # 测试集图片(约640张) ├── labels/ │ ├── train/ # 训练集YOLO标签(.txt) │ ├── val/ # 验证集YOLO标签(.txt) │ └── test/ # 测试集YOLO标签(.txt) └── weld_defect.yaml # YOLO数据集配置文件五、数据集配置文件weld_defect.yaml
放在数据集根目录,直接复制使用,适配YOLO全系列训练:
# 数据集根路径(根据你的实际文件路径修改)path:./weld_defect_datasettrain:images/trainval:images/valtest:images/test# 类别数量 & 类别名称(和标注ID严格对应)nc:4names:0:Crack1:Porosity2:Spatters3:Welding line六、环境依赖安装
# 安装YOLO核心库+工业场景辅助依赖pipinstallultralytics opencv-python numpy tqdm lxml七、配套辅助脚本
1. 数据集自动划分脚本(8:1:1拆分)
如果你的数据集还未划分,运行该脚本自动拆分图片+标签到训练/验证/测试集:
importosimportrandomimportshutil# 配置参数img_dir="./weld_defect_dataset/JPEGImages"# 你的原图文件夹label_dir="./weld_defect_dataset/labels"# 你的标签文件夹save_root="./weld_defect_dataset"train_ratio=0.8val_ratio=0.1test_ratio=0.1# 创建标准目录defmake_dir(path):ifnotos.path.exists(path):os.makedirs(path)# 生成目录路径img_train=os.path.join(save_root,"images/train")img_val=os.path.join(save_root,"images/val")img_test=os.path.join(save_root,"images/test")label_train=os.path.join(save_root,"labels/train")label_val=os.path.join(save_root,"labels/val")label_test=os.path.join(save_root,"labels/test")# 创建所有目录fordin[img_train,img_val,img_test,label_train,label_val,label_test]:make_dir(d)# 获取所有图片文件img_list=[fforfinos.listdir(img_dir)iff.endswith((".jpg",".png",".jpeg"))]random.shuffle(img_list)# 随机打乱total_num=len(img_list)# 计算划分数量train_num=int(total_num*train_ratio)val_num=int(total_num*val_ratio)# 拆分数据集train_set=img_list[:train_num]val_set=img_list[train_num:train_num+val_num]test_set=img_list[train_num+val_num:]# 复制文件函数defcopy_files(file_list,dst_img,dst_label):forfileinfile_list:name=os.path.splitext(file)[0]# 复制图片shutil.copy(os.path.join(img_dir,file),os.path.join(dst_img,file))# 复制对应标签txt_file=name+".txt"ifos.path.exists(os.path.join(label_dir,txt_file)):shutil.copy(os.path.join(label_dir,txt_file),os.path.join(dst_label,txt_file))# 执行复制copy_files(train_set,img_train,label_train)copy_files(val_set,img_val,label_val)copy_files(test_set,img_test,label_test)print(f"数据集划分完成:")print(f"训练集:{len(train_set)}张")print(f"验证集:{len(val_set)}张")print(f"测试集:{len(test_set)}张")2. VOC XML 转 YOLO TXT 格式转换脚本
如果你的标注是VOC格式,运行该脚本一键转为YOLO格式:
importosimportxml.etree.ElementTreeasET# 类别映射(和yaml文件严格对应)class_names=["Crack","Porosity","Spatters","Welding line"]xml_dir="./weld_defect_dataset/Annotations"# VOC标签文件夹save_txt_dir="./weld_defect_dataset/labels"# 输出YOLO标签文件夹# 创建输出目录ifnotos.path.exists(save_txt_dir):os.makedirs(save_txt_dir)# 转换函数defxml_to_yolo(xml_file):tree=ET.parse(xml_file)root=tree.getroot()# 获取图片尺寸size=root.find("size")img_w=int(size.find("width").text)img_h=int(size.find("height").text)# 生成txt文件路径txt_name=os.path.basename(xml_file).replace(".xml",".txt")txt_path=os.path.join(save_txt_dir,txt_name)withopen(txt_path,"w",encoding="utf-8")asf:# 遍历所有目标forobjinroot.iter("object"):cls_name=obj.find("name").textifcls_namenotinclass_names:continuecls_id=class_names.index(cls_name)# 获取边界框坐标bndbox=obj.find("bndbox")x1=float(bndbox.find("xmin").text)y1=float(bndbox.find("ymin").text)x2=float(bndbox.find("xmax").text)y2=float(bndbox.find("ymax").text)# 转换为YOLO归一化格式x_center=(x1+x2)/2.0/img_w y_center=(y1+y2)/2.0/img_h width=(x2-x1)/img_w height=(y2-y1)/img_h# 写入txtf.write(f"{cls_id}{x_center:.6f}{y_center:.6f}{width:.6f}{height:.6f}\n")# 批量转换forxml_fileinos.listdir(xml_dir):ifxml_file.endswith(".xml"):xml_to_yolo(os.path.join(xml_dir,xml_file))print("VOC转YOLO格式转换完成!")八、YOLOv8 训练代码(工业焊缝场景优化版)
新建train_weld_defect.py,直接运行即可训练:
fromultralyticsimportYOLOdeftrain_weld_defect():# 加载预训练模型:# yolov8n = 轻量快速 | yolov8s = 平衡精度速度 | yolov8m = 高精度(工业检测推荐)model=YOLO("yolov8m.pt")# 工业焊缝场景专属训练参数results=model.train(data="./weld_defect_dataset/weld_defect.yaml",# 数据集配置文件路径epochs=120,# 训练轮数,工业缺陷建议100-150轮imgsz=640,# 输入尺寸,小缺陷可调高至800batch=16,# 批次大小,显存不足改为8/4device=0,# GPU编号,无GPU改为 device="cpu"workers=4,# 数据加载线程patience=20,# 早停机制:20轮无精度提升则停止,防止过拟合pretrained=True,# 使用COCO预训练权重optimizer="Adam",# 优化器,工业场景Adam收敛更稳定lr0=0.001,# 初始学习率lrf=0.01,warmup_epochs=5,# 热身轮数,稳定训练初期# 数据增强配置(适配工业焊缝场景)mosaic=0.8,# 马赛克增强,降低比例避免破坏缺陷特征mixup=0.1,copy_paste=0.0,hsv_h=0.015,# 色相增强,适配不同光照的焊缝图像hsv_s=0.7,hsv_v=0.4,# 保存配置project="runs/weld_train",name="yolov8_weld_defect",exist_ok=True,# 缺陷检测专属阈值conf=0.25)print("训练完成!")print(f"最优模型保存路径:{results.save_dir/'weights/best.pt'}")if__name__=="__main__":train_weld_defect()九、推理测试代码(训练后使用)
新建predict_weld.py,用于检测图片/视频/摄像头:
fromultralyticsimportYOLO# 加载训练好的最优模型model=YOLO("./runs/weld_train/yolov8_weld_defect/weights/best.pt")# 1. 单张图片检测# results = model("test_weld.jpg", save=True, conf=0.3)# 2. 文件夹批量图片检测# results = model(source="./test_images", save=True, conf=0.3)# 3. 视频检测# results = model("weld_video.mp4", save=True, conf=0.3)# 4. 实时摄像头检测results=model(source=0,save=True,conf=0.3)print("推理完成,结果已保存到 runs/detect 目录")十、完整使用流程
- 整理6400张图片和对应标签,放入数据集对应文件夹;
- 运行
voc2yolo.py(如果是VOC格式)生成YOLO标签; - 运行
split_dataset.py完成数据集划分; - 核对
weld_defect.yaml中的文件路径和类别; - 安装依赖包,运行
train_weld_defect.py开始训练; - 训练完成后,用
predict_weld.py测试检测效果。
十一、工业焊缝场景调优建议
- 小缺陷漏检:调高
imgsz=800,降低训练/推理conf=0.2~0.25,增加patience=25; - 背景杂物误检:降低
mosaic=0.6,关闭mixup,减少强数据增强对缺陷特征的破坏; - 显存不足:减小
batch,使用yolov8n.pt轻量模型,关闭不必要的增强; - 暗光/反光焊缝效果差:保留HSV色域增强,增加
brightness相关增强,提升图像鲁棒性; - 类别不均衡:如果某类缺陷样本少,在训练参数中添加
cls权重,增加小样本类别的损失权重。
