资讯详情

资讯详情

基于深度学习与YOLO的焊接缺陷检测系统实践

干过质检或者跟焊接产线打过交道的人应该都懂这个场景老师傅戴着面罩拿肉眼查焊缝赶上夜班或者连续查几百个工件眼睛都看花了漏检照样防不住。后面就算上了机器视觉传统算法面对弧光干扰、飞溅、工件表面的油污反光参数调到头也还是误报不断。这几年基于深度学习的焊接缺陷检测系统成了热点原因很简单——它不是在“写规则”去套所有缺陷而是让模型自己从大量标注好的图像里学出“缺陷长什么样”泛化能力比传统算法规整得多。我自己也完整做过一个基于Python的焊接缺陷检测项目从数据准备到模型训练再到部署落地踩了不少坑这篇就把整个系统的研究思路和代码实现从头到尾拆开讲清楚给准备入坑的朋友一条能直接抄的路线。这套系统解决什么问题核心就是替代人工质检中的“眼睛疲劳和标准不统一”把检测任务自动化。具体能做的包括识别焊缝中的气孔、夹渣、未熔合、裂纹、咬边这些常见缺陷类型输出缺陷位置和类别在产线上联动报警或控制机械臂分拣。适合谁看一是做机器视觉落地的工程师二是搞智能制造课题研究的学生三是想评估深度学习方案能不能用在自己工厂产线上的技术管理者。文里的代码基于Python和PyTorch实现模型以目标检测作为主路线全文不绑定任何收费商业软件全部用开源工具链照着走基本能复现。1. 焊接缺陷检测的需求拆解与方案选型1.1 缺陷类型与检测难点到底是什么焊点或者焊缝的缺陷在工业标准里有一套明确的分类最常见的几类是气孔、夹渣、未熔合、裂纹、咬边和烧穿。气孔是小圆坑夹渣是不规则暗色块未熔合和裂纹都是细线状但方向不同咬边在焊缝边缘呈沟槽状。这些缺陷形态差异大直接导致一个问题单一算法很难同时兼顾它们因为有的体积小、有的对比度极低、有的和正常焊纹十分相似。检测难点的第一层是图像采集环境。焊接现场有弧光闪烁有飞溅颗粒工件表面有氧化色和反光相机的曝光稍有不稳一张图中的缺陷特征就可能被高光淹没。第二层是特征本身——未熔合和裂纹都是长条形但裂纹往往只有几个像素宽在1080P图像里占比不足0.1%这种小目标对深度学习模型的分辨率设计和anchor尺寸设定都非常敏感。第三层是样本不均衡产线正常品远多于缺陷品缺陷里气孔又远多于裂纹如果直接拿原数据训练模型会学成“只会报气孔”的偏科生。所以在项目启动之前我建议大家先花一周时间做数据盘点收集多个批次、不同光照条件的图像按缺陷类别统计数量分布筛掉模糊和标注争议大的图。这一步决定后面所有工作的上限数据质量不达标模型再先进也白搭。1.2 为什么是深度学习而不是传统机器视觉传统方案做焊接缺陷检测通常走的是图像预处理加特征提取的路子先滤波去噪再用边缘检测、灰度阈值分割或形态学操作把缺陷区域圈出来最后用支持向量机或者随机森林做分类。这套方案在实验室干净样本上表现尚可一上线就露馅不同钢材反光度不同焊接电流电压一变图像灰度分布就全变了阈值跟着失效调试周期长还锁死在某条产线上。深度学习方案的核心优势是把“特征设计”这件事交给了网络。模型在训练过程中自动从图像里学到有区分度的特征抽象层级浅层关注边缘纹理深层关注语义形状对光照变化、工件批次差异的鲁棒性明显更强。尤其在焊接这种强干扰场景下卷积网络对局部特征的组合表达能力远超手工特征。但深度学习也不是万能药。它吃数据、吃算力而且对标注质量要求高推理部署环节比传统算法复杂需要做模型压缩和格式转换。实操里我见过不少团队跳过需求分析直接租显卡开训最后模型指标挺漂亮却因为推理延迟压不到产线节拍而无法落地。所以选型结论是如果缺陷类型固定、产线环境稳定、样本量少传统方案够用如果你要面对多样化产品型号和复杂干扰深度学习是更优解但必须按系统工程来做。2. 整体架构设计与模型选型逻辑2.1 检测任务定义分类、定位还是分割动手写代码之前先把任务类型定清楚。焊接缺陷检测有三种常见的任务定义方式图像级分类、目标检测、实例分割。图像级分类只回答“这张图上有没有缺陷”不告诉你位置适合做粗筛闸口比如大批量首检快速排除正常件。目标检测输出每个缺陷的边界框和类别是当前产线用得最多的方案因为品控人员看到框的位置就能去补焊或打磨。实例分割则把缺陷像素精确抠出来适合对缺陷面积有量化要求的场景比如计算气孔率、评估裂纹长度但标注成本和计算开销都高。我做的这个项目选择目标检测作为主路线原因很直接产线需要的是“在哪里、是什么、有多大”边界框足够同时分割标注的时间接近检测的三倍而我们在项目周期内没有那么多标注人力。如果你后续要算缺陷面积占比可以在检测结果基础上加一个轻量分割头不用一开始就上完整分割模型工程上更灵活。2.2 模型选型YOLO系列与轻量化取舍模型选型我从YOLOv5s开始做基线后来又对比了YOLOv8n和YOLOv8s。选YOLO系列的原因总结下来有三点一是工程成熟度数据加载、增强、训练、导出整条链路的代码都是开箱即用社区资料多遇到问题好搜二是推理速度快YOLOv5s在单张1080P图上用GPU推理可以跑到10毫秒出头完全能满足在线实时检测三是增强策略丰富YOLO自带Mosaic、MixUp这些数据增强对样本量有限的焊接缺陷任务来说变相扩了好几倍数据。YOLOv5s和YOLOv8s怎么选我建议看部署硬件。你的边缘设备如果是老型号GPU或者只有CPU优先考虑YOLOv5s或者YOLOv8n虽然mAP稍低一点但实时性稳如果算力充足、要更高的精度上限YOLOv8s的C2f结构和解耦头对细节特征提取更好小目标的召回率通常能高出2到3个点。我在实际项目中先用YOLOv5s跑通流程最后因为现场误检率要求苛刻换了YOLOv8s最终mAP50从0.912提到0.934代价是推理帧率从90FPS降到60FPS产线仍然够用。注意不要一上来就追求大模型。焊接缺陷样本量通常只有几千张大模型在数据不足时很容易过拟合训练慢、部署难精度反而可能不如小模型。先小后大按需升级才是正路。2.3 数据增强与训练策略的思路数据这块我的做法分三部分。第一部分是离线清洗和标注用LabelImg和X-AnyLabeling这类工具画框类别按标准分类设定六类porosity、slag、lack_fusion、crack、undercut、burn_through。第二部分是在线增强训练时开启Mosaic和随机仿射变换把不同焊缝图拼在一起训练让模型见过更多缺陷拼接方式同时配合随机亮度对比度调整来模拟不同弧光强度下的图像变化。第三部分是类别平衡处理针对裂纹样本少的问题我单独给它开了更高的增强倍率并在loss里增加类别权重避免模型完全被气孔和夹渣带偏。训练策略上我用了两阶段思路先在公开的焊接缺陷数据集上预训练一轮再迁移到现场数据上微调。迁移学习的好处是网络在前一个任务上学会了基本的纹理和边缘特征微调时只需要适应焊接缺陷的特定形态收敛速度和最终精度都有明显改善。实测下来直接冷启动训练要120个epoch才稳定迁移训练40个epoch就达到同等水平省下的不是一点半点时间。3. 核心代码实现与实操过程3.1 环境搭建与数据集准备环境的版本搭配很容易踩坑我这边测试过相对稳妥的一套组合Python 3.10、PyTorch 2.0.1、CUDA 11.8、Ultralytics YOLOv8.2.0。显卡是单张RTX 309024G显存训练YOLOv8s在1080P图上batch size可以开到16显存占用约18G。如果你的显卡显存小一些把batch size降到8或者把训练图分辨率从1280降到960效果差距不会太大。数据集目录结构按YOLO格式组织datasets/ ├── weld_defect/ │ ├── images/ │ │ ├── train/ │ │ ├── val/ │ │ └── test/ │ └── labels/ │ ├── train/ │ ├── val/ │ └── test/标注文件每行五个数值格式是类别ID、归一化中心x、归一化中心y、归一化宽度、归一化高度。注意这里一定是归一化后的坐标取值0到1之间数据格式错了会直接导致训练loss不下降或者边界框错乱。3.2 训练脚本的关键实现用Ultralytics封装库训练时核心代码非常短但参数配置要用心。我用的训练配置示例如下from ultralytics import YOLO model YOLO(yolov8s.pt) results model.train( dataweld_defect.yaml, epochs150, imgsz1280, batch16, lr00.01, lrf0.01, mosaic1.0, mixup0.2, fliplr0.5, scale0.5, patience20, device0, workers8, valTrue, projectruns/weld_defect, nameexp1, pretrainedTrue, )几个参数的经验解释imgsz用1280而不是默认的640是因为裂纹和未熔合这类缺陷宽度只有几十像素在640下特征几乎被压缩没了mixup开0.2而不是默认的0.1略微增强泛化但开太大缺陷边缘会变得模糊反而难学patience开20做早停防止后期过拟合浪费训练时间。数据配置文件weld_defect.yaml里写入类别数量和类别名路径用绝对路径最稳妥相对路径有时会因为工作目录不同而报错。3.3 训练过程监控与评估训练过程中每5个epoch看一下验证集上的PR曲线和混淆矩阵。我踩过的一个典型坑是训练到第80个epoch时mAP50还在涨但mAP50-95开始掉说明模型开始过拟合训练集的纹理细节而丢失泛化能力。这时不要犹豫用早停截断回到第70个epoch的权重做最终模型。训练完成后用验证集做一次详细评估打印每类的精确率和召回率from ultralytics import YOLO model YOLO(runs/weld_defect/exp1/weights/best.pt) metrics model.val(dataweld_defect.yaml, splitval) print(metrics.box.map) # mAP50-95 print(metrics.box.map50) # mAP50 print(metrics.box.mp) # 所有类别平均精确率 print(metrics.box.mr) # 所有类别平均召回率如果某个类别召回率明显低比如裂纹类的召回率只有0.6而其他类都在0.9以上优先检查两个方向一是标注是否漏标了细小的裂纹框二是数据增强时裂纹被随机裁剪出画面。我实际遇到的情况是后者Mosaic拼接导致细裂纹被切了一半模型学不到完整特征。解决办法是把scale参数调低并给裂纹类单独制作一批不参与Mosaic的保留数据混合训练。3.4 推理代码与结果可视化训练完的模型在推理阶段代码更简单但输出信息的利用方式值得讲究。我的推理脚本在检测之外还加了一个质量统计模块from ultralytics import YOLO import cv2 model YOLO(runs/weld_defect/exp1/weights/best.pt) img cv2.imread(test_img/part_023.jpg) results model.predict(sourceimg, conf0.25, iou0.45, imgsz1280, device0) boxes results[0].boxes cls_names results[0].names for i in range(len(boxes)): cls_id int(boxes.cls[i]) conf float(boxes.conf[i]) xyxy boxes.xyxy[i].tolist() print(f缺陷类: {cls_names[cls_id]}, 置信度: {conf:.3f}, 位置: {xyxy})conf阈值我建议设在0.25到0.3之间。设得太低误检增多现场频繁报警会让操作员直接关掉系统设得太高漏检风险上升万一真有裂纹没报出来责任就大了。阈值取舍要跟产线质量负责人一起定不要自己做主。4. 效果评估、调优方向与部署落地4.1 指标怎么看mAP不是万能的焊接缺陷检测的评估不能只看一个mAP。mAP50反映的是IOU阈值0.5下的平均精度适合看整体检测效果mAP50-95则对边界框的拟合格外严格缺陷检测中这类小目标天然框不准mAP50-95不高是常态不必过度焦虑。更要看的是每类缺陷的召回率尤其在安全相关的检测场景里漏一个裂纹比多报十个气孔严重得多。我习惯做一张评估矩阵表把每个类别的precision和recall列出来再统计“误检来源”。比如下表是一个典型结果缺陷类别样本数PrecisionRecall主要问题气孔11200.950.93正常焊纹小凹坑误判为气孔夹渣4600.910.88飞溅颗粒被误判未熔合1800.820.74细长框定位偏移裂纹950.700.58小目标漏检严重咬边2300.880.85与阴影混淆烧穿1200.940.91强光干扰这样的表比单一指标有用得多直接指导调优方向。4.2 调优优先级先数据后模型再后处理很多人一上来就调网络结构其实效果最明显的永远是数据侧。我在项目里把裂纹样本从95张扩到800张召回率从0.58直接提到0.76。扩数据可以对原图做小角度旋转、局部放大、加高斯噪声、模拟弧光强曝光注意不要用翻转把左右结构搞变形焊缝方向统一会更好。模型侧容易见效的调整是anchor尺寸。用YOLO自带的自动anchor检测脚本先统计验证集标注框的真实尺寸分布如果发现裂纹框的宽度远小于默认anchor就重新聚类生成新anchor。我跑完后anchor的第三层尺寸从原来的大框级别下探到十几个像素小目标召回率再涨了两到三个点。后处理侧可以针对单张图上连续多帧检测结果做时序滤波焊接缺陷如果是静止的这个处理能把偶发误检压下去不少。4.3 模型导出与产线部署经验训练好的PyTorch模型不能直接上产线我用的部署链路是导出ONNX格式再通过推理优化转成TensorRT的engine文件在GPU上以FP16精度跑。导出的关键代码model.export(formatonnx, imgsz1280, dynamicFalse, halfTrue)TensorRT转换时注意固定输入尺寸如果不固定引擎会对多种分辨率做优化选择实际推理性能会打折。另外焊接现场的工控机硬件不要省最低建议是搭载独立显卡显存8G以上否则1280分辨率的推理延迟很容易超过50毫秒跟不上产线节拍。如果是CPU部署把模型切成YOLOv8n并量化到INT8帧率可以恢复到15到20FPS精度会掉约5%。对焊检场景我的建议是优先保精度硬件能上GPU就不要省这个钱。5. 常见问题与排错实录5.1 检测框偏移严重怎么办训练完跑验证集发现缺陷检测框总是偏左或偏上大概率是标注数据的问题。我在项目初期让两个同学分别标注同一批图片框的标注习惯不一致一个框紧贴缺陷边缘一个框留了很大的白边。模型学到的框尺寸分布就会变得混乱推理时定位自然不稳定。解决办法是重新统一标注规范严格规定框必须包含缺陷的全部可见区域允许外扩不超过5个像素标注完再跑一次质量抽检。5.2 loss不收敛该怎么排查loss曲线平着走不下降是最让人头大的问题。第一步检查数据格式用脚本读几张图和一个标签文件画出标注框确认没有错位第二步检查类别ID是否连续比如只有1、2、3类而没有0类模型的类别映射会出问题第三步检查学习率l r 初始值调到0.005以下试试第四步检查显存异常和梯度爆炸loss突然变成nan多半是数据里混入了损坏图片逐一排除法最有效率。5.3 误检多正常焊纹被当缺陷这个问题的根源通常是负样本太少了。模型只见过“有缺陷”和“无缺陷”的图但没学过“看起来像缺陷但实际正常”的干扰纹理。解决思路是单独收集一批只有正常焊纹、划痕、油污的反例图片作为背景类加入训练。YOLO系列模型本身没有显式的背景类别输出但你可以通过难负样本挖掘在验证集上筛出误检严重的图把它们加入训练集并打上正确标签两三个轮次后误检率就能明显下降。5.4 模型在A批次工件上表现好换B批次就垮了这是领域漂移问题非常常见。焊接件的批次不同材料表面状态会有差异例如涂层厚度、氧化程度、纹路方向都会让图像分布发生偏移。对策有三个一是训练时收集尽可能多批次的图像不要只用一个月的货二是推理侧加图像归一化预处理统一亮度和对比度三是每隔一段时间用新批次的小样本做主动学习标注几十张图微调模型让系统保持和产线同步。我个人在实际操作中的体会是深度学习焊接缺陷检测这个项目七成时间花在数据和工程上三成花在模型上。模型选型直接从成熟的YOLO系列下手最稳妥除非你有极强的学术创新需求否则别去复现花哨的网络结构。踩过几次坑之后我最后悔的一件事就是没在项目早期把标注规范和评估矩阵定细后面返工占了大量时间。最后再分享一个小技巧训练完不要急着部署找一条不在训练验证集里的真实焊缝视频让模型在连续几百帧上跑一遍把误检和漏检的帧截出来做案例分析。这种在真实时序数据上的检验比任何指标都更能暴露模型的实际问题。焊接缺陷检测系统的价值最终要落在产线不良品率有没有下降上而不是落在论文里的图表上。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →