语义分割网络文献综述——深度学习篇(一)

20200202 suyako semantic segmentation

背景

图像分割任务一般可再细化为语义分割任务及实例分割任务,其中语义分割仅从语义上理解图像,实例分割则还兼顾目标检测的内容。举例来说,对一张常见的行人图片,语义分割会将图上的所有行人归为一类,实例分割则需要将所有行人分开。语义分割最知名的使用场景应该还是在自动驾驶中对路况的判断。传统方法一般为树方法,深度学习模型的出现则推动应用场景逼近落地级别。语义分割的深度模型不少,本文主要还是介绍常见的几种,后续随着论文阅读量的增加会不断更新。

FCN

paper: Fully Convolutional Networks for Semantic Segmentation

repo:

主要思想

Fully convolutional networks are a rich class of models, of which modern classification convnets are a specific case. Recognizing this, extending these classification nets to segmentation, and improving the architecture with multi-resolution layer combinations dramatically improves the state-of-the-art, while simultaneously simplifying and speeding up learning and inference.

FCN是一种统称,只要网络全由卷积层构成即可认为是FCN,其中分类网络的全连接层在概念上稍作修改即可认为是以与输入图片尺寸相当的kernel作的卷积层,因此分类网络是FCN的特例。当意识到这一点后,即可将分类网络延伸扩展到分割网络,此时的网络输出为每个类别在输入图像上的热度分布。由于种种原因,输出图像尺寸往往较输入图像小,因此需要对输出图像作尺寸恢复,传统的resize方法必然造成位置偏差/精度损失,此时对不同分辨率的feature-map作合并则可有效提高SOTA。总结而言,全卷积网络简化了分割任务,同时显著提高了训练与推理速度。

这篇论文所指的FCN均为针对语义分割任务对分类网络进行改进之后的网络。

网络结构

网络分为两部分,第一部分作卷积得到不同分辨率的feature-map,第二部分作上采样恢复到输入图像尺寸,某种意义上来说这是一种初见雏形的encoder-decoder结构。第一部分很简单,之前分类网络的全连接层替换成卷积层即可,详细结构论文未给出(如替换后的卷积核尺寸),只是说明最后的输出尺寸为原图像的1/32,需要结合代码来看。第二部分在文章中给出了几种实现形式并作了讨论,以下做一次详述。

shift-and-stitch

思路很朴素,既然卷积过程会缩减图片尺寸,那就多做几次卷积,最后对所有输出结果做一次整合恢复到原尺寸。具体做法如下:

  1. 假设最终stride为,shift负责对输入图像向右及向下分别平移(x,y)个像素,其中,得到个输出结果;

  2. stitch负责对这些输出结果作整合,这里先贴一段论文原文:

Process each of these inputs, and interlace the outputs so that the predictions correspond to the pixels at the centers of their receptive fields.

意思是比较清楚的,就是每个receptive field会对应一个像素输出,最后所有像素输出按照其对应的receptive field排列即可。但是实际代码写起来可能不是太好操作,我个人的思路是按照输入图像的平移情况进行反平移。

atrous convolution

shift-and-stitch简单粗暴地将计算资源扩大了​倍,可以采用atrous convolution(以下统称空洞卷积)作为其等价实现。这中间的思路过程我没有查阅相关文献,个人猜想是就shift-and-stitch来说,是可以递归地实现来减少计算资源的,可能是在递归过程的梳理中推导得出了等效的空洞卷积。举例来讲,以原始的resnet为例,每一个block(除最后一个外)的最后一层都会做一次stride为2的卷积,假设当前block较输入图像的stride为,那么原始网络的结构应该是,其中括号里的数字代表stride。若换成空洞卷积则其结构应为,其中aconv后面括号里的数字分别代表空洞率及stride,的定义如下:

空洞卷积是现阶段很多语义分割网络所采用的基本结构,原因不外乎实现方便,而且空洞率的存在并不影响对分类网络训练得到参数的迁移使用(考虑shift-and-stitch的思想,这不难理解)。但是抛开语义分割网络,似乎就很难再见到空洞卷积的使用,原因可能在于相较encoder-decoder结构,空洞卷积没有显著的提升,计算量却大了很多(需要更多论文考证)。

backwards convolution/deconvolution/transpose convolution

一般都推荐翻译为转置卷积,可能是现阶段除了线性resize以外最常用的上采样方式,也是FCN这篇论文所采用的方法。转置卷积相较于卷积在传播方向上呈对称关系,其它无本质区别,相关介绍很多,这里不赘述。

benchmark

数据集为PASCAL VOC2011,采取fine-tuning的方法。论文首先比较了naive的方式(输出结果stride为32,之后做线性resize恢复到原尺寸),之后对比加了skip connection(论文里称为deep jet)的效果,同时根据skip connection次数的不同将输出结果分别命名为FCN-32s/FCN-16s/FCN-8s,分别对应0/1/2次skip connection,验证集上mean IU指标分别为59.4/62.4/62.7(这里用了额外的训练数据)。指标可能体现不出来,就肉眼效果来说加入skip connection的效果远好于naive。另外论文尝试了减小stride及shift-and-stitch的方法(这里不知道为什么不采用空洞卷积),限于VGG自身限制及计算资源等原因未能成功训练。

一些训练细节

主要是论文提到的patch sampling,这里论文考虑训练速度采用的是对最后输出结果进行概率采样的做法(相当于mask),同时根据采样概率扩大了一个batch当中的图片数量,结果表明采样对训练结果无影响,但严重影响训练效率,因此论文是直接将整张图作为一个样本的(这里有个疑问是网络推理时对图片尺寸没要求,但训练应该是对batch中的图片有尺寸对齐要求的,不知道PASCAL VOC2011的数据是否本身就是对齐的)。

