摘要
卷积网络是一种能够产生特征层次结构的功能强大的视觉模型。我们表明,卷积网络本身,训练端到端,像素到像素,超过了最先进的语义分割。我们的关键见解是建立“fully convolutional”网络,该网络接受任意大小的输入,并通过有效的推理和学习产生相应大小的输出。我们定义并详细描述了全卷积网络的空间,解释了它们在空间密集的预测任务中的应用,并与之前的模型建立了联系。我们将当代分类网络(AlexNet[19],VGGnet[31]和GoogLeNet[32])调整为完全卷积网络,并通过微调[4]将其学习到的表示转移到分割任务中。然后,我们改进了一种新的架构,它将深层、粗层的语义信息与浅层的外观信息结合起来,以产生准确和详细的分割。我们的全卷积网络实现了最先进的PASCAL VOC(2012年比62.2%提高20%)和SIFT流的分割,而对于典型图像的推断需要不到五分之一的秒。
结果
跟同时期的其他语义分割模型相比:
1.介绍
1.1 背景
- 早期的图像处理方法大多基于较粗粒度的信息(如整个图像或较大的区域块)进行推理。这种方法可能无法捕捉图像中精细的细节。随着技术进步,逐渐发展到精细推理阶段,即需要对图像中的每个像素进行分析和理解。
- 最自然的下一步:像素级预测。精细推理的目标是捕捉图像中尽可能多的细节,而对每个像素进行预测是实现这一目标的直观选择。每个像素都被看作是独立的信息单元,单独预测它的类别或属性,可以最大程度上保留图像的空间细节。
完全卷积网络(FCN),训练端到端,像素到像素的语义分割超过了最先进的,没有进一步的机制。可以预测来自任意大小的输入的密集输出。
2.全卷积网络
2.1传统的CNN卷积网络存在的问题
CNN做图像分类甚至做目标检测的效果已经被证明并广泛应用,图像语义分割本质上也可以认为是稠密的目标识别(需要预测每个像素点的类别)。 对于一般的分类CNN网络,如VGG和ResNet,都会在网络的最后加入一些全连接层,经过softmax后就可以获得类别概率信息。但是这个概率信息是1维的,即只能标识整个图片的类别,不能标识每个像素点的类别,所以这种全连接方法不适用于图像分割。
传统的基于CNN的语义分割方法是:将像素周围一个小区域(如25*25)作为CNN输入,做训练和预测。这种方法有几个缺点:
- 存储开销很大。例如对每个像素使用的图像块的大小为25x25,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升
- 计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。
- 像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。
2.2将全连接层转换为卷积层
在CNN中,比如将一张猫的图片输入到AlexNet,最终经过全连接层会得到一个长为1000的输出向量,表示输入的图像属于每一类的概率,其中在“tabby cat”这一类的统计概率最高,用来做分类任务。
通常的识别网络,包括LeNet,AlexNet,以及后面更加优秀的网络结构,都是输入固定大小的图像,得到非空间结构的输出。但是,这些网络的全连接层也可以看做是覆盖整个图像区域的卷积核。因此,可以将其转化为全卷积网络,那么可以输入任意大小的图像,输出分类特征图,保留了空间信息。
而图像语义分割的输出需要是一个分割图,且不论尺寸大小,都至少是二维的。所以,我们就想到丢弃全连接层,换上全卷积层。
比如一个7×7×512的特征矩阵,首先将其展平(flatten)为1×1×25088的向量,再通过全连接层得到长度为4096的向量,总参数量为25088×4096=102760448。如果使用卷积(7×7,s1,4096)代替全连接层,输出也是长度为4096的向量,总参数量为7×7×512×4096=102760448。每一个卷积核有7×7×512=25088个参数,而全连接输出向量中的每一个值都是由25088个值乘上权重得来,计算过程是一样的,所以4096个卷积核的参数可以由全连接层的4096个节点的参数reshape得到。
简要来说,语义分割是在一个二维图上做的,自然希望保留二维图的结构,希望输出的是二维分割图。所以在最后一层里面用几个卷积层替换了之前的全连接层 。
2.2上采样Upsamling
2.2.1 常见的上采样
- 转置卷积:feature maps补0,然后做卷积操作
示例 下面假设输入的特征图大小为2x2(假设输入输出都为单通道),通过转置卷积后得到4x4大小的特征图。这里使用的转置卷积核大小为k=3,stride=1,padding=0的情况(忽略偏执bias)。
nn.ConvTranspose2d
nn.ConvTranspose2d(in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
output_padding=0,
groups=1,
bias=True,
dilation=1)
-
线性差值
插值法不需要学习任何的参数,只是根据已知的像素点对未知的点进行预测估计,从而可以扩大图像的尺寸,达到上采样的效果
-
反池化unpooling
在空隙中填充 0
-
unsampling
在空隙中填充同样的值
2.2.2 为什么上采样
其目的是恢复图像的原始分辨率,使最终的分割结果与输入图像大小一致,从而为每个像素生成一个类别预测。这是因为在网络的前向传播过程中,特征图的分辨率会随着卷积和池化操作逐渐缩小,导致信息丢失,因此需要通过上采样将低分辨率的特征图还原到原始大小。
还可以把上采样与接下来要讲的跳跃连接相结合,将高层语义信息与低层的细节信息融合,改善分割结果的精确度。
2.3跳跃连接
以VGG、GooleNet为backbone,中间都要经过多层的池化(下采样)操作,从而导致最终的输出结果失去了很多细节信息,故想到将多层池化结果融合在一起使得最终的图像分割结果更加准确。通过跳级结构将低层,精细层(fine layers)与高层,粗糙层(coarse layers)结合,使得模型兼顾局部预测以及全局结构。(感觉和残差网络的思想差不多。。。)
对于FCN-32s这个模型,拿到pool5之后,经过conv6-7的卷积运算后,得到的是size=1×1的数据。但是我们需要将输出变成32*32。这个时候就是用32倍的upsampling实现这一需求。也就是说图中的“32x upsampling prediction"中间的“32x”的意思是放大32倍。
这个模型的思想是,将相对较浅的层的信息,比如pool4,融合进深层信息比如conv7中。pool4的size是2×2,conv7的size是1×1,二者size大小不一致无法进行element-wise的对应位置元素相加的融合。为了统一size,conv7需要通过deconv来放大两倍。所以下图中,才写着“2x conv7”,就是把conv7放大两倍。它是由两部分组成的。第一部分是pool4,size是2×2。第二部分是2x conv7。2x的意思是放大两倍。现在我们把两个2×2的feature map进行相加,就得到一个2×2的feature map。我们最终的目的是输出和input原始图片一样长和宽的feature map(size=32×32),因此我们需要把2×2的feature map通过deconv来放大16倍。也正是因为放大的倍数是16,所以下面才写着"16x upsampled"和"FCN-16s"。都是表示16倍。
首先是数据融合,有三部分要融合(1)conv7从1×1upsampling放大4倍,(2)pool4 upsampling放大2倍(3)pool3直接拿过来。前面这三个,他们的size都是4×4。然后把三个4×4的矩阵对应位置element-wise相加,得到一个4×4的矩阵。因为我们最终需要得到32×32的output,所以需要用upsampling实现8倍放大,也是因此这个模型被称为FCN-8s。这个8就是8倍放大的意思。
从上面展示的网络结构图可以看出,FCN-8S明显融合了更多的图像信息,因此实验结果也是最好。只用最深的数据,效果最差,多融合一点浅层数据,模型效果会变好。
3.实验框架点
带动量的SGD优化方法:动量是一种优化 SGD 的技术,用来加速收敛并减少震荡。它通过在参数更新中加入过去梯度的累积信息,使更新方向更稳定。
相当于是将之前多次梯度更新的历史信息纳入当前更新中,相当于给当前梯度加上一个“惯性”。这种方法可以在优化方向变化剧烈时减少震荡,在平坦区域也就是梯度较小的地方加速收敛。(可以结合随机梯度下降方法的公式理解)
密集预测(Dense Prediction):指的是需要对输入图像的每个像素或每个区域进行预测,而不仅仅是对整张图像或某些特定区域做预测。相比于常规的图像分类或目标检测任务,密集预测更关注图像中的细节信息和每个像素级别的分类或回归。