经典卷积网络学习----FCN(图像分割)

目录

1,CNN与FCN的区别

2,FCN的详细步骤

3,FCN的训练过程

4,总结

 5,知识点补充

5.1 为什么FCN输入图像的大小可以任意

5.2 语义分割和实例分割的区别

6,图像分割通用框架



1,CNN与FCN的区别


     CNN网络在卷积之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率,如ALexNet网络最后输出一个1000维的向量表示输入图像属于每一类的概率。
      FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题。与经典的CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。
       全卷积网络(FCN)是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。
       FCN将传统CNN中的全连接层转化成一个个的卷积层。如下图所示,在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。 

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

这里写图片描述

 图1. FCN实现了 end-to-end 的图像语义分割

那么怎样将全连接层转换为卷积层呢?下面详细解释了转换方法。

卷积层卷积层替换全连接层的意义:
之所以要进行替换,是为了方便和高效
对于方便而言:
传统的CNN要求输入图片的尺寸必须要固定,这是因为传统的CNN全连接层的权值参数是固定的,则输入全连接层的尺寸也必须是固定的。如果输入图片的尺寸不固定,等运行至全连接层就会出错。
FCN中没有全连接层,也就没有某一个要求的固定输入,从而对输入图像的尺寸没有要求。

对于高效而言:
1,传统的CNN要求输入的尺寸必须要固定,在图片中包含多个待检测物体时,一般做法是将图片裁剪成多个图片块输入网络,检测这多个图片块的分类置信度。
      1)比如现有384 × 384,大小的图片,CNN要求输入图片的尺寸为244 × 244 ,这时图片将按照244×244的大小裁剪为多个图片块,之后输入到CNN模型,判断这些图像块的分类置信度。最后整合判断图像包含的物体。
       2)比如现有图片244 × 244 ,虽然符合CNN模型的输入尺寸,但是因为图片中包含有多个待检测物体,所以一般也将图片分成多个图像块,之后利用填充等方法将图像块扩充至244 × 244 ,最后整合判断图像包含的物体。
       3)这种做法,一方面会使CNN因为多个图片块的出现,增大运算负担;另一方面,这些图片块只包含着局部信息,不利于图片的整体分析。
2,FCN将整张图片输入,经过多次卷积后形成的特征图,也叫热图,能够整体概括图片中出现目标的检测概率。

核心思想

该论文包含了当下CNN的三个思潮 
- 不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。 
- 增大数据尺寸的反卷积(deconv)层。能够输出精细的结果。 

- 结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。

 fcn开源代码

github下载地址https://github.com/shelhamer/fcn.berkeleyvision.org 

2,FCN的详细步骤


FCN的论文主要集中于语义分割,当然这种结构现在已经运用在计算机视觉的各种任务中。
FCN创造性的将传统CNN的全连接层都转换成了卷积层。
FCN支持任意尺度的图片输入,改变了传统CNN要求固定输入图片尺寸的要求。
FCN中可将卷积分为两个过程,分别使得图片“缩小”、“变大”。所谓“缩小”指的是经过卷积提取图片的特征,所谓“放大”指的是经过反卷积将“缩小”的特征图还原成与输入图像尺寸相同的特征图。


        FCN中如果直接将特征图的尺寸通过反卷积转换为与输入图片尺寸相同,结果会非常粗糙。于是作者提出了跳级的思想,这样可以很好的解决这一问题。另外这种思想与之后的FPN、yolo等非常相似。
        FCN的运行原理:将一张任意尺寸的图片输入到FCN中,首先经过卷积得到特征图(因为该特征图非常小,故可以称为热图),然后运用反卷积和跳级的方法,还原出与输入图片尺寸相同的特征图,将该特征图与原始图像对比,实现了每个像素的预测,保留了原始输入图像中的空间信息。
整体的运行流程如下所示:

