尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

焊接图像语义分割实战:数据集构建与模型训练全记录

焊接图像语义分割实战:数据集构建与模型训练全记录 简介语义分割是计算机视觉中的核心任务之一通过对图像逐像素分类能够精确区分目标边界与轮廓。在焊接质量检测场景中传统目标检测的矩形框难以刻画细长裂纹、微小气孔和飞溅颗粒而语义分割可提供像素级分类结果为缺陷面积统计、焊缝质量评级和机器人自动焊接提供关键数据支撑。本文基于6000余张真实产线焊接图像的像素级标注数据集系统阐述从标签体系设计、数据预处理与增强、类别不平衡处理到DeepLabV3与U-Net模型对比训练的全流程实践并分享了针对工业噪声特性的调参和后处理经验。这些内容适合工业视觉、缺陷检测和语义分割相关工程人员参考。 焊接质检这个场景我一直觉得是计算机视觉里特别“实在”的方向——脏活累活多但落地价值极高。最近刚好在整理一个焊接图像语义分割数据集总数超过6000张每张都带了像素级标签。这篇文章就把我处理这套数据、训练模型、踩坑排查的全过程记录下来希望能给正在做工业视觉、缺陷检测或者语义分割相关工作的朋友一些参考。1. 场景理解与整体设计思路1.1 为什么焊接检测需要语义分割焊接缺陷检测和普通的目标检测任务不太一样。目标检测给的是矩形框告诉你“这里有缺陷”但焊接场景里的问题往往形状不规则——裂纹可能是细长的一条气孔可能就针尖大小飞溅更是四处散落。边界框会在框住缺陷的同时框进大量背景导致后续的量化分析比如缺陷面积占比、焊缝宽度、熔池形态完全没法做。语义分割的本质是给图像里的每一个像素打上类别标签。对于焊接图像来说这意味着我们不仅能定位缺陷在哪里还能精确到缺陷的轮廓、面积、形状甚至能区分出焊缝区域、母材区域、飞溅区域和背景区域。这类细粒度的信息后续无论做焊接质量评级、工艺参数优化还是机器人自动焊接的路径规划都是绕不开的基础输入。1.2 数据集项目的整体定位这套数据集的核心定位是“为工业焊接场景提供可落地的像素级标注数据”。6k的数据量并不是随便凑出来的而是覆盖了不同焊接工艺、不同光照条件、不同材质表面的真实产线图像。我在实际使用中体会很深的一点是工业场景的数据集难点从来不是“多”而是“脏”和“杂”——弧光过曝、烟尘遮挡、反光干扰、飞溅粘连这些才是分割模型真正要面对的敌人。所以整个项目的设计思路是数据采集阶段尽量保留现场的真实干扰标注阶段建立严格的质量规范训练阶段针对工业图像的噪声特性做专门的预处理和增强策略。这套思路下来模型在产线环境里的表现会比在公开数据集上训出来的稳定得多。1.3 适合谁用、能解决什么问题如果你是做焊接质量检测算法研发的工程师这套数据可以直接用来训练语义分割模型替代传统的人工肉眼检验或者简单的阈值分割。如果你在搞机器人自动化焊接分割结果可以帮助系统实时识别焊缝位置和熔池状态。就算你只是入门语义分割这套数据也是个不错的练习对象——它比Cityscapes、VOC这类通用数据集更有挑战因为工业图像的噪声分布更加复杂能逼着你把数据预处理和模型调参的基本功练扎实。2. 数据集构成与标注体系拆解2.1 数据规模和场景覆盖整套数据集一共6237张焊接图像全部是真实产线环境拍摄的不是实验室里摆拍的理想样本。按照焊接工艺划分大约包含三大类气体保护焊约占45%、手工电弧焊约占30%和埋弧焊约占25%。每一类下面的工件材质、板厚、焊接位置也都有差异这样模型不会只学会识别某一种特定场景下的焊缝。图像分辨率统一处理为1024x1024格式为PNG标注文件是单通道的PNG灰度图像素值直接对应类别ID。这里要说明一下训练的时候原始分辨率其实不用太高1024这个尺度是标注成本和训练效率的折中。如果产线上后续要往更高分辨率迁移可以基于这套数据做滑窗切图我在后面预处理章节会细说。2.2 标签体系与像素类别设计标注类别一共分了6类这个粒度是我反复斟酌过的类别ID类别名称说明0background背景母材以外的区域1weld_pool熔池区域2weld_seam凝固焊缝区域3spatter飞溅颗粒4porosity气孔/表面缺陷5crack裂纹设计这个类别体系时有几个考虑。第一熔池和焊缝分开标注因为这两个区域的视觉特征差异很大——熔池是高温液态金属亮度高、轮廓动态变化焊缝是冷却后的固态金属有规律的鱼鳞纹。分开之后模型才能分别学习各自的特征。第二飞溅单独成一类是因为飞溅在图像上是高亮的小颗粒和小的气孔很容易混淆只有单独建模才能抑制这类误判。第三裂纹这一类标注难度最高像素数量通常很少但工业场景里它恰恰是最不能漏检的缺陷。2.3 标注工具与质量把控流程标注用的是LabelMe这个工具做多边形标注比较顺手输出的是JSON格式转成语义分割的PNG掩码只需要一个脚本。选LabelMe而不是其他工具主要是因为团队里标注人员的学习成本低而且多边形标注对焊接飞溅这种不规则形状很友好。质量把控上做了两道检查。第一道是自动检查写脚本扫描所有标注文件检查类别ID是否越界、掩码和原图尺寸是否一致、每张图有没有空洞区域。第二道是人工抽检随机抽20%的图由经验丰富的质检工程师复核重点看裂纹和气孔这两类小目标有没有漏标、飞溅有没有被错误并入背景。注意焊接图像的弧光区域会出现严重的过曝人眼几乎分不清边界。这类图不要硬标直接跳过或者标注时把过曝区域统一归为背景否则标注员的标注一致性会很差反而污染数据。3. 数据预处理与增强策略3.1 基础预处理流程拿到原始图像和掩码之后第一步是做统一化处理。由于产线相机的曝光参数不完全一致图像的亮度分布有差异我会先做一个简单的灰度归一化把像素值拉伸到0-255的标准范围。这个处理对焊接图像尤其重要因为弧光区域和暗部区域的对比度差异极大不归一化的话模型很容易被个别极亮样本带偏。第二步是图像清洗。焊接产线有时会拍到完全空白的图像比如焊机没启动、严重模糊的图像相机抖动或者遮挡率超过50%的图像烟尘太大挡住镜头。这类脏数据直接留在训练集里模型学到的是噪声而不是特征。我的筛选规则是计算图像的拉普拉斯方差低于某个阈值的判为模糊图像剔除掉烟尘遮挡严重的靠人工目检来剔除。这一步做完大约去掉180张左右。3.2 数据增强策略的取舍焊接图像的增强策略和通用语义分割不太一样不能无脑上。我实际测试过几种方案翻转和旋转水平翻转可以放心用因为焊接方向左右对称垂直翻转要谨慎因为熔池在上、焊缝在下这种空间关系在很多场景下是有物理意义的。亮度和对比度扰动这个对焊接图像很有用产线不同时间段的光照差异本来就大稍微加一点扰动可以增强泛化性。但幅度不能太大否则会让弧光区域和焊缝区域混在一起。随机裁剪焊接图像的缺陷区域往往很小直接从1024x1024里随机裁剪512x512的训练块会让小目标在裁剪后消失。我的做法是固定随机裁剪的同时额外做一次以标注像素为中心的裁剪——先用连通域分析找出所有标注目标以目标为中心裁出固定大小的图块这样小目标就能在训练中反复出现。我最后采用的增强组合是随机水平翻转概率0.5、随机亮度扰动幅度±20%、随机裁剪输出512x512加目标中心裁剪的混合策略。这里有个重要的实操心得在混合策略里目标中心裁剪的比例不要超过50%否则模型会过拟合到“目标总在图像中心”的分布上推理时遇到目标在边缘的情况就抓瞎。3.3 类别不平衡处理焊接图像里背景像素和熔池像素的比例极度失衡。我统计了一下一张典型图像里背景占了80%以上裂纹区域往往不足0.5%。如果直接用交叉熵损失训练模型会倾向于把所有像素都预测成背景mIoU看着还行但裂纹这类关键缺陷全丢。针对这个问题我用了两套手段配合。第一套是在损失函数层面引入加权交叉熵每个类别的权重按照类别频率的倒数来设置但做了一次截断——权重上限设成10防止太稀有的类别权重过大导致训练震荡。第二套是用Dice Loss做辅助损失Dice Loss对小目标的敏感度比交叉熵高得多两个损失按0.6和0.4的比例加权效果比单独用任何一个都稳定。4. 模型选型与训练参数配置4.1 模型选型为什么选择DeepLabV3和U-Net的对比语义分割的模型方案很多我这次重点对比了U-Net和DeepLabV3两条路线。U-Net的结构是编码器-解码器加跳跃连接编码器逐层提取特征解码器逐步恢复分辨率跳跃连接把浅层的空间细节和深层的语义信息融合起来。焊接图像里飞溅、气孔这类小目标非常依赖浅层细节信息所以U-Net在这个场景下天然有优势。DeepLabV3用的是空洞卷积加空间金字塔池化ASPP核心思想是在不降低特征图分辨率的前提下扩大感受野。焊缝是长条状结构跨越大范围的上下文信息很重要ASPP能同时捕捉不同尺度的上下文对长条状的焊缝分割效果不错。我最后选了DeepLabV3作为主模型ResNet50作为backbone原因是它在分割精度和推理速度之间最平衡。如果追求极致精度可以用ResNet101的backbone但推理时间翻倍产线实时性会受影响。同时在实验组里跑了一个U-Net做对比效果和后处理细节在第5章展开。4.2 训练超参数与优化器配置具体参数直接给到能复现的设置参数配置值说明输入尺寸512x512裁剪后的训练尺寸Batch Size8单卡显存约9GB训练卡是RTX 3080 10G优化器AdamW权重衰减0.01初始学习率1e-4配合warmup策略Warmup步数500前500步从1e-5线性升到1e-4学习率调度余弦退火最小学习率到1e-6总训练轮数80使用早停验证集mIoU连续10轮不升就停损失函数0.6CE 0.4DiceLoss加权组合用AdamW而不是SGD是因为我在焊接图像上实测Adam系的收敛速度明显快而且对学习率的敏感度低不需要频繁调参。权重衰减设0.01是避免模型在噪声较多的工业图像上过拟合。warmup这一步不可省焊接图像里弧光区域的梯度变化非常剧烈如果没有warmup直接上大学习率前几百步loss往往剧烈震荡。4.3 训练过程的关键观察训练过程中的loss变化值得记录一下。前10轮loss从1.8快速降到0.4左右但这时候的mIoU不高大概只有0.6。从第10轮到第30轮之间是最关键的阶段loss下降变慢但mIoU爬升很快说明模型正在从“学到大结构”进入“精修小目标”的阶段。到了第50轮之后验证集mIoU基本在0.82-0.84之间波动继续训练提升很有限。这里有个坑要提醒受弧光过曝影响个别图像里熔池和背景的对比度极低模型在这几张图上始终分割失败。后来我单独看了一下错误样本发现模型并非学不到特征而是这类图像本身信息不足人眼都难以分辨边界。这种图在产线场景里不可避免缓解思路是采集阶段尽量控制曝光不能指望模型处理超出人类视觉极限的问题。5. 实验对比与推理优化5.1 不同方案的量化对比我把U-Net、DeepLabV3ResNet50和DeepLabV3ResNet101三组方案跑了一遍评估指标用了语义分割最常用的mIoU所有类比的平均交并比和各个类别的IoU。结果如下模型方案mIoUweld_pool IoUweld_seam IoUspatter IoUporosity IoUcrack IoUU-NetResNet340.780.850.810.690.610.35DeepLabV3ResNet500.830.890.860.770.700.52DeepLabV3ResNet1010.840.900.870.780.710.54从数据能明显看出DeepLabV3在这个场景下全面优于U-Net尤其是在裂纹这个最难的小目标类别上提升了将近17个百分点。原因在于ASPP模块的多尺度上下文捕捉能力对细长裂纹更有效——裂纹的周边环境信息比如裂纹周围的焊道纹理能帮助模型判断哪些像素属于缺陷而U-Net的跳跃连接虽然保留细节信息但没有这种显式的多尺度建模。ResNet101相对ResNet50的提升不大但显存占用和推理延迟高了不少所以生产环境里我选了ResNet50版本。5.2 推理阶段的加速处理训练完成后还有一个关键环节是推理优化。语义分割模型直接跑1024x1024的整图在GPU上没问题但很多产线现场用的还是普通工控机加CPU推理。我把模型转成了ONNX格式再用TensorRT做FP16量化在这套组合下推理速度能做到单张图约38msRTX 2060显卡相比PyTorch原生推理快了2倍左右。如果GPU都没有只靠CPU推理的话建议把输入尺寸降到768x768虽然mIoU会掉1到2个点但延迟能控制在可接受范围内。5.3 预测结果的后处理模型输出的概率图直接做argmax得到掩码后会有些碎小的误检区域一个飞溅的误检可能只有几个像素。对这种应用后处理必须加上形态学操作。我用的是先腐蚀后膨胀的形态学开运算核大小3x3这样能把孤立的小噪点去掉同时保留较大的飞溅区域对裂纹这类长条形目标后面再做一个闭运算把断裂的线连起来。另外一个生产经验的补充如果只是做质检可以不用把分割结果直接作为最终结果而是从分割掩码里提取统计特征比如缺陷总面积占比、单个缺陷的面积分布、焊缝中心线的连续性等再把这些特征送入一个简单的分类器或者规则引擎做最终的焊接质量判别。这样比直接拿像素级结果做判断要稳得多也更容易通过产线验收。6. 常见问题与排查技巧实录6.1 数据标注阶段的高频问题标注过程中最常见的问题是标注边界不一致。焊接图像里飞溅和背景的边界常常模糊标注员A可能把部分背景划进飞溅区域标注员B则相反。这个问题的排查方法是在标注完成后做一致性统计随机挑几张图让不同标注员对同一张图各标注一遍计算两幅掩码之间的IoU。如果IoU低于0.7说明标注规范还不清晰需要重新对齐标准。另一个高频问题是类别误标。气孔和飞溅在外观上很相似都是圆形高亮区域但气孔凹陷、飞溅凸起在2D图像上区分确实困难连现场老师傅也要仔细看。我们的解决方案是在标注培训中专门用一页PPT展示气孔和飞溅的典型对比图同时要求在标注时结合灰度分布判断——通常飞溅的亮度更高、边缘更锐利气孔多呈暗斑形状且周围有熔渣环绕。6.2 训练阶段常见报错与对策训练中最容易遇到的是显存不足问题尤其是输入尺寸拉到1024、batch size设到16的时候。这类报错通常是“CUDA out of memory”。别急着加显存先把batch size调到4再用梯度累积模拟8的batch size效果多数情况就能解。还有一个细节是数据加载的瓶颈。大量PNG图像在读取和解析上比JPEG慢得多如果数据管道没有优化GPU会经常处于空转状态。我的解法是先把所有图像和掩码离线转存成LMDB格式训练时直接读取单卡训练速度提升明显。这个优化在训练数据上花的功夫不多收益却很大。6.3 模型效果不佳的排查顺序如果你拿这套数据集训练后模型效果不理想我的建议是按这个顺序排查先看验证集loss曲线是否收敛。如果loss震荡剧烈优先检查学习率和batch size以及warmup有没有加。再看每个类别的IoU。如果总体mIoU还行但个别小类别指标很低典型是裂纹那就是类别不平衡问题没处理好重点检查损失函数的权重设置。如果某个类别误检特别严重比如把大量母材预测成熔池先抽样看预测结果图判断是什么视觉特征触发了误检。有时候是增强策略出了问题比如亮度扰动幅度太大导致模型学混了。如果以上都正常但效果还是不满意那就回到了数据层面补充对应场景的数据永远是最直接有效的手段。7. 实操总结与扩展思路焊接图像语义分割这个方向说实话没有太多投机取巧的空间拼的就是数据质量和训练细节。这套6000多张的数据集从标注体系设计到训练策略调整每一步都需要扎扎实实做下去。在反复实验过程中我的感受是焊接场景的分割任务里小目标缺陷裂纹、气孔永远是最难攻克的点任何能提升小目标IoU的手段——不管是目标中心裁剪、加权损失函数还是选择合适的模型结构——都值得优先尝试。最后再分享一个小技巧。如果你后续想用SAM这类大模型来辅助标注焊接数据我的经验是它很擅长分割出完整的焊缝区域但在飞溅和小气孔这类细碎目标上效果不稳定依然需要人工修正。大模型可以当标注提效工具但工业场景的标注质量最终还是要靠一套严格的规范和双人复核机制来兜底。这套数据集的后续扩展方向我目前在考虑加入更多不同焊接姿态的图像横焊、立焊、仰焊因为在立焊和仰焊场景下熔池形态和飞溅分布与平焊差异非常大。另一个方向是给部分图像补充红外或者光谱相机的多模态数据这能解决弧光过曝时可见光图像信息丢失的问题。希望这些实战经验能帮你少踩一些坑。本文还有配套的精品资源点击获取
返回列表