0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

新机器视觉 来源:CSDN 2023-07-10 08:48 次阅读

一、介绍

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

二、缺陷数据

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

如何制作训练数据呢?这里是在原图像上进行截取,截取到小图像,比如上述图像是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方式就派上用场了。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • CMOS
    +关注

    关注

    58

    文章

    5157

    浏览量

    233351
  • CCD
    CCD
    +关注

    关注

    32

    文章

    837

    浏览量

    141246
  • 机器视觉
    +关注

    关注

    161

    文章

    4044

    浏览量

    118367
  • 工业相机
    +关注

    关注

    5

    文章

    272

    浏览量

    23154
  • 机器视觉系统

    关注

    1

    文章

    66

    浏览量

    18763

原文标题:基于深度学习识别模型的缺陷检测

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全网唯一一套labview深度学习教程:tensorflow+目标检测:龙哥教你学视觉—LabVIEW深度学习教程

    ,基于深度学习缺陷检测已经应用于金属固件、布匹丝织物、建筑裂纹、钢筋裂纹等多个领域,并取得了不错的成果。下面将结合具体案例介绍其实现方法
    发表于 08-10 10:38

    labview测试tensorflow深度学习SSD模型识别物体

    安装labview2019 vision,自带深度学习推理工具,支持tensorflow模型。配置好python下tensorflow环境配置好object_detection API下载SSD
    发表于 08-16 17:21

    labview缺陷检测算法写不出来?你OUT了!直接上深度学习吧!

    传统视觉对于缺陷检测有先天性的不足,当缺陷区域与正常区域灰度接近,没有明确的边界曲线时,往往无法将缺陷检测出来,而
    发表于 08-16 17:29

    labview深度学习应用于缺陷检测

    标注产品后通过训练平台完成模型训练经过少量样品训练得到测试结果,表明深度学习对传统视觉算法比较棘手的缺陷检测方面,能简单粗暴的解决问题,后续
    发表于 08-16 18:12

    labview+yolov4+tensorflow+openvion深度学习

    的网络结构。当然,深度学习方法用来检测,也有自己的很多缺点。例如:数据量要求大,工业数据收集成本高。但是随着数据增强技术,无监督学习的不断
    发表于 05-10 22:33

    labview深度学习检测药品两类缺陷

    ),因此,利用深度学习的方式解决此类问题至关重要。 通过labview调用tensorflow实现常见通用模型:faster-rcnn,ssd,ssd-mobile等模型的训练和调
    发表于 05-27 22:25

    labview深度学习PCB插件光学检测

    `labview在检测PCBA插件的错、漏、反等缺陷中的应用检测原理通过高精度彩色工业相机不停板实时抓取板卡图像,采取卷积神经网络算法处理图像,智能判定元器件不良。采用最新的深度
    发表于 07-13 15:27

    基于深度学习和3D图像处理的精密加工件外观缺陷检测系统

    缺陷空间,共同识别检测缺陷,增加缺陷识别检测的准确
    发表于 03-08 13:59

    基于深度学习模型的点云目标检测及ROS实现

    近年来,随着深度学习在图像视觉领域的发展,一类基于单纯的深度学习模型的点云目标检测
    的头像 发表于 11-05 16:47 1.7w次阅读

    基于深度学习的小样本墙壁缺陷目标检测及分类

    近年来,无需人工干预的深度学习已经成为缺陷图像检测与分类的一种主流方法。本文针对室内墙壁缺 陷缺检测
    发表于 04-24 09:44 1次下载

    基于深度学习的工业缺陷检测方法

    基于深度学习的工业缺陷检测方法可以降低传统人工质检的成本, 提升检测的准确性与效率, 因而在智能
    的头像 发表于 07-30 14:41 2295次阅读

    基于深度学习的焊接焊点缺陷检测

    深度学习主要包含卷积神经网络和Faster R-CNN两种网络模型,通过利用算法模型自动学习的特点,不再受限于复杂多变的环境,可自动提取
    的头像 发表于 10-19 15:08 1927次阅读

    一文梳理缺陷检测深度学习和传统方法

    但由于缺陷多种多样,传统的机器视觉算法很难做到对缺陷特征完整的建模和迁移,所以越来越多的学者和工程人员开始将深度学习算法引入到缺陷
    的头像 发表于 02-13 15:39 924次阅读

    瑞萨电子深度学习算法在缺陷检测领域的应用

    浪费大量的人力成本。因此,越来越多的工程师开始将深度学习算法引入缺陷检测领域,因为深度学习在特征
    的头像 发表于 09-22 12:19 506次阅读
    瑞萨电子<b class='flag-5'>深度</b><b class='flag-5'>学习</b>算法在<b class='flag-5'>缺陷</b><b class='flag-5'>检测</b>领域的应用

    深度学习在工业缺陷检测中的应用

    工业制造领域中,产品质量的保证是至关重要的任务之一。然而,人工的检测方法不仅费时费力,而且容易受到主观因素的影响,从而降低了检测的准确性和一致性。近年来,基于深度
    的头像 发表于 10-24 09:29 614次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>在工业<b class='flag-5'>缺陷</b><b class='flag-5'>检测</b>中的应用