跳级的思想:

       前面提到了“放大”、“缩小”的两个卷积过程,可是根据实际操作发现,一步直接将“缩小”后特征图放大效果非常不好,有很多图片的细节没有办法体现。于是作者提出了跳级的思想。

 

      所谓跳级,也就是分步将特征图“放大”。可以看到图中有三种“放大”的策略,它们分别是FCN-32s,FCN-16s,FCN-8s。而且FCN中对特征图的放大一共是32倍(原因是2的8次方)。
       我们以FCN-8s为例讲解跳级思想,首先将1 × 1特征图上采样2倍,然后与之前特征图尺寸相同的相加,得到新的上采样2倍特征图。
       新的上采样2倍的特征图继续上采样2倍,然后与之前特征图尺寸相同的相加,得到新的上采样4倍的特征图。
       之后,特征图不再与之前的特征图相加,以2倍的上采样不断进行,直到采样的总倍数为32倍。所以跳级的精华在于与之前的特征图相融合,可以更好的利用底层位置信息和高层语义信息。

下图详细的介绍了网路的连接结构

图中,image是原图像,conv1,conv2..,conv5为卷积操作,pool1,pool2,..pool5为pool操作(pool就是使得图片变为原图的1/2),注意con6-7是最后的卷积层,最右边一列是upsample后的end to end结果。必须说明的是图中nx是指对应的特征图上采样n倍(即变大n倍),并不是指有n个特征图,如32x upsampled 中的32x是图像只变大32倍,不是有32个上采样图像,又如2x conv7是指conv7的特征图变大2倍。

(1)FCN-32s过程

只需要留意第一行,网络里面有5个pool,所以conv7的特征图是原始图像1/32,可以发现最左边image的是32x32(假设以倍数计),同时我们知道在FCN中的卷积是不会改变图像大小(或者只有少量像素的减少,特征图大小基本不会小很多)。看到pool1是16x16,pool2是8x8,pool3是4x4,pool4是2x2,pool5是1x1,所以conv7对应特征图大小为1x1,然后再经过32x upsampled prediction 图片变回32x32。FCN作者在这里增加一个卷积层,卷积后的大小为输入图像的32(2^5)倍,我们简单假设这个卷积核大小也为32,这样就是需要通过反馈训练32x32个权重变量即可让图像实现end to end,完成了一个32s的upsample。FCN作者称做后卷积,他也提及可以称为反卷积。事实上在源码中卷积核的大小为64,同时没有偏置bias。还有一点就是FCN论文中最后结果都是21×*,这里的21是指FCN使用的数据集分类,总共有21类。 

(2)FCN-16s过程

现在我们把1,2两行一起看,忽略32x upsampled prediction,说明FCN-16s的upsample过程。FCN作者在conv7先进行一个2x conv7操作,其实这里也只是增加1个卷积层,这次卷积后特征图的大小为conv7的2倍,可以从pool5与2x conv7中看出来。此时2x conv7与pool4的大小是一样的,FCN作者提出对pool4与2x conv7进行一个fuse操作(事实上就是将pool4与2x conv7相加,另一篇博客说是拼接,个人认为是拼接)。fuse结果进行16x upsampled prediction,与FCN-32s一样,也是增加一个卷积层,卷积后的大小为输入图像的16(2^4)倍。我们知道pool4的大小是2x2,放大16倍,就是32x32,这样最后图像大小也变为原来的大小,至此完成了一个16s的upsample。现在我们可以知道,FCN中的upsample实际是通过增加卷积层,通过bp反馈的训练方法训练卷积层达到end to end,这时卷积层的作用可以看作是pool的逆过程。 

(3)FCN-8s过程

这是我们看第1行与第3行,忽略32x upsampled prediction。conv7经过一次4x upsample,即使用一个卷积层,特征图输出大小为conv7的4倍,所得4x conv7的大小为4x4。然后pool4需要一次2x upsample,变成2x pool4,大小也为4x4。再把4x conv7,2x pool4与pool3进行fuse,得到求和后的特征图。最后增加一个卷积层,使得输出图片大小为pool3的8倍,也就是8x upsampled prediction的过程,得到一个end to end的图像。实验表明FCN-8s优于FCN-16s,FCN-32s。 
我们可以发现,如果继续仿照FCN作者的步骤,我们可以对pool2,pool1实现同样的方法,可以有FCN-4s,FCN-2s,最后得到end to end的输出。这里作者给出了明确的结论,超过FCN-8s之后,结果并不能继续优化。

