Fully Convolutional Networks for Semantic Segmentation,2015 年
文章目录
这篇文章相对比较早了,所以其中的某些探讨现在会觉得“那肯定”,比如卷积可以应用在全图,而不需要提前划分出来小块再分块进行运算,那样会有很多重复的计算,相对较慢。我自己总结比较有价值的有下面几点,记录中也主要围绕这些来写:
- 修改分类网络为全卷积网络并应用在 dense prediction 如语义分割任务上。
- 探讨 upsampling,本文用的是 deconv (Transpose Conv)并将不同尺度的特征结合在一起 做 dense prediction。
Abstract
- 卷积网络天然地能够获取到层级特征,很适合用来处理语义分割任务;
- 本文接收任意大小的图像,并且输出对应尺寸的语义分割结果;
- 本文并不从头开始工作,而是在经典的卷积网络如 AlexNet、VGG、GoogLeNet等基础上做一些微调和改进,来处理语义分割任务;
- 本文还通过 skip connections 将深但粗糙的特征与浅但细致的特征结合在一起,来生成精确且细致的语义分割。
Introduction
卷积网络在分类和检测任务上有很多有价值的研究工作,在像素级别的相关任务上还比较少。本文使用 FCN 来实现有监督的 + 像素级别的语义分割。FCN 能够对任意尺寸的图片给出稠密预测。In-network upsampling layers (上采样出现了)能够保证像素级别的预测。
在语义分割方向,已有分块处理的方法。但是 FCN 并不采用任何分块的处理,比如超像素、proposal 等各种前后处理。我们把用在分类任务上的经典网络重新定义为 FCN 使其能够输出稠密的预测,同时也会在经典网络上做微调,而不是完全重新训练模型。
语义分割任务需要两部分信息,一部分是全局的来告诉网络这是啥(也就是更高级的信息、更接近语义层面),另一部分是局部的来告诉网络细节边界在哪儿(也就是更低级的信息,更接近像素层面)。所以层级特征就很重要,像个特征金字塔一样,既有高级特征也有低级特征。而且这些层级特征得联合起来一起用,文中就采用了 skip connections 来结合深但粗糙和浅但细致的特征信息。
Related Work
本文工作的两大基石就是用在分类任务上的神经网络以及迁移学习。
全卷积网络非常适合提取不同尺度的特征,已有前人使用,它可以不限定输入图像的尺寸。不过前面的工作和研究,多数是在全卷积网络后面再加其他操作,然后输出比较“稀疏”,比如仅仅是一个类别,或者再加上 BoundingBox 信息等终究不是像素级别的,而语义分割任务或者实例分割任务需要像素级别的输出。
那么关于全卷积网络输出 dense prediction 也已有很多工作,但是这些工作中会使用较小的模型来限制模型表达力和感受野、分块处理、后处理、多尺度金字塔处理等等,或者需要多个 pipeline 。本文的工作中不使用刚刚提到的 trick 和方法,而是调整分类任务的神经网络的神经架构,再进行 finetuning,输出符合语义分割任务的 dense prediction。
Fully convolutional networks
用在分类或者检测任务上的网络多数后面会跟全连接层,将前面的特征“拉平”并且给了一次“线性组合”的机会。这一步就会限定网络的初始输入尺寸,如果能去掉这部分,变成全卷积网络,就可以接收任意尺寸的输入。
除了要接收任意尺寸的输入以外,还要输出像素级别的 dense prediction。那么又遇到一个问题,就是靠前面的特征 dense 但是也低级,靠后面的特征 coarse 但是也高级。你单独取哪边都不好,最好能结合在一起。这就又涉及到一个问题就是 dense 和 coarse 的特征怎么结合在一起,来完成语义分割任务,也就是“这是啥”和“这在哪儿”的双重任务。本文会把 coarse 的高级特征 upsampling 然后和 dense 的特征连在一起使用。
Adapting classifiers for dense prediction
首先介绍怎么修改分类网络。
可以看到下图中分类网络会映射到 1000 类,然后在 1000 类中响应最大的就会对应到这个小猫猫类别。这就是分类任务中全连接层的作用,此时猫猫到底在哪儿边界如何变得不再重要,全连接直接“拉平”卷积的特征结果。
而换个角度来看,也可以理解为全连接层在深度上把 256 个通道的输入映射到 1000 个通道对应 1000 个类别,在图像面上把 h × w 的大小压到了 1 个 pixel。如果这么理解的话,全连接层也可以理解为是某种卷积,应用在整个 h × w 面上。那么如果把全连接的“卷积”作用修改一下,在 h × w 面上不再直接压到 1 pixel,同时继续维护最后的 1000 通道,就可以在 1000 个通道对应类别的通道上得到热图,最为目标类别的响应,作为像素级输出,自然训练时 gt 也是像素级标注。
Shift-and-stitch is filter rarefaction
略。
Upsampling is backwards strided convolution
本文工作中使用的上采样方法是逆卷积 deconv,但是关于这个名字有争议,按照更加严谨的说法,这里应该是叫 Transposed Convolution 也就是仅仅实现上采样(deconv 应该是更接近信号复原),tensorflow 中也是用 transpose 来命名。在训练过程中,中间层的 Transpose Convolution 初始为双线性插值,然后跟着一起训练。最后一层一直 fix 为双线性插值。
Patchwise training is loss sampling
略。
Segmentation Architecture
这里任务的 loss 使用的类别间不互相独立的,也就是每次输出 N + 1 个 channel 全都参与 loss 计算。之所以特意提这一点是因为后面 Mask R-CNN 的工作中特意提起这里,说单独指定目标类别参与计算 loss 更好,其他 channel 的路过不参与就可以(也是因为 Faster R-CNN 本来就有类别的 branch)。
skip connections 将多层级的特征结合在一起。
使用不同层级的特征做 dense prediction 的对比结果如下。