使用计算机视觉在钢铁平面上检测焊接缺陷

论文研究 | 基于机器视觉的钢材表面缺陷检测 钢材是发展现代工业技术的基本材料,随着工业制造能力的提升,钢材广泛应用于建筑行业、海洋工程、航天工程,对钢材也提出了更严苛的要求。然而由于生产工艺限制,钢材在生产过程中不可避免地存在深度各异的表面缺陷,如划痕、裂纹、凹面等。这些缺陷不仅会影响产品外观,同时会导致钢材耐磨性、韧性等性能下降,缩短钢材的使用寿命。因此,分析与掌握如何提高钢材表面质量是现代钢材生产厂家亟需解决的重要问题。 阅读详情

来源丨AI公园

编辑丨极市平台

导读

 

借助卷积神经网络算法和U-Net结构,可以准确地检测出钢铁平面的焊接故障,还能评估它的严重程度。本文即介绍了这一检测方法,并给出了3个样本结果。

作者:Soham Malakar

编译:ronghuaiyang

原文链接:

https://medium.com/@malakar_soham/detecting-welding-defects-in-steel-plates-using-computer-vision-algorithms-98b1fb0da5e9

1 介绍

焊接缺陷可以定义为焊缝表面出现的不规则、不连续性、缺陷或不一致性。焊接接头的缺陷可能导致零件和组件的报废、昂贵的维修费用、工作条件下性能的显著降低,在极端情况下,还可能导致导致财产和生命损失的灾难性故障。

此外,由于焊接工艺本身的缺陷和金属本身的特性,在焊接过程中总会存在一定的缺陷。评估焊接质量是很重要的,因为由于固有的冶金几何缺陷、机械性能的不均一性和残余应力的存在,焊接接头经常是裂纹萌生的位置。

在实践中,几乎不可能得到完美的焊接,而且在大多数情况下,也没有必要提供所需的足够的服务功能。然而,及早发现和隔离总是比发生事故更可取。

利用我们的算法,我们可以很容易地检测出焊接故障的图像,并准确地衡量每一个故障的严重程度。这将进一步帮助更快的图像识别和避免不良情况的出现。

结果表明,采用卷积神经网络算法和U-Net结构,可以大大提高处理效率。结果在工作结束时,准确率达到98.3%。

2 预备知识

  • 对机器学习有基本了解

  • 卷积神经网络的基本思想

  • 理解卷积,最大池化和上采样操作

  • 了解U-Net的架构理念

  • 对残差块中skip连接有基本了解(可选)

  • 使用Python、TensorFlow和Keras库操作ConvNets的知识(可选)

3 图像分割

分割是将图像分割成不同的区域,这些区域包含具有相似属性的像素。为了对图像分析和解释有意义和有用,区域应该与描绘的物体或感兴趣的特征有强烈的关联。

图像分析的成功与否取决于分割的可靠性,但图像的精确分割通常是一个非常具有挑战性的问题。

分割后的胸部x光片,心脏(红色)、肺(绿色)和锁骨(蓝色)

4 图像矩

图像矩是图像像素强度的某一特定加权平均值。图像矩用于描述分割后的目标。

通过图像矩发现的图像的简单属性包括:

  • 面积(或总强度)

  • 重心

  • 关于方向的信息

5 理解数据

dataset包含两个目录。原始图像存储在‘images’目录中,分割后的图像存储在‘labels’目录中。

让我们将数据可视化:

来自‘image’的原始图像

来自‘labels’的二值图像

这些来自“labels”目录的图像是二进制图像或ground truth标签。这是我们的模型必须对给定的原始图像做出的预测。在二进制图像中,像素要么有一个“high”值,要么有一个“low”值。白色区域或“high”值表示缺陷区域,黑色区域或“low”值表示没有缺陷。

6 使用的方法

我们在这个问题上使用的架构是U-Net。我们将通过三个步骤来检测故障并测量这些焊接图像的严重程度:

  • 图像分割

  • 使用颜色表示严重程度

  • 使用图像矩度量严重程度

训练模型

下面是我们用于模型的U-Net架构:

使用的U-Net结构

要注意的点:

每个蓝框对应一个多通道特征图

通道的数量在盒子的顶部表示

(x,y)维度显示在盒子的左下边缘

箭头表示不同的操作

层的名称在层的下面

C1 C2…C7是卷积操作后的输出层

P1, P2, P3是最大池化操作的输出层

U1, U2, U3是上采样操作的输出层

A1, A2, A3是跳跃连接

左侧是收缩路径,应用常规卷积和最大池操作

