news 2026/10/17 3:33:28

X射线底片焊缝缺陷目标检测数据集构建全流程详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
X射线底片焊缝缺陷目标检测数据集构建全流程详解

X射线底片焊缝缺陷目标检测数据集,5232张,一步步讲清楚我是怎么建出来的

做工业视觉的人,大概率绕不开这样一个场景:拿到一卷记录着焊缝内部状态的X射线底片,在黑房间里隔着观片灯,瞪大眼睛找焊道上的气孔、夹渣、裂纹、未焊透。这种活儿我干了快六年。后来转型做检测算法,最头疼的反而不是模型本身,而是数据集。市面上传的焊接缺陷数据要么数量太少、要么标注混乱、要么来源不明不敢商用。一个偶然的机会,我和团队拿到了足够的原始底片授权,前后花了三个月,构建了一套包含5232张X射线底片图像、配有目标检测框和缺陷类别标签的数据集。这篇文章不聊虚的,把这套数据集从选片、扫描、预处理、标注、划分,到跑通目标检测模型的全过程,以及中间踩过的坑,一次讲清楚。

这套数据集的核心价值在于三点:第一,底片来源真实,是实际检测现场积累下来的X射线胶片,不是网上随便抓来的模糊截图;第二,标注规则针对焊缝缺陷重新梳理过,尤其是未焊透与未熔合这类容易混淆的类别,制定了统一的判定标准;第三,版权清晰,可以合法用于学术研究甚至工业项目交付。如果你正在做焊接质量相关的图像识别、无损检测类工作,或者刚入门目标检测想找一套工业场景数据做练手,这篇内容会非常有用。我也见过太多人在网上流传的数据集上跑模型,结果训练集和测试集有重复、标注框有明显的错位,白白浪费了时间。下面,从项目思路开始讲。

1. 为什么需要一套自建的焊缝缺陷目标检测数据集

1.1 焊缝缺陷检测的行业现状与痛点

焊接是几乎所有重工业的基础工艺,压力容器、管道、桥梁、船舶钢结构都离不开它。但这些部位的焊缝一旦存在内部缺陷,轻则返工,重则引发安全事故。所以生产环节一定要做无损检测,最传统也最可靠的就是X射线照相法:射线穿过工件,内部缺陷会在底片上留下不同黑度、不同形状的影像。

问题在于,评片这件事极度依赖人的经验和状态。一名熟练的评片员,一小时能看几十张片,但连续看久了注意力会下降。而且不同评片员对同一张底片可能给出不同结论,这类情况在企业内部经常引发扯皮。所以行业内早就想用视觉算法把底片上的缺陷自动框出来。但算法要落地,第一步就是数据。

现实情况是,工业生产环境里的底片,对比度极低,缺陷形态各异,气孔是白色或者黑色的圆点,夹渣可能是一长条,裂纹往往细得像发丝。这样的图像喂给一个通用目标检测模型,效果大概率不理想。更糟的是,很多工厂即使存有底片,也没有做过数字化归档,更谈不上给每个缺陷画框标类别。数据稀缺并不是假话。

1.2 网传数据集的“坑”和版权隐患

网上一搜“焊缝缺陷数据集”,能找到不少,但细看问题很明显。有些是翻拍屏幕的,分辨率低,细节丢得一干二净;有些压缩成了几百KB的JPEG,发丝裂纹根本看不见;还有的把同一张图翻转一下就算新样本,训练验证一划分,模型直接在测试集上“背答案”。

更麻烦的是版权。很多数据集是从企业内部泄露出来的,或者从培训教材、论文插图里截出来的,原始底片归属权不明。你拿来做学术研究可能没人追,但一旦涉及商用交付,甲方做数据溯源,立刻变雷区。标题里写“其他的都是盗版”,说得直白一点,就是这个行业里网传数据长期处于灰色地带,乱拷贝、乱转发、乱标的情况太多,最后受害者反而是认真做项目的开发团队。

所以,与其赌网传数据的质量和来源,不如拿出一套产权清晰、可追溯、可复用的自建数据。这也是这套5232张数据集的出发点。

1.3 为什么是目标检测,而不是单纯分类

焊缝缺陷识别有两类解决方案。一类是图像分类,告诉模型“这张片上有没有缺陷、属于哪类缺陷”;另一类是目标检测,模型不仅要判断有没有缺陷,还要把缺陷具体每处的边界框出来,并指出框内是什么类别。

工业生产里,分类远远不够。一张底片通常几十厘米长,可能包含多道焊缝,一道焊缝上有多个缺陷。如果只做分类,哪怕判断出有气孔,工人还是要重新铺开一整张片子找位置,效率提升有限。目标检测的好处是给出每个缺陷的坐标和类别,系统可以把坐标映射到实物上,直接指导返修位置。所以数据集的最终形态必须是带bbox标注的目标检测格式,而不是单纯打上类别标签。

