Segmentation-baseddeep-learningapproachforsurface-defect detection

本文介绍了一种基于分割的深度学习方法,用于检测和分割表面异常。该方法将表面异常检测转化为二进制图像分类问题,采用两阶段设计,仅需25-30个有缺陷样本即可完成分类。提出的模型精度高、计算量小,适用于工业场景下的缺陷检测。
  • 前言:这篇文章提出了一种基于分割的深度学习体系结构,该体系和结构旨在检测和分割表面异常
    由于对图像存在的异常进行分类比对缺陷进行精确定位更为重要,所以这篇文章将表面异常检测进一步归为二进制图像分类问题。为了克服在深度学习中出现的少量样本的问题,文章采用了两阶段的设计

  • 这篇文章主要优势为:只需要25-30个有缺陷的样本就可完成分类,所用样本极少。它提出了一个two-stage的模型,具有精度高、所需标注样本少、计算量小的特性。并且其提供了表面缺陷的开源数据集KolektorSDD。
    399个图像,52个有缺陷的样本,347个无缺陷样本。 分辨率1408*512。

文章地址:https://arxiv.org/abs/1903.08536v3
代码地址:https://github.com/Wslsdx/Deep-Learning-Approach-for-Surface-Defect-Detection
在这里插入图片描述
主体框架包含两个部分,左边的分割网络和右边的决策网络。分割网络对标么缺陷进行逐像素定位,决策网络主要进行二进制图像分类。

本文所解决的实际问题:
1.一般工业实际中也只能提供少量的缺陷样本;
2.缺陷检测需要100%的detection rate;
3.算力(时间)受限。

1. Segmentation network 分割网络
在这里插入图片描述
segmentation network包括11个卷积层和3个最大池化层:

 9个5*5卷积层;    ---每个卷积层后面都有一个batch normalization和非线性ReLU层
 1个15*15卷积层;    特征归一化将每个通道归一化为具有单位方差的零均值分布,有助于提高收敛速度
 1个1*1卷积层;      --- 源码中1*1卷积没有使用ReLU激活函数,使用的是sigmoid激活函数,用于生成二值掩码。
 3个最大池化层;     --- 用于降采样, 其步长为2。
 
    卷积层使用的都是same卷积,即卷积层不进行降采样的操作,仅通过池化层进行降采样的操作。 最终生成单通道图。整个过程中使用了3个最大池化层,最终得到8倍缩小于原图的输出。

分割网络专注于在高分辨率的图像表面上查找小的缺陷,网络需要满足两个需求:

  • 具有较大的感受野; —下采样层使用小的卷积核(5×5),且具有较小的层数。高层使用15×15大的卷积核,局域较高的层数。
  • 能够捕捉到较小的特征细节。 —使用最大池化而不是大幅度卷积实现下采样。使用最大池化层代替具有步长的卷积层,能够保证小但重要的细节在降采样过程中得以保存。

2. Decision network 决策网络

在这里插入图片描述
附加网络(下半部分):使用的是分割网络的输出和分割网络的特征通道数量为1024+1 = 1025层:

  1. 3个5*5卷积层; 通道数量为 8 、 16、 32 。 —通道数量随着特征分辨率的降低而增加,导致每一层所需的计算需求相同。
  2. 3个最大池化层; — 降采样 8倍缩小于输入。

附加网络之后,包含一个全局池化层。分别对segmentation output 和 附加网络输出 进行全局最大和全局平均池化。最终将会组合生成 32+32+1+1 = 66 通道数量的输出。由于是做的全局池化,所以每一个输出都是一个值,即消除了segmentation output 和附加网络输出维度不匹配的问题。
  最后,通过一个全连接层,生成最终分类的输出。 [0, 1]表示缺陷出现的可能性。

决策网络设计遵循两个重要原则
1.使用多层卷积核下采样来确保适合大型复杂形状的容量,使网络不仅可以捕获局部,还可以捕获跨越图像较大区域的全局形状。
2.决策网络不仅使用了分割网络中1*1内核缩减前的输出特征量,还是用了之后的输出。这引入了一种捷径,网络可以避免使用大量的特征图,减少对大量参数的过度拟合。
很多人并不直接在卷积中使用分段输出映射,仅通过全局最大平均池化,这限制了决策网络的复杂性,阻止了它捕获大型全局形状。

实验结果:
对网络进行了四个配置组的评估:

五种注释类型
两种损失函数
两种输入图像的尺寸
旋转或不旋转90度

在这里插入图片描述
最佳的结果:

  1. dilate=5
  2. cross-entropy loss function
  3. full image resolution
  4. No rotation
def DecisionNet(feature,mask, scope, is_training,num_classes=2, reuse=None):
      with tf.variable_scope(scope, reuse=reuse):
          with slim.arg_scope([slim.conv2d],
                                      padding='SAME',
                                      activation_fn=tf.nn.relu,
                                      normalizer_fn=slim.batch_norm):
             # 附加网络
              net=tf.concat([feature,mask],axis=3)    # 1024的特征是和mask进行合并
              net = slim.max_pool2d(net, [2, 2], [2, 2], scope='pool1')
 
             net = slim.conv2d(net, 8, [5, 5], scope='conv1')
             net = slim.max_pool2d(net, [2, 2], [2, 2], scope='pool2')
 
             net = slim.conv2d(net, 16, [5, 5], scope='conv2')
             net = slim.max_pool2d(net, [2, 2], [2, 2], scope='pool3')
 
             net = slim.conv2d(net, 32, [5, 5], scope='conv3')
             
             vector1=math_ops.reduce_mean(net, [1,2], name='pool4', keepdims=True)  # 全局平均
             vector2=math_ops.reduce_max(net, [1,2], name='pool5', keepdims=True)   # 全局最大
 
            # segmentation network 输出的处理
             vector3=math_ops.reduce_mean(mask, [1, 2], name='pool6', keepdims=True)
 
             vector4=math_ops.reduce_max(mask, [1, 2], name='pool7', keepdims=True)   # 全局池化操作就是reduce_max_mean
             # 拼接
             vector=tf.concat([vector1, vector2, vector3, vector4], axis=3)    # 将全局内容合并
             
             vector=tf.squeeze(vector, axis=[1, 2])    #  # 删除张量shape中维度为1的, 可以指定维度
 
             logits = slim.fully_connected(vector, num_classes,activation_fn=None)
             output=tf.argmax(logits, axis=1)  # 找logits中最大的那个变量
             return  logits,output            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值