U-Net

paper: U-Net: Convolutional Networks for Biomedical Image Segmentation

repo:

主要思想

One important modification in our architecture is that in the upsampling part we have also a large number of feature channels, which allow the network to propagate context information to higher resolution layers. As a consequence, the expansive path is more or less symmetric to the contracting path, and yields a u-shaped architecture.

U-Net在FCN上作了一些修改,其中最重要的一点是在skip connection的时候U-Net并不像FCN每个分辨率输出一个结果然后跟下游upsample以后的结果做整合,更准确地说U-Net的上采样路径其实也属于encode的部分,只是整合了下采样路径的一些信息。

网络结构

重点讲下奇怪的no padding convolution,这个涉及到论文提到的另一个概念overlap-tile。由于算力及图片尺寸偏大等原因(实际上512*512的图片尺寸在现在算力看来并不大),论文在网络推理时的做法似乎是把图像分成一个个不重叠的patch,送入网络后再对结果做合并,这种做法会导致边界处像素类别预测不准。论文给的解决办法就是no padding convolution,此时输入图片的尺寸大于输出图片的尺寸,这些多余的输入像素构成了目标区域的context,有助于边界像素类别的识别。对于原始图片的边界,则在算好padding尺寸后对原图就边界做一次镜像。所以如果算力足够支撑一张完整图片的输入,完全可以采取same padding的方式。

benchmark

数据集为EM和ISBI-PHC,ISBI-DIC,均为医学影像数据集。EM数据集的指标是warping error,不熟不作评价。另外两个数据集分别较之前的最好成绩分别提高了9/31个点,完全是碾压级别了。

一些训练细节

数据增广方面应该是有一些领域知识,不具备太多参考价值:

Especially random elastic deformations of the training samples seem to be the key concept to traina segmentation network with very few annotated images.

损失函数方面,一个是对foreground/background给了不同的权重,另一个是对边界赋予了更大的权重,具体可参考原论文。

DeepLabv3

paper: Rethinking Atrous Convolution for Semantic Image Segmentation

repo:

主要思想

Our proposed model “DeepLabv3” employs atrous convolution with upsampled filters to extract dense feature maps and to capture long range context. Specifically, to encode multi-scale information, our proposed cascaded module gradually doubles the atrous rates while our proposed atrous spatial pyramid pooling module augmented with image-level features probes the features with filters at multiple sampling rates and effective field-of-views.

论文在开头指出语义分割面临的两个主要问题:更深层的网络与更精确的位置信息之间的tradeoff/对不同尺寸物体检测能力的鲁棒性。deeplabv3对第一个问题采用了空洞卷积,对第二个问题则试图给出两种结构,这两种结构均以resnet作为backbone,第一种结构在resnet最后一层block得到的image feature基础上增加空洞卷积层,空洞率随层数增加而增加,相当于增加resnet层数获得更大的感受野但不减少分辨率,论文中将该类型归为context module;第二种结构则是在上述image feature上并行地增加空洞卷积层,每一个并行分支都有一个不同的空洞率代表对不同尺寸的feature进行重采样(除空洞卷积分支外实际上还有一个image pooling,见下文详述),最后对所有分支进行合并得到最终结果,论文将该类型归为spatial pyramid pooling。

值得注意的是,deeplabv3针对第二个问题提出的两种结构都更倾向于捕捉长程信息(可能与语义分割任务本身特性有关,即同类物体总是相互接近的,而且按照一般的评估标准小尺寸物体影响不大),直观来看应该对解决小尺寸物体没有帮助。

网络结构

Going deeper

保持最终的输出图片尺寸stride为1/16,以此为依据,在对原始resnet结构新增block时令stride为1,rate则在之前的基础上扩大2倍。这里唯一让我困惑的地方在于multi-grid方法的使用,一个是对其起源HDC本身的质疑,因为在block内改变rate虽然扩大了实际视野感知范围,但是空洞卷积版的resnet能直接套用imagNet预训练得到的网络参数的理论基础来源于其为shift-and-stitch的等效实现,如果在block内改变rate这个理论基础就不再成立;另一个是按照HDC的意思,调整block内的rate时应当保持原视野域尺寸大小不变,multi-grid直接粗暴地放大了block内卷积的视野尺寸大小,相当于把后几层block应当做的事提前了,这也是为什么只有block4的效果提升如此明显的原因。

ASPP

going deeper为串行结构,ASPP则为并行结构,每个并行分支对应不同的空洞率以对不同尺寸的feature重采样,除此之外还有一个image pooling分支,该分支首先作一次global pooling,再作一次1x1卷积扩充到预定的维度,然后再双线性采样到对应的feature尺寸。对所有分支进行一次concat与1x1卷积,即得到最终的feature map。

benchmark

数据集为PASCAL VOC2012,其实相对于当时的leaderboard来说提升不大,在有COCO数据集的加成下最终的mIOU为85.7,比PSPNET好一些,离当时的榜首DIS尚有一个点的差距。

一些训练细节

deeplabv3在训练的时候采用了PASCAL VOC2012之外的数据集,它首先在额外数据集中以0.007的初始学习率及1/16的输出尺寸训练30000轮并更新BN参数,然后在官方数据集中锁定BN参数以0.001的初始学习率及1/8的输出尺寸继续训练30000轮,目的就是保持accuracy和训练速度的tradeoff。另外一个值得注意的地方是计算最终损失时实际上是对groundtruth线性采样到输出尺寸后再作的。

除此之外还有一些验证时的细节,对验证集作flip以及random scale,再对最终结果取平均均有助于结果的提升。