基于深度学习识别模型的缺陷检测

2023-11-15

一、介绍

缺陷检测被广泛使用于布匹瑕疵检测、工件表面质量检测、航空航天领域等。传统的算法对规则缺陷以及场景比较简单的场合,能够很好工作,但是对特征不明显的、形状多样、场景比较混乱的场合,则不再适用。近年来,基于深度学习的识别算法越来越成熟,许多公司开始尝试把深度学习算法应用到工业场合中。

二、缺陷数据

如下图所示,这里以布匹数据作为案例,常见的有以下三种缺陷,磨损、白点、多线。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
如何制作训练数据呢?这里是在原图像上进行截取,截取到小图像,比如上述图像是512x512,这里我裁剪成64x64的小图像。这里以第一类缺陷为例,下面是制作数据的方法。

在这里插入图片描述
在这里插入图片描述

注意:在制作缺陷数据的时候,缺陷面积至少占截取图像的2/3,否则舍弃掉,不做为缺陷图像。

一般来说,缺陷数据都要比背景数据少很多,没办法,这里请参考我的另外一篇博文,图像的数据增强https://blog.csdn.net/qq_29462849/article/details/83241797
最后通过增强后的数据,缺陷:背景=1:1,每类在1000幅左右~~~

三、网络结构

具体使用的网络结构如下所示,输入大小就是64x64x3,采用的是截取的小图像的大小。每个Conv卷积层后都接BN层,具体层参数如下所示。
Conv1:64x3x3
Conv2:128x3x3
ResNetBlock和DenseNetBlock各两个,具体细节请参考残差网络和DenseNet。
Add:把残差模块输出的结果和DenseNetBlock输出的结果在对应feature map上进行相加,相加方式和残差模块相同。注意,其实这里是为了更好的提取特征,方式不一定就是残差模块+DenseNetBlock,也可以是inception,或者其它。
Conv3:128x3x3
Maxpool:stride=2,size=2x2
FC1:4096
Dropout1:0.5
FC2:1024
Dropout1:0.5
Softmax:对应的就是要分的类别,在这里我是二分类。

在这里插入图片描述

关于最后的损失函数,建议选择Focal Loss,这是何凯明大神的杰作,源码如下所示:

def focal_loss(y_true, y_pred):
    pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))
    return -K.sum(K.pow(1. - pt_1, 2) * K.log(pt_1))

数据做好,就可以开始训练了~~~

四、整幅场景图像的缺陷检测

上述训练的网络,输入是64x64x3的,但是整幅场景图像却是512x512的,这个输入和模型的输入对不上号,这怎么办呢?其实,可以把训练好的模型参数提取出来,然后赋值到另外一个新的模型中,然后把新的模型的输入改成512x512就好,只是最后在conv3+maxpool层提取的feature map比较大,这个时候把feature map映射到原图,比如原模型在最后一个maxpool层后,输出的feature map尺寸是8x8x128,其中128是通道数。如果输入改成512x512,那输出的feature map就成了64x64x128,这里的每个8x8就对应原图上的64x64,这样就可以使用一个8x8的滑动窗口在64x64x128的feature map上进行滑动裁剪特征。然后把裁剪的特征进行fatten,送入到全连接层。具体如下图所示。

全连接层也需要重新建立一个模型,输入是flatten之后的输入,输出是softmax层的输出。这是一个简单的小模型。

在这里插入图片描述

在这里提供一个把训练好的模型参数,读取到另外一个模型中的代码

#提取特征的大模型
def read_big_model(inputs):
    # 第一个卷积和最大池化层
    X = Conv2D(16, (3, 3), name="conv2d_1")(inputs)
    X = BatchNormalization(name="batch_normalization_1")(X)
    X = Activation('relu', name="activation_1")(X)
    X = MaxPooling2D(pool_size=(2, 2), strides=(2, 2), name="max_pooling2d_1")(X)
    # google_inception模块
    conv_1 = Conv2D(32, (1, 1), padding='same', name='conv2d_2')(X)
    conv_1 = BatchNormalization(name='batch_normalization_2')(conv_1)
    conv_1 = Activation('relu', name='activation_2')(conv_1)
    conv_2 = Conv2D(32, (3, 3), padding='same', name='conv2d_3')(X)
    conv_2 = BatchNormalization(name='batch_normalization_3')(conv_2)
    conv_2 = Activation('relu', name='activation_3')(conv_2)
    conv_3 = Conv2D(32, (5, 5), padding='same', name='conv2d_4')(X)
    conv_3 = BatchNormalization(name='batch_normalization_4')(conv_3)
    conv_3 = Activation('relu', name='activation_4')(conv_3)
    pooling_1 = MaxPooling2D(pool_size=(2, 2), strides=(1, 1), padding='same', name='max_pooling2d_2')(X)
    X = merge([conv_1, conv_2, conv_3, pooling_1], mode='concat', name='merge_1')
    X = MaxPooling2D(pool_size=(2, 2), strides=(2, 2), name='max_pooling2d_3')(X)  # 这里的尺寸变成16x16x112
    X = Conv2D(64, (3, 3), kernel_regularizer=regularizers.l2(0.01), padding='same', name='conv2d_5')(X)
    X = BatchNormalization(name='batch_normalization_5')(X)
    X = Activation('relu', name='activation_5')(X)
    X = MaxPooling2D(pool_size=(2, 2), strides=(2, 2), name='max_pooling2d_4')(X)  # 这里尺寸变成8x8x64
    X = Conv2D(128, (3, 3), padding='same', name='conv2d_6')(X)
    X = BatchNormalization(name='batch_normalization_6')(X)
    X = Activation('relu', name='activation_6')(X)
    X = MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same', name='max_pooling2d_5')(X)  # 这里尺寸变成4x4x128

    return X

