尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于CNN的焊缝缺陷检测:从网络搭建到在线部署全解析

基于CNN的焊缝缺陷检测:从网络搭建到在线部署全解析 简介一份面向工业激光焊接场景的深度学习学术论文PDF聚焦焊缝表面缺陷检测问题适合焊接自动化、机器视觉和深度学习方向的工程师、算法研究员及高校学生参考。内容围绕卷积神经网络CNN搭建多分类模型详细分析了卷积层、池化层、全连接层所使用的函数与参数并基于工业数控机床和工业相机完成焊缝数据采集通过分类、增强、扩增等预处理提升泛化能力再借助滑动窗口检测识别实际待测图像。实验数据显示该方法的焊缝缺陷检测精度可达97%以上单张图像测试耗时约300 ms在准确性和实时性上均优于传统机器学习算法。包内共含1个PDF文件压缩包大小1.76MB包含完整期刊论文排版、中英文摘要、实验数据与参考文献便于快速获取核心研究思路和实现细节。目前已有155人学习下载可作为工业缺陷检测方案选型、模型设计及论文写作时的高价值参考资料。1. 焊缝质检这道坎人工和传统视觉都卡在哪激光焊接的产线上气孔、溅射、凹陷、未焊透这些缺陷几乎无法完全避免它们直接决定焊件能不能投用。人工目检一小时看几百个焊点眼睛疲劳后误检率直线上升传统机器视觉靠人工设计边缘、纹理特征一旦遇到机床遮挡、光照不均特征稳定性就出问题。论文里那张账很清楚在2070张焊缝样本上卷积神经网络四分类模型准确率能到97%以上单张200×200图像推理时间只有300ms左右而SVM、KNN在同一批数据上只有约80%的准确率。这篇文章把整个方案拆开讲从网络结构、数据预处理到在线部署所有参数都能直接照抄复现。2. 搭建CNN多分类框架三卷积三池化怎么配参数2.1 这道题为什么适合CNN而不是手工特征焊缝表面缺陷的视觉特征没有固定形状。气孔是深色圆斑溅射是亮色颗粒群凹陷是连续暗区正常焊缝有规则鱼鳞纹。传统方法要为每个缺陷单独设计特征本质上是靠人的经验做数据建模泛化能力有限。CNN通过卷积核自动学习特征低层卷积提取边缘、纹理高层卷积组合出能区分缺陷类别的语义特征。这篇论文没有用Faster R-CNN、YOLO这类目标检测框架而是搭了一个轻量的多分类CNN原因很实际检测任务是判断每个滑动窗口图像的类别而不是框出缺陷位置分类模型更简单推理更快。2.2 网络结构与各层尺寸推导模型输入200×200×3的RGB图像三层卷积、三层最大池化、三个全连接层。卷积核大小为5×5个数100步长1padding方式为same。第一层卷积后特征图尺寸不变最大池化2×2、步长2把尺寸减半。整个网络的特征图变化过程如下表层输出尺寸参数说明输入200×200×3RGB焊缝图像Conv1200×200×1005×5卷积核×100same步长1Pool1100×100×1002×2最大池化步长2Conv2100×100×1005×5卷积核×100same步长1Pool250×50×1002×2最大池化步长2Conv350×50×1005×5卷积核×100same步长1Pool325×25×1002×2最大池化步长2Dropout25×25×100置零概率0.5Flatten62500展平为一维向量FC1512全连接ReLU激活FC2256全连接ReLU激活FC34softmax输出四类概率卷积输出尺寸按这个公式算N (W - F 2P) / S 1这里W200F5P0S1same模式计算结果是200。如果把padding改成validP0时输出就是196×196池化后的尺寸也随之变化所以padding的选择会直接影响后续每层特征图大小。对应的Keras建模代码from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout model Sequential([ Conv2D(filters100, kernel_size(5, 5), strides(1, 1), paddingsame, activationrelu, input_shape(200, 200, 3)), MaxPooling2D(pool_size(2, 2), strides(2, 2)), Conv2D(filters100, kernel_size(5, 5), strides(1, 1), paddingsame, activationrelu), MaxPooling2D(pool_size(2, 2), strides(2, 2)), Conv2D(filters100, kernel_size(5, 5), strides(1, 1), paddingsame, activationrelu), MaxPooling2D(pool_size(2, 2), strides(2, 2)), Dropout(0.5), Flatten(), Dense(512, activationrelu), Dense(256, activationrelu), Dense(4, activationsoftmax) ]) model.summary()卷积核数量固定为100和主流CNN从32、64逐层翻倍的做法不同。三层的感受野配合5×5卷积核在200×200输入上已经能覆盖足够大的局部区域而100个通道的特征图在三层结构里也不会产生过于庞大的计算量训练和推理速度都更适合工业产线。2.3 激活函数与池化层的作用激活函数选的是ReLUf(x) max(0, x)。相比SigmoidReLU在正区间梯度恒为1反向传播时梯度不会快速衰减三层卷积结构里能保证底层权重得到有效更新。最大池化取每个2×2窗口内的最大值保留的是最显著的特征响应对焊缝表面这类强纹理区域比平均池化更能保留缺陷边缘的突变信息。在第3个池化层后接Dropout随机置零概率0.5。可以对隐层神经元的输出概率进行随机丢弃实现权重参数的稀疏化既缓解过拟合也让模型迭代更快。这里需要注意Dropout应该放在Flatten之前还是之后论文里是放在最后一个池化层后、全连接层前作用域是整个特征图训练时让部分特征通道失效反而迫使剩余通道学习到更独立的表征。3. 焊缝数据采集与预处理从原始大图到200×200样本3.1 采集设备与曝光方式数据来自工厂实际钢板激光焊接相机用工业CMOS加上工业定焦镜头光源是工业环形视觉光源配合工业数控机床和CNC操作面板同步采集。论文里特意提到一个细节用背光方式增强图像让焊缝较亮、背景相对较暗缺陷轮廓更突出。这比漫反射正面打光在提取微小凹陷和溅射时更稳定。相机架在数控机器轴上随着X轴运动逐段拍摄原始图像宽度很大每张图里可能同时包含多种缺陷必须先截取成小图再分类。采集过程中有一个常见的干扰机床横梁、悬臂遮挡在图像上方时相机拍到的焊缝图像灰度和对比度都会下降部分缺陷特征被隐藏轮廓很难辨认。如果直接丢弃这些样本训练数据就失去了一部分真实工况。针对这类问题论文用的是Sin函数灰度变换。3.2 Sin函数非线性变换解决低对比度问题变换公式如下f(x, y) 127 * (1 sin(π * (f(x, y) - (a b) / 2) / (b - a)))其中f(x, y)为原灰度值a和b分别表示图像的最低灰度值和最高灰度值。先用OpenCV的minMaxLoc函数求出a、b再把灰度值做居中缩放后送入正弦函数。实现代码import cv2 import numpy as np gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # minMaxLoc 同时返回最小/最大灰度值和对应位置 min_val, max_val, _, _ cv2.minMaxLoc(gray) a, b min_val, max_val # 居中到 (ab)/2再按 (b-a) 归一化到 [-0.5, 0.5] normalized (gray.astype(np.float32) - (a b) / 2.0) / (b - a 1e-6) enhanced 127.0 * (1.0 np.sin(np.pi * normalized)) enhanced np.clip(enhanced, 0, 255).astype(np.uint8)正弦函数在[-π/2, π/2]区间内对中间灰度变化较敏感所以原本灰度集中分布的低对比度图像变换后灰度直方图会被拉开。这样做和普通直方图均衡化的差别在于它不会把噪声也一起放大对灰度分布密集、但并没有真正覆盖全灰度范围的干扰图更安全。经过变换后的焊缝图像凹坑、溅射的边界对比度明显提高训练时模型能学到更清晰的特征。3.3 滑动窗口截取与数据扩增原始焊缝图像宽度远大于200像素论文里设置200×200的滑动窗口从左到右按固定步长依次截取。窗口覆盖同一位置时相邻窗口之间要留一段重叠区域避免缺陷正好落在两个窗口的边界上被切断。若不重叠一个尺寸接近200像素的缺陷很容易被拆成两半模型会把半个气孔误判成正常纹理。论文里150多张原始大图一共截出517张200×200图像再按正常、凹陷、溅射、气孔四类放好。数据量只有517张对CNN来说远远不够。数据扩增策略包括水平翻转、垂直翻转、20度角度随机旋转、随机亮度增强和添加椒盐噪声。扩增前后的样本量变化如下阶段数量说明原始截取517张150余张原始大图滑动窗口截取数据扩增后2070张每类约510张训练/验证划分4:1验证集中再抽1/4作为测试集参考实现以单通道灰度图为例def add_salt_pepper(img, prob0.01): noisy img.copy() mask np.random.rand(*img.shape[:2]) prob noisy[mask] np.random.choice([0, 255], sizemask.sum()) return noisy def augment(img): return [ cv2.flip(img, 1), # 水平翻转 cv2.flip(img, 0), # 垂直翻转 cv2.warpAffine(img, cv2.getRotationMatrix2D((100, 100), 20, 1), (200, 200)), # 20度旋转 cv2.convertScaleAbs(img, alpha1.2, beta30), # 亮度增强 add_salt_pepper(img, 0.01) # 椒盐噪声 ]水平翻转和垂直翻转不改变缺陷类别语义气孔翻转后还是气孔旋转20度模拟焊件摆放角度偏差论文里实际焊缝就存在约20度的角偏移亮度增强覆盖不同曝光时刻的差异椒盐噪声模拟传感器信号抖动。需要注意的是旋转角度不能太大旋转超过45度后正常焊缝的鱼鳞纹方向特征会被破坏模型反而学到错误关联。4. 损失函数、RMSprop与训练调参把baseline从0.8提到0.974.1 多分类目标与评价指标四分类任务用的是softmax交叉熵损失H(p, q) -Σ p(xᵢ) log q(xᵢ)softmax把FC3的4个输出值变成归一化概率交叉熵衡量真实标签与预测分布的差异。每次迭代通过优化器反向传播更新权重和偏置让损失值逐步变小。性能评价要看混淆矩阵四个指标里准确率Accuracy反映整体判断正确率精确率Precision反映预测为正样本中真正的正样本比例召回率Recall反映真实正样本中被找出来的比例F1-score是精确率和召回率的调和平均。焊缝场景里这三者都不能只看一个有缺陷没召回缺陷件会流入下道工序召回率必须拉高误报太多返工会频繁中断产线精确率也不能低。F1-score就是在两者之间取平衡。4.2 训练配置与early stopping优化器选RMSprop它对每个参数使用梯度的平方滑动平均来调整学习率对焊缝数据这种包含大量平坦区域、梯度变化不均匀的图像比SGD收敛更稳。初始学习率0.001batch_size64并开启shuffle打乱训练顺序。配套训练代码from tensorflow.keras.optimizers import RMSprop from tensorflow.keras.callbacks import EarlyStopping model.compile( optimizerRMSprop(learning_rate0.0001), losscategorical_crossentropy, metrics[accuracy] ) early_stop EarlyStopping( monitorval_loss, patience5, restore_best_weightsTrue ) history model.fit( train_x, train_y, validation_data(val_x, val_y), epochs50, batch_size64, shuffleTrue, callbacks[early_stop] )batch_size64在GTX 1050这样的入门卡上能跑满GPU利用率又不至于让显存溢出shuffle保证每个batch里的类别分布相对均匀early stopping监听val_loss连续5个epoch没有改善就停止训练并回滚到最优权重。如果不加early stopping模型到后期会在验证集上出现过拟合训练集准确率继续涨验证集损失反向走高。4.3 学习率调参过程论文明确记录了baseline到最优模型的完整过程。初期按0.001跑出来的baseline准确率约0.8说明模型架构本身没问题但梯度更新步长偏大损失函数在最优值附近震荡始终到不了更高的精度区间。把学习率降到0.0001后50个epoch内曲线稳定下降。继续降到0.00001模型经过更多次迭代细化权重达到最优效果。最终测试集结果如下指标微调前微调后Precision0.957190.97260Recall0.945210.97010F1-score0.950850.97130Accuracy0.958900.97260注意这里微调前和微调后指的是同一套网络结构下学习率训练策略不同带来的差异。学习率降到0.00001后精度提升约1.4个百分点但训练时间也变长。实际项目里可以先用0.001快速验证数据没标错再降到0.0001做正式训练最后用小学习率精调这套流程和迁移学习里的分层训练思路一致。5. 滑动窗口检测与数控机床联动在线检测怎么扫完整条焊缝5.1 mark点定位与路径规划离线训练完成后在线检测要在数控机床上复现训练时的数据形态。焊缝在实际钢板上的位置不是完全水平的论文里的采集对象沿X轴方向排布部分图像有约20度的角偏移。如果直接用固定角度拍相机视野里焊缝的走向和训练样本不一致检测效果会打折扣。解决办法是mark点定位。在焊缝区域起点和尾端各设置一个mark点A、B通过两个定位点坐标确定一条直线路径L。机器轴先把相机对准起点A再沿L移动到B每个窗口的中心定位到这条直线上。这样图像采集路径始终贴合焊缝走向角偏移问题被几何校正掉模型看到的是和训练数据一致的焊缝纹理方向。相机定位到第一个窗口H1的中心O1后从第二个窗口H2开始保留一部分重叠区域保证相邻窗口衔接处不遗漏缺陷。5.2 滑动窗口采集与推理流程在线扫描时相机沿路径L每次移动一个窗口宽度同时采集200×200图像并送入模型。整个扫描流程可以用一串逻辑串起来定位mark点、规划路径、逐窗口采集、推理分类、记录结果。核心窗口截取逻辑如下def sliding_window_crop(full_img, window_size200, step160): h, w full_img.shape[:2] crops [] for y in range(0, h - window_size 1, step): for x in range(0, w - window_size 1, step): crops.append(full_img[y:y window_size, x:x window_size]) return crops步长参数说明参数值说明窗口尺寸200×200与训练输入保持一致步长160相邻窗口重叠40像素重叠率20%防止缺陷被切断step取160而不是200就是让相邻窗口重叠40像素约20%的重叠率。焊缝缺陷尺寸变化很大一些细长裂纹状缺陷很容易被切在窗口边界上重叠采集弥补了单窗口切割的盲区。每张截取图像预处理成200×200后归一化输入模型from tensorflow.keras.models import load_model model load_model(weld_defect_cnn.h5) def scan_weld_line(path_img, step160): full_img cv2.imread(path_img) windows sliding_window_crop(full_img, stepstep) results [] for win in windows: x cv2.resize(win, (200, 200)).astype(np.float32) / 255.0 prob model.predict(x[None, ...])[0] cls int(np.argmax(prob)) results.append((cls, float(prob[cls]))) return results每张图像经过一次前向传播得到4类概率。论文实测单张200×200图像测试时间在200~400ms之间平均300ms左右完全可以跟上产线节拍。5.3 缺陷判定与重加工策略整条焊缝扫描完成后每个窗口的类别已按数字编码存储。判定逻辑是统计缺陷窗口在所有窗口中的占比如果缺陷比例达到一定工业条件整条焊缝判为不合格安排重加工如果只有很小区域的缺陷则记录缺陷窗口对应的机器轴坐标定位到具体位置再根据缺陷类别采取不同的修补方式。这一段的实用价值在于标记好mark点后数控机床本身就有精确到微米级的坐标精度窗口序号可以直接映射到物理位置不需要额外加编码器。这种基于机床坐标的回查机制是深度学习模型在产线上落地时很关键的一环模型负责分类机床负责定位二者解耦模型换版本时不需要改动机械结构。6. 对比SVM/KNN与误判分析模型上线前还要看什么6.1 传统机器学习在同一批数据上的表现论文用SVM和KNN在同一批焊缝数据上做了对比实验。SVM在无缺陷与缺陷的二分类上能到90%左右但四分类只有80%附近而且性能随惩罚因子C和RBF核的gamma参数波动明显KNN则在不同邻域K值下表现不同数据量大时推理耗时急剧上升在线产线根本扛不住。这说明不是深度学习在所有场景下都一定赢而是当缺陷特征高度重叠、类别多且样本量大时手工特征加浅层模型的表征能力确实到了上限。6.2 误判集中在溅射与气孔之间论文里明确提到存在一定量的误检且主要发生在溅射缺陷和正常焊缝之间——准确说是部分溅射缺陷被误判为正常。原因是人工标注时部分溅射缺陷周围飞溅的颗粒并不多也不够明显模型学到的溅射特征主要依赖密集飞溅区域遇到稀疏溅射样本时置信度下降。这类问题在工业质检里很常见解决方向有两个一是把难以区分的类别重新审视标注必要时把稀疏溅射单独作为一个难例类别加入训练二是用困难样本挖掘把模型预测置信度低或预测错误的样本收集起来二次标注后追加训练。这些样本往往比随机增强数据更有效。6.3 模型部署时值得注意的三个细节第一权重初始化。随机初始化时把权重矩阵设为较小的值保证激活值不会在初始阶段饱和训练更稳定。第二模型文件大小。论文训练出来的模型约232MB对单机单卡部署没问题但如果要做多工位部署可以尝试用TensorRT量化或知识蒸馏把模型压到几十MB300ms的推理时间还能进一步缩短。第三迁移学习。新产线的材料、光源、焊缝形状和原有数据总有差异直接用原权重初始化冻结前两层卷积只微调后面的全连接层通常几百张新样本就能收敛比从头训练快得多也稳得多。在把模型送进产线前也建议每次误判的图像按类别存下来让有经验的焊接工艺工程师参与难例标注这类专业指导比单纯调参更有效再结合模型预测结果做一次数据建模分析看误判是集中在特定光照环境还是特定轨迹位置把复发样本打上标签并纳入下一轮训练数据模型收敛速度和精度都会有明显改善。本文还有配套的精品资源点击获取
返回列表