☰
焊缝缺陷检测数据集解析:VOC+YOLO双格式1494张6类别实操指南
2026/10/20 4:27:15 网站建设 项目流程

焊缝焊接处裂纹气孔飞溅缺陷检测数据集VOC+YOLO格式1494张6类别

做机器视觉这行,尤其是工业质检方向的,十个人里有八个都绕不过去一个坎:缺陷样本不够。产线上的坏件要么少得可怜,要么根本不让你往产线外拿,更别提拿着缺陷图给你一张张标注。真正常见的办法,就是找开源数据集先跑通流程,再用生成数据或者少量自采样本去微调。焊缝表面缺陷检测就是这么一个典型场景,而这份1494张、6类别的VOC+YOLO双格式数据集,刚好解决了从“没有图”到“能训出一个像样模型”中间最空白的那一段。

这篇文章不打算把数据集文件结构复制一遍给你看,那毫无意义。我要说的是怎么理解这批数据,怎么把VOC格式和YOLO格式的标注吃透,以及拿到之后怎么直接扔进网络训练,还能在螺栓、夹缝、弧光反光这些破环境下不翻车。如果你是做焊接质检、无损检测,或者正在为自定义缺陷识别找起点,这篇东西应该对你有用。

1. 焊缝缺陷检测的真实困境:为什么1494张图比上万张通用图更值钱

很多时候在项目交流群里看到有人问:“有没有那种几万张的焊缝缺陷数据集?”我都会多说一句:你要是有能在产线上跑得动的焊缝缺陷模型,你就知道这行的图有多难搞。焊缝缺陷检测的难点从来不在算法端,而在数据端。

1.1 工业场景下标注样本的三大痛点

先说第一个痛点:采集环境不统一。同一个焊缝,白天采和晚上采不一样,焊机不同、母材批次不同也不一样,甚至光照角度差个十几度,缺陷在图像上的对比度就完全不同。通用数据集里的那些猫猫狗狗、行人和汽车目标,光照、尺度再变也有个度,但焊缝图像在工业现场的变化,往往能直接把训练集里的统计规律打得七零八落。

第二个痛点是缺陷自然出现概率极低。焊接工艺稳定的产线上,气孔率可能都不到百分之一,深层次的裂纹更是少之又少。你蹲一周产线,可能攒下来就那么几张带裂纹的图,每张还得亲自确认是不是真裂纹、有没有和咬边混淆。这也是为什么很多企业内部的焊缝检测方案,做得再烂也不敢直接外流,因为那批手工筛选的缺陷数据本身就是核心资产。

第三个痛点更隐蔽:验收标准没有统一度量衡。国内国外、航空航天和普通钢结构,对缺陷的判定都不一样。有的只要求裂纹、未熔合不能有,有的连密集气孔区都算不合格。标注的人如果没有焊工或者质检经验,很容易把飞溅当成弧坑,把成形不良当成咬边。于是我们常说,焊缝缺陷数据集的“标注质量”,往往比“标注数量”更决定模型上限。

1.2 1494张的数量级为什么够用

看到1494张这个数字,很多人第一反应是“是不是太少了”。我反而不这么认为。拿YOLO系模型来跑,如果你的任务是6类焊缝缺陷检测,1494张图经过合理划分和增强,完全能训出一个在固定工位、固定光照下发到现场试跑的初版模型。

关键在于这类数据集里的目标结构非常固定。焊缝是一个连续条状区域,缺陷在其中的形态变化幅度远小于自然场景目标。裂纹多是细长线状,气孔是圆或椭圆,飞溅是小颗粒,咬边/未熔合/焊瘤这类几何缺陷的位置也相对集中。类别少、背景单一、目标分布有规律,这就意味着模型不需要从零学到海量的纹理知识,只需要在有限维度里找准区分边界。只要划分得当,1494张能顶得上通用场景上万张图的效果。