def read_big_model_classify(inputs_sec):
    X_ = Flatten(name='flatten_1')(inputs_sec)
    X_ = Dense(256, activation='relu', name="dense_1")(X_)
    X_ = Dropout(0.5, name="dropout_1")(X_)
    predictions = Dense(2, activation='softmax', name="dense_2")(X_)
    return predictions
#建立的小模型
inputs=Input(shape=(512,512,3))
X=read_big_model(inputs)#读取训练好模型的网络参数
#建立第一个model
model=Model(inputs=inputs, outputs=X)
model.load_weights('model_halcon.h5', by_name=True)

五、识别定位结果

上述的滑窗方式可以定位到原图像,8x8的滑窗定位到原图就是64x64,同样,在原图中根据滑窗方式不同(在这里选择的是左右和上下的步长为16个像素)识别定位到的缺陷位置也不止一个,这样就涉及到定位精度了。在这里选择投票的方式,其实就是对原图像上每个被标记的像素位置进行计数,当数字大于指定的阈值,就被判断为缺陷像素。

识别结果如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、一些Trick

对上述案例来说,其实64x64大小的定位框不够准确,可以考虑训练一个32x32大小的模型,然后应用方式和64x64的模型相同,最后基于32x32的定位位置和64x64的定位位置进行投票,但是这会涉及到一个问题,就是时间上会增加很多,要慎用。

对背景和前景相差不大的时候,网络尽量不要太深,因为太深的网络到后面基本学到的东西都是相同的,没有很好的区分能力,这也是我在这里为什么不用object detection的原因,这些检测模型网络,深度动辄都是50+,效果反而不好,虽然有残差模块作为backbone。

但是对背景和前景相差很大的时候,可以选择较深的网络,这个时候,object detection方式就派上用场了。

七、关于源代码

这里的代码不再开源,因为设计到技术保密,感兴趣的话可以自己动手实现下,难度不大~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于深度学习识别模型的缺陷检测 的相关文章

  • jenkins学习笔记第七篇HTML Publish Report

    上一篇讲解了下载HTML Publisher Plugin 插件后 在项目构建发布HTML Report 项目执行后可以在构建里看到HTML Report 但是打开jenkins的报告是不会展示出原本的样式格式 因为jenkins将这些cs
  • js虚拟代理实现图片的预加载

    h1 虚拟代理实现图片的预加载 h1 p 在Web开发中 图片预加载是一种常见的技术 如果直接给某个img标签节点这只src属性 由于图片过大或者网络不佳 图片的位置往往有一片 空白 常见的做法是先用一张loading图片占位 然后用异步的

