目录

  1. 介绍

  2. 先决条件

  3. 图像分割

  4. 图像矩

  5. 了解数据

  6. 使用的方法和算法

  7. 结果

  8. 参考

1. 介绍

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

此外,由于焊接技术的固有缺陷和金属的特性,在焊接过程中总会存在一定的缺陷。

由于固有的冶金几何缺陷、机械性能的不均匀性和残余应力的存在,焊接接头通常是裂纹萌生的位置,因此评估焊接质量非常重要。

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

使用我们的算法,我们可以通过图像轻松检测焊接故障,并精确测量每个故障的严重程度,这将进一步有助于加快图像识别速度并避免出现不利情况。

研究发现,使用卷积神经网络算法和 U-Net 架构使该过程更加高效,工作结束时准确率为 98.3%。

2. 先决条件

  1. 对机器学习的基本理解

  2. 卷积神经网络的基本思想

  3. 了解卷积、最大池化和上采样操作

  4. U-Net架构思路

  5. 对残差块中的跳过连接的基本理解(可选)

  6. 使用 Python、TensorFlow 和 Keras 库的 ConvNets 的工作知识(可选)

3. 图像分割

分割将图像划分为包含具有相似属性的像素的不同区域。为了对图像分析和解释有意义且有用,区域应与所描绘的对象或感兴趣的特征密切相关。

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

心脏(红色)、肺(绿色)和锁骨(蓝色)的胸部 X 光片被分割。

4. 图像矩

图像矩是图像像素强度的某个特定加权平均值,图像矩对于描述分割后的对象很有用。

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

  • 面积(或总强度)

  • 质心

  • 有关其方向的信息。

5. 了解数据

该数据集包含两个目录,原始图像存储在“images”目录中,分割图像存储在“labels”目录中。

让我们将数据可视化:

来自“images”的原始图像

上面的这些原始图像是 RGB 图像,必须用于训练模型和测试模型。这些图片的尺寸各不相同。直观地说,较暗的部分是焊接缺陷,模型需要对这些图像进行图像分割。

来自“labels”的二进制图像

