前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于OpenCV的焊件缺陷检测

基于OpenCV的焊件缺陷检测

作者头像
小白学视觉
发布于 2025-02-05 04:36:01
发布于 2025-02-05 04:36:01
13500
代码可运行
举报
运行总次数:0
代码可运行

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 每次串联后,我们再次应用规则卷积,以便模型可以学习组装更精确的输出。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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个epochs(在所有输入上运行模型的次数)。调整这些参数,模型性能可能会有很大的改善可能。

测试模型

由于模型采用的尺寸为512x512x3,因此我们将输入的尺寸调整为该尺寸。接下来,我们通过将图像除以255进行归一化以加快计算速度。图像进入模型后以预测二进制输出,为了放大像素的强度,二进制输出已乘以1000。

然后将图像转换为16位整数以便于图像操作。之后,算法将检测缺陷并通过颜色分级在视觉上标记缺陷的严重性,并根据缺陷的严重性为具有缺陷的像素分配权重。然后考虑加权像素,在此图像上计算图像力矩。最终将图像转换回8位整数,并以颜色分级及其严重性值显示输出图像。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AI识万物:从0搭建和部署手语识别系统 ⛵
据北京听力协会预估数据,我国听障人群数量已过千万。而在全球范围内有4.66亿人患有残疾性听力损失,约占全世界人口的5%。聋哑人士很特殊,他们需要使用手语进行交流,其他与常人无异,我国存在特殊教育水平在各城市中发展力度具有较大差异,国家通用手语推广程度浅,但不懂手语,与听力障碍者交流会非常困难。
ShowMeAI
2022/08/09
1K0
AI识万物:从0搭建和部署手语识别系统 ⛵
具有TensorFlow,Keras和OpenCV的实时口罩检测器
在本文中,将使用Prajna Bhandary创建的口罩数据集。此数据集由属于1376个的图像with mask和without mask2类。
代码医生工作室
2020/06/01
1.2K0
从零开始构建:使用CNN和TensorFlow进行人脸特征检测
人脸检测系统在当今世界中具有巨大的用途,这个系统要求安全性,可访问性和趣味性!今天,我们将建立一个可以在脸上绘制15个关键点的模型。
deephub
2020/05/09
1.1K0
从零开始构建:使用CNN和TensorFlow进行人脸特征检测
TensorFlow 基础学习 - 3 CNN
抓住它的核心思路,即通过卷积操作缩小了图像的内容,将模型注意力集中在图像特定的、明显的特征上。
叉叉敌
2021/12/06
5030
TensorFlow 基础学习 - 3 CNN
使用TensorFlow和OpenCV实现口罩检测
在这段艰难的疫情期间,我们决定建立一个非常简单和基本的卷积神经网络(CNN)模型,使用TensorFlow与Keras库和OpenCV来检测人们是否佩戴口罩。
小白学视觉
2020/06/12
2.7K2
基于Python使用OpenCV进行车牌检测
1.车牌检测:第一步是从车上检测车牌。我们将使用OpenCV中的轮廓选项来检测矩形对象以查找车牌。如果我们知道车牌的确切尺寸、颜色和大致位置,可以提高准确度。通常,检测算法是根据特定国家使用的摄像机位置和车牌类型进行训练的。如果图像中甚至没有汽车,这将变得更加棘手,在这种情况下,我们将执行额外的步骤来检测汽车,然后是车牌。
小白学视觉
2022/02/14
1.7K0
基于Python使用OpenCV进行车牌检测
干货|深度学习实现零件的缺陷检测
本文由Oliver Cui根据实战经验,撰稿而成,同时他也是「视觉IMAX」知识星球特邀嘉宾。
计算机视觉
2020/11/11
9190
干货|深度学习实现零件的缺陷检测
Tensorflow2——卷积神经网络的搭建
***** 以下有关代码全是在jupyter notebook 里面调试完后曾,如果直接复制粘贴到pycharm可能不太行,自己得改改
Albert_xiong
2021/06/21
1.3K0
Tensorflow2——卷积神经网络的搭建
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
项目及数据地址:https://www.kaggle.com/c/dogs-vs-cats-redux-kernels-edition/overview
Michael阿明
2021/02/19
2.5K0
TensorFlow 2.0 - tf.data.Dataset 数据预处理 & 猫狗分类
MOOC TensorFlow入门实操课程代码回顾总结(一)
0 T-shirt/top(体恤) 1 Trouser(裤子) 2 Pullover(套头衫) 3 Dress(连衣裙) 4 Coat(外套) 5 Sandal(凉鞋) 6 Shirt(衬衫) 7 Sneaker(运动鞋) 8 Bag(袋子) 9 Ankle boot(短靴)
荣仔_最靓的仔
2022/01/05
7340
MOOC TensorFlow入门实操课程代码回顾总结(一)
用AI给黑白照片上色,复现记忆中的旧时光
【导读】我们知道,深度学习几乎已经应用在每一个领域,但如果我们能够构建一个基于深度学习的模型,让它能够给老照片着色,重现我们童年的旧回忆,这该多么令人激动啊!那么我们要怎么做呢?本文的作者将为大家介绍一个教程,通过深度学习方法为黑白老照片自动上色,带我们重新忆起那段老时光!
AI科技大本营
2018/09/28
1.8K0
用AI给黑白照片上色,复现记忆中的旧时光
使用深度学习和OpenCV的早期火灾探测系统
嵌入式处理技术的最新发展已使基于视觉的系统可以在监视过程中使用卷积神经网络检测火灾。在本文中,已经实现了两个定制的CNN模型,以实现用于监视视频的具有成本效益的火灾探测CNN体系结构。第一个模型是受AlexNet架构启发的定制的基本CNN架构。将实现并查看其输出和限制,并创建一个定制的InceptionV3模型。为了平衡效率和准确性,考虑目标问题和火灾数据的性质对模型进行了微调。将使用三个不同的数据集来训练模型。数据集的链接在本文结尾处可用。进入编码部分。
代码医生工作室
2020/07/09
1.1K0
使用深度学习和OpenCV的早期火灾探测系统
MOOC TensorFlow入门实操课程代码回顾总结(二)
欢迎来到TensorFlow入门实操课程的学习 MOOC TensorFlow入门实操课程代码回顾总结(一) MOOC TensorFlow入门实操课程代码回顾总结(三) 注: 用于表示python代码 粘贴运行结果 目录 5 图像分类基础应用——猫狗分类案例 5.1 导入库 5.2 下载数据集 5.3 查看样本数目 5.4 创建文件夹,存放训练测试数据 5.5 切分为训练数据和测试数据 5.6 模型构建 5.7 数据预处理 5.8 模型训练 5.9 训练结果可视化 5.10 模型推理 6 迁移学
荣仔_最靓的仔
2022/01/05
5520
MOOC TensorFlow入门实操课程代码回顾总结(二)
使用Python实现深度学习模型:智能垃圾分类与环境保护
智能垃圾分类是实现环境保护和资源回收的重要手段。通过深度学习技术,我们可以自动识别和分类垃圾,从而提高垃圾处理的效率。本文将介绍如何使用Python和深度学习库TensorFlow与Keras来构建一个简单的垃圾分类模型。
Echo_Wish
2024/08/07
2480
使用Python实现深度学习模型:智能垃圾分类与环境保护
Tensorflow2——tensorboard可视化
下面通过手写数字数据集来介绍如何使用tensorboard可视化 可以两种方法,一种是再notebook里,还有一种是网页打开。 jupyter notebook 调试
Albert_xiong
2021/06/21
4950
Tensorflow2——tensorboard可视化
去噪自动编码器
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137703.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/05
5960
基于深度学习的图像分类:使用卷积神经网络实现猫狗分类器
摘要: 深度学习在计算机视觉领域中具有广泛的应用。本文将介绍如何使用卷积神经网络(CNN)实现一个猫狗分类器。我们将使用Python和TensorFlow框架搭建一个简单的卷积神经网络模型,并利用猫狗图像数据集进行训练和测试。通过本文,读者将了解到深度学习在图像分类任务中的基本原理和实践应用。
海拥
2023/06/10
2.4K1
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,常用于计算机视觉领域的图像分类、目标检测和图像分割任务中。它的核心思想是通过卷积运算从原始数据中提取特征,然后将这些特征传递给全连接层进行分类或回归。
MATRIX.矩阵之芯
2023/04/05
4120
快乐学AI系列——计算机视觉(4.篇外)什么是“卷积神经网络”
深度学习实战-CNN猫狗识别
本文记录了第一个基于卷积神经网络在图像识别领域的应用:猫狗图像识别。主要内容包含:
皮大大
2023/08/23
7260
深度学习检测疟疾
欢迎来到AI for Social Good系列,将重点关注人工智能(AI)与流行的开源工具,技术和框架如何用于发展和改善社会的不同方面。“健康就是财富”也许是一个陈词滥调,但却非常真实!在这篇特别的文章中,将研究如何利用AI来检测疟疾,这是一种致命的疾病,并且有望建立一个低成本,有效和准确的开源解决方案。本文的目的是双重的 - 了解致命疾病疟疾的动机和重要性以及深度学习在检测疟疾方面的有效性。将在本文中介绍以下主要主题:
代码医生工作室
2019/06/21
1.1K0
深度学习检测疟疾
推荐阅读
相关推荐
AI识万物:从0搭建和部署手语识别系统 ⛵
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档