随机推荐

  • STM32f103 串口接收不定长数据

    推荐方法三 方法1 串口接受数据 定时器来判断超时是否接受数据完成 方法2 DMA接受 IDLE中断 实现思路 采用STM32F103的串口1 并配置成空闲中断IDLE模式且使能DMA接收 并同时设置接收缓冲区和初始化DMA 那么初始化完成
  • Windows平台下 USRP E310 基础环境配置

    原创声明 作者 Billyme 詩 博客园 https www cnblogs com billyme CSDN https blog csdn net horizon08 Github https billyas github io 本文
  • anaconda安装jieba(被折腾了很久)终于搞定

    今天打算在anaconda下安装jieba 总感觉直接pip install jieba可以轻松搞定 最后发现too young to simple 我首先使用pip install jieba或者conda install jieba 或
  • Intent隐式启动 AndroidManifest.xml 中的intent-filter

    隐式启动Activity的intent到底发给哪个activity 需要进行三个匹配 一个是action 一个是category 一个是data 可以是全部或部分匹配 同样适用于Service和BroadcastReceiver 下面是以A
  • SQL中的脏读、不可重复读、幻读

    一 数据库事务隔离级别 数据库事务的隔离级别有4个 由低到高依次为Read uncommitted Read committed Repeatable read Serializable 这四个级别可以逐个解决脏读 不可重复读 幻读 这几类
  • dw创建站点本地服务器,在Dreamweaver建立本地虚拟机站点

    这次给大家讲解一下在Dreamweaver cs6里建立本地虚拟机站点 步骤 1 首先要知道电脑安装的虚拟机的重要信息 虚拟机首页地址 127 0 0 1 ocalhost 要设置好虚拟机上的文档地址为d www地址 这样我们教材上讲的内容
  • MySQL02

    MySQL基础回顾 1 数据库概念 数据库 存储数据的仓库 逻辑概念 并未真实存在 数据库软件 真实软件 用来实现数据库这个逻辑概念 数据仓库 数据量更加庞大 更加侧重数据分析和数据挖掘 供企业决策分析之用 主要是数据查询 修改和删除很少
  • Several Machine Learning Problems

    Classification Classification algorithms are algorithms that learn topredict theclass orcategory of an instance of data
  • 不是具体的python序列类型的是_python的序列类型不包括

    Python中除了字符串以外 还有哪些常用的序列类型呢 题主欢迎来到CSS布局HTML 序列类型除了题主提到的 字符串 外 常用的还有 列表 list 元组 tuple range 对象 参考 题主有时间可以看一下Python官网Built
  • CTF-WEB(攻防世界题目-新手区)

    CTF WEB 新手区 view source robots backup Cookie disabled button weak auth simple php get post xff referer webshell waf simp
  • 技术服务线上沙龙——WebGL三维空间分析线上问题整理

    12月20日 超图集团质控与支持中心组织了岁末冲刺技术服务福利第三弹 WebGL三维空间分析 在讲解过程中就不断有朋友们在留言区提问 后面有朋友们提出将问题整理为文档 方便大家后续查看 于是 技术支持的同事们打铁趁热 将线上关注度较高的问题
  • 视频图像去雨论文数据集主页整理总结

    概述 近年来 计算机视觉快速发展 在各领域取得了较大的进展 尤其是随着深度学习的提出 计算机视觉再封闭和受限环境下都有着不错的表现 但是 面对开放和恶劣环境下 依然存在这巨大的挑战 常见的就是恶劣天气 对于户外的视觉系统 包括自动驾驶 视频
  • python编辑器IDLE的使用说明

    1 idle快捷键说明 alt n 返回之前输入过的上一个命令 alt p 下一个命令 ctl n 创建新的py文件 运行是F5 参考博客 https blog csdn net Dreamy LIN article details 794
  • TCP协议通信的过程

    终端之间的通信 一定是会话与会话 应用与应用之间的通信 端到端的连接是如何实现的 通过端口 三次握手 实现 TCP的建立 三次握手 通信之前先要建立三次握手 建立成功才能够通信 三次握手就是TCP连接建立的过程 TCP中有六个bite位 指
  • AI操作视频的工具最新最强集合

    AI的进化日新月异 很多之前只是在想象中的操作 已经有很多可以使用AI来完成了 最新的Stable Diffusion ControlNet EBsynth有哪些神奇的应用 如何一键替换视频中人物和场景 如何根据文字描述即可生成梦幻视频 我
  • git21天打卡day21-解决合并冲突

    新建的分支是有master分支的所有内容的 出现问题 本地新建了分支并修改了内容 推送到了远程 倒是远程分支和master都是旧的内容 猜想可能是本地修改没有add commit 本地修改要提交到远程必须add commit 和push 远
  • 在字节实习8个月后,成功转正!

    大家好 这里是 NewBeeNLP 今天给大家分享一位22届学弟在字节实习8个月后成功转正的经历 他向我们展示了在字节实习的日常工作 以及转正答辩该如何准备 最后告诫学弟学妹们今年秋招会很激烈 一定要尽早投递 本文堪称大厂实习转正的教科书
  • SQLITE3 使用总结

    SQLITE3 使用总结 3 5 转 3 不使用回调查询数据库 T6 F H m2 上面介绍的 sqlite3 exec 是使用回调来执行 select 操作 还有一个方法可以直接查询而不需要回调 但是 我个人感觉还是回调好 因为代码可以更
  • 安卓手机玩游戏卡顿怎么解决_员工在上班时间玩手机怎么办?解决方案来了!...

    人性化管理不是嘴上说说而已 员工为什么上班期间看手机 你思考过吗 gt gt gt gt 第一种员工自然是工作效率很高 这种员工也是很多公司想要拥有的 如果a员工在工作期间忙的鸡飞狗跳 b员工则胜似 闲庭漫步 这足以说明两者之间的工作效率
  • 基于深度学习识别模型的缺陷检测

    一 介绍 缺陷检测被广泛使用于布匹瑕疵检测 工件表面质量检测 航空航天领域等 传统的算法对规则缺陷以及场景比较简单的场合 能够很好工作 但是对特征不明显的 形状多样 场景比较混乱的场合 则不再适用 近年来 基于深度学习的识别算法越来越成熟