Fully Convolutional Networks for Semantic Segmentation

图像语义分割,简而言之就是对一张图片上的所有像素点进行分类。

通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如分类模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。

我们分类使用的网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。

而图像语义分割的输出需要是个分割图,且不论尺寸大小,但是至少是二维的。所以,我们需要丢弃全连接层,换上全卷积层,而这就是全卷积网络了。如下图所示:

Fully Convolutional Networks for Semantic Segmentation_第1张图片

 图中的猫, 输入到网络中, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高。

FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。

为什么全卷积网络可以接受任意尺寸的图像:

  • 卷积层的参数和输入大小无关,它仅仅是一个卷积核在图像上滑动,不管输入图像多大都没关系。图像进行卷积的时候,因为每一个卷积核中权值都是共享的,因此无论输入图像的尺寸是多大的都可以都是按照步长滑动做卷积,只不过都是经过卷积运算,不同大小的输入图片提取出的卷积特征的大小也是不同的。
  • 但全连接层的参数就和输入图像大小有关,因为它要把输入的所有像素点连接起来。(如果网络中含有全连接层的话。现在假设之前输入的图像都是一样大小的,经过卷积得到特征的尺寸也都是相同的,比如说是a×b,之后接一个1×c的全连接层,那么你现在卷积层的输出与全连接层之间的权重矩阵的大小为(a×b)×c.但是现在你如果你输入了一张比原来输入大的图像,这个时候你得卷积输出会为a‘×b’,如果它还要和全连接层相连接的话,权重矩阵的大小为(a‘×b’)×c,很明显与原来的权重矩阵不一样大,所以也就无法使用和训练了)

最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。下图是用于语义分割所采用的全卷积网络(FCN)的结构示意图:

Fully Convolutional Networks for Semantic Segmentation_第2张图片

简单的来说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,输出的是一张已经Label好的图片。

Fully Convolutional Networks for Semantic Segmentation_第3张图片

全连接层转化为卷积层:假设一个卷积神经网络的输入是 224x224x3 的图像,一系列的卷积层和下采样层将图像数据变为尺寸为 7x7x512 的激活数据体。AlexNet使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意一个转化为卷积层:

  • 针对第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为F=7,这样输出数据体就为[1x1x4096]了。
  • 针对第二个全连接层,令其滤波器尺寸为F=1,这样输出数据体为[1x1x4096]。
  • 对最后一个全连接层也做类似的,令其F=1,最终输出为[1x1x1000]
  • 这里相当于一个逐像素预测,输入1*1*4096,卷积模板尺寸1*1,输出1*1*1000。 相当于对每个像素施加一个全连接层,从4096维特征,预测1000类结果

CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。

作者的FCN主要使用了三种技术:

  • 卷积化(Convolutional)不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。 
  • 上采样(Upsample)增大数据尺寸的反卷积(deconv)层。能够输出精细的结果。 
  • 跳跃结构(Skip Layer)结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。

经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32∗W/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小.

Fully Convolutional Networks for Semantic Segmentation_第4张图片

最后的输出是1000张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测,标注成最后已经进行语义分割的图像,最后通过逐个像素地求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如下图右侧有狗狗和猫猫的图。

Fully Convolutional Networks for Semantic Segmentation_第5张图片

 

Fully Convolutional Networks for Semantic Segmentation_第6张图片

上图中,32x即为扩大32倍。

Pool5扩大32倍就可以得到原来图像大小了。

Pool5扩大2倍与Pool4融合得到,再扩大16倍也可以得到原来图像大小了。

扩大2倍与Pool3融合再扩大8倍也可以得到原来图像大小了。

不同的结构产生的结果对比如下:

Fully Convolutional Networks for Semantic Segmentation_第7张图片

你可能感兴趣的:(Semantic,Segmentation)