文:Jonathan Long,Evan Shelhamer,Trevor Darrell.Fully Convolutional Networks for Semantic Segmentation.CVPR 2015
素质三连
1.论文贡献
提出了基于VGG16的FCN语义分割模型,将浅层的表征信息和深层的语义信息结合起来,产生准确、精细的语义分割。
关键点 :
1) 卷积化(Convolutional)
2)上采样(Upsample)
3)跳跃结构(Skip)
2.实验结果
达到语义分割的SOTA,在VOC 2012上达到62.2的mean IU,每张图片分割时间少于0.2s。
3.待解决的问题
分割结果不够精细。
语义分割
学习图像处理时就知道了图像语义分割的概念,即把一张图片分割为若干个特定的、具有独特性质的区域。在2000年之前,主要通过阈值分割、区域分割、边缘分割、纹理特征、聚类等方法,2000年到2010年有基于图论、聚类、分类以及聚类和分类结合的方法,2010年以后主要通过神经网络进行分割,而本文提出的FCN则是深度学习语义分割的开山之作。从输入输出的角度看,语义分割就是将输入图片的每一个像素进行分类,因此语义分割也被视为一种dense prediction。语义分割的实例如下:
语义分割和实例分割的不同之处在于它不区分同一类别的实体。语义分割模型接收RGB/灰度图片作为输入,输出同样分辨率的分割图,分割图的每个像素是对应输入图片像素的预测标签,如下:
分割图的每个像素都是一个One-hot向量,即分割图的不同通道对应不同的类别:
应用场景:
A.自动驾驶
B.医学图像诊断
FCN语义分割模型
1.模型提出
Fully Convolutional Network(FCN,全卷积网络)是一个端到端的、像素到像素的语义分割模型。端对端(end to end)的意思就是输入到输出由一个模型搞定,优点是减少了人工操作,模型整体契合度增加,缺点是增加了模型的复杂度,降低了模型的可解释性。全卷积的意思是整个网络所有的层都是卷积层。本文提到的FCN指论文提出的用于语义分割的模型。
全卷积最早出现于拓展LeNet用于识别手写数字,后来在OverFeat中,使用全卷积网络用于定位和检测。有很多工作是使用CNNs进行密集预测(dense prediction),常用以下机制 1.小模型,限制了容量和感受野,2.使用patchwise training 3.使用superpixel projection,random field regularization,filtering,local classification进行后处理。4.输入移位和输出交错,比如OverFeat里面的offset pooling。5.多尺度金字塔处理。6.饱和tanh非线性。7.使用集成模型。但是FCN并不使用以上机制,而是先在ImageNet上预训练大型CNNs(比如VGG16),然后将其转换为FCN,添加新的层,最后进行微调。
在这篇论文之前,有人用CNNs进行语义分割,他们用周围的像素预测某个像素的类别,即patchwise,需要预处理或后处理,使用小型CNNs。相比之下,FCN是像素到像素,即pixelwise,更高效、直接,不需要预处理和后处理,使用预训练的大型CNNs进行fine-tuning:
语义分割要解决语义和位置之间的内在冲突:全局信息解决what(是什么),局部信息解决where(在哪里)。FCN使用深层特征层级( Deep feature hierarchies)在局部到全局金字塔(local-to- global pyramid)中共同编码位置和语义,这里作者提出一个叫”skip”新架构,将深层的、粗糙的语义信息和浅层的、精细的表征信息结合起来。
2.FCN原理和架构
像LeNet AlexNet这样的分类模型,由于FC层的存在,只能接收固定分辨率的图片。因此可以像OverFeat一样,将FC层转换为1x1卷积层,就可以接收不同的分辨率的输入。
语义分割需要输出与原图相同分辨率的分割图,而1x1卷积后得到的是粗糙的、抽象的、低分辨率的特征图。从粗糙的特征图中得到密集预测(也就是分割图)的方法,OverFeat使用的是shift-and-stitch(或称为offset pooling)方法,而FCN使用的是插值的方法。学过图像处理的都知道,图像放大采用插值方法,比如最近邻插值,双线性插值等。这里采用插值的方法将低分辨率特征图映射到高分辨率的分割图,采用的是backwards convolution(反卷积、转置卷积)。转置卷积在DCGAN里面也有使用,它的优点是可以端对端训练和使用,更加高效快速。
将分类模型转换为分割模型的示意图:
CNNs选择
本论文发表时,可选的预训练CNNs有AlexNet、VGG net、GoogLeNet等,这里对这几个模型迁移到语义分割的性能做了比较。对于三个分类模型,将FC层转换为1x1卷积层,再增加一个有21个通道的1x1卷积层,对应到PASCAL中的分类,最后再后接上采样层得到语义分割模型。特别的,对于GoogLeNet,仅用最后的输出层,去掉GAP层。各模型在PASCAL VOC上的对比结果如下:
可以看到,尽管GoogLeNet和VGG16的分类精度差不多,但是很明显VGG16迁移到FCN的性能要好的多。
将what和where联合起来
作者提出一种新的架构将粗糙的/高级和精细的/低级的特征结合起来,名为跳跃结构(ski),如下图所示:
其中FCN-32s表示不使用跳跃连接,32表示上采样的stride=32; FCN-16s表示先上采样2x,与pooling4层的输出经过1x1卷积得到的特征图相加,再进行16x的上采样;而FCN-8s则是先上采样2x,与pooling4层的输出经过1x1卷积得到的特征图相加,再上采样2x,与pooling3层的输出经过1x1卷积得到的特征图相加,再上采样8x。下面是定性对比:
可以看到,不使用ski架构的情况下(FCN-32s),分割结果十分粗糙,而使用多层语义信息的FCN-8s,分割结果精细得多。这是因为底层的特征图中保留了大量的精细的表征信息,越往后面,网络学到的特征越抽象,因此这种精细层和粗糙层的结合能产生很好的结果。作者称这种非线性局部特征层级为deep jet。下图为定量对比:
从上图还可以知道,对整个模型fine-tuning的效果要远好于只fine-tuning新加入的层。除了通过跳跃结构得到精细结果之外,其它的方法包括减小池化层的stride、使用shift-and-stitch等。
3.训练
Fine-tuning参数
优化器是动量为0.9的SGD。权重衰减系数为5^-4或2^-4。batch size为20。FCN-ALexNet、FCN-VGG16、FCN-GoogLeNet的学习率分别为10^-3、10^-4、10^-5。偏置参数的学习率是权重参数的两倍。对class scoring 卷积层使用零初始化。Dropout和预训练模型里的一样。
这里使用整张图片进行训练,而不是像以前的论文那样使用patch training。下面是使用两者效果的对比,可以看到两者都能收敛到差不多的精度,但是FCN花的时间更少。
Class Balancing
在神经网络中,一个重要的问题是需要平衡各类别的训练样本数。而FCN可以自己平衡类别,即使输入的样本类别不是很平衡,即平均每张图片中有3/4的像素是背景,但这对模型没有影响。
数据增强
作者尝试对训练数据使用镜像或随机平移32像素,但是发现没有明显提升。
训练数据
使用PASCAL VOC 2011语义分割训练集的1112张+Hariharan收集的8498张。
实现
基于Caffe,在单NVIDIA Tesla K40s上训练。
4.实验结果
指标(Metrics)
nij是类别i被预测为类别j的像素数量,有ncl个不同的类别。令ti=Σjnij是类别i的总像素数。计算:
我给翻译翻译:
像素精度:预测正确的像素数/像素总数
平均精度:各个类别的平均像素精度
mIU(Mean Intersection over Union,均交并比):IoU=(A交B)/(A并B ) = Sab / (Sa + Sb - Sab),则mIU是每个类像素总数ti与预测为该类的像素总数Σjnji的IoU的均值。
频率加权IU:各类加权的IoU。
下面是FCN在各个数据集上的测试结果:
PACAL VOC实验结果
FCN-8s与RCNN、SDS的对比:
可以看到FCN不仅性能大幅超过其它模型,达到了SOTA,而且推断时间大大减小。下面是语义分割实例:
NYUDv2实验结果
SIFT Flow实验结果