而且工业项目里真正的目标是“跑通,然后在现场迭代”。你先用这份数据把训练、验证、导出推理的整条链路跑顺,再基于实际产线反馈补充几十张自己工位上的图做增量训练。那种按“万张起步”去等数据的思路,反而最容易让项目死在数据等待期。

2. 数据集解剖:6类缺陷的判定标准与数量分布

一份数据集拿到手,第一件事不是看目录,而是看label文件里的类别名。尤其焊缝缺陷,类名一不对,后面所有训练都是白搭。从这份数据集的常见内容来看,六个类别应该覆盖了焊缝表面最常见的缺陷形态:裂纹、气孔、飞溅、咬边、未熔合和焊瘤。这里说明一下,不同版本的焊缝数据集在类别定义上会略有出入,具体还是要以你手头数据集的names文件为准,但下面这六类的判据,是行业里普遍采用的基准。

2.1 各类别的成像特征与判定要点

我把每一类在图像上的表现和容易混淆的点整理成了一张表,标注的时候最有用。

类别典型成像特征易混淆对象判定要点
裂纹细长、折线状,宽窄不一,灰度与母材差异大咬边、未熔合边界具有明显的末端尖细特征,走向不规则
气孔圆形/椭圆形暗斑,边缘灰度下降较缓飞溅暗影、凹坑中心灰度低于周边,形态近似回转体
飞溅球状或水滴状颗粒,灰度偏离母材,常带拖尾气孔往往凸出表面,高光区域明显,尺寸偏小
咬边沿焊缝边缘的沟槽状,与母材交界处灰度突变裂纹位置固定,沿熔合线走向,宽度均匀
未熔合焊缝与母材之间的线性暗区,较长且方向一致裂纹平行于焊缝方向,边缘较直,无分叉
焊瘤熔池溢出的堆高,灰度常高于周围,轮廓外凸飞溅(大尺寸)覆盖范围大,紧贴焊缝边缘且与母材有连续过渡

光看表有点抽象,我说说实际操作中的经验。区分裂纹和咬边是最让人头痛的,因为咬边这条“沟”如果拍深了,在图像上就是一道暗线,和裂纹很像。但是裂纹的走向会因为拘束应力的随机分布变得不规则,甚至出现分叉;咬边基本老老实实沿着熔合线走。经验是:先看走向是否平行于焊缝,再看中间有没有分叉点。

气孔和飞溅则是另一对容易模糊的类别。飞溅凸出表面,相机正打光时会产生一个小亮点,或者正好相反是个暗斑,关键看边缘是否密集不规则。气孔大多是凝固时气体没跑出去留下的,内壁相对干净,边缘灰度变化平稳。一句话:飞溅看起来“脏”,气孔看起来“空”。

2.2 前期的数量和分布怎么验证

拿到数据集先不要急吼吼去训练。我会花大概半小时做三件事。

第一,用脚本统计每个类别的目标框数量,看看有没有严重的长尾。如果裂纹只有几十个框,气孔有上千个,那训练时要么加权,要么针对裂纹类别做裁剪增强。这里可以用一个简单的Python统计脚本,读XML或txt标注文件都行。

import os import xml.etree.ElementTree as ET from collections import Counter # 统计VOC XML标注中各类别目标数量 xml_dir = "Annotations" counter = Counter() for xml_file in os.listdir(xml_dir): if not xml_file.endswith(".xml"): continue tree = ET.parse(os.path.join(xml_dir, xml_file)) for obj in tree.findall("object"): counter[obj.find("name").text] += 1 print("各类别目标数量:", dict(counter))

第二,看看尺度分布。焊缝缺陷里飞溅普遍很小,如果大部分框都集中在320×320以下,那训练时输入尺寸就别盲目设成1280,否则小目标被下采样几次就彻底消失了。我一般习惯把标注框的宽高分布画个散点图,几百个框丢进去一眼就能看出大致的尺度范围。

第三,手动抽看十几张图和标注的叠加效果。重点看两类内容:一是目标的标注框是否紧贴缺陷边缘,松垮的框会影响回归精度;二是是否存在漏标。毕竟人工标注难免有错漏,你确认一遍心里也有底。