结合上述的FCN的全卷积与upsample,在upsample最后加上softmax,就可以对不同类别的大小概率进行估计,实现end to end。最后输出的图是一个概率估计,对应像素点的值越大,其像素为该类的结果也越大。FCN的核心贡献在于提出使用卷积层通过学习让图片实现end to end分类。

事实上,FCN有一些短处,例如使用了较浅层的特征,因为fuse操作会加上较上层的pool特征值,导致高维特征不能很好得以使用,同时也因为使用较上层的pool特征值,导致FCN对图像大小变化有所要求,如果测试集的图像远大于或小于训练集的图像,FCN的效果就会变差。

《全卷积网络(FCN)详解》

       图像(图a)在经过卷积、池化等一系列处理后,得到的特征图(图b)分辨率远小于原图像。这样一来特征图中的像素无法与原图中一一对应,无法对每个像素进行预测。于是需要对特征图进行上采样以提高特征图的分辨率。

3,FCN的训练过程

训练过程分为四个阶段,也体现了作者的设计思路,值得研究。

step1:训练的第一阶段

《全卷积网络(FCN)详解》

       使用数据集对模型的分类backbone进行预训练,使卷积层获得提取相应特征的能力。最后两层红色的是全连接层。

step2:训练的第二阶段

《全卷积网络(FCN)详解》

从特征小图(16×16×4096)预测分割小图(16×16×21),之后直接升采样为大图(300×300×21)。这里输出通道数为21的原因是:采用的PASCAL数据集中有20类,算上背景类一共21类。每个通道预测一类的像素。反卷积(橙色)的步长为32,故该网络被称为FCN-32s

step3:训练的第三阶段

《全卷积网络(FCN)详解》

 这个阶段上采样分为两次完成(橙色×2)。 在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)通过跃层结构融合进来,提升精确性。 第二次反卷积步长为16,这个网络称为FCN-16s

step4:训练的第四阶段

这里写图片描述

 升采样分为三次完成(橙色×3)。 
进一步融合了第3个pooling层的预测结果。 
第三次反卷积步长为8,记为FCN-8s。 
这一阶段使用单GPU训练约需1天。

较浅层的预测结果包含了更多细节信息。比较2,3,4阶段可以看出,跳级结构利用浅层信息辅助逐步升采样,有更精细的结果。 
这里写图片描述

4,总结

FCN 的优势在于: 
- 可以接受任意大小的输入图像(没有全连接层) 
- 更加高效,避免了使用邻域带来的重复计算和空间浪费的问题。

其不足也很突出: 
- 得到的结果还不够精细 。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
-是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

 5,知识点补充

5.1 为什么FCN输入图像的大小可以任意

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

5.2 语义分割和实例分割的区别

目前的分割任务主要有两种:
(1)像素级别的语义分割
(2)实例分割

这个有意思,什么叫实例分割呢?它与语义分割有什么区别与联系呢?
顾名思义,像素级别的语义分割,对图像中的每个像素都划分出对应的类别,即实现像素级别的分类;
而类的具体对象,即为实例,那么实例分割不但要进行像素级别的分类,还需在具体的类别基础上区别开不同的实例。比如说图像有多个人甲、乙、丙,那边他们的语义分割结果都是人,而实例分割结果却是不同的对象,具体如下图所示:

6,图像分割通用框架

     发展到现在,基于深度学习的图像语义分割“通用框架已经确定”:前端 FCN(包含基于此的改进 SegNet、DeconvNet、DeepLab)+ 后端 CRF/MRF (条件随机场/马尔科夫随机场)优化

这里写图片描述

  • 15
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值