FullyConvolutionalNetworksforSemanticSegmentation 论文笔记

FCN的意义

  • 端到端的意义,是语义分割端到端模型的开山之作
  • 性能相较之前state-of-the-art的算法在PASCAL VOC test上的mIoU提升11%
  • 虽然本文的意义主要在于开创端到端语义分割,但是文章的主要工作是在如何将卷积得到的特征图恢复至原图大小

与之前做法的对比

RCNN:先用传统方法获得2k个候选框(框有大有小),暴力缩放至同一尺寸后传至CNN网络提取特征,之后将特征传入SVM分类器识别框中是否存在类别C,若存在,则保留此框,否则,该框作废。所以一张图像的判别需要进行2k次CNN和SVM的正向传播
缺点:

  • 对于图像中的某些区域可能被多个框选中,那么这些区域多次传入CNN中,这部分的重复计算导致速度慢
  • 由于SVM/FC对输入规模大小有限制,所以RCNN需要在CNN模块前进行暴力缩放,这很不优雅(虽然可以用ROI pooling等解决)

FCN的解决方式

以VGG为例,VGG同样限制输入图像的大小固定,图像经过一系列卷积之后得到特征图,将特征图逐张逐点线性拉开作为FC的输入。所以考虑如果把FC层换成CONV层,效果是等价的。
在这里插入图片描述
如上图,原来的FC将7x7x512映射至4096。如果换成CONV,使用4096个7x7大小的卷积进行处理可以得到4096张1x1大小的特征图。所以只是将4096变成了1x1x4096。这两种方法的效果,参数个数,反向传播都是等价的。
所以经过卷积之后,我们就不需要限制输入图像的大小了。但是对应的,输入的图像越大,输出的4096张特征图也跟着变大,不再是1x1大小了。

这个更大的特征图对应的意义是什么呢?

如果是1x1大小的特征图,我们是将他看错对应类别的概率,比如第五张1x1大小的特征图像素值为0.8,对应类别为猫,则我们将0.8视为图像中存在猫的概率。然后第49张特征图对应的类别是人,则特征图的值对应图像中有人的概率。但是现在比如是10x10的特征图,那么第五张特征图上像素值更高的区域对应原图中猫存在的位置。同理,第49张10x10特征图上值更高的区域对应原图人在的位置,而值低的区域对应没有人。

为什么卷积得到的特征图会有原图中类别的位置信息呢?

这就是卷积的能力,区域相关性,在进行卷积的时候,输入图像的左上角区域进行卷积的结果会放到输出的特征图的左上角,而输入图像的右下角区域并不对输出的特征图的左上角区域贡献信息。所以很大程度上位置信息被保留。
从这个角度在回过头看分类模型的全连接层:

  1. 用FC层进行特征判别,将卷积的结果线性拉开的操作,破坏了特征图记录的位置信息。
  2. FC的输出可以看成是1x1的特征图,每张特征图只有一个值,信息很不丰富,没有充分发挥卷积的记录位置能力。

FCN的计算流程

所以将VGG的FC层换成CONV层,并最终输出21张特征图。这21张特征图的大小将会是输入图像大小32倍下采样后大小的特征图。之后将特征图的大小使用反卷积上采样32倍,得到原图大小的21张特征图。训练的trick是将反卷积的权值初始化为双线性插值作为初始化。这样得到的结果就称为FCN-32S。但是32倍反卷积的结果仍然非常粗糙,所以本文提出了更进一步的上采样策略。

FCN的上采样策略

回顾特征小的原因,主要在于池化操作。以VGG16为例,经过了5次stride=2的池化下采样,所以最终是 2 5 = 32 2^5=32 25=32下采样。所以自然的想法是使用Shift-and-stitch策略进行池化,这样得到的池化是不降低尺寸的,但是这样会有新的问题:原来经过下采样得到 n 2 \frac{n}{2} 2nx n 2 \frac{n}{2} 2n大小的特征图后在进行下一层的3x3卷积操作,但是现在Shift-and-stitch得到的特征图大小是 n n nx n n n的,所以下一层3x3的卷积核的感受野相对变小了,所捕获的上下文信息变得不足了。解决方法是使用同样3x3大小的空洞卷积以增加感受野。这是一种作者提出的第一种思路,是有效果的,但是还有更棒的实现思路。
纵观FCN网络,在逐层前向传播的过程中,特征图的语义信息逐渐增强,而位置信息逐渐模糊,所以作者考虑结合低层特征图的位置信息和高层特征图的语义信息。所以如图。
在这里插入图片描述
将32倍下采样的特征图通过反卷积2倍上采样(同样使用双线性插值作为初始化),得到了21张原图16倍下采样大小的特征图。之后将前一层的特征图,即图中的pool4,512张(如果是VGG的话)16倍下采样的特征图,通过21个1x1的卷积核进行降维得到21张16倍下采样的特征图。之后将这两个21张16倍下采样的特征图进行对应位置相加,得到一份21张16倍下采样的特征图。之后反卷积上采样回原图大小。这样得到的结果记作FCN-16S。同理,更进一步的,将pool3的特征图经过1x1降维后,与2倍上采样的pool4,4倍上采样的con7进行对应位置相加,在反卷积回原图大小,记为FCN-8S。

PS:
  1. 这里为什么要1x1降维后对应位置相加(类似之后残差的思想)而不直接用concate拼接,我认为concate也可以,但是需要引入了更多的参数。
  2. 作者只做到了FCN-8S,为什么不更进一步使用FCN-4S和FCN-2S呢。论文中指出在使用FCN-4S时发现效果变差了。毕竟从FCN-32S到FCN-16SmIoU提升了3%,但是从FCN-16S到FCN-8S只提升了0.3%。个人认为是pool2的信息太浅层了,使得融合提供了较差的信息,误导了梯度的方向。
    在这里插入图片描述
  3. 融合还有一些小技巧,比如用于1x1降维的卷积核是要先训练的,比如FCN-16S的融合前,先对pool4接1x1卷积的输出进行语义监督学习以获得1x1卷积参数,用于后续的降维合并使用。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值