搬来给自己学的啊 感谢大佬 大佬勿怪

# 布匹瑕疵检测

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

缺陷数据

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

缺陷检测4_深度学习

缺陷检测4_2d_02

缺陷检测4_2d_03

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

缺陷检测4_数据_04

缺陷检测4_深度学习_05

注意:在制作缺陷数据的时候,缺陷面积至少占截取图像的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:对应的就是要分的类别,在这里我是二分类。

缺陷检测4_数据_06

关于最后的损失函数,建议选择Focal Loss,这是何凯明大神的杰作,源码如下所示: 

缺陷检测4_深度学习_07

数据做好,就可以开始训练了~~~

整幅场景图像的缺陷检测

上述训练的网络,输入是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层的输出。这是一个简单的小模型。

缺陷检测4_人工智能_08

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

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

识别结果如下图所示:

缺陷检测4_2d_09

缺陷检测4_深度学习_10

 

缺陷检测4_深度学习_11

一些Trick

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

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

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

# 手机表面缺陷检测

随着智能制造产业的升级和改造,智能手机作为人们生活的必需品,它的“智”不仅仅在于产品功能、性能方面的创新,更在于生产制造过程的智能化。

智能手机生产共有80多道工序,每一个工序都需要进行检测,检测的标准各不相同。为提升产品品质,降低不良率,达到用户满意度,检测作为手机生产的最后一道工序,是产品品质的“守门员”,也是手机厂商们关注的焦点。

深度学习技术 

解锁智能手机“智”造之路

手机在生产时候不可避免的会有一些缺陷,例如:

· 盖板玻璃上有划伤、压伤、破损、边缘毛刺等,产品尺寸公差大等;


· 手机电池表面会出现漏气、焊点、压伤等;


· PCB元器件有错、漏、反、浮高等问题;


· 金属部件表面脏污、裂纹、划伤、刮伤、气泡等;


· 摄像模组上有异物、污染、刮伤、白点以及高度差等;


· 在成品机组装上,出现缺件、错件、螺钉浮高等等。

缺陷检测4_深度学习_12

这些缺陷不仅会引发一系列的返工、售后问题,还会影响消费者对产品的使用感受,对产品的口碑也会造成一定的影响。

伴随着人口红利的逐渐消失,以及传统机器视觉的“僵态化”检测,局限性问题日益突出,已无法应对终端产品的频繁迭代。

深度学习技术,通过深度提取图像瑕疵特征,突破传统机器视觉逻辑简单、难以分析无规律图像的瓶颈,持续有效地提高了质检的准确性。

对于产品线的不断更迭变换,用户无需更改或调整设备机构,只需通过软件选择相应前期调试好的参数即可,如此一来,便大幅降低了用户更换不同产品时的设备调试时间。

在检测过程中,可实现不同尺寸、型号手机玻璃面、后盖、侧面、圆弧面的全方位检查,快速、精准地检测出划痕、碰伤、脏污、边缘银边、漏光等缺陷,省去了人工干预的环节。

遇到严重缺陷,还可根据设定在线报警或者停机,以防出现故障导致全线停产。

检测完成后,可在线将缺陷分类、存储、输出报表,增加了数据的可追溯性,管理者也能在第一时间获取产品缺陷分布和良品率,并根据一手数据及时优化流程与工艺。

毫无疑问,无论是在产品生产检验作业中,或是进行品质管理,实现精益化生产上,依靠深度学习技术的缺陷检测系统将是企业最为坚实的力量。

AI深度学习在手机“智”造应用

场景一

手机镜片外观瑕疵缺陷检测

缺陷检测4_人工智能_13

检测背景

手机镜片制造商,需要对出货前的产品进行外观检测,包括披风、蚀刻不良、异色、字体不良、崩边、边透沙眼、划伤、晶点、亮点等不良。

采用深度学习技术,可准确的检测出不良,以此来替代人工繁琐的检测,提升效率的同时并能管控好品质。

检测需求

披风检测、蚀刻检测、异色检测、字体检测、崩边检测、边透沙眼、划伤检测、晶点检测、亮点检测。

检测方案

通过机器视觉系统,检测产品制造中出现的划痕、脏污、异物等外观缺陷和其他异常,检测装配错误、表面缺陷、损坏的工件和缺失的功能,可确定对象的方向、形状、位置,还可识别功能。

检测效果

① 崩边检测

缺陷检测4_人工智能_14

② 边透沙眼

缺陷检测4_人工智能_15

③ 划伤检测

缺陷检测4_数据_16

④ 晶点检测

缺陷检测4_2d_17

⑤ 亮点检测

缺陷检测4_深度学习_18

⑥ 披锋检测

缺陷检测4_2d_19

⑦ 蚀刻检测

缺陷检测4_2d_20

⑧ 字体检测

缺陷检测4_数据_21

 场景二

手机玻璃盖外观缺陷检测

缺陷检测4_2d_22

检测背景

手机、平板电子产品在组装完成后,为保证出货前的产品质量,需对手机的玻璃面、后盖、侧面、圆弧面进行全方位的检查,检测内容包括划伤、缺口、点状异物(如颗粒、玻璃珠、气泡等)、压痕、凹凸痕、锯齿状、脏污、电镀掉漆、异色等。使屏幕依次显示不同的纯色背景,检测屏幕亮点、暗点、花屏、背光不良等缺陷。

检测效果

① 正面检测图片

缺陷检测4_深度学习_23

② R角检测图片

缺陷检测4_数据_24

③ 侧面检测图片

缺陷检测4_2d_25

场景三

手机中板外观缺陷检测

缺陷检测4_数据_26

检测难点

· 检测崩边缺失、断裂、变形,发生不良的位置未知且不固定,精准的搜索并检测判定是关键。

· 检测是否漏攻牙,由于牙孔内螺纹与CCD不在一个平行的平面,加上牙孔较小且受深度干扰,难度大。

· 断柱检测,由于辅助定位柱的Z向高度,与CCD不在一个平行的平面,是一个难点。

检测效果

① 牙孔检测效果

缺陷检测4_数据_27

② 断柱检测效果

缺陷检测4_人工智能_28

③ 崩边缺失检测效果

缺陷检测4_数据_29

场景四

手机外壳Logo缺陷检测

场景缺陷

碰压伤 、刮伤、料线、针孔、麻点、白点、缺口、凸包、研磨痕、拱起、变形

检测难点

· 手机LOGO属于高亮、镜面金属材质;

· 细微的划伤、凹坑在传统光学下,会被强光遮掩掉;

检测效果

①划痕检测

缺陷检测4_数据_30

② 凹凸点检测

缺陷检测4_数据_31