'labels' 目录中的这些图像是二进制图像或地面真实标签。这是我们的模型必须为给定的原始图像预测的内容。在二值图像中,像素具有“高”值或“低”值,白色区域或“高”值表示缺陷区域,黑色区域或“低”值表示无缺陷。

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 tfh,w = 512,512def 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 modelimages = []
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/255model = 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 tfh,w = 512,512
num_cases = 10images = []
labels = []files = os.listdir('./dataset/images/')
random.shuffle(files)model = tf.keras.models.load_model('my_model')lowSevere = 1
midSevere = 2
highSevere = 4for 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/255cropped_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]*1000test_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] = lowSevereelif(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] = highSevereelif(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] = midSevereelse:resized_test_out[i,j] = 0M = cv2.moments(resized_test_out)maxMomentArea = resized_test_out.shape[1]*resized_test_out.shape[0]*highSevereprint("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. 结果

我们用于严重性检测的视觉指标是颜色,在图像中,颜色为:

  • 绿色表示存在严重缺陷的区域。

  • 蓝色表示缺陷更严重的区域。

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

第0个时刻以百分比的形式显示在输出图像旁边,作为严重性的经验度量。以下是三个随机样本,显示了原始输入、真实情况和模型生成的输出。

示例 1:

原始图像

二进制图像(真实情况)

具有严重性的预测输出

示例 2:

原始图像

二进制图像(真实情况)

具有严重性的预测输出

示例 3:

原始图像

二进制图像(真实情况)

具有严重性的预测输出

8. 参考

https://domingomery.ing.puc.cl/material/gdxray/

https://www.cs.auckland.ac.nz/courses/compsci773s1c/lectures/ImageProcessing-html/topic3.htm#adaptive

https://medium.com/r/?

url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FImage_moment

https://medium.com/r/?url=https%3A%2F%2Ftowardsdatascience.com%2Funderstanding-semantic-segmentation-with-unet-6be4f42d4b47

https://www.sciencedirect.com/topics/materials-science/welding-defect

Github代码连接:

https://github.com/malakar-soham/cnn-in-welding

往期精彩回顾适合初学者入门人工智能的路线及资料下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载本站qq群955171419,加入微信群请扫码:

【CV】使用计算机视觉算法检测钢板中的焊接缺陷相关推荐

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 目录 介绍 先决条件 图像分割 图像矩 了解数据 使用的方法和算法 ...

  2. Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示

    Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + openc ...

  3. 【CV】小目标检测问题中“小目标”如何定义?其主要技术难点在哪?

    前言: 目标检测是计算机视觉领域中的一个重要研究方向,同时也是解决分割.场景理解.目标跟踪.图像描述和事件检测等更高层次视觉任务的基础.在现实场景中,由于小目标是的大量存在,因此小目标检测具有广泛的应 ...

  4. CV:无人驾驶/自动驾驶汽车中涉及的软硬件技术(摄像头、雷达、激光雷达)、计算机视觉技术(检测、分类、跟踪、语义分割)的简介

    CV:无人驾驶/自动驾驶汽车中涉及的软硬件技术(摄像头.雷达.激光雷达).计算机视觉技术(检测.分类.跟踪.语义分割)的简介 目录 无人驾驶汽车中涉及的软硬件结合相关的技术 摄像头.雷达.激光雷达 影 ...

  5. Interview:算法岗位面试—11.15下午上海某航天***公司(国企)技术面之工业机器视觉认知、计算机视觉算法的理解、目标检测相关项目案例

    ML岗位面试:11.15下午上海某航天***公司(国企)技术面之工业机器视觉认知.计算机视觉算法的理解.目标检测相关项目案例 Interview:算法岗位面试-11.15下午上海某航天***公司(国企 ...

  6. CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念)、早期/中期/近期应用领域(偏具体应用)、经典CNN架构(偏具体算法)概述、常用工具/库/框架/产品、环境安装、常用数据集、编程技巧

    CV:计算机视觉技最强学习路线之CV简介(传统视觉技术/相关概念).早期/中期/近期应用领域(偏具体应用).经典CNN架构(偏具体算法)概述.常用工具/库/框架/产品.环境安装.常用数据集.编程技巧 ...

  7. 计算机视觉算法——基于Transformer的目标检测(DETR / Deformable DETR / DETR 3D)

    计算机视觉算法--基于Transformer的目标检测(DETR / Deformable DETR / DETR 3D) 计算机视觉算法--基于Transformer的目标检测(DETR / Def ...

  8. 计算机视觉算法——目标检测网络总结

    计算机视觉算法--目标检测网络总结 计算机视觉算法--目标检测网络总结 1. RCNN系列 1.1 RCNN 1.1.1 关键知识点--网络结构及特点 1.1.2 关键知识点--RCNN存在的问题 1 ...

  9. 计算机视觉物体检测中面对的挑战

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者:Exposit 编译:ronghuaiyang  |  AI公园 AI博士笔记系列推荐 周志华<机 ...

最新文章

  1. Sql注入和Html注入
  2. boost的chrono模块等待按键的测试程序
  3. 计算机系统NSX,2017款的讴歌NSX计算机维持的“战斗机”
  4. Linux 服务器注意事项
  5. day37-数据库分组查询
  6. 初学docker容器
  7. html5shiv主要解决IE6-8 无法识别HTML5的新标签,父节点不能包裹子元素,以及应用CSS样式...
  8. Android基于Glide的二次封装,借鉴Glide思想二次封装Fresco
  9. mac nginx 安装及PHP配置
  10. mysql decimal_MySQL系列之数据类型及约束
  11. ABB伺服驱动调试(四)
  12. 业务,大数据监控平台搭建
  13. 神经网络发展的三个阶段,人工神经网络的发展
  14. c语言中十六进制可以直接和十进制运算吗,C语言 · 十六进制转十进制
  15. 电脑声卡维修经验和实例完全分析
  16. 14种鼻型图解_十种鼻型分类图解
  17. Ghost for Linux 出色的硬盘对拷工具(转)
  18. java swfupload 302_swfupload Upload Error 302 错误解决办法
  19. 《深入浅出DPDK》——DPDK网络功能虚拟化
  20. 14五规划里面的句子

热门文章

  1. 关于modelsim 6.4a遇到的问题
  2. C#中的String编码转换
  3. OpenFlow: Enabling Innovation in Campus Networks
  4. [VMM 2008虚拟化之初体验-2] 界面功能介绍
  5. TLS,SSL,HTTPS with Python(转)
  6. php设置错误,错误记录
  7. Nginx + PHP CGI的fix_pathinfo安全漏洞
  8. 纯css3开发的响应式设计动画菜单(支持ie8)
  9. 70条WB, IHC常见实验问题解决方案汇总
  10. JavaWeb(十一)——登录注册小案例