实操教程|使用计算机视觉的方法在钢铁平面上检测焊接缺陷
时间:2023-09-05 08:07:00
来源丨AI公园
极市平台编辑
导读
借助卷积神经网络算法和U-Net该结构能准确检测钢平面的焊接故障,并评估其严重性。本文介绍了该测试方法,并给出了三个样本结果。
作者: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, P输出层是最大的池化操作
U1, U2, U3.上采样操作的输出层
A1, A2, A3是跳跃连接
左侧为收缩路径,采用常规卷积和最大池操作
图像尺寸逐渐减小,深度逐渐增加
右侧是扩展路径,用于转移卷积和常规卷积操作
在扩展路径中,图像的尺寸和深度逐渐增加
为了得到更精确的位置,在扩展路径的每一步中,我们使用跳跃连接,将转置卷积层的输出与来自编码器的相同级别的特征图连接在一起:A1 = U1 C3 A2 = U2 C2 A3 = U3 C1
每次连接后,我们再次应用常规卷积,使模型能够学会组装更准确的输出。
importnumpyasnp importcv2 importos importrandom importtensorflowastf h,w=512,512 defcreate_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 结果
我们用于检测严重程度的视觉度量是颜色。
在图像中,颜色:
绿色表示有严重缺陷的区域。
蓝色代表缺陷较严重的区域。
红色区域表示最严重的缺陷。
0阶矩作为一个百分比显示在输出图像上作为一个经验的严重程度度量。
下面是三个随机样本,分别显示了我们模型生成的原始输入、ground truth和输出。
样本1::
原始图像
二值图像(Ground Truth)
带有严重程度的预测输出
样本2:
原始图像
二值图像(Ground Truth)
带有严重程度的预测输出
样本3:
原始图像
二值图像(Ground Truth)
本文仅做学术分享,如有侵权,请联系删文。
干货下载与学习
后台回复:巴塞罗那自治大学课件,即可下载国外大学沉淀数年3D Vison精品课件
后台回复:计算机视觉书籍,即可下载3D视觉领域经典书籍pdf
后台回复:3D视觉课程,即可学习3D视觉领域精品课程
3D视觉精品课程推荐:
1.面向自动驾驶领域的多传感器数据融合技术
2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)
9.从零搭建一套结构光3D重建系统[理论+源码+实践]
10.单目深度估计方法:算法梳理与代码实现
11.自动驾驶中的深度学习模型部署实战
12.相机模型与标定(单目+双目+鱼眼)
13.重磅!四旋翼飞行器:算法与实战
14.ROS2从入门到精通:理论与实战
重磅!计算机视觉工坊-学习交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看