3. VOC和YOLO两套格式的底层逻辑与转换要点

双格式数据集的方便之处不用多说,但很多人拿着两个文件夹之后就困惑了:为什么同一个目标,在VOC里是xmin, ymin, xmax, ymax,在YOLO里就变成了cx, cy, w, h,而且数值看起来像归一化后的浮点数?这看起来是格式问题,背后其实涉及两种标注体系的设计哲学。

3.1 坐标体系与归一化差异

VOC格式直接给人看的,框的四个角坐标都是像素整数,读取直观易于人工校对;而YOLO格式偏向机器解析效率,它记录的是框中心点的相对坐标和相对宽高,这样不管输入图像被resize成多大,标注都能跟随图像等比缩放,无需换算。可以说VOC是以“像素为语言”,YOLO是以“比例关系为语言”。

转换的时候最常见的错误就是忘了归一化。比如你读完XML,拿到xmin=500, ymin=300, xmax=800, ymax=600,假设图像宽1024、高768,那YOLO格式的中心点坐标就该是:

cx = ((500 + 800) / 2) / 1024 = 650 / 1024 ≈ 0.6348 cy = ((300 + 600) / 2) / 768 = 450 / 768 ≈ 0.5860 w = (800 - 500) / 1024 ≈ 0.2930 h = (600 - 300) / 768 ≈ 0.3906

如果把cx写成(800+500)/2=650这种像素值而不是归一化浮点数,等训练器读入之后,它会认为中心点在整个图像的65万像素处,结果直接蹦到画面外。YOLO系列读取标注时不校验取值范围,这种错误常表现为损失函数一上来就NaN,或者所有预测框都聚在图像边缘,非常迷惑人。

3.2 转换时如何保留类别一致性

另一件要紧的事是类别索引。VOC里的name字段可能是字符串crack(裂纹),但YOLO训练时需要的不是字符串,而是整数ID。所以你必须有一份固定不变的映射表:

0: crack 1: porosity 2: spatter 3: undercut 4: incomplete_fusion 5: welt

这里有个小坑:如果你用脚本把VOC转YOLO时又去遍历了一遍文件夹来动态生成类别列表,那每次运行得到的ID顺序可能都不一样。比如第一次crack是0、porosity是1,第二次因为文件迭代顺序变了可能变成porosity是0。推理部署阶段模型输出的class 0到底代表什么,就全乱了。正确做法是把映射表写死成一个字典文件,转换时直接查表。

我在GitHub上看到过不少数据集转换脚本,为了省事直接用os.listdir()或者set()去收集类别名,这个在数据集里类别固定时勉强能用,但一旦你后续自己加了一个新类别,再跑一遍脚本,所有旧文件里的类别ID就全错位了。固定映射表,是最值得养成的习惯。

4. 用YOLOv8跑通这份数据的完整流程与超参配置

有了双格式的数据集,训练本身反而不是最难的。我以YOLOv8为例,说一遍我跑这份焊缝缺陷数据集的完整流程,包括命令、超参和那些文档里不细写的注意点。环境是单卡8GB显存(比如某入门级显卡也能跑),不需要多卡。

4.1 数据目录划分与配置文件

第一步,把数据按照train / val / test划分。1494张图,我习惯按大约8:1:1切,训练约1200、验证约150、测试约150。注意一个原则:按图切,别按框切。同一条焊缝序列的图可能同时出现在训练和验证里,那评估指标就虚高了。经验做法是先按文件夹或者图像采集批次随机分组,确保同一批采集的图不会同时进训练和验证。

目录结构建议这样规划:

dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml

如果下载的是VOC格式,先确认有没有已经分好目录,没有就先做一次随机划分,再统一转成YOLO格式放进labels/。

data.yaml内容非常简单明了:

path: /your_path/dataset train: images/train val: images/val test: images/test names: 0: crack 1: porosity 2: spatter 3: undercut 4: incomplete_fusion 5: welt

