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

发布者:Lihua521最新更新时间:2024-08-08 来源: elecfans关键字:深度学习  识别模型  缺陷检测 手机看文章 扫描二维码
随时随地手机看文章

一、介绍

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


二、缺陷数据

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

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

4e0d2b8a-1e3b-11ee-962d-dac502259ad0.png

4e38cf92-1e3b-11ee-962d-dac502259ad0.png

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

一般来说,缺陷数据都要比背景数据少很多, 最后通过增强后的数据,缺陷:背景=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:对应的就是要分的类别,在这里我是二分类。

4e6a6eda-1e3b-11ee-962d-dac502259ad0.png

关于最后的损失函数,建议选择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层的输出。这是一个简单的小模型。

4e929112-1e3b-11ee-962d-dac502259ad0.png

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


#提取特征的大模型

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个像素)识别定位到的缺陷位置也不止一个,这样就涉及到定位精度了。在这里选择投票的方式,其实就是对原图像上每个被标记的像素位置进行计数,当数字大于指定的阈值,就被判断为缺陷像素。

识别结果如下图所示:

4ea5bea4-1e3b-11ee-962d-dac502259ad0.png
4f861d00-1e3b-11ee-962d-dac502259ad0.png
506a4c64-1e3b-11ee-962d-dac502259ad0.png

六、一些Trick

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

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

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


关键字:深度学习  识别模型  缺陷检测 引用地址:基于深度学习识别模型的缺陷检测方法

上一篇:介绍常见电机的控制算法
下一篇:用PLC怎么实现编码器的定位功能

推荐阅读最新更新时间:2024-11-06 06:28

深度学习成人工智能安全软肋 潜在风险不容忽视
  虽然 人工智能 正给人类生活带来翻天覆地的变化,但是,很多人并未考虑到 人工智能 也存在诸多安全隐患,尤其是其核心的 深度学习 技术更是面临着众多潜在威胁。随着 深度学习 应用越来越广泛,越来越多的安全问题也开始暴露出来。下面就随网络通信小编一起来了解一下相关内容吧。   日前,360安全研究院结合过去一年对 深度学习 系统安全性的详细研究,出具了《AI安全风险白皮书》,白皮书指出:深度学习框架中的软件实现漏洞、对抗机器学习的恶意样本生成、训练数据的污染等可能导致 人工智能 所驱动的识别系统出现混乱,形成漏判或者误判,甚至导致系统崩溃或被劫持,并可以使智能设备变成僵尸攻击工具。    图1:谷歌AlphaGo围棋功力惊艳
[网络通信]
英特尔谈OpenVINO是如何助力边缘到云的深度学习全流程开发
日前,在2019英特尔人工智能与物联网生态合作伙伴峰会上,英特尔视频业务市场拓展总监Thomas Neubert详细介绍了目前OpenVINO的部署情况,Thomas首先表示,OpenVINO的三大特色包括:免费开源、迅速地产品迭代以及跨平台的扩展性三大方面,这也是英特尔对于OpenVINO发展蓝图的一贯承诺。 OpenVINO™(Open Visual Inference & Neural Network Optimization,开放视觉推理及神经网络优化)软件平台是一个快速开发高性能计算机视觉和深度学习视觉应用的工具包。其中包括英特尔®深度学习部署工具包,具有模型优化器和推理引擎,以及面向OpenCV*和OpenVx*的
[嵌入式]
LED照明产品检测方法中的缺陷和改善的对策
  传统的 LED 及其模块光、色、电参数检测方法有电脉冲驱动,CCD 快速光谱测量法,也有在一定的条件下,热平衡后的测量法,但这些方法的测量条件和结果与LED 进入照明器具内的实际工作情况都相差甚远。文章介绍了通过Vf—TJ 曲线的标出并控制LED 在控定的结温下测量其光、色、电参数不仅对采用LED的照明器具的如何保证LED 工作结温提供了目标限位,同时也使LED 及其模块的光、色、电参数的测量参数更接近于实际的应用条件。文章还介绍了采用LED的照明器具如测量LED 的结温并确定LED 参考点的限值温度与结温的函数关系。这对快速评估采用LED 的照明器具的工作状态和使用寿命提供了一个有效的途径。   一、 序言   对于一个