图像的尺寸逐渐减小,而深度逐渐增加

右边是展开路径,在这里应用(上采样)转置卷积和常规卷积操作

在扩展路径中,图像的尺寸逐渐增大,深度逐渐减小

为了得到更精确的位置,在扩展路径的每一步中,我们使用跳跃连接,将转置卷积层的输出与来自编码器的相同级别的特征图连接在一起:A1 = U1 + C3 A2 = U2 + C2 A3 = U3 + C1

在每次连接之后,我们再次应用常规卷积,以便模型能够学习组装出更精确的输出。

import numpy as np
import cv2
import os
import random
import tensorflow as tf

h,w = 512,512

def create_model():

    inputs = tf.keras.layers.Input(shape=(h,w,3))

    conv1 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',padding='same')(inputs)
    pool1 = tf.keras.layers.MaxPool2D()(conv1)

    conv2 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',padding='same')(pool1)
    pool2 = tf.keras.layers.MaxPool2D()(conv2)

    conv3 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',padding='same')(pool2)
    pool3 = tf.keras.layers.MaxPool2D()(conv3)

    conv4 = tf.keras.layers.Conv2D(64,(3,3),activation='relu',padding='same')(pool3)

    upsm5 = tf.keras.layers.UpSampling2D()(conv4)
    upad5 = tf.keras.layers.Add()([conv3,upsm5])
    conv5 = tf.keras.layers.Conv2D(32,(3,3),activation='relu',padding='same')(upad5)

    upsm6 = tf.keras.layers.UpSampling2D()(conv5)
    upad6 = tf.keras.layers.Add()([conv2,upsm6])
    conv6 = tf.keras.layers.Conv2D(16,(3,3),activation='relu',padding='same')(upad6)

    upsm7 = tf.keras.layers.UpSampling2D()(conv6)
    upad7 = tf.keras.layers.Add()([conv1,upsm7])
    conv7 = tf.keras.layers.Conv2D(1,(3,3),activation='relu',padding='same')(upad7)

    model = tf.keras.models.Model(inputs=inputs, outputs=conv7)

    return model

images = []
labels = []

files = os.listdir('./dataset/images/')
random.shuffle(files)

for f in files:
    img = cv2.imread('./dataset/images/' + f)
    parts = f.split('_')
    label_name = './dataset/labels/' + 'W0002_' + parts[1]
    label = cv2.imread(label_name,2)

    img = cv2.resize(img,(w,h))
    label = cv2.resize(label,(w,h))

    images.append(img)
    labels.append(label)

images = np.array(images)
labels = np.array(labels)
labels = np.reshape(labels,
    (labels.shape[0],labels.shape[1],labels.shape[2],1))

print(images.shape)
print(labels.shape)

images = images/255
labels = labels/255

model = tf.keras.models.load_model('my_model')

#model = create_model()  # uncomment this to create a new model
print(model.summary())

model.compile(optimizer='adam', loss='binary_crossentropy',metrics=['accuracy'])
model.fit(images,labels,epochs=100,batch_size=10)
model.evaluate(images,labels)

model.save('my_model')

模型采用Adam优化器进行编译,由于只有缺陷和无缺陷两类,我们使用二元交叉熵损失函数。

我们使用批大小为10的100 epoch(模型在所有输入上运行的次数)。

请注意,调整这些超参数有很大的进一步提高模型性能的空间。

测试模型

由于模型的输入尺寸为512x512x3,我们将输入尺寸调整为这个尺寸。接下来,我们将图像归一化,将其除以255,这样计算速度更快。

该图像被输入到模型中,用于预测二进制输出。为了放大像素的强度,二进制输出被乘以1000。

然后将图像转换为16位整数,便于图像操作。然后用算法检测缺陷,通过颜色分级和根据缺陷的严重程度给有缺陷的像素分配权重,直观地标记出缺陷的严重程度。然后在此图像上考虑加权像素计算图像矩。

最后将图像转换回8位整数,并显示输出图像的颜色等级和严重性值。

import numpy as np
import cv2
from google.colab.patches import cv2_imshow
import os
import random
import tensorflow as tf


h,w = 512,512
num_cases = 10

images = []
labels = []

files = os.listdir('./dataset/images/')
random.shuffle(files)

model = tf.keras.models.load_model('my_model')

lowSevere = 1
midSevere = 2
highSevere = 4