这里有个容易漏的细节:names里每一项的索引顺序必须和标签txt里的整数ID一一对应。如果你训练时发现某个类别的mAP一直很低,先别急着调模型,打开一张标注图和验证集的预测结果看看是不是类别ID错位了。

4.2 训练超参设置的关键经验

训练命令我一般这样起:

yolo train data=dataset/data.yaml model=yolov8s.pt epochs=250 imgsz=640 batch=16 patience=50 project=weld_runs name=weld_exp1

几个参数我特意说一下为什么这么设。

模型选yolov8s而不是yolov8n。焊缝缺陷目标整体偏小,n模型速度快但特征提取能力偏弱,在细长裂纹上是真的会漏检。s模型在速度和精度上的平衡性最适合这种单场景任务。如果你的显存只有6GB,也可以选n模型加一点马赛克增强,但要做好mAP50降2-3个点的心理准备。

imgsz=640是折中方案。焊缝缺陷数据集的原始图通常不小,但缺陷相对图幅还算小。我试过直接用1280训练,mAP提升确实有一点,但训练时间暴涨,8GB显存还需要调batch到4才能跑动。先640拿到一个稳定的baseline,后续如果需要部署到高分辨率相机,再做TTA或者切片推理也不迟。

马赛克增强按情况关闭。YOLOv8默认mosaic=1.0,但焊缝这种目标密集排布的场景,马赛克切块容易把一条裂纹切成两半,导致标注框被割裂、目标不完整。我的做法是训练中段就把它降到0.3左右,或者用close_mosaic=10让最后10个epoch关掉马赛克。这个小改动对裂缝类长条形缺陷的检测稳定性肉眼可见地提升。

训练轮次不需要死磕300。我一般开着patience=50让它自动早停。焊缝缺陷模式相对固定,往往在200轮上下就收敛了。别看到训练还没到300就焦虑,损失曲线不降就是不降,放到后台喝杯茶再说。

4.3 训练中如何监控是否过拟合或欠拟合

很多人训练完只看最后的test结果,这不够。我在训练过程中至少会看三样东西:train_loss、val_loss和每一类的mAP50曲线。

如果train_loss一直下降,val_loss降到一个平台甚至反弹,大概率是过拟合了。这时候先做两件事:加weight_decay(比如从0.0005提到0.001),或者加大scale增强范围。工业场景的光照变化是常态,多让模型见见不同对比度下的缺陷形态,比死磕一个训练集有效率得多。

反过来如果train_loss降得很慢,val_loss也跟着高,那就要检查是不是学习率过大导致震荡,或者数据本身有大量噪声标注。前一种情况,把lr0从0.01降到0.005试试;后一种情况就要回去翻标注了。焊缝缺陷里那种类别边界模糊的目标,标错一两个类别的确影响全局收敛,得上人工再核一遍。

5. 验证与易混淆缺陷的专项优化

训练结束之后,真正的项目才刚刚开始。焊缝缺陷识别的交付标准不是“mAP多高”,而是“现场漏检多少、误杀多少”。所以在常规测试集的数字之外,我还会专门针对易混淆类别做专项验证。

5.1 mAP指标之外,更要看混淆矩阵

YOLOv8训练完会在runs/detect/下自动输出混淆矩阵。对焊缝数据来说,我主要看crack和undercut、spatter和porosity这两对之间的错分情况。

如果spatter被大量预测成porosity,说明这两类在特征空间里太接近了。一个很有效的办法就是做类别定向增强:把气孔这类缺陷的样本单独抽出来,做几组旋转、对比度调整、滤波增强,再和飞溅样本交替混进训练。让模型在有限的类别中找到更细的判别边界。

还有一种思路是用带角度的框而非水平框。裂纹和咬边这种长条形目标,水平框往往圈进大量背景,特征被稀释。但YOLO原版不支持旋转框,只能像YOLOv8-OBB这种变体。如果你的部署方案不排斥OBB,焊缝裂纹检测的精度往往还能再往上走一点。

