论文下载地址 :
https://arxiv.org/pdf/1411.4038.pdf
原作代码 :
https://github.com/shelhamer/fcn.berkeleyvision.org
备注: 此文的FCN特指<<Fully Convolutional Networks for Semantic Segmentation>>论文中提出的结构,而非广义的全卷积网络。
一、介绍
1.1FCN
关于图像分割的算法,传统有很多(关于图像分割的历史), 而全卷积神经网络(FCN, FullyConvolutionalNetwork) 是第一次将
端到端的卷积网络推广到了语义分割的任务当中,随后出现了很多成功的图像分割深度学习技术都是基于 FCN 实现的网络结构,比如 U-Net 等
1.2网络结构
FCN-32s
FCN-16s
FCN-8s
1.3 CNN和 FCN 的区别
关于两者的区别, 这篇文章总结的不错
我们知道, 通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(“全连接层 + softmax归一化”的结构)。
下图中的猫, 输入AlexNet网络中, 经过后面的全连接层后得到一个长为1000的输出向量, 再加上softmax归一化后即可以表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高。
这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。
CNN一般用作图像级的分类,而FCN可以对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类(最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本).如下图所示
(PACSAL数据集有20个类别+background=21)
简单的来说,FCN与CNN的区域在把于CNN最后的全连接层换成卷积层,输入一张原始图,输出的是一张已经Label好的图片,做到了端到端.
其实,CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:
- 较浅的卷积层感知域(感受野)较小,学习到一些局部区域的特征;
- 较深的卷积层具有较大的感知域(感受野),能够学习到更加抽象一些的特征。
这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。下图CNN分类网络的示意图:
这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。
而传统的基于CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:
- 一是存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。
- 二是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。
- 三是像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。
而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即
FCN从图像级别的分类进一步延伸到像素级别的分类。
CNN做图像分类、目标检测的效果已经被证明并广泛应用, 而很多成功的图像分割深度学习技术都是基于 FCN 实现
二、3 大技术
全卷积神经网络主要使用了三种技术:
- 卷积化(Convolutionalization): 适应任意尺寸输入,输出低分辨率的分割图片。
- 反卷积 : 低分辨率的图像进行上采样,输出同分辨率的分割图片
- 跳跃结构(跳跃层、Skip Layer): 结合上采样和上层卷积池化后数据,填补丢失的细节数据, 修复还原图像
2.1卷积化(Convolutionalization)
分类使用的网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息
卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可
图像语义分割的输出需要是个分割图,且不论尺寸大小,但是至少是二维的。所以,我们需要丢弃全连接层,换上全卷积层,如下图所示
因此这种全卷积形式的网络可以适应任意尺寸的输入(没有全连接层,全连接的结构是固定的)
2.2反卷积
FCN作者在论文中讨论了
3种上采样(upsample)方法,最后选用的是反卷积的方法(FCN作者称其为后卷积)使图像实现end to end,可以理解上采样(upsample)就是使大小比原图像小得多的特征图变大,使其大小为原图像大小
实际上,上采样(upsampling)一般包括2种方式:- Resize,如双线性插值直接缩放,类似于图像缩放(这种方法在原文中提到)
- 反卷积
所以反卷积(Deconvolution)是上采样(upsample)的一种.
反卷积(
Deconvolution)也叫转置卷积(
Transposed Convolution), 当然关于这个名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose。CS231n这门课中说,叫conv_transpose更为合适。
如上图所示, a 是输入图像,
经过卷积和池化得到的特征图分辨率明显下降, 而经过反卷积(上采样的一种)提升分辨率得到同时,还保证了特征所在区域的权重,
最后将图片的分辨率提升原图一致后,权重高的区域则为目标所在区域。
传统的网络是下采样(subsampling),对应的输出尺寸会降低;上采样(
upsampling)的意义在于将小尺寸的高维度特征图(feature map)恢复回去,以便做像素级的预测(pixelwise prediction),获得每个点的分类信息。
上采样在FCN网络中的作用如上图所示,明显可以看到经过上采样后恢复了较大的pixelwise的feature map(其中最后一个层21-dim是因为PACSAL数据集有20个类别+Background)。这其实相当于一个编码解码(
Encode-Decode)的过程。
对于一般卷积,输入蓝色4x4矩阵,卷积核大小3x3。当设置卷积参数pad=0,stride=1时,卷积输出绿色2x2矩阵,如下图:
相应的卷积公式为:
而对于反卷积,相当于把普通卷积反过来,输入蓝色2x2矩阵,卷积核大小还是3x3。当设置反卷积参数pad=0,stride=1时输出绿色4x4矩阵,如图,这相当于完全将图4倒过来
而对于反卷积公式就是将输入和输出反过来:
反卷积的卷积运算的参数也是通过bp算法学习出来的, 反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可
2.3 跳跃结构(跳跃层、Skip Layer)
但是,模型前期通过卷积、池化、非线性激活函数等作用输出了特征权重图像,由于最后一层的特征图(也叫热图, heatmap, 指卷积池化的最后特征图)太小,我们会损失很多细节。因此我们需要找到一种方式填补丢失的细节数据然后再反卷积,所以就有了跳跃结构(Skip Layer), 这是特征融合的一种方式, 后面的模型会有其它的方式.
未加入skip layer的模型是特别粗糙的,因为热图直接扩大了 32 倍,所以论文中有一个改进,就是利用跳跃结构将网络中间的输入联合起来,即逐点相加,再进行反卷积,这样能够依赖更多的信息,所以可以得到更好的结果,如下图所示:
fcn-32s 就是直接将最后的结果通过转置卷积扩大 32 倍进行输出,而 fcn-16s 就是联合前面一次的结果进行 16 倍的输出,fcn-8s就是联合前面两次的结果进行 8 倍的输出,我们用上图中 fcn-8s 举例,就是先将最后的结果通过转置卷积扩大 2 倍,然后和 pool4 的结果相加,然后在通过转置卷积扩大 2 倍,然后和 pool3 的结果相加,最后通过转置卷积扩大 8 倍得到和输入形状一样大的结果。
作者在原文种给出3种网络结果对比,明显可以看出效果:FCN-32s < FCN-16s < FCN-8s,即
使用多层feature融合有利于提高分割准确性,效果如下:
因而作者提出增加Skips结构将最后一层的预测(有更富的全局信息)和更浅层(有更多的局部细节)的预测结合起来,这样可以在遵守全局预测的同时进行局部预测。
三、FCN 的缺点 :
- 分割的结果不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
- 因为模型是基于CNN改进而来,即便是用卷积替换全连接, 但是依然是独立像素进行分类,没有充分考虑像素与像素之间的关系.忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。
每个模型都有自己的不足,所以才会出现各式各样的模型来解决它们的问题。大家如果能分析出每个模型的缺点,那我们也可以构建新的模型去完善他们的模型,这其实就是创新的过程
四、拓展
拓展1: 热图
此外,我再讲一个概念叫热图(heatmap)
经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32∗W/32 的时候图片是最小的一层时,所产生特征图(feature map)叫做热图(heatmap),热图就是我们最重要的高维特征图。
得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小。
经过卷积池化最后输出的21张heatmap(由于PACSAL数据集有20个类别+background=21)再经过upsampling变为原图大小的图片,为了对每个像素进行分类预测,这里有一个小trick,就是最后通过逐个像素地求其在21张图像中该像素位置的最大数值描述(概率)作为该像素的分类, 因此产生了一张已经分类好的图片
拓展2 : FCN + CRF
文章《【总结】图像语义分割之FCN和CRF》 认为,发展到现在,基于深度学习的图像语义分割“通用框架已经确定”:前端 FCN(包含基于此的改进 SegNet、DeconvNet、DeepLab)+ 后端 CRF/MRF (条件随机场/马尔科夫随机场)优化