FCN理解

为什么需要FCN?

  分类网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压扁成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。
  而图像语义分割的输出需要是个分割图,且不论尺寸大小,但是至少是二维的。所以,流行的做法是丢弃全连接层,换上全卷积层,而这就是全卷积网络了。具体定义请参看论文:《Fully Convolutional Networks for Semantic Segmentation》

FCN结构

  在FCN论文中,作者的FCN主要使用了三种技术:

  • 卷积化(Convolutional)
  • 上采样(Upsample)
  • 跳层连接(Skip Layer)

      卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。


    这里写图片描述

      上采样即是反卷积(Deconvolution)。当然关于这个名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose,在信号与系统这门课上,我们学过反卷积有定义,不是这里的上采样。所以叫conv_transpose更为合适。

      众所诸知,池化会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了得到和原图等大的分割图,我们需要上采样/反卷积。反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0。图解如下:




  但是,虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。代码如下:

layer {
  name: "upscore"
  type: "Deconvolution"
  bottom: "score_fr"
  top: "upscore"
  param {
    lr_mult: 0
  }
  convolution_param {
    num_output: 21
    bias_term: false
    kernel_size: 64
    stride: 32
  }
}

可以看到lr_mult被设置为了0.

  跳层连接的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:




  不同上采样得到的结果对比如下:



  当然,你也可以将pool1, pool2的输出再上采样输出。不过,作者说了这样得到的结果提升并不大。FCN是深度学习应用于图像语义分割的开山之作,所以得了CVPR2015的最佳论文。但是,还是有一些处理比较粗糙的地方,具体和后面对比就知道了。

FCN缺点

1、缺乏空间的一致性规整,像素的处理都是独立的!
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值