语义分割系列 – FCN详解

FCN是深度学习用于语义分割领域的开山之作,他的主要核心贡献在于:

  • 全卷积(convolutional):采样端对端的卷积网络,将普通分类网络的全连接层换上对应的卷积层(FCN)
  • 上采样(upsample):即反卷积(deconvolution),恢复图片的位置信息等,反卷积层可以通过最小化误差学习得到。
  • 跳跃连接(skip layer):通过连接不同卷积层的输出到反卷积层,来改善上采样很粗糙的问题。

FCN:Fully Convolutional Networks for Semantic Segmentation
submit time: 2015
arxiv link

FCN与CNN

通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。
如下:下图中的猫, 输入AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高。
CNN
FCN相对用于图片分类领域的经典网络如Alexnet, VGG, Googlenet等只是在最后几层稍作了修改,替换,以让它们适用在了semantic segmentation上面。下图中可看出FCN相当于分类CNN网络在模型后端所有的变化。
FCNFCN
全卷积:
前端输入,一般CNN分类网络选择使用固定大小的image patch来作为输入,这个patch往往是从原图当中剪切出来的;而FCN网络则使用整张原图来作为输入,允许图片大小不固定。然后在模型的后端,CNN分类网络会使用FC层对最后的CNN层生成出的feature map进行处理,从而丢掉由前端CNN各层处理所一直保存着的图片上敏感区域的位置信息,进而只抽象表达出它的类别信息来,以交由后面的softmax等层来最终预测出它的类别概率分布;FCN则不同,它丢掉了CNN分类网络后端的FC层,进而保留了图片上的区域位置信息,又在其后加上了几层CNN来进一步分析处理,整合主干网络输出特征,最终它生成出有着C+1(C为目标类别数,+1是为了考虑进去图片背景)个channels的heat map(本质上可以理解为是cnn所产生的feature map)来。
由于FCN网络前端CNN处理过程中会不断选择用Pool来整合、下采样特征,从而扩大后来层次的receptive fields,因此最终我们生成出来的heat map其大小肯定要小于原输入图片大小。实际上最终生成的feature map比原图片缩小s倍,s为图片中下采样层次stride的乘积即累积下采样步长。
而我们Semantic segmentation的目标是要预测输入图片每个像素点的可能类别。因此我们要想办法将输出的heat map与input raw image关联起来。简单的话可以直接使用线性二次插值来解决。FCN中通过在网络最后加入步长为s的deconvolution层来使得最终的网络输出heat map具有与输入原图一样的大小
全连接层->卷积层

  • 第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为k=7,padding = 0,stride = 1,共4096个卷积核,这样输出数据体就为[1x1x4096]了。
  • 第二个全连接层,令其滤波器尺寸为K=1,共有4096个卷积核,这样输出数据体为[1x1x4096]。
  • 对最后一个全连接层,令其K=1,共1000个卷积核,最终输出为[1x1x1000]

上采样:
下图是一个反卷积的过程,首先在feature map上增加padding,padding的大小为Kernel size - 1,padding部分用0来填充。随后使用卷积核在对该feature 进行卷积操作。该图是一个strides(步长)为1的反卷积,即FULL卷积方式:
full: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1+N2-1 x N1+N2-1
upsample
下图是步长为2的反卷积,可以使得图片变大,反卷积中步长指的是原图像素间填充0的行数。这时候原图中就会出现孔,可以这么理解,反卷积与卷积对应,当卷积stride为2的时候,表明下一次卷积将跨越两个像素。当反卷积stride为2时,意味着反卷积的步长为0.5,即需要走2步才能走到下一个像素位置。
upsample_stride
反卷积效果:
deconv

跳跃连接(skip layer):
由于直接从最后的feature map上采样到图片大小,精度上过于粗糙,这是因为当网络较深时可以学到比较深度的特征,同时过深的网络也会丢失空间位置信息。这意味着较浅层的输出具有更多位置信息。如果我们将两者结合起来,我们就提高结果。
fcndeconv
训练过程:
第一阶段:
step1
用经典的分类网络进行初始化,最后两层参数不使用。
step2
从特征图(16*16*4096)预测分割小图(16*16*21),之后直接上采样为大图。
反卷积(橙色)的步长为32,即特征图放大16倍,这个网络称为FCN-32s。
step3](/images/FCN/step3.jpg)
上采样分为两次完成:第一次为橙色×2。在第二次上采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性。 第二次反卷积步长为16,这个网络称为FCN-16s。
!step4
升采样分为三次完成(橙色×3)。进一步融合了第3个pooling层的预测结果。 第三次反卷积步长为8,记为FCN-8s。

LOSS

FCN的loss 为交叉墒loss,先接一个soft Max将网络的输出转化为概率。用概率计算交叉墒。
tensorflow 中调用的函数为:

1
2
loss = tf.reduce_mean((tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,
labels=tf.squeeze(annotation, squeeze_dims=[3]),name="entropy")))

CNN 网络优化通常使用的是SGD,随机梯度下降法来优化。