-
前言:这篇文章提出了一种基于分割的深度学习体系结构,该体系和结构旨在检测和分割表面异常。
由于对图像存在的异常进行分类比对缺陷进行精确定位更为重要,所以这篇文章将表面异常检测进一步归为二进制图像分类问题。为了克服在深度学习中出现的少量样本的问题,文章采用了两阶段的设计。 -
这篇文章主要优势为:只需要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层:
- 3个5*5卷积层; 通道数量为 8 、 16、 32 。 —通道数量随着特征分辨率的降低而增加,导致每一层所需的计算需求相同。
- 3个最大池化层; — 降采样 8倍缩小于输入。
附加网络之后,包含一个全局池化层。分别对segmentation output 和 附加网络输出 进行全局最大和全局平均池化。最终将会组合生成 32+32+1+1 = 66 通道数量的输出。由于是做的全局池化,所以每一个输出都是一个值,即消除了segmentation output 和附加网络输出维度不匹配的问题。
最后,通过一个全连接层,生成最终分类的输出。 [0, 1]表示缺陷出现的可能性。
决策网络设计遵循两个重要原则:
1.使用多层卷积核下采样来确保适合大型复杂形状的容量,使网络不仅可以捕获局部,还可以捕获跨越图像较大区域的全局形状。
2.决策网络不仅使用了分割网络中1*1内核缩减前的输出特征量,还是用了之后的输出。这引入了一种捷径,网络可以避免使用大量的特征图,减少对大量参数的过度拟合。
很多人并不直接在卷积中使用分段输出映射,仅通过全局最大平均池化,这限制了决策网络的复杂性,阻止了它捕获大型全局形状。
实验结果:
对网络进行了四个配置组的评估:
五种注释类型
两种损失函数
两种输入图像的尺寸
旋转或不旋转90度

最佳的结果:
- dilate=5
- cross-entropy loss function
- full image resolution
- 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
本文介绍了一种基于分割的深度学习方法,用于检测和分割表面异常。该方法将表面异常检测转化为二进制图像分类问题,采用两阶段设计,仅需25-30个有缺陷样本即可完成分类。提出的模型精度高、计算量小,适用于工业场景下的缺陷检测。
201

被折叠的 条评论
为什么被折叠?



