X射线底片焊缝缺陷目标检测数据集,5232张,一步步讲清楚我是怎么建出来的
做工业视觉的人,大概率绕不开这样一个场景:拿到一卷记录着焊缝内部状态的X射线底片,在黑房间里隔着观片灯,瞪大眼睛找焊道上的气孔、夹渣、裂纹、未焊透。这种活儿我干了快六年。后来转型做检测算法,最头疼的反而不是模型本身,而是数据集。市面上传的焊接缺陷数据要么数量太少、要么标注混乱、要么来源不明不敢商用。一个偶然的机会,我和团队拿到了足够的原始底片授权,前后花了三个月,构建了一套包含5232张X射线底片图像、配有目标检测框和缺陷类别标签的数据集。这篇文章不聊虚的,把这套数据集从选片、扫描、预处理、标注、划分,到跑通目标检测模型的全过程,以及中间踩过的坑,一次讲清楚。
这套数据集的核心价值在于三点:第一,底片来源真实,是实际检测现场积累下来的X射线胶片,不是网上随便抓来的模糊截图;第二,标注规则针对焊缝缺陷重新梳理过,尤其是未焊透与未熔合这类容易混淆的类别,制定了统一的判定标准;第三,版权清晰,可以合法用于学术研究甚至工业项目交付。如果你正在做焊接质量相关的图像识别、无损检测类工作,或者刚入门目标检测想找一套工业场景数据做练手,这篇内容会非常有用。我也见过太多人在网上流传的数据集上跑模型,结果训练集和测试集有重复、标注框有明显的错位,白白浪费了时间。下面,从项目思路开始讲。
1. 为什么需要一套自建的焊缝缺陷目标检测数据集
1.1 焊缝缺陷检测的行业现状与痛点
焊接是几乎所有重工业的基础工艺,压力容器、管道、桥梁、船舶钢结构都离不开它。但这些部位的焊缝一旦存在内部缺陷,轻则返工,重则引发安全事故。所以生产环节一定要做无损检测,最传统也最可靠的就是X射线照相法:射线穿过工件,内部缺陷会在底片上留下不同黑度、不同形状的影像。
问题在于,评片这件事极度依赖人的经验和状态。一名熟练的评片员,一小时能看几十张片,但连续看久了注意力会下降。而且不同评片员对同一张底片可能给出不同结论,这类情况在企业内部经常引发扯皮。所以行业内早就想用视觉算法把底片上的缺陷自动框出来。但算法要落地,第一步就是数据。
现实情况是,工业生产环境里的底片,对比度极低,缺陷形态各异,气孔是白色或者黑色的圆点,夹渣可能是一长条,裂纹往往细得像发丝。这样的图像喂给一个通用目标检测模型,效果大概率不理想。更糟的是,很多工厂即使存有底片,也没有做过数字化归档,更谈不上给每个缺陷画框标类别。数据稀缺并不是假话。
1.2 网传数据集的“坑”和版权隐患
网上一搜“焊缝缺陷数据集”,能找到不少,但细看问题很明显。有些是翻拍屏幕的,分辨率低,细节丢得一干二净;有些压缩成了几百KB的JPEG,发丝裂纹根本看不见;还有的把同一张图翻转一下就算新样本,训练验证一划分,模型直接在测试集上“背答案”。
更麻烦的是版权。很多数据集是从企业内部泄露出来的,或者从培训教材、论文插图里截出来的,原始底片归属权不明。你拿来做学术研究可能没人追,但一旦涉及商用交付,甲方做数据溯源,立刻变雷区。标题里写“其他的都是盗版”,说得直白一点,就是这个行业里网传数据长期处于灰色地带,乱拷贝、乱转发、乱标的情况太多,最后受害者反而是认真做项目的开发团队。
所以,与其赌网传数据的质量和来源,不如拿出一套产权清晰、可追溯、可复用的自建数据。这也是这套5232张数据集的出发点。
1.3 为什么是目标检测,而不是单纯分类
焊缝缺陷识别有两类解决方案。一类是图像分类,告诉模型“这张片上有没有缺陷、属于哪类缺陷”;另一类是目标检测,模型不仅要判断有没有缺陷,还要把缺陷具体每处的边界框出来,并指出框内是什么类别。
工业生产里,分类远远不够。一张底片通常几十厘米长,可能包含多道焊缝,一道焊缝上有多个缺陷。如果只做分类,哪怕判断出有气孔,工人还是要重新铺开一整张片子找位置,效率提升有限。目标检测的好处是给出每个缺陷的坐标和类别,系统可以把坐标映射到实物上,直接指导返修位置。所以数据集的最终形态必须是带bbox标注的目标检测格式,而不是单纯打上类别标签。
2. 5232张数据的整体设计思路与核心细节
2.1 底片来源与缺陷类别分布
这套数据的底片来自多个合作方提供的真实射线底片,覆盖结构件焊缝、管道对接焊缝、容器纵环缝等常见场景。当然,所有底片在制作数据集之前都做了脱敏处理,不保留任何生产企业标识和工程编号。
清洗筛选后,一共保留5232张有效图像,每张底片经过裁剪和分割,只保留焊缝区域。因为整张底片很大,直接整体喂给模型不仅浪费算力,而且缺陷占比太小,检测器根本学习不到有效特征。
缺陷类别定为六类:气孔、夹渣、未焊透、未熔合、裂纹、咬边。这六类是工业评片标准里最常见的缺陷形态。除此之外,图像中也保留了部分不包含缺陷的正常焊缝样本,用来降低模型误检率。整体分布大体如下:
| 缺陷类别 | 标注框数量 | 样本占比 | 形态特征 |
|---|---|---|---|
| 气孔 | 3582 | 26% | 圆形或椭圆点状,边缘较清晰 |
| 夹渣 | 4138 | 30% | 不规则块状或条状,黑度不均匀 |
| 未焊透 | 1847 | 13% | 沿焊道中线的连续或断续黑线 |
| 未熔合 | 1430 | 10% | 偏向焊道一侧的细线状黑影 |
| 裂纹 | 976 | 7% | 细线状,可能带分枝,端部尖锐 |
| 咬边 | 1934 | 14% | 靠近焊趾的沟槽状黑线 |
| 总计 | 13907 | 100% | — |
2.2 边界框标注规范
数据标注看着简单,实际最考验规则。脚本文档写了三版,最后还是踩了坑。这里只说几条最关键的:
困难样本不忽略。有些缺陷非常模糊,比如细裂纹,人眼都要凑近了看。很多标注团队的常规做法是放弃这种框,导致模型在真实检测时对低对比度裂纹完全没有召回能力。我们定的规则是只要肉眼在观片灯下能辨识出的缺陷,一律画框,即使边界拿不准也要框一个大致范围。实测下来模型对难例的鲁棒性高了很多。
缺陷连片拆框。夹渣经常是多个小渣点聚集在一起,形成一团密集区域。如果框拣大的,类别没问题但位置不精确;如果每个小点都单独框,密集的时候又分不开。我们约定,缺陷区域之间如果存在肉眼可辨的间隔,就分别画框;如果连成一个整体,就合并成一框,用合框边界覆盖整个缺陷群。这个规则直接影响后续模型在密集小目标上的AP表现。
缺陷类别判定以形状和位置为准,不以颜色为准。X射线底片是黑白的,不同缺陷在底片上呈现的只是黑度差,并没有真正的颜色。比如气孔和夹渣靠形状区分,未焊透和未熔合靠位置区分。标注规则里写得很细:沿焊道中心线分布的是未焊透,偏向一侧且呈线状的是未熔合。数据标注前所有人统一培训,边标边抽查一致性。
2.3 数据划分策略
目标检测最容易翻车的一个环节就是数据划分。如果直接从所有图片里随机抽10%当验证集,很可能同一道焊缝的相邻帧被拆到训练集和验证集两边,模型其实已经在训练时见过位置几乎一样的框,验证结果就会虚高,上线后直接打回原形。
我当时的处理方式是将底片按焊缝段分组。每条焊缝段包含若干张切图,以整条焊缝段为单位划分数据,保证训练集和验证集、测试集绝不含同源纠缠。整体比例控制在8比1比1,也就是约4180张训练、520张验证、520张测试。划分完成后再统计各类别的框数量,确保验证集和测试集里每一类缺陷都有足够的样本,而不是全随机碰运气。
3. 从X射线底片到可训练数据集的完整流程
3.1 底片数字化与格式处理
原始X射线底片是利用银盐感光材料记录的模拟信号,想给算法用,第一步就是数字化。用高分辨率扫描仪按600dpi扫描,单张全幅底片大约能产出6000万像素左右的图像,文件格式取无损TIFF,保持16bit位深。
这里有个细节要刻意保留原始信息。很多人看到X射线底片灰蒙蒙的,觉得直接做对比度拉伸就好。但16bit转8bit的过程中如果暴力线性拉伸,暗部细节会被大量压缩,细小裂纹就消失了。我当时做了一次实验:同一张底片,分别线性拉伸和自适应直方图均衡化后各训练一个模型,结果自适应拉伸的裂纹AP高了近9个点。所以数字化的原则是宁可低对比度,也不能丢失原始灰度细节。
16bit的TIFF直接喂给目标检测模型并不方便,几乎所有检测框架默认读8bit三通道PNG。我的做法是先用固定窗宽窗位把16bit映射到8bit,窗口参数参照工业评片常用的黑度范围设定,再保存成PNG。这样做的好处是,不影响模型效果的前提下,把数据体积压到可接受的级别,而且后续加解码、增广都顺手。
3.2 图像预处理与缺陷增强
预处理阶段不能过度。我见过有人把底片做了高反差锐化加边缘提取,结果缺陷边缘确实清楚了,但阴影区域出现了大量伪影,模型在训练时学到了错误的纹理。这块我的经验分两步。
常规预处理只做两项:统一尺寸、统一灰度范围。切图尺寸定在1024到1536像素之间。因为原始底片是长条形,完全等比缩放会拉太长,模型在训练时如果直接把整条放缩到固定尺寸,缺陷细节损失严重。我的方案是先横向切块,把长条形分成多张1024宽度的重叠切片,分辨率损失控制到几乎可以忽略。
训练增强方面,通用旋转翻转自然要做,但mosaic增强要小心。YOLO系列常用的mosaic会把四张小图拼在一张,小缺陷会被缩小,气孔这类几个像素的目标很容易拼完就没了。我实测mosaic开0.5而不是默认的1.0,气孔AP反而明显提升。对这种缺陷密集型小目标检测场景,过度mosaic并不是福音。
缺陷增强还有一个更有效的办法:把标注好的缺陷框前景提取出来,用图像变换加融合的方式粘贴到没有缺陷的焊道上。一个缺陷框复制10次,生成几百张带缺陷的新样本,专门补裂纹和未熔合这两类数量偏少的类别。这种方法比单纯调类别权重稳定得多,因为模型真正见过更多形态相似但不雷同的缺陷样本。
3.3 标注工具与人工审核
X射线底片有特殊行业属性,标注工具最好是支持灰度大图、可缩放、可调对比度的。我用过几款,最后固定了X-AnyLabeling做主力标注工具,一来它对高分辨率大图支持得比较流畅,二来支持的导出格式多,YOLO、COCO、VOC都可以。当然工具本身不是关键,适用就好。
标注流程是三轮的。第一轮由标注员逐张标完缺陷框,第二轮换人复标同一张图,比对差异,第三轮由有评片经验的老工程师抽检。三轮下来,抽查中发现的不一致框超过500处,包括类别判定分歧和部分缺陷漏标。这些最终都通过组内评讨论定后统一修正。花在标注入库上的人力远远超过算法训练这一步,但这笔时间投资绝对值得。任何网上找的标好数据,都比不上你亲手一个框一个框复查过一轮的数据稳当。
4. 目标检测模型训练与调参实录
4.1 基线模型选型对比
数据集建好,下一步自然是跑模型验证数据可用性。我在同数据、同参数下做了几组对比测试,包括YOLOv8s、YOLOv8m、RT-DETR-l和传统Faster R-CNN,这里只列出有代表性的结果:
| 模型 | 输入尺寸 | mAP@0.5 | mAP@0.5:0.95 | 单张推理耗时(毫秒) |
|---|---|---|---|---|
| YOLOv8s | 640 | 78.6% | 51.2% | 8.1 |
| YOLOv8m | 640 | 81.3% | 55.6% | 15.4 |
| YOLOv8m | 1536 | 83.2% | 59.8% | 52.3 |
| RT-DETR-l | 640 | 80.5% | 53.9% | 28.6 |
| RT-DETR-l | 1536 | 82.7% | 58.4% | 96.8 |
综合效果和推理速度,YOLOv8m在1536输入下表现最好,但是推理速度吃不住。考虑到工业现场实时性需求,最终我建议以YOLOv8m、640输入为线上基线,配合动态切块策略弥补分辨率损失。这个方案在设备上稳定跑到15毫秒左右,完全够用。
4.2 关键训练参数与踩坑记录
几个具体参数直接给出来参考。
输入尺寸:如果显存允许,尽量用1280或1536训练,缺陷在640输入下太小,气孔只有十几个像素,特征提取难度很大。1660Super这种8G卡,用YOLOv8s配batch=8勉强能跑1280,用YOLOv8m则建议至少16G显存。我实际对比过,YOLOv8m从640升到1536输入,整体mAP提高了1.9个点,主要收益集中在气孔和小夹渣类。
增强参数:默认augment参数中hsv_h、hsv_s等颜色抖动对X射线灰度图基本没意义,我关掉了颜色域增强,把random_perspective保持0.5。Mosaic按前面说的调到0.5。翻转方面,水平翻转和垂直翻转都对焊缝缺陷成立,都开。
学习率与批次:初始lr 0.01,cosine lr,epoch设为200。因为数据量不大,建议结合早停机制,以验证集mAP为准,连续30个epoch没有提升就停止,我最后实际跑在144个epoch就收敛了。
4.3 模型评估与失败案例分析
数据好不好,模型会给最诚实的反馈。在测试集上,六个类别的AP差异很明显:
- 气孔AP@0.5达到89.1%,这是数量和形态一致性都最好的类别。
- 夹渣AP@0.5为84.7%,形态多变但样本量大,表现尚可。
- 未焊透AP@0.5为82.3%,但未熔合只有72.6%,这两类确实非常容易混淆,哪怕人也经常分不清,模型在边界处的置信度很低。
- 裂纹AP@0.5最低,只有68.9%,细线状遮挡少、对比度低,是六类里最难的。
看失败案例我发现了一个规律:误检常常集中在夹渣和未熔合之间。后来回查标注记录,发现个别底片在早期的标注里本身就把这两类标混了,模型学到了混淆的特征。这提醒我数据集不是标完就万事大吉,必须在模型badcase分析后反向修正标注。我汇总了数百个误检样本,挑出其中近60个确认是标注问题,逐一重标后重新训练,整体mAP又提了1.3个点。这就是自建数据集相对网传数据的最大优势:出现错误你有底稿可查,有原始底片可溯源。
5. 数据集落地使用中的常见问题与避坑指南
5.1 版权与合规使用
关于“其他的都是盗版”这句,我是认真的。工业数据集直接从生产现场流出是很有问题的,不经授权拿来做商用项目,一旦被原始所有方追究,轻则项目下架,重则赔偿。就算用于论文,复制传播来源不明的数据也可能引发学术诚信质疑。
所以构建数据集之前,先把授权链条理清楚。原始底片的提供方签署书面授权文件,允许做脱敏和技术加工,允许发布标注后的训练子集,商用用途单独约定。数字化和标注后的数据,以合规开源协议发布,用户在协议范围内自由使用。这套流程虽然繁琐,但能保证你几个月的心血不会因为版权纠纷白费。给你的建议就一条:数据来源必须能经得起追溯,没有授权的东西宁可不做。
5.2 标注噪声对模型的影响与修正
标注噪声在自建数据里几乎不可避免,关键是建立发现和修正机制。我常用的一个办法是“置信度直方图法”。训练完成后,把所有验证集预测框按置信度从高到低排序,模型高置信度但预测错的框,极大概率对应的标注框有误。人工抽查Top误检,比从头复查一遍全部数据效率高得多。
还有一种情况是漏标。用训练好的模型在无缺陷样本上做推理,若模型输出了高置信度框,而你确认该样本确实没有缺陷,那就是模型虚警;但如果你仔细看发现确实有缺陷,那就是当时的漏标。我把这个流程称为“模型辅助数据回流”,实质是让模型给标注团队当第一轮初筛员。三周时间,通过这个方法额外检出了150多个漏标缺陷框,裂纹类最多。毕竟人眼长时间盯灰度图一定会疲劳,机器不会。
5.3 类别不平衡的终局解决方案
六类缺陷数量天然不平衡,气孔和夹渣加起来占了一半以上,裂纹只有不到一千框。只靠数据增强已经不够时,我加了两个手段。
第一是类别加权损失。YOLO系列的自定义训练里可以按类别调整loss权重,把少数类权重提到1.3到1.5,让模型更重视裂纹和未熔合的错误。第二是构建平衡子集做增量训练。把裂纹类和未熔合类单独抽出来,配合预处理阶段做的合成样本,各做成一个小训练集,在总模型基础上只fine-tune少量epoch,相当于针对错题专项补课。
这两板斧用完之后,裂纹的AP从68.9%升到了75.4%,未熔合从72.6%升到77.2%。虽然还达不到气孔的精度,但已经具备上线价值。
6. 数据集后续还能怎么扩展
6.1 半监督与合成数据的想象空间
目前数据只有5232张,边际效益递减明显。我目前正在做的扩展方向有三个。
半监督伪标签。让一个已经调教得不错的教师模型去预测大量未标注底片,高置信度的bbox作为伪标签回填,再用来训练学生模型,反复迭代。底片获取渠道是现成的,只是标注贵,这个方案能把可用数据量翻倍还不增加标注成本。
合成数据生成。用扩散模型在真实缺陷框约束下,生成更多落在焊道位置上的合成缺陷图像。难点在于不能让模型产生伪造缺陷,必须严格贴合真实物理形态。目前我看到的行业实验已经证明,适量参与训练后,合成数据对裂纹这种极少数类别的AP提升非常明显。
跨域迁移。同一套标注规则,如果配合不同厂家的扫描仪、不同暗室条件、不同牌号胶片,模型在换厂后的泛化能力会更强。后续我准备对同一底片做不同扫描参数的配对数据,模拟曝光波动的分布,增强模型对设备差异的抗性。
6.2 给后来者的三条建议
如果你也准备自建一套缺陷检测数据,我的感受是几句话。
先写标注规则再动手标。没有明确规则就开标,会得到大量不可控的标注结果,返工成本往往比多花一周写规则贵得多。
把数据划分当成项目里程碑来对待。不是最后顺手一分的环节,而应该在数据入库前就设计好,避免同源数据泄漏造成模型虚高。
版权问题永远放在最前面。技术问题再难都有解,合规问题一个就能让整个项目归零。宁可慢一点,也不要去碰来源不明的“盗版”数据——这句话既是经验,也是教训。
最后分享一个实际操作里的细节。整套数据建完后,我一直保留着原始未增强版本和增强后版本两套数据,分别归档。模型效果出问题时,可以随时回溯对比,判断是训练策略问题还是数据问题。这个习惯帮我少走了很多弯路,也推荐给你。