for f in files[0:num_cases]:
    test_img = cv2.imread('./dataset/images/' + f)
    resized_img = cv2.resize(test_img,(w,h))
    resized_img = resized_img/255
    cropped_img = np.reshape(resized_img,
          (1,resized_img.shape[0],resized_img.shape[1],resized_img.shape[2]))

    test_out = model.predict(cropped_img)

    test_out = test_out[0,:,:,0]*1000
    test_out = np.clip(test_out,0,255)

    resized_test_out = cv2.resize(test_out,(test_img.shape[1],test_img.shape[0]))
    resized_test_out = resized_test_out.astype(np.uint16)

    test_img = test_img.astype(np.uint16)

    grey = cv2.cvtColor(test_img, cv2.COLOR_BGR2GRAY)

    for i in range(test_img.shape[0]):
     for j in range(test_img.shape[1]):
          if(grey[i,j]>150 & resized_test_out[i,j]>40):
            test_img[i,j,1]=test_img[i,j,1] + resized_test_out[i,j]
            resized_test_out[i,j] = lowSevere
          elif(grey[i,j]<100 & resized_test_out[i,j]>40):
            test_img[i,j,2]=test_img[i,j,2] + resized_test_out[i,j]
            resized_test_out[i,j] = highSevere
          elif(resized_test_out[i,j]>40):
            test_img[i,j,0]=test_img[i,j,0] + resized_test_out[i,j]
            resized_test_out[i,j] = midSevere
          else:
            resized_test_out[i,j] = 0

    M = cv2.moments(resized_test_out)
    maxMomentArea = resized_test_out.shape[1]*resized_test_out.shape[0]*highSevere
    print("0th Moment = " , (M["m00"]*100/maxMomentArea), "%")

    test_img = np.clip(test_img,0,255)

    test_img = test_img.astype(np.uint8)

    cv2_imshow(test_img)

    cv2.waitKey(0)

7 结果

我们用于检测严重程度的视觉度量是颜色。

在图像中,颜色:

  1. 绿色表示有严重缺陷的区域。

  2. 蓝色代表缺陷较严重的区域。

  3. 红色区域表示最严重的缺陷。

0阶矩作为一个百分比显示在输出图像上作为一个经验的严重程度度量。

下面是三个随机样本,分别显示了我们模型生成的原始输入、ground truth和输出。

样本1::

原始图像

二值图像(Ground Truth)

带有严重程度的预测输出

样本2:

原始图像

二值图像(Ground Truth)

带有严重程度的预测输出

样本3:

原始图像

二值图像(Ground Truth)

-结束-

树莓派全息投影制作指南:从硬件搭建到交互实现 全息投影技术利用光学原理创造三维视觉体验,其核心是基于视觉暂留和光线折射的成像机制。在工程实践中,通过树莓派这类嵌入式系统,可以构建低成本、可交互的伪全息显示方案。技术价值在于将复杂的全息概念简化为创客可实现的硬件项目,融合了计算机视觉、传感器集成和实时媒体处理。应用场景涵盖教育展示、艺术装置和智能交互终端。本文聚焦于树莓派全息舱的实现,详细解析硬件选型中的树莓派4B与树莓派5的权衡,以及软件配置中涉及的树莓派安装OpenCV等关键技术环节,为开发者提供从基础搭建到高级交互的完整路径。 阅读详情

相关推荐

数字IC设计之时序分析基础概念汇总

时序分析主要有两种办法:静态时序分析: (static timing analysis,STA),是遍历电路存在的所有时序路径,根据给定工作条件(PVT)下的时序库.lib文件计算信号在这些路径上的传播延时,检查信号的建立和保持时间是否满足约束要求,根据最大路径延时和最小路径延时找出违背时序约束的错误。

weixin_45230720的博客 5607

使用计算机视觉的方法在钢铁平面上检测焊接缺陷

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶”作者:Soham Malakar编译:ronghuaiyang导读计算机视觉在工业领域的一个实践,有方案和代码的分享。1. 介绍...

AI公园 1018

AI大模型与碳足迹评估结合模式及示范案例

AI大模型与碳足迹评估相结合,可以提供更精确、更快速的碳排放量计算,优化减排策略,并促进可持续发展目标的实现。

贾贾的博客 3943

AI赋能焊接:开启质量预测与优化新时代

在现代工业制造中,焊接作为一种关键的连接工艺,广泛应用于航空航天、汽车制造、船舶工业、建筑等众多领域。焊接质量的优劣,直接关系到产品的安全性、可靠性以及使用寿命,进而影响企业的生产效率与经济效益。例如,在航空航天领域,飞行器的关键部件如发动机、机翼等都依赖焊接技术进行组装,若焊接质量出现问题,哪怕是极其微小的缺陷,都可能在飞行过程中引发严重的安全事故,危及生命财产安全。在汽车制造行业,车身的焊接质量决定了整车的结构强度和碰撞安全性,直接影响消费者的驾乘体验与安全保障。传统的焊接质量控制主要依赖于人工经验和定

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3826

