点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

01. 简介

焊接缺陷是指焊接零件表面出现不规则、不连续的现象。焊接接头的缺陷可能会导致组件报废、维修成本高昂,在工作条件下的组件的性能显着下降,在极端情况下还会导致灾难性故障,并造成财产和生命损失。此外,由于焊接技术固有的弱点和金属特性,在焊接中总是存在某些缺陷。不可能获得完美的焊接,因此评估焊接质量非常重要。

可以通过图像来检测焊接中的缺陷,并精确测量每个缺陷的严重性,这将有助于并避免上述危险情况的出现。使用卷积神经网络算法和U-Net架构可提高检测的效率,精度也能达到98.3%。

02. 图像分割

图像分割是指将图像划分为包含相似属性的不同像素区域。为了对图像分析和解释,划分的区域应与对象特征密切相关。图像分析的成功取决于分割的可靠性,但是图像的正确分割通常是一个非常具有挑战性的问题。

对心脏(红色),肺部(绿色)和锁骨(蓝色)的胸部X光进行了分割

03. 图像中心距

图像中心距是图像像素强度的某个特定加权平均值。图像矩可用于描述分割后的对象。通过图像瞬间发现的图像简单属性包括:

  1. 面积(或总强度)

  2. 质心

  3. 有关其方向的信息

04. 数据

该数据集包含两个目录。原始图像存储在“图像”目录中,分割后的图像存储在“标签”目录中。让我们来看看这些数据:原始图像是RGB图像,用于训练模型和测试模型。这些图片的尺寸各不相同。直观地,较暗的部分是焊接缺陷。模型需要对这些图像执行图像分割。

来自“图像”的原始图像

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

来自“标签”的二进制图像

05. 算法

我们将使用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个epochs(在所有输入上运行模型的次数)。调整这些参数,模型性能可能会有很大的改善可能。

测试模型

由于模型采用的尺寸为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)

07. 结果

我们使用颜色来表示缺陷的严重程度:

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

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

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

零阶矩将以百分比形式显示在输出图像旁边,作为严重程度的经验指标。

以下是三个随机样本,它们显示了原始输入,地面真实情况以及由我们的模型生成的输出。

范例1:

原始图像

二进制图像(地面真相)

具有严重性的预测输出

范例2:

原始图像

二进制图像(地面真相)

具有严重性的预测输出

范例3:

原始图像

二进制图像(地面真相)

具有严重性的预测输出

参考文献:

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

代码链接:https://github.com/malakar-soham/cnn-in-welding

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目31讲

在「小白学视觉」公众号后台回复:Python视觉实战项目31讲即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

下载4:leetcode算法开源书

在「小白学视觉」公众号后台回复:leetcode即可下载。每题都 runtime beats 100% 的开源好书,你值得拥有!


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

基于OpenCV的焊件缺陷检测相关推荐

  1. python 视频人脸替换_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  2. python视频人脸检测_Python基于OpenCV实现视频的人脸检测

    本文实例为大家分享了基于OpenCV实现视频的人脸检测具体代码,供大家参考,具体内容如下 前提条件 1.摄像头 2.已安装Python和OpenCV3 代码 import cv2 import sys ...

  3. Python基于OpenCV的指针式表盘检测系统(附带源码&技术文档)

    1.背景 指针式机械表盘具有安装维护方便.结构简单.防电磁干扰等诸多优点, 目前广泛应用于工矿企业.能源及计量等部门.随着仪表数量的增加及精密仪表技术的发展,人工判读已经不能满足实际应用需求.随着计算 ...

  4. 基于OpenCV的视频处理 - 人脸检测

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com  Time of completion:2023.2.7 Las ...

  5. Python基于Opencv的鱼群密度速度检测系统(源码&教程)

    1.研究背景 智慧渔业是大数据.物联网与人工智能等现代信息技术驱动下的渔业发展新模式,是水产养殖业供给侧结构性改革的重要方式,涉及养殖环境监测.生物环境监测与生物状态监测这几大方面的应用与需求.本文从 ...

  6. 实战 | OpenCV实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + Python/C++源码)

    点击下方卡片,关注" OpenCV与AI深度学习" 视觉/图像重磅干货,第一时间送达! 导读 本文将介绍使用OpenCV实现纺织物缺陷检测(脏污.油渍.线条破损缺陷)的详细步骤 + ...

  7. OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)

    点击下方卡片,关注" OpenCV与AI深度学习" 视觉/图像重磅干货,第一时间送达! 导读 本文将介绍使用OpenCV实现纺织物缺陷检测(脏污.油渍.线条破损缺陷)的详细步骤 + ...

  8. 基于OpenCV的视频道路车道检测

    基于OpenCV的视频道路车道检测 基于OpenCV的视频道路车道检测 前言 综述 运行方法 车道检测的实现 路面图像二值化 基于透视变换提取车道区域 基于二次多项式拟合车道线 计算曲率半径与车辆的偏 ...

  9. 案例分享 | 圆柱锂电池入壳焊后缺陷检测

    动力电池作为新能源汽车的动力核心,其品质直接关系到新能源汽车的性能和安全性,无论是尝鲜还是刚需,消费者在购买决策上都会综合考虑安全性.充电能力和续航等多方面的性能表现,新能源汽车搭载的动力电池首当其冲 ...

最新文章

  1. PHP超时处理全面总结
  2. ping 原理与ICMP协议
  3. 想成为牛逼程序员? 先数数编程语言之父们的头发
  4. (转载)Linux信息资源
  5. 编程范式,程序员的编程世界观
  6. Linux密码是一个回文,usermod命令和用户密码管理
  7. 从零开始学习PYTHON3讲义(二)把Python当做计算器
  8. pythonsuper继承规则,深入理解Python中的super()方法
  9. 用 Rust 开发 Linux,可行吗?
  10. Linux系统性能检测
  11. mysql 库存预警_仓库管理中如何实现库存预警
  12. java工厂模式和抽象工厂_Java中的抽象工厂设计模式
  13. 今天加入了OSChina,准备将我的BLOG搬到这里。
  14. 网站服务器和空间大小,网站服务器和空间大小
  15. 【运动学】基于Matlab模拟斜抛运动
  16. 2021牛客多校9.F.Train Wreck 构造
  17. 【高等教育6年+工作5年】的个人阶段性自述
  18. Leetcode 884. 两句话中的不常见单词
  19. python识别二维码条形码?用pyzbar一招搞掂(含代码)!
  20. 284、超详细的光纤熔纤、盘纤教程,值得收藏

热门文章

  1. 你知道“啥是佩奇”,却不一定了解佩奇排名算法
  2. 读 MySQL 源码再看 INSERT 加锁流程
  3. 分布式系统咋做同步?虐死人!
  4. RabbitMQ 延迟队列实现定时任务的正确姿势,你学会了么?
  5. 20 张图彻底弄懂 HTTPS 的原理!
  6. 15000 字的 SQL 语句大全
  7. Git从入门到放不下
  8. 网络常见的 9 大命令,非常实用!
  9. 图像数据读取及数据扩增方法
  10. 1行代码消除PyTorch的CUDA内存溢出报错,这个GitHub项目刚发布就揽星600+