算法原理
基于深度学习的图像分割算法属于图像处理领域最高层次的图像理解范畴。所谓图像分割就是把图像分割成具有相似的颜色或纹理特性的若干子区域,并使它们对应不同的物体或物体的不同部分的技术。这些子区域,组成图像的完备子集,又相互之间不重叠。
1、传统分割方法
图像分割问题最早来自于一些文本的分割,医学图像分割。在文本图像分割中,需要切割出字符,常见的问题包括指纹识别,车牌识别;由于这一类问题比较简单,因为基于阈值和聚类的方法被经常使用。基于阈值和聚类的方法虽然简单,但因此也经常失效。以graphcut为代表的方法,是传统图像分割里面鲁棒性最好的方法。Graphcut的基本思路,就是建立一张图,其中以图像像素或者超像素作为图像顶点,然后移除一些边,使得各个子图不相连从而实现分割。图割方法优化的目标是找到一个切割,使得移除边的和权重最小。
2、深度学习方法:
全卷积神经网络(Fully connected Network)是第一个将卷积神经网络正式用于图像分割问题的网络。一个用于分类任务的深度神经网络通过卷积来不断抽象学习,实现分辨率的降低,最后从一个较小的featuremap或者最后的特征向量,这个featuremap通常为5*5或者7*7等大小。而图像分割任务需要恢复与原尺度大小一样的图片,所以,需要从这个featuremap恢复原始图片尺寸,这是一个上采样的过程。由于这个过程与反卷积是正好对应的逆操作,所以我们通常称其为反卷积。代表算法有FCN、Unet、Deeplab等。
3、深度学习算法较之传统分割算法的优势:
(1)学习能力强:深度学习自动提取低层次或者高层次特征,具有较强的学习能力。
(2)覆盖范围广,适应性好:深度学习的神经网络层数很多,宽度很广,理论上可以映射到任意函数,所以能解决很复杂的问题。
(3)数据驱动,上限高:深度学习高度依赖数据,数据量越大,它的表现就越好。在图像识别、面部识别、NLP 等部分任务甚至已经超过了人类的表现。同时还可以通过调参进一步提高它的上限。
(4)可移植性好:由于深度学习的优异表现,有很多框架可以使用,例如 TensorFlow、Pytorch。这些框架可以兼容很多平台。
传统分割方法中特征提取主要依赖人工设计的提取器,需要有专业知识及复杂的调参过程,同时每个方法都是针对具体应用,泛化能力及鲁棒性较差。存储开销大,计算效率低下,识别速度较慢。
深度学习主要是数据驱动进行特征提取,根据大量样本的学习能够得到深层的、数据集特定的特征表示,其对数据集的表达更高效和准确,所提取的抽象特征鲁棒性更强,泛化能力更好,并且可以是端到端的。
4、Unet算法
本项目使用了基于深度学习的Unet网络:Unet网络由两部分组成,前半部分作用是特征提取(基础模型为MobileNet),后半部分是上采样。在一些文献中也把这样的结构叫做编码器-解码器结构。由于此网络整体结构类似于大写的英文字母U,故得名Unet。
Unet与其他常见的分割网络有一点非常不同的地方:Unet采用了完全不同的特征融合方式:拼接,Unet采用将特征在channel维度拼接在一起,形成更厚的特征。而FCN融合时使用的对应点相加,并不形成更厚的特征。
所以语义分割网络在特征融合时有两种办法:
(1)FCN式的对应点相加,对应于TensorFlow中的tf.add()函数;
(2)Unet式的channel维度拼接融合,对应于TensorFlow的tf.concat()函数,比较占显存。
除了上述新颖的特征融合方式,Unet还有以下几个优点:
(1)5个pooling layer实现了网络对图像特征的多尺度特征识别。
(2)上采样部分会融合特征提取部分的输出,这样做实际上是将多尺度特征融合在了一起,以最后一个上采样为例,它的特征既来自第一个卷积block的输出(同尺度特征),也来自上采样的输出(大尺度特征),这样的连接是贯穿整个网络的,可以看到上图的网络中有四次融合过程,相对应的FCN网络只在最后一层进行融合。
数据集准备
深度学习模型的精确度一般依赖于数据集的大小,CNN要求用于训练的数据集足够大,能够覆盖问题域中所有已知可能出现的问题。设计CNN的时候,数据集包含三个子集:训练集、测试集、验证集。
1、训练集:包含问题域中的所有数据,并在训练阶段用来调整网络的权重。
2、测试集:在训练的过程中用于测试网络对训练集中未出现数据的检测性能,根据网络在测试集上的性能情况,网络的结构可能需要做出调整,或者增加训练循环次数。
3、验证集:验证集中的数据统一应该包含在测试集和训练集中没有出现过的数据,用于在网络确定之后能够更好的测试和衡量网络的性能。
数据预处理与参数设置
1、数据预处理
为了加速训练的收敛速度,一般都会采用一些数据预处理技术,其中包括:去除噪声、输入数据降维、删除无关数据等。
数据的平衡化在目标检测问题中异常重要,一般认为训练集中的数据应该相对于标签类别近似于平均分布,也就是每一个类别标签所对应的数据集在训练集中是基本相等的,以避免网络过于倾向于表现某些分类的特点。
为了平衡数据集,应该移除一些过度富余的分类中的数据,并相应补充一些相对样例稀少的分类中的数据。还有一个方法就是复制一部分这些样例稀少的数据,并在这些数据中加入随机噪声。
2、数据归一化
将数据规则化到统一的区间(如[0,1])中,可以防止数据中存在较大数值的数据造成数值较小的数据对于训练效果减弱甚至无效化。一个常用的方法是将输入和输出数据按比例调整到一个和激活函数相对应的区间。
3、网络权值初始化
CNN的初始化主要是初始化卷积层和输出层的权值和偏置。网络权值初始化就是将网络中的所有连接权重赋予一个初始值,如果初始权重向量处在误差曲面的一个相对平缓的区域的时候,网络训练的收敛速度可能会很缓慢,一般情况下网络的连接权重和偏置被初始化在一个具有0均值的相对小的区间内均匀分布。
4、学习速率
如果学习速率选取的较大,则会在训练过程中较大幅度的调整权值,从而加快网络的训练速度,但是这会造成网络在误差曲面上搜索过程中频繁抖动,且有可能使得训练过程不能收敛。如果学习速率选取的较小,能够稳定的使得网络逼近于全局最优点,但也可能陷入一些局部最优,并且参数更新速度较慢。自适应学习率设定有较好的效果。
5、收敛条件
训练误差、误差梯度、交叉验证等可以作为停止训练的判定条件。一般来说,训练集的误差会随着网络训练的进行而逐步降低。
标注
对训练集和测试集的数据使用专业的标注工具进行标注,本项目标注图片数量为5000张。
训练流程
训练过程分为两个阶段:前向传播阶段和后向传播阶段
前向传播阶段:
1、从样本集中取N个样本,输入网络。
2、计算相应的实际输出,在此阶段信息从输入层经过逐级变换,传送到输出层。
后向传播阶段:
1、计算实际输出与相应的理想输出的误差。
2、按照极小化误差的方法调整权值矩阵。
具体训练过程如下:
1、选定训练组,从样本集中分别随机地寻求N个样本作为训练组。
2、将各权值、偏置,设置成小的接近于0的随机值,并初始化精度控制参数和学习率。
3、从训练组中取一个输入模式加到网络,并给出它的目标输出向量。
4、计算出中间层输出向量,计算出网络的实际输出向量。
5、将输出向量中的元素与目标向量中的元素进行比较,计算出输出误差;对于中间层的隐单元也需要计算出误差。
6、依次计算出各权值的调整量和偏置的调整量。
7、调整权值和调整偏置。
8、当经历M次迭代后,判断指标是否满足精度要求,如果不满足,则返回步骤3,继续迭代;如果满足就进入下一步。
9、训练结束,将权值和偏置保存在模型文件中。这时可以认为各个权值已经达到稳定,模型已经形成。再一次进行训练时,直接从模型文件中导出权值和偏置进行训练,不需要进行初始化。
识别流程
利用训练好的模型对待检测的图片进行缺陷检测的具体流程大致为:
1、将整张图片传入模型进行下采样,得到特征图。
2、将特征图进行上采样且结合下采样特征图得到与原图尺寸一样的mask图。
3、对mask图进行可视化即可看到测试结果。
模型优化
针对识别结果可以通过以下方法优化模型:
1、增加样本数量。
2、丰富缺陷种类和平衡每种缺陷的样本数量。
3、调整模型参数。