5.2 推理阶段有用的后处理技巧

有些项目不想改动模型结构,那就在推理和后处理环节做文章。

比如对微小飞溅这种目标,输出时可以把置信度阈值放宽到0.15,再结合面积过滤把低于某个像素面积的框排除。这样做的思路是:模型对小目标本来就缺乏置信度,阈值卡太高容易漏,卡太低会出一堆假阳,用面积过滤兜底就能平衡很多。

另一个技巧是局部区域二次推理。焊缝通常位于画面中间偏下的带状区域,可以先跑一个粗定位模型把焊缝区域裁出来,再在这个区域上用高分辨率二次检测裂纹和气孔。这种两级推理思路在产线上很常见,因为焊缝区域只占画面一小部分,直接全图检测时小缺陷经过下采样可能只剩几个像素,二次推理能极大缓解这个问题。

6. 从数据集到现场落地,还有几步必须走

训练完了、指标也漂亮了,不代表就能装到产线工控机上。真正把模型用起来,还有几个环节很容易出岔子。这也是我不太建议只盯着训练指标看的原因。

6.1 导出与部署时的格式选择

用一个具体例子说。YOLOv8训练完导出engine格式,我的经验是优先用TensorRT的INT8或者FP16精度。INT8能大幅提速,但某些缺陷目标太小,量化误差可能会直接让细裂纹在特征图上消失。稳妥的做法是先试FP16,跑一下测试集确认mAP掉了多少再决定要不要挑战INT8。

导出命令通常是这样的:

yolo export model=runs/weld_exp1/weights/best.pt format=engine device=0 half=True imgsz=640

这里有个容易被忽略的点:导出时的imgsz必须和训练时一致,否则推理精度会下降。很多人训练用了640,导出时图省事设成默认640倒没事,但如果你之前改过训练尺寸,导出时一定记得同步。

6.2 现场环境的鲁棒性验证

工业现场的干扰主要来自三类:弧光散射、飞溅火花、镜头灰尘。弧光散射会让整个画面亮度波动,火花则在图像里形成飞溅高光点,灰尘会造成假的小目标暗点。这时候如果你只拿干净的测试集去衡量,模型一上产线就会现原形。

我的习惯是在训练时就把这些干扰模拟进去,比如随机亮度抖动、高斯噪声、小面积遮挡。过拟合打游击不如提前让模型知道“世界不是干净整洁的”,这是焊缝缺陷检测和很多通用检测任务一个很大的不同。

另外提醒一点,现场部署时相机安装角度和数据集拍摄角度不要差太多。如果数据集基本都是垂直俯拍,你现场非要倾斜45度装,缺陷的长宽比、反射特性全变了,之前的模型效果再好在现场也白搭。这一步看着是工程问题,但直接影响模型能不能用。

6.3 增量学习与数据回流策略

到现场之后,我一般会留一套脚本,定时把产线上跑出来的低级误检图(置信度高但判错类别、或漏检区域)抓回来,让工艺人员做二次确认,然后每隔一两周做一次增量训练。增量训练不需要从零开始,拿best.pt作为预训练权重,用新老数据混合着再训50个epoch左右就足够了。

这里建议别只喂新样本,要按一定比例把老数据混进去。比如新样本占三分之一、老样本占三分之二。否则模型对近期采集的光照环境产生偏好,之前学到的老特征反而被慢慢冲刷掉。焊缝缺陷本身类别特征相对稳定,模型遗忘主要是对环境和纹理细节的遗忘,混着老数据训是性价比最高的做法。

这一套走下来,从拿到1494张双格式数据集,到训练出baseline,再到现场部署、回流迭代,项目就算是真正闭环了。焊缝缺陷检测和通用视觉感知最大的不同就在这:它没有一个全能通用的模型,只有不断贴合真实工况、贴合真实工艺数据的模型。数据集是第一步,但永远不是最后一步;把整条链路跑顺、跑稳,才是最值钱的那部分经验。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询