这篇是 CVPR 2015 年的一篇论文。最近在朋友的影响下,也想了解一下语义分割的相关知识。
Our key insight is to build “fully convolutional” networks that take input of arbitrary(任意,随意的) size and produce correspondingly-sized output with efficient inference and learning.
论文的核心是建立 「全卷积」网络,来接受任意大小的输入,并通过有效的推理和学习产生对应大小的输出。论文中对 AlexNet,VGG net 以及 GoogLeNet 进行一些改造,改造成全卷积网络,并进行迁移学习,应用在语义分割任务上。
全卷积网络
Each layer of data in a convnet is a three-dimensional array of size h×w×d, where h and w are spatial dimensions, and d is the feature or channel dimension. The first layer is the image, with pixel size h×w, and d color channels. Locations in higher layers correspond to the locations in the image they are path-connected to, which are called their receptive fields.
在一个卷积层中,数据都是一个三维的结构 - h x w x d,其中 h,w 都是空间维度,d 是特征维度或者说通道(channel)维度。比如,第一层是输入的图片,像素的大小是 h x w,d 表示颜色通道。较高的网络层的位置对应于其路径连接的图像的位置,这些位置被称为 _receptive field_,即感受野。
那么全卷积网络的定义是什么?顾名思义,当整个网络都是由这些非线性的卷积层组成的时候,就是全卷积网络,简称 FCN。一个 FCN 对任何大小的输入进行操作,并产生相应(可能重新采样的)空间维度的输出。
如何构建全卷积网络
经典的识别网络,包括 LeNet,AlexNet,以及它们的继承者,都是采用固定大小的输入并产生非空间输出。这些网络的全连接层具有固定的尺寸并且丢弃了空间坐标。但是这些全连接层可以用卷积层来替代,这样就可以转换成全卷积网络,然后可以输入任何大小的图片和输出对应的分类图。 这种转变如下所示:
网络被改成全卷积网络后,输入的大小可以是任意的,输出是通常通过下采样(subsampling)来减少维度的。分类网络下采样可以保持过滤器的小型化和计算要求的合理性。但是,这使得这些网络的全卷积版本的输出变得粗糙,如上图所示,最后卷积之后得到的一个粗糙的结果,也就是一个很高维的特征图,称为 heatmap,热力图(感兴趣的,具体可以查看这个练习:链接)
还原像素操作 - shift-and-stitch
构建全卷积网络会使得输出变得粗糙。但是,为了像素分类,需要将这些粗糙的输出连接回像素级别。第一种方法是 _shift-and-stitch_,即移动和缝合,通过对输入的移位并将其对应的输出缝合在一起,可以从粗糙的输出中获得密集预测(Dense prediction)。具体操作是:假设一个输出是通过一个因子 f 进行下采样的,移动输入的 x 轴的像素向右以及 y 轴的像素向下,那么对于每个 (x,y),都有 0<= x, y < f ,处理每一个 f 输入,并交错输出,使预测对应于其感受野中心的像素。但是这种方法会因为因子 f 而计算消耗特别大。
但是还有一种特别有名的技巧,是来自 wavelet 社区的一种算法。现在思考一个带有输入步幅 s 的层(卷积或池化),以及一个带有滤波器权重 fij 的后续卷积层(省略无关的特征维数)。将下层的输入步幅设置为 1,将其输出的上采样数增加到 s。然而,将原始滤波器与上采样输出进行卷积并不会产生与 shift-and-stitch 相同的结果,因为原始滤波器只会看到它的(目前是上采样的)输入减少了一部分。要复现这个技巧,通过放大滤波器,使其变得稀疏,如下所示:
要复现上面的技巧,即需要一层一层地重复这个过滤器放大的过程,直到所有的子采样都被删除。(实际上,这可以通过处理上采样输入的次采样版本来有效地完成。)
减少网络中的下采样是一种权衡:过滤器可以看到更精细的信息,但感受野更小,计算时间更长。 shift-and-stitch 技巧是另一种折衷:在不减少过滤器感受野大小的情况下,输出密度更大,但过滤器被禁止在比原始设计更细的范围内存取信息。
虽然论文作者已经用这个技巧做了初步的实验,但是没有在实验的模型中使用它。他们发现通过上采样学习,正如下一节所描述的那样,会更有效,效率更高,尤其是与后面所描述的 _skip _结构相结合时。
还原像素操作 - Upsampling
还有一种将粗糙输出还原成像素的方法是 _interpolation_,插值法。例如,简单的双线性插值法,通过一个只依赖于输入和输出单元相对位置的线性映射,来计算最近的 4 个输入所对应的每个输出 *yij*。
在某种意义上,使用因子 f 的上采样(upsampling)也是卷积操作,但是其输入步幅(stride)为分数 - 1/f。 只要 1/f 是积分,因此上采样的自然方式是向后卷积(有时称为反卷积),其输出步幅为 f。这样的操作实现起来很简单,因为它只是对卷积的前向和后向传递进行了反转。因此,通过来自逐像素损失(pixelwise loss)的反向传播,在网络中执行上采样来进行端到端学习。
需要注意,这种层中的反卷积滤波器不需要固定(如双线性上采样),而是可以学习的。一堆反卷积层和激活函数扫描甚至可以学习非线性上采样。
在实验中,发现对于密集学习,在网络中进行上采样是快而高效的。下面的分割结构就是使用这些层来学习上采样,进行精准预测的。
整个语义分割的流程就是:先是用全卷积层得到粗糙的高纬度信息,然后对最后一个卷积层的 feature map 应用反卷积层进行上采样,最后得到和输入图像一样的尺寸,从而对每个像素都产生了一个预测, 同时又保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。
Segmentation Architecture - “skip”
将一些 AlexNet,VGG 等网络的全连接成改为卷积层,再进行微调及上采样的操作,应用于图像分割任务。在标准的评估下,可以得到当时比较好的结果。但是,它们的输出仍旧不尽人意,如下 FCN-32S 所示,分割的结果还是不够精确。这是因为,当深入时可以获得深度特征,当深入时也会丢失空间位置信息。这意味着较浅层的输出具有更多位置信息。如果我们将两者结合起来,我们就可以提高结果。
后面作者通过添加链接来解决这个问题,这些链接将最终预测层与较低层组合在一起。这会将线性拓扑结构变为DAG,其边缘从较低层跳到较高层,如下图所示。
Figure 4 的图像中就显示了,FCN-16s 比 FCN-32s 要精确,FCN-8s 比 FCN-16s 要精确。作者做到 FCN-8s 就没有继续了。