一文搞懂STM32定时器翻转模式(产生多路频率、占空比的PWM)

(产生多路频率、占空比的PWM)

weixin_56688599的博客 7936

C++ muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装

Muduo is a multithreaded C++ network library based on the reactor pattern. muduo库的介绍就是:一个基于reactor反应堆模型的多线程C++网络库。 muduo网络库是C++语言开发的一个非常优秀的网络库,作者陈硕,muduo网络库在多线程环境下性能非常高,该系列文章会分享一些muduo库源码的知识,包括它的线程池源码...

大秦坑王的专栏 3万+

【学习】基础知识

对于一张彩色图像,通常有三个通道(红、绿、蓝),每个通道都是一个二维矩阵。假设图像的高度为 H,宽度为 W,那么图像的维度表示为 (H, W, 3)。这里的 3 表示三个通道。对于灰度图像,只有一个通道,其维度表示为 (H, W)。

qq_46110320的博客 740

基于YOLOv8的城市违建识别系统:从数据集构建到UI界面实现

YOLOv8是Ultralytics公司于2023年推出的最新一代YOLO(You Only Look Once)系列目标检测算法。更高效的骨干网络设计改进的锚框机制更精确的损失函数支持分类、检测、分割等多任务YOLOv8特别适合像违建识别这样的实时检测任务,能够在保持高精度的同时实现快速推理。

YOLO 675

【焊缝检测】基于计算机视觉实现焊缝检测附Matlab代码

焊接是现代工业中至关重要的连接工艺,其质量直接关系到产品的安全性和可靠性。传统的人工焊缝检测方法效率低、成本高,且易受人为因素影响,难以保证检测的精度和一致性。随着计算机视觉技术的快速发展,基于计算机视觉的焊缝检测方法逐渐成为研究热点,并展现出巨大的应用前景。本文将深入探讨基于计算机视觉实现焊缝检测的技术原理、面临的挑战以及未来的发展方向。一、基于计算机视觉的焊缝检测方法基于计算机视觉的焊缝检测主要利用图像处理和模式识别技术对焊缝图像进行分析,从而识别出焊缝缺陷。

m0_57702748的博客 1427

31、贝叶斯认知建模与隐马尔可夫模型:理论与应用

本文探讨了贝叶斯认知建模与隐马尔可夫模型(HMM)的理论基础及其在认知科学和神经科学中的应用。重点介绍了贝叶斯定理和HMM的基本原理,并结合实际案例,如情绪识别系统和脑机接口(BCI),展示了它们在处理复杂认知任务中的强大能力。文章还讨论了贝叶斯-HMM模型的技术细节、优势与局限性,以及未来的发展前景。

meat5的博客 141

【SECS】初识SECS协议

项目标题的第一位和第二位告诉下面有多少字节表示项目的长度。而项目的长度是指项目标题后面的字节数,这里第一个字节就是项目标题。1个字节可以表示的最大长度是0-255,所以只要项目标题后面的字节数小于等于254,都是0x01。

weixin_48618536的博客 1644

钢铁平面焊接缺陷检测,有方案、有代码

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达来源:AI公园作者:Soham Malakar编译:ronghuaiyang导读计算机视觉在工业领域的一个实践,有方案和代码的分享。...

3D视觉工坊 2218

Open3D点云算法与点云深度学习案例汇总(长期更新)

Open3D-python算法专栏文章汇总,长期更新算法原理与实战案例。

纵马踏花向自由 7469

c~视觉~CV~合集2

哈哈 准备开始挪一些 cv相的合集~一、CVの图像转为ASCII艺术效果 在广阔且不断扩展的编码项目领域中,那些将艺术与技术融为一体的人占据着特殊的地位。其中一个项目是从数字图像创建 ASCII艺术图——这一过程将普通图片变成 ASCII 标准字符的马赛克。这是探索计算机视觉和 Python 编程的一种有趣的方...

weixin_41004378的博客 471

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

振动数据 自相关计算时时延_APReLU:跨界应用于机器故障检测的自适应ReLU丨IEEE TIE 2020...