[电源管理]
LED照明产品<font color='red'>检测</font>方法中的<font color='red'>缺陷</font>和改善的对策
微软联手亚马逊:发布开源深度学习库Gluson抗衡谷歌
  在人工智能领域,国外几大科技巨头之间的竞争可以说是达到了白热化。不过,竞争之外,部分巨头似乎也有合作的打算。10月13日, 亚马逊 和 微软 共同发布了开源深度学习库Gluson,可以帮助开发人员构建和训练自然语言网络。下面就随网络通信小编一起来了解一下相关内容吧。   据了解,两家公司已经建好一个Gluon界面,能够让用户构建神经网络,训练模型和开发APP一样简单。从描述上看这个软件有点类似谷歌的开源人工智能库TensorFlow。目前,TensorFlow已经被像Airbnb、eBay、Uber、Snapchat和Dropbox这样的公司用于人工智能开发。      微软联手亚马逊:发布开源深度学习库Gluson抗衡谷
[网络通信]
观点 | 深度学习有偏见、有局限性,但谁也挡不住它的未来
我知道博客标题中使用否定词很奇怪,但是前几天有一波讨论正好相应于我正在思考的一些问题。这一切开始于 Jeff Leek 发表的一篇有关说明在小样本范围内使用 深度学习 的文章。要言之,他认为当样本较小时(这在生物领域很常见),带有少许参数的线性模型甚至比带有少量层和隐藏单元的深度网络性能更优。他继续展示了一个非常简单的带有十大信息特征的线性预测器,在使用大约 80 个样本在 MNIST 数据集中分类 0 和 1 时,性能比一个简单的深度网络更优。这促使 Andrew beam 写了一篇反驳文章(详见:小心训练模型,数据少也可以玩转深度学习),其中写道一个适当训练的深度网络能够完胜简单的线性模型,甚至仅仅使用非常少的训练样本。在争论
[嵌入式]
燧原科技获Pre-A轮融资3.4亿,打造云端深度学习训练平台
2018年8月7日,中国上海——专注于人工智能领域神经网络解决方案的燧原科技今日宣布获得Pre-A轮融资3.4亿元人民币,由腾讯领投,种子轮投资方亦合资本(武岳峰资本旗下基金)、真格基金、达泰资本、云和资本继续跟投。本轮融资将用于云端AI加速芯片及相关软件生态的研发投入。 燧原科技今年3月成立于上海,在上海和北京设有研发中心。其产品是针对云端数据中心开发的深度学习高端芯片,定位于人工智能训练平台。芯片将采用自主研发的独特创新架构,具有高算力、高能效比、可编程、低成本、支持主流机器学习框架等特点,专为云端AI 训练设计和优化。公司研发团队的主要成员都拥有15年以上的高端芯片及相关软件生态系统的开发及量产经验,有着丰富的工程和
[嵌入式]
燧原科技获Pre-A轮融资3.4亿,打造云端<font color='red'>深度学习</font>训练平台
中科院为寒武纪芯片注资1000万元 支持国产智能芯片研发
新华社北京4月6日电(记者 白国龙)记者日前从中国科学院获悉,专门针对智能认知等应用并有望用于未来各种人工智能设备的专用芯片——寒武纪深度学习处理器从2017年起获得了中科院为期18个月共计1000万元的专项资金支持,用于项目研发及其产业化。 寒武纪是地球生命大爆发的年代,从那时起,地球进入了生命的新纪元。中国科学院计算技术研究所陈云霁、陈天石课题组把他们研制的深度学习处理器命名为“寒武纪”,是希望这世界上第一款模仿人类神经元和突触进行深度学习的处理器,能开启人工智能的新纪元。 据中国科学院计算技术研究所智能处理器研究中心介绍,这1000万元专项资金一方面用于人工智能芯片的基础性研究,探索下一代人工智能芯片的架构、算法以及
[半导体设计/制造]
基于改进FCOS的表面缺陷检测算法
相比two-stage方法,one-stage的目标检测算法在工业界更受追捧。one-stage的模型目前可以分为两大类:anchor-based和anchor-free方法。 FCOS属于anchor-free,但是却不是基于关键点检测的方法,严格来看其更接近基于anchor-based的方法,但是不需要anchor并加上特殊的设计却能够实现更好的效果。本文提出基于改进FCOS的表面缺陷检测算法,提升钢铁表面的缺陷检测效率。 针对现有钢带表面缺陷检测所存在的检测效率低、适用范围有限等缺陷,提出一种基于改进FCOS的钢带表面缺陷检测算法。该算法使用含形变卷积的卷积神经网络提取缺陷特征,使用关键点特征融合增强检测模型输入,并
[嵌入式]
基于改进FCOS的表面<font color='red'>缺陷</font><font color='red'>检测</font>算法
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved