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

发布者: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-19 05:31

基于机器视觉的太阳能电池片外观缺陷检测
引言 随着国内外对清洁能源需求的增加以及各国政府对清洁能源补助的提高,光伏组件的需求也在快速增长。为保证产能及组件品质的可靠性,高精度、高速太阳能电池片的全自动焊机成为光伏企业的首选。目前这些设备大多依赖进口,然而进口设备高昂的价格很大程度上增加了太阳能发电的成本,急需研制出高水平的太阳能电池片焊接设备来满足市场的需求。电池片焊接设备的精度、速度与电池片的完整性相关。传统的检测方法精度低、速度慢,而且部分还需依赖人工操作,不能满足市场要求,而基于机器视觉的检测方法能有效地解决这些问题。 机器视觉技术与人类通过眼睛获取信息的方式是一致的,光学图像的采集就好比是机器在用“眼睛”获取信息,检测算法就是机器在用“大脑”思考的过程。
[单片机]
基于机器视觉的太阳能电池片外观<font color='red'>缺陷</font><font color='red'>检测</font>
亿智电子助力深度学习模型在ASIC上部署
集微网消息,智能网络摄像机(AI IPC)拥有广阔的市场空间,2020年在新冠疫情、国际贸易政策的影响下,IPC SoC芯片的产能缺口巨大。近日,亿智电子将深度学习模型在ASIC人工智能芯片上量化部署。 随着深度学习在近年来的逐步升温,智能边缘计算应用需求增大,ASIC人工智能芯片应运而生。ASIC人工智能芯片通过加速运算使深度学习可以加速运行,同时可以定制配置运行在低功耗计算资源较少的终端侧,但因此能耗要求也较高,传统的深度学习模型通常需要量化到精度较低的数据类型才可以达到落地的指标要求。由于深度学习ASIC人工智能芯片通常计算资源较少,尤其位宽、中间值位宽与现在的通用芯片有较大区别,导致传统的深度学习模型通常不能直接部署到AS
[手机便携]
亿智电子助力<font color='red'>深度学习</font><font color='red'>模型</font>在ASIC上部署
小米高管谈深度学习框架MACE:被多家软件公司APP集成
小米集团副总裁、小米技术委员会主席崔宝秋在昨天晚间谈到了深度学习框架MACE。 崔宝秋称,为了将小米算法团队的诸多技术成果通过AI框架尽快地落地到手机上,2017年,在考察当时流行的深度学习框架并反复权衡之后,小米决定研发自己的移动端深度学习推理框架,并于2018年对外推出并开源了专门为移动端设备优化的深度学习推理框架MACE。 MACE在立项时确立了四个目标:通用、高性能、易用和便携。在后续的技术实践中,MACE团队围绕这四个目标进行了技术方案的设计和研发,在多框架支持、性能、系统响应、功耗、内存占用、模型保护等方面都进行了专门优化。 到了2020年,MACE推出并开源了微控制器AI推理引擎MACE Micro,以全面支持手机与
[手机便携]
深度学习发威 人工智能为智能医疗添动能
人工智能持续展现其惊人的数据筛选能量。NVIDIA近期表示,该公司致力于新药开发的合作伙伴benevolent.ai,藉由内建GPU训练系统的人工智能计算机,在短短一个月内,便找出两种阿兹海默症药物的模型。明显增进科学家研究效率,为医疗体系的智慧化再添动能。 研究机构IDC指出,到了2020年,80%的大数据与分析部署,将需要分布式的微分析,而有40%的公司分析软件中,将会包含基于认知运算功能的标准型分析。上述趋势,皆需要在现有运算能力上,有戏剧性的突破,而其很有可能将会由GPU来作驱动。 NVIDIA 解决方案工程架构经理康胜闵表示,NVIDIA在五年前开始投入深度学习领域,将影片、图片、文字,透过深度学习的过程,让计算机学习到
[医疗电子]
ABI报告看好未来基于深度学习的机器视觉摄像头应用
全球科技市场咨询公司ABI Research的分析报告《基于深度学习(DL)的机器视觉在智慧城市中的应用》显示,2025年搭载AI芯片组的智能摄像头装机量将达到3.5亿台以上。预计2025年出货的摄像头中,超过65%的摄像头将至少配备一个AI芯片组。 这种摄像头将采用深度学习(DL)模型,在智能交通管理、资产管理、人流监控和管理、物理和周界安全以及预防性威胁检测等应用中实现自动化和增强决策。 全球越来越多的城市和政府都在积极寻求利用人工智能,这导致了采用边缘AI芯片组的智能摄像头的热潮。 ABI Research人工智能和机器学习首席分析师Lian Jye Su表示。 除了低延迟之外,数据隐私问题也推动了边缘AI的应用
[安防电子]
这七大颠覆性技术价值数十万亿美元 深度学习值35个亚马逊
  7月2日消息,据外媒报道,专注于当今颠覆性技术发展潜力研究和投资的ARK Investment Management公司日前发布报告,评选出最具潜力的七大颠覆性技术,以及它们最终可能成长到何种规模。下面就随网络通信小编一起来了解一下相关内容吧。     该公司创始人兼首席执行官凯瑟琳·伍德(Catherine Wood)表示:“我们相信创新才是增长的关键。我们并非聚焦于过去,而是关注未来。我们认为公共市场拥有巨大的机会,而我们要做的就是把握住机会。”    1. 深度学习 值35个亚马逊    深度学习 是 机器学习 的分支,而后者又是人工智能(AI)的子分支。 深度学习 是导致当今AI被大肆炒作的重要原因。然而,在炒
[网络通信]
恩智浦开发汽车级深度学习工具包 加快汽车AI应用开发
据外媒报道,恩智浦(NXP)开发了深度学习工具包eIQ,使汽车AI应用开发性能提高30倍,并且能使客户更快开发AI应用。 (图片来源:恩智浦半导体官网) 该工具包支持使用基于深度学习的算法,如图像识别、自动驾驶、传感器数据融合、驾驶员监测和其他汽车应用。该工具包使客户能够在桌面、云和GPU环境中开发应用程序,并将神经网络移植到eIQ Autocompatible S32处理器中。恩智浦的工具包和汽车电子专用推理引擎有助于将神经网络轻松集成到高安全性要求的应用程序中。 传统的图像识别算法逐渐转变为基于深度学习的算法。在对象识别和分类方面,基于深度学习的算法准确性更高,更易于维护。但是,目前在车辆中实施此类系统费用较高
[汽车电子]
恩智浦开发汽车级<font color='red'>深度学习</font>工具包 加快汽车AI应用开发
机器人Loomo正式发售 新增两大深度学习框架支持
近日,Segway Robotics(赛格威 机器人 )团队宣布机器人Loomo已达到量产状态,并正式投入市场。Loomo Academy(教育版)和Loomo Enterprise(企业版)也在赛格威机器人官网上正式发布,用户可以根据自己的需求购买不同版本的机器人。   Loomo教育版和企业版上线 这次发布的Loomo Academy是Segway Robotics针对科研机构和高等院校推出的机器人研发平台,用于推进人工智能在机器人领域的应用,涉及计算机视觉、人机交互、语音处理等多个相关领域。近年来,人工智能应用的爆发得益于 深度学习 技术可以在大量数据中训练、推演出高精度模型。发布Loomo Academy的目的在于为
[嵌入式]
小广播
最新嵌入式文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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