一.图像分割算法分类与介绍
图像分割是预测图像中每一个像素所属的类别或者物体。基于深度学习的图像分割算法主要分为两类:
- 语意分割:为图像中的每一个像素分配一个类别,如把画面中的所有物体都指出它们各自的类别。
- 实例分割:与语意分割不同,实例分割只对特定物体进行类别分配,这一点与目标检测有点相似,但目标检测输出的是边界框和类别,而实例分割输出的是掩膜(mask)和类别。
基于传统的CNN的分割方法的缺点:
基于传统的CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入,用于训练与预测,这种方法主要有几个缺点:
- 存储开销大:比如对每一个像素使用15 * 15的图像块,然后不断滑动窗口,将图像块输入到CNN中进行类别判断,因此,需要的存储空间随滑动窗口的次数和大小急剧上升。
- 效率低下:相邻像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算有很大程度上的重复。
- 像素块的大小限制了感受区域的大小,通常像素块的大小比整幅图像的大小小很多,只能提取一些局部特征,从而导致分类性能收到限制。
而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属类别。即从图像级别的分类进一步延伸到像素级别的分类。针对语意分割训练一个端到端,点对点的网络,达到了state-of-the-art。
二.FCN
对于一般的分类CNN网络,如VGG和ResNet,都会在网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。
而FCN提出可以把后面几个全连接层都换成卷积层(卷积化),这样就可以获得一张2维的feature map,后接softmax层获得每个像素点的分类信息,从而解决分割问题。如下图所示:
这幅图显示了卷积化的过程,图中显示的是AlexNet的结构,简单来说卷积化就是将其最后三层全连接层全部替换成卷积层。
FCN网络结构
FCN对图像进行像素级的分类,从而解决了语意级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全连接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用转置卷积层对最后一个卷积层的feature map进行上采样,使他恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测,同时保留了原始输入图像中的空间信息,最后在上采样的特征图上进行逐像素分类。
下面是语意分割所采用的全连接网络的结构:
通常CNN网络在卷积层之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射称一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适用于图像级别的分类和回归任务,因为它们最后都得到整个输入图像的一个概率向量。
用上面第一张图举一个例子:
- 在CNN中,猫的图片输入到AlexNet中,得到一个长为1000的输出向量,表示输入图像属于每一类的概率,其中在“tabby cat”这一类统计概率最高,用来做分类任务。
- FCN与CNN的区别在于把CNN最后的全连接层转换成卷积层,输出的是一张已经带有标签的图片,而这个图片就可以做语意分割。
- CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。高层的抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高,所以我们常常可以将卷积层看作是特征提取器。
全连接层和卷积层相互转化
全连接层和卷积层之间唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。然而在两类层中,神经元都是计算点积,所以它们的函数形式是一样的。因此,将两者互相转化是可能的。
- 对于任一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块,其余部分都是零。而在其中大部分块中,元素都是相等的。
- 任何全连接层都可以被转化为卷积层。比如VGG16中第一个全连接层是25088 * 4096的数据尺寸,将它转换为512 * 7 * 7 * 4096的数据尺寸,即一个K=4096的全连接层,输入特征图的尺寸是7 * 7 * 512,这个全连接层可以被等效地看作一个F=7,P=0,S=1,K=4096的卷积层。换句话说,就是将滤波器的尺寸设置为和输入特征图的尺寸一致7 * 7,这样输出就变为1 * 1 * 4096,本质上和全连接层的输出是一样的。
输出激活特征图深度是由卷积核的数目决定的(K=4096)
在两种变换中,将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是227 * 227 * 3的图像,一系列的卷积层和下采样层将图像数据变为尺寸为7 * 7 * 512的激活特征图,AlexNet的处理方式为使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。我们将这3个全连接层中的任意一个转化为卷积层:
- 第一个连接区域是[7 * 7 * 512]的全连接层,令其滤波器尺寸为F=7,K=4096,这样输出特征图就为[1 * 1 * 4096]。
- 第二个全连接层,令其滤波器尺寸为F=1,K=4096,这样输出特征图为[1 * 1 * 4096]。
- 最后一个全连接层也做类似的变换,令其F=1,K=1000,最终输出为[1 * 1 * 1000]。
说完上面的内容,那么就出现一个问题,为什么要进行全连接层和卷积层的转换呢?
因为如果是全连接层,那么输入的图像大小是要固定的,这就使得训练网络的前期工作十分耗时。而如果用卷积层代替了全连接层之后,可以使得卷积在一张更大的输入图片上移动,可以获取更多的特征。
那么为什么有全连接层,输入的图片大小就是固定的呢?
首先,对于CNN来说,一幅输入图片在经过卷积和pooling层时,这些层是不关心图片大小的。比如对于一个卷积层,输出大小=(输入大小-卷积核大小)/步长+1,他并不关心输出尺寸多大,对于一个输入尺寸大小的输入feature map,卷积操作后输出尺寸的feature map就行。对于pooling层也是一样的道理。但在进入全连接层之后,feature map(假设x * x)要拉成一条向量,而向量中每个元素(共x * x个)作为一个节点都要与下一层的所有节点(假设4096个)全连接,这里的权值个数是4096 * x * x,我们知道神经网路结构一旦确定,它的权值个数都是固定的,所以这个x不能变化,x是前一个卷积层的输出大小,所以层层向前倒推,每个输出大小都要固定,因此输入图片大小要固定。
把全连接层的权重W改成卷积层的filter的好处
这样的转化可以在单个前向传播过程中,使得卷积网络在一张更大的输入图片上滑动,从而得到多个输出(可以理解为一个label map)。
例如我们想让224 * 224尺寸的浮窗,以步长为32在384 * 384的图片上滑动,把每个停经的位置都带入卷积网络,最后得到6 * 6个位置的类别得分,那么通过将全连接层转化为卷积层之后的运算过程为:
如果224 * 224的输入图片经过卷积层和下采样层之后得到了[7 * 7 * 512]的数组,那么,384 * 384的大图片直接经过同样的卷积层和下采样层之后会得到[12 * 12 * 512]的数组,然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6 * 6 * 1000]的输出((12 - 7)/1 + 1 = 6),这个结果正是浮窗在原图停经的6 * 6个未知的得分。
三.转置卷积的结构
Upsampling的操作可以看成是转置卷积(transposed convolution),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过BP算法学习得到。转置卷积层也是卷积层,不关心输入的大小,卷积操作后输出feature map。转置卷积的前向传播就是卷积的反向的传播。
虽然转置卷积层和卷积层一样,也是可以训练参数的,但是实际实验过程中,作者发现,让转置卷积层可以学习,并没有带来performance的提升,所以实验中的转置卷积的lr都被置零了,这样还可以加速训练。
转置卷积参数:利用卷积过程filter的转置(实际上就是水平和竖直方向上翻转filter)作为计算卷积前的特征图。
转置卷积后的特征图输出尺寸:
W = (W1 - 1) * stride + kernelsize - 2 * padding。
H = (H1 - 1) * stride + kernelsize - 2 * padding。
转置卷积的运算如下图所示:
其中蓝色是反卷积层的输入,绿色是反卷积层的输出。
再看一个例子:
上图的反卷积,输入是3 * 3,输出是5 * 5。
四.跳级结构(Skip Architecture)
对CNN的结果做处理,得到了dense prediction(预测每个像素的label),而作者在实验中发现,得到的分割效果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的池化层输出和最后的输出做一个fusion,实际上也就是加和:
而不同的结构产生的结果对比如下:
实验表明,这样的分割结果更细致更准确。在逐层fusion的过程中,做到第三行再往下,结果又会变差,所以作者做到这里就停了。
六.FCN缺点
- 得到的结果还是不够精确。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
- 对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。