↑ 点击蓝字关注极市平台作者丨VincentLee来源丨晓飞的算法工程笔记编辑丨极市平台极市导读通过分析输入的振动信号,ResNet-APReLU能够检测出电子设备故障,本文即介绍了这种APReLU的基本设计思路。目前,相关代码已开源,感兴趣的研究者可自行尝试。Deep Residual Networks with Adaptively Parametric Rectifier L...

weixin_39890517的博客 257

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【Reading Notes】(6)Favorite Articles from 2023

Feature-Based Knowledge,一般而言,在基于特征的知识迁移中,研究的对象包括了:如何需选择知识类型?对于台积电的客户来说,这个数字是难以接受的,因为客户需要为整个晶圆买单,包括其中有缺陷的芯片。最后大家采取了一个折中方案,4号线经过北大的789米轨道段,将采用世界上最先进的轨道减振技术,也就是在钢轨下铺设钢弹簧浮置板。毕竟,有苹果这样的金主愿意成为台积电新制造工艺的第一个客户,能分担台积电先进制程节点的研发费用和专用工厂的建设费用。(2023年01月01日)(2023年01月04日)

bryant_meng 1717

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

毕业设计:基于机器学习的焊缝质量检测算法研究 图像识别 人工智能 python

毕业设计:基于深度学习和图像处理技术的焊缝缺陷自动检测方法。首先,分析了焊缝质量检测的现状和面临的挑战,指出传统检测方法的局限性。然后,提出了一种结合机器学习与图像处理的焊缝质量评估模型,通过对焊缝图像特征的提取和分析,实现对焊缝缺陷的自动识别与分类。

Hai_Lang_IT的博客 1506

关于图像的说明

图像的shape一般标注是(H,W,3)或者(3,H,W);H:Height, W:Width分别代表图片的高度,图片的宽度 一般来说给出一个图像的size或者shape:hxw(比如40x100大小) 实际上对应的是什么呢: 对于PIL模块的Image模块, img=Image.open('1.jpg') H = img.height W = img.width (W,H)=i...

zz2230633069的博客 1511

PIL.Image相关操作(ImageDraw)

from PIL import Image 2. 读取一张图片: im=Image.open('C:/Users/admin/Desktop/WallPaper/d.png') 3. 显示一张图片: im.show() 4. 保存图片: im.save("save.gif","GIF")#保存图像为gif格式 5. 创建新图片: ...

hxxjxw的博客 1万+

焊缝质量检测的主要检测方法是什么?

目前,焊接工业的技术越来越成熟,因此,焊接产品的应用也越来越广泛。所以焊缝质量检测是非常重要的。如何识别的问题和如何处理发现的问题的原因,这是一个非常重要的一步。这里有几个焊缝质量检测主要的检测方法: 1.要对母材的品质进行检查。一般有目视检查和破坏性检查两种方法… 外观检验顾名思义就是根据员工丰富的工作经验来判断产品是否合格。但是,如果基于本次检验的结论不充分,则需要进行破坏性检验,即撕开焊机的母材进行确认。此外,拉伸强度可以用拉伸仪进行测试。 2.根据现象分析原因。一般来说,如果济南铆接厂焊接工艺不好,

qq_27572409的博客 2507

使用计算机视觉算法检测钢板中的焊接缺陷

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达目录介绍先决条件图像分割图像矩了解数据使用的方法和算法结果参考1. 介绍焊接缺陷可以定义为焊接零件中出现的焊接表面不规...

小白学视觉 1311

深度学习之瑕疵缺陷检测

先附一些参考文章,后续再更新: https://blog.youkuaiyun.com/u012968002/article/details/81976612 https://blog.youkuaiyun.com/dlh_sycamore/article/details/87886198

2万+

AI项目对接第二期——缺陷检测

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达【AI项目对接】星球是一个项目和AI人才快速匹配对接的平台,星球中既有项目的发布方又有各行业的工程师,一对一的交接更能有效地进行沟通...

3D视觉工坊 1734

机器学习笔记之异常检测

问题动机 异常检测问题是机器学习算法的一个常见应用,这种算法的一个有趣之处在于:它虽然主要用于非监督学习问题,但从某些角度看,它又类似于一些监督学习问题。 举例:比如制造飞机引擎,当生产的飞机引擎从生产线上流出时,需要进行QA(质量控制测试),而作为这个测试的一部分,测量了飞机引擎的一些特征变量,比如引擎运转时产生的热量,或者引擎的振动等等。 这样一来,你就有了一个数据集,从 x(1)x^{(1...

Steven的博客 6078
上一篇: 建议收藏 | TensorFlow 与 cuda cudnn版本对应表
下一篇: FCN、Unet、Unet++:医学图像分割网络一览
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值