2. 5232张数据的整体设计思路与核心细节

2.1 底片来源与缺陷类别分布

这套数据的底片来自多个合作方提供的真实射线底片,覆盖结构件焊缝、管道对接焊缝、容器纵环缝等常见场景。当然,所有底片在制作数据集之前都做了脱敏处理,不保留任何生产企业标识和工程编号。

清洗筛选后,一共保留5232张有效图像,每张底片经过裁剪和分割,只保留焊缝区域。因为整张底片很大,直接整体喂给模型不仅浪费算力,而且缺陷占比太小,检测器根本学习不到有效特征。

缺陷类别定为六类:气孔、夹渣、未焊透、未熔合、裂纹、咬边。这六类是工业评片标准里最常见的缺陷形态。除此之外,图像中也保留了部分不包含缺陷的正常焊缝样本,用来降低模型误检率。整体分布大体如下:

缺陷类别标注框数量样本占比形态特征
气孔358226%圆形或椭圆点状,边缘较清晰
夹渣413830%不规则块状或条状,黑度不均匀
未焊透184713%沿焊道中线的连续或断续黑线
未熔合143010%偏向焊道一侧的细线状黑影
裂纹9767%细线状,可能带分枝,端部尖锐
咬边193414%靠近焊趾的沟槽状黑线
总计13907100%—

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.5mAP@0.5:0.95单张推理耗时(毫秒)
YOLOv8s64078.6%51.2%8.1
YOLOv8m64081.3%55.6%15.4
YOLOv8m153683.2%59.8%52.3
RT-DETR-l64080.5%53.9%28.6
RT-DETR-l153682.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 给后来者的三条建议

如果你也准备自建一套缺陷检测数据,我的感受是几句话。

先写标注规则再动手标。没有明确规则就开标,会得到大量不可控的标注结果,返工成本往往比多花一周写规则贵得多。

把数据划分当成项目里程碑来对待。不是最后顺手一分的环节,而应该在数据入库前就设计好,避免同源数据泄漏造成模型虚高。

版权问题永远放在最前面。技术问题再难都有解,合规问题一个就能让整个项目归零。宁可慢一点,也不要去碰来源不明的“盗版”数据——这句话既是经验,也是教训。

最后分享一个实际操作里的细节。整套数据建完后,我一直保留着原始未增强版本和增强后版本两套数据,分别归档。模型效果出问题时,可以随时回溯对比,判断是训练策略问题还是数据问题。这个习惯帮我少走了很多弯路,也推荐给你。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 3:32:31

ThreadX+STM32CubeMX串口收发工程拆解:从裸机到RTOS的UART实战

简介:本资源面向STM32嵌入式开发者与ThreadX实时操作系统学习者,聚焦串口DMA通信这一常见工程场景,解决在ThreadX下如何用队列与信号量协调串口收发、避免阻塞与数据丢失的问题。压缩包共约2000个文件,以905个C源文件、345个头文件…

作者头像 李华
网站建设 2026/10/17 3:32:15

WebLogic WAR部署协议选型:HTTP、T3与IIOP原理与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/17 3:31:57

SteamVR 2.7.2 VR手柄按钮输入测试与阈值调优实战

1. 为什么按钮测试值得单独写一篇总结做过VR手柄交互的人都有一个共识:抓取、投掷、传送这些“大功能”反而好调,真正折磨人的是按钮。扳机键的键程、握持键的触发时机、摇杆的死区、触摸板的电容判定,任何一个参数没对齐,用户戴上…

作者头像 李华
网站建设 2026/10/17 3:31:40

Claude Code agentTeams实战:多Agent协作拆解大项目

我自己在终端里天天用 Claude Code 写代码,单 Agent 用久了就会发现一个问题:活一多、项目一复杂,那个上下文窗口就像个越堆越满的垃圾桶,前面改的需求后面就忘,修了 A 文件的 bug 又把 B 文件的结构给带崩了。后来我把…

作者头像 李华
网站建设 2026/10/17 3:31:27

Q-learning在Matlab随机迷宫路径规划中的实战与调参心得

在路径规划这个方向上摸爬滚打了几年,我发现一个很有意思的现象:很多人一上来就直奔各种号称“最强”的算法,结果环境稍微改一改,性能掉得难看得要命。反倒是那些最基础的东西,吃透了之后哪儿都能用。Q-learning就是这…

作者头像 李华
网站建设 2026/10/17 3:30:59

商业级Unity 2D平台跳跃游戏开发指南:从架构到发布

做商业级Unity 2D平台跳跃游戏,常被误解成“把角色跑跳做出来就行”,但真做到能上线、能持续迭代、能让团队不同人接手不骂街的程度,差距基本就在“开发大纲”这一层。这篇文章不是给你讲Lerp和AddForce的入门教程,而是站在商业项…

作者头像 李华