ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

焊接缺陷检测数据集解析:YOLO/VOC标注转换与YOLOv8训练实践

焊接缺陷检测数据集解析:YOLO/VOC标注转换与YOLOv8训练实践 简介面向焊接缺陷检测的YOLO/VOC格式增强数据集覆盖烧穿、污染、未完全融合、未完全渗透、错位及正常等6类典型焊接状态共包含4137张清晰焊接图像矩形框标注总计4214个适合用于目标检测模型的训练、验证与算法对比。压缩包约为153.88MB共2000个文件以xml标注文件为主并附说明txt数据采用VOC与YOLO双格式组织便于直接接入主流检测框架。目前已有199人学习下载适合算法工程师、研究生和竞赛选手用于焊接质检场景的实战练习。该数据集已做增强处理有助于缓解小样本场景下模型过拟合的问题便于开展YOLOv5、YOLOv8等模型的调优实验建议按任务自行划分训练/验证集以实际验证效果为准。需要留意的是本数据集不对训练后模型或权重文件精度作任何保证。1. 焊接缺陷检测数据集六类缺陷物才是核心价值一个焊接件在X射线底片或者红外热像上真正需要被找出来的往往只是整幅图里几百乘几百像素中的一小块异常——可能是圆形气孔、条状夹渣也可能是一道很淡的未熔合。这套6类焊接缺陷检测数据集提供的正是这类小目标检测的基础样本4137张已增强图片同时带YOLO格式的txt标注和VOC格式的xml标注。它的价值在于把缺陷类别、标注坐标系和训练所需的样本规模一次绑定了落地时省掉最花时间的整理与格式转换环节。适合刚入手YOLO目标检测的工程师拿来做完整pipeline练习也适合工厂质检项目里先跑通基线模型。下面先弄清楚它内部两类标注各是按什么规则存的再一步步做格式校验、可视化、训练和预测。2. 先弄清数据集结构YOLO/VOC双格式的标注约定拿到dataset.zip后解压看到的不只是图片。理解这套数据集的目录层级与每类标注文件的含义决定了后续转换脚本、训练配置和模型输出能不能对得上。2.1 六类缺陷的名称与标签ID要核对焊接缺陷检测的类别命名在不同标注习惯下会略有差异常见的是气孔porosity、夹渣slag、未焊透incomplete penetration、未熔合lack of fusion、咬边undercut、裂纹crack。在动手训练之前第一步是先找到数据集里的classes.txt、names.txt或label_mapping文件确认以下三件事类别顺序对应到的是0到5的类别ID所有图片的txt标注第一列数字是否都落在0到5区间内如果用的是VOC格式训练xml里的name是否严格与类名大小写一致。检查方法不依赖图形界面直接对全部标注文件做统计。以下Python脚本可以快速输出各类别使用情况与ID分布import os from collections import Counter label_dir path/to/labels counter Counter() for fn in os.listdir(label_dir): if not fn.endswith(.txt): continue with open(os.path.join(label_dir, fn)) as f: lines f.readlines() for line in lines: cls int(line.strip().split()[0]) counter[cls] 1 for cls_id in range(6): print(fclass {cls_id}: {counter[cls_id]})这个脚本只做两件事读全目录下的txt标注按第一列的类别ID计数。运行结果如果显示某类数量特别少比如裂纹只有几十个样本后续训练时就要对该类单独调节损失权重否则模型会为了降低整体loss而把裂纹直接忽略。注意优先确认标注文件与图片文件同名且一一对应避免names文件与xml标签名字错位导致的「标签有一行不存在」。2.2 VOC的xml与YOLO的txt坐标约定不同VOC格式的标注存放在xml里坐标是bndbox下的xmin、ymin、xmax、ymax单位是像素表述的是「左上角和右下角两个点」。而YOLO格式的txt标注每一行只有五个数字分别表示类别ID、归一化中心点x、归一化中心点y、归一化宽度w、归一化高度h。归一化的分母是图片本身的宽度和高度。它们的对应关系可以归纳为下表项目VOC xmlYOLO txt坐标系像素绝对坐标0到1相对坐标核心信息xmin, ymin, xmax, ymaxclass, cx, cy, w, h边界表达左上/右下两点中心点加宽高典型精度int或floatfloat通常保留6位两张方式各有各的使用场景VOC易于人读、调试可视化而YOLO训练时框架在load_image阶段就要求标注为归一化坐标省去了每张图尺寸不一致带来的坐标换算成本。这个换算逻辑与常见的「kitti标注转yolo」一致都是先求像素级的中心点再同时除以图的宽高。比较容易被忽略的一个细节某些VOC标注的坐标是整数换算时直接用int做除法会导致边框整体偏移几个像素对于气孔这类几个像素的小缺陷偏移会显著降低IoU。转换脚本里始终要用浮点数计算。3. 格式互转与质量校验从VOC到YOLO的落地脚本「已增强」四个字让这类数据集的质量比原始采集好得多但增强操作也常带来两个副作用一是有些图片被翻转或裁剪后标注框跑到了画面外二是生成器在写xml时多写了空object节点。无论哪种情况拿到的数据必须先做一轮校验和清洗。3.1 用xml_to_yolo脚本做转换的四个核心参数即便数据集已经同时给到两种格式仍存在一些模型需要VOC而框架只认YOLO的情况。这里给出一个可复用的转换脚本骨架import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_file, class_names, out_txt): tree ET.parse(xml_file) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in class_names: continue cls_id class_names.index(name) box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) # 坐标修正防止裁剪增强后越界 xmin max(0, xmin) xmax min(img_w, xmax) ymin max(0, ymin) ymax min(img_h, ymax) if xmax - xmin 1 or ymax - ymin 1: continue cx (xmin xmax) / 2.0 / img_w cy (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) with open(out_txt, w) as f: f.write(\n.join(lines))要点说明xmin max(0, xmin)这类裁剪针对的是增强阶段产生的负目标框这类框会导致YOLO训练时计算w、h出现负值最终损失值变成nan。xmax - xmin 1的过滤条件是为了去掉面积小于1像素的无效框在焊接小缺陷场景里很常见。中心点与宽高统一除以该图自己的宽高与输入尺寸无关。3.2 校验工作流四类问题一次检查完转换完成后还需要写一个同时面对txt与xml的校验脚本。这四类问题几乎每个焊接缺陷数据集的标注里都会出现坐标越界、类别ID溢出、空txt文件、重复标注同一个小缺陷。python check_labels.py --dir labels --classes 6 --img_dir images --check_size检查逻辑主要有三点所有txt中的每行是否恰为5个浮点数每一行的cx、cy、w、h是否都在0到1之间图片的宽高与txt里归一化后反推的像素宽高是否一致如果出现某张图的标注框宽度超过图片宽度说明增强过程中图片被裁剪而标注未同步更新。焊接缺陷检测对这两个坐标系的容错非常低缺陷本身比整张图小得多一个框偏移0.5%像素在图上可能偏差好几个缺陷直径。建议在跑训练前把校验脚本产物里的示例图用OpenCV画框人工扫一遍。这一步不能省已增强的数据集未必在坐标上都是自洽的。另外一个值得注意的点是数据集的目录组织方式。YOLOv8训练时默认按images/train、labels/train同名前缀读取VOC数据集则常常是JPEGImages加Annotations。如果拿到的包里两种目录结构并存最稳妥的做法是单独建一份dataset.yaml显式指定train和val的图片路径避免框架自动推断目录时把txt和xml混在一起。4. 可视化与数据增强让4137张真正够用4137张在工业质检里不算小但对六类缺陷来说每类平均不到700张仍属于小样本范畴。增强是本数据集已经做过的事使用时更要关注增强后的数据分布是否真实、是否引入了伪缺陷以及训练时需要配合什么增强策略才能稳定收敛。4.1 标注可视化判断增强是否合理增强操作的合理性不能只看贴几张图的样子而要看缺陷的语义有没有被破坏。焊接件表面的弧光反射、飞溅和纹理阴影对模型识别干扰很大。对已做数据增强的图像进行可视化时重点观察三类情况翻转是否导致原本纵向的裂纹变成了横向类别仍叫crack是否合理亮度调整是否让低对比度的未焊透在视觉上直接消失模糊增强是否会让微小气孔被定义为「不存在」。可视化标注常用的是在图像上直接绘制框和类别名。用OpenCV读取单张图与真实标注的参考实现如下import cv2 img cv2.imread(images/sample_001.jpg) with open(labels/sample_001.txt) as f: lines f.readlines() h, w img.shape[:2] for line in lines: parts line.strip().split() cls int(parts[0]) cx, cy, bw, bh map(float, parts[1:]) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(cls), (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2) cv2.imwrite(visualized_001.jpg, img)这个示例中文本框用的是类别ID真正做报告时建议替换为类别名列表否则六类的颜色和ID对应关系需要反复回看names文件。4.2 增强要克制焊接缺陷的增强边界与离线增强配置已增强数据集通常已经包含翻转、旋转、裁剪、色彩抖动、Mosaic以及模拟噪点等操作。真正开始训练前需要优先控制的是以下三个增强参数hsv_h、hsv_s、hsv_v焊接金属表面颜色相对单一饱和度和色相增强幅度过大会让表面纹理失去金属质感。scale过大的随机缩放会让缺陷在最终输入图上的尺寸处于不稳定状态训练初期容易振荡。mosaicYOLOv8中mosaic合并了4张图但焊接缺陷属于小目标4张图叠加后的有效分辨率和标注框数量会有较大压力。如果只用YOLOv8训练推荐在yaml或命令行里显式控制增强参数例如hsv_h: 0.01 hsv_s: 0.2 hsv_v: 0.2 degrees: 10.0 translate: 0.05 scale: 0.3 mosaic: 0.8 mixup: 0.5含义解释degrees 10.0最多旋转10度。焊接缺陷检测里不需要90度或180度的旋转不变性旋转太大会让框的语义混乱。translate 0.05平移范围只设5%防止缺陷被移到图外或被截断。mosaic 0.8不关闭mosaic但保留一个关闭比例让非拼接图像在每一轮仍然占一定比率。mixup 0.5混合增强对底片上相近的小缺陷有正则化作用但对极端前景与背景比不友好的场景要谨慎。如果要用618之前老一些的YOLOv5训练则需要在hyp.scratch-low.yaml相应位置同步修改。增强参数对损失函数的影响也很直接。焊接缺陷小目标过多时总体loss容易倾向于反映背景负样本前景类别的局部损失会被平抑。在此期间调整yolo_loss相关的fl_gammafocal loss的gamma是常见做法gamma提高会让模型更关注困难样本但太高又会让小缺陷训练不稳一般从1.5起调逐步试探。5. 基于YOLOv8训练自己的数据集目录、参数与验证策略准备这一步先确认环境里YOLOv8可用。如果还没配置用pip install ultralytics即可完成基础安装。训练自己的数据集核心是把路径映射、类别和参数三件事一次配好。5.1 数据目录与yaml配置把训练图和验证图分开是4096张左右的数据集中最常规的组织方式。目录建议如datasets/welding/ ├── images/ │ ├── train/ │ └── val/ ├── labels/ │ ├── train/ │ └── val/ └── welding.yamlwelding.yaml中需要显式写明路径与类别名称格式如下path: datasets/welding train: images/train val: images/val names: 0: porosity 1: slag 2: incomplete_penetration 3: lack_of_fusion 4: undercut 5: crack注意如果val集缺少某类缺陷的样本评估时会出现mAP50-95对某一类直接卡在0的情况这并不代表模型没学会而是验证集类别覆盖不全。建议划分数据集时确保每个类别在train和val中都有代表。5.2 训练命令与小目标相关的参数与常规YOLO目标检测流程不同焊接缺陷检测的输入图通常是较大尺寸的工业影像。如果原始图片宽度超过2000像素又直接resize到640一个小气孔会退化到只有十几个像素极难检测。建议先用640测试基线再用1280比较小目标表现。启动训练的命令建议为yolo detect train \ datadatasets/welding/welding.yaml \ modelyolov8s.pt \ imgsz1280 \ batch16 \ epochs200 \ patience30 \ close_mosaic10参数说明如下imgsz1280针对小目标保留更多像素细节气孔等缺陷不会因resize消失close_mosaic10最后10个epoch关闭mosaic增强让模型在接近真实分布的数据上做最后微调patience30验证集指标连续30个epoch不提升时早停batch16根据显存容量调整8GB显存建议降到8图片分辨率高时尤其注意显存占用。训练时应该同时观察loss曲线和验证指标。正常收敛的特征是box_loss与cls_loss均下降并在后期趋于平缓如果某个阶段的损失曲线突然回升多半是close_mosaic生效后数据分布变化所致这种回升幅度较小、后续会回落不必恐慌。5.3 评估优先看混淆矩阵与类间误检焊接缺陷检测里最让工程师头疼的不是漏检而是气孔与夹渣、未焊透与未熔合这两组容易互相混淆的类别。它们shape上高度相似区分点往往在空间分布或灰度纹理上。训练结束后运行yolo detect val \ datadatasets/welding/welding.yaml \ modelruns/detect/train/weights/best.pt \ imgsz1280除查看mAP指标外应重点关注runs/detect/val/confusion_matrix.png。混淆矩阵里如果slag与porosity之间存在大面积互判说明模型预测时没有充分利用灰度差异在推理阶段可以额外对这两个类别设置不同的置信度阈值或调整它们的cls损失权重。6. 推理部署前的三个边界检查与实用技巧训练好模型只完成了一半流程焊接缺陷检测在部署到产线上时还会碰到三个在测试集上看不出来的问题。6.1 检查一大图要不要切块推理工业相机输出的图片动辄3000乘3000直接resize不可避免掉信息。常用做法是把大图按固定步长切成分块tiling再对分块做推理最后把结果映射回大图坐标系。切块边线与缺陷位置重合时会截断目标所以tiling的步长应小于块宽并采用重叠裁剪方式。6.2 检查二复制数据集后自动生成的目录是否对应另一处容易翻车的是把数据集从zip解压到服务器后images和labels目录下文件名不同步。养成一个习惯部署前执行一次全目录同名比对删除任何没有对应标注文件或者没有对应图片的孤立文件。6.3 检查三对低置信度缺陷单独设置阈值气孔和裂纹在视觉上灰度对比低预测置信度通常低于0.3如果直接沿用默认的conf0.25很容易把真实的细裂纹滤掉。可以把检测结果导出为JSON统计每个类别的置信度分布对低置信度类别单独使用更低的阈值再用几何条件如最小面积和长宽比过滤误检。这一步在所有检测模型部署里都值得做对焊接小目标尤其有效。本文还有配套的精品资源点击获取
返回列表