本文记录了博主阅读论文《SegNet: A Deep Convolutoal Encoder-Decoder Architecture for Image Segmentation》的笔记,代码,教程,官网(含Caffe实现代码和demo)。更新于2019.04.09。
本文提出了一种用于像素级语义分割的深度全卷积神经网络结构SegNet。该网络核心可训练分割部分包括一个编码网络(encoder network),一个对应的解码网络,和一个像素及分类层。其中,编码网络在拓扑结构上与VGG16网络中的13层卷积层相同。解码器的作用是将低分辨率的编码特征图还原到完整的输入分辨率上,从而用于像素级分类任务。
SegNet的创新点在于译码器对输入的低分辨率特征图的上采样处理方式。具体来讲,解码器利用在max-pooling过程中计算的池化indices,计算对应的编码器的非线性上采样。这个操作就省去了上采样过程的学习。上采样后的map是稀疏的,再用可学习的filter通过卷积计算稠密的特征图。
作者比较了本文中的结构与FCN、DeepLab-LargeFOV和DeconvNet结构。由于SegNet的设计初衷来源于场景理解(scene understanding),因此在内存和计算时间上效率很高,可学习参数量也比其他结构小,可以用SGD端到端训练。在道路场景和SUN RGB-D室内场景下进行了排名。
下图是SegNet网络结构:
其中,编码器含有13个卷积层,分别对应了VGG16(用于目标分类)的前13个卷积层,因此就可以用在大数据库下训练得到的权重初始化网络(ImageNet large scale visual recognition challenge)。此外,作者丢弃了全连接层,从而保留在最深编码输出处的高分辨率特征图,同时与其他网络结构相比(如FCN和DeconvNet,具体见下表),大幅减少了SegNet编码部分的参数量(从134到14.7M)。
编码器中的每一层都对应了解码器中的一层,因此解码器也有13层。解码器的输出随后传递给一个多类别soft-max分类器,从而生成每个像素点在个类别下的独立概率。
编码器网络中的每一个encoder都用一组filter进行卷积计算,随后batch normalized,再应用逐像素的ReLU m a x ( 0 , x ) max(0,x) max(0,x)。之后,应用窗口尺寸2x2、步长2(无重叠)的max-pooling,得到一个下采样(factor of 2)的结果。应用Max pooling的原因是实现输入图像上小空间位移的平移不变性(translation invariance over small spatial shifts)。下采样使得特征图中的每个像素点都对应了大输入图像内容(large input image context, spatial window)。
尽管下采样和max-pooling能够实现分类任务下更多的平移不变性,但这些操作也降低了特征图的空间分辨率。而这些逐渐损失的图像描述(比如边界)对于分割任务是非常重要的。因此,需要在下采样进行之前记录和保存这些边界信息。在不考虑内存的情况下,编码器中的每一层特征层都应该记录下来。但是这种方式在实际应用中是不太现实的,因此本文提出了另一种存储方式。这种方式只保存max-pooling indices,也就是每个窗口内的最大特征值的位置。在实际应用中,这个信息可以用一个2bit来记录一个2x2的pooling window,因此相比较记录整张特征图而言也就更实用。后面会证明,这种方式损失了一定的精度,但是对于实际应用还是够用了。
解码器用之前记录的max-pooling indices上采样输入的特征图。这个过程生成的特征图是稀疏的。解码技巧如下图所示。
卷积后面也跟了batch normalization。与编码器第一层(最靠近input image的层)对应的解码器层有多通道(而非完全对应的三通道),除此以外的其它层都与编码器具有相同的尺寸和通道数。解码器的输出送给一个可学习的soft-max classifier,该分类器对每一个像素都单独分类。分类器的输出有K个通道,每个通道上存储的都是该类别下的概率。最终的分割结果对应的是概率最大的类别。
DeconvNet和U-Net与SegNet结构相似,但是也有不同。主要用于使用了全连接层(尽管是以卷积的形式使用),DeconvNet参数量非常大而且很难端到端训练(如前面Table6显示的)。而U-Net(为医学场景提出的)以消耗内存的方式,直接将整个特征图级联在后面,而没有使用pooling indices。而且U-Net没有conv5和max-pool five block,而SegNet用了完整的VGG结构和预训练的参数。
许多分类结构的编码器都是相同的,不同之处在于用了不同的解码器。为了与FCN比较(译码器部分),这里用了一个编解码器各只有4层的SegNet。解码器中在卷积后没有bias,也没有应用ReLU。整个编解码过程用固定的7x7窗口to provide a wide context for smooth labelling(也就是第4层特征图中一个像素对应输入图像的106x106个像素)。
前文Fig.3中左侧是SegNet中使用的技巧,不需要学习,但是得到稀疏特征图后需要卷积变成稠密特征图。不同的是,这个卷积过程只针对一个通道,也就是说每个卷积只处理自己对应的那层特征。这种方式极大地减小了计算时间与参数个数。Fig.3右侧是FCN解码技巧。FCN将整个特征图记录下来,这样是很消耗内存的。比如存储第一层的64个特征图,图像分辨率为180x240,以32bit浮点精度存储,需要11MB。
除了上面的几种变体,作者还研究了用固定的双线性插值权重做上采样,这样就没有权重学习的过程了。在另一个极端下,可以把64层特征层都加到解码器上。内存消耗再大一些,可以没有尺度减小,也就是说解码器的最后一层也是跟第一层一样的通道数(比如64),而不是类别个数 K K K。
作者也尝试了其他变体,比如用replication上采样,或用固定的(稀疏的)indices array上采样。但是这些方法的表现相比较前面几种都不太好。没有max-pooling和sub-sampling的变体消耗的内存更大、收敛所需时间更长,且表现不好。
这里博主总结一下所有的变体:
名称 | 结构 | max-pooling | sub-sampling | 上采样 | bias | ReLU | batch normalization | 核函数 | 备注 |
---|---|---|---|---|---|---|---|---|---|
SegNet-Basic | 结构与SegNet相同,但是编解码器各只有4层 | 编码器 | 编码器 | 解码器用max-pooling indices上采样,无学习,采样后卷积 | NO | 编码器 | BOTH | 7x7 | 感受野106x106 |
FCN-Basic | 编码器与SegNet-Basic相同,解码器用FCN解码方式(见Fig.3) | 解码器8x8 | 先缩小至K再上采样(compress),上采样用双线性插值权重初始化 | ||||||
SegNet-Basic-SingleChannelDecoder | 与SegNet-Basic相同,但卷积每次只处理一个特征图 | 训练参数和训练时间大幅减小 | |||||||
FCN-Basic-NoAddition | 与FCN-Basic相同 | 没有编码器求和过程,只学习上采样kernels | |||||||
SegNet-Basic-EncoderAddition | 结构与SegNet-Basic相同,但是将所有64个特征图都加到对应解码器上 | ||||||||
FCN-Basic-NoDimReduction | 与FCN-Basic相同,但不用Compress |
数据库: CamVid 道路场景数据库。包含367张训练图片和233张测试图片,RGB(包括白天和黑暗场景),分辨率360x480。分割11个类别,比如道路、建筑、车、行人、路牌、杆、人行道等。对数据库进行了local contrast normalization。
编解码器的权重都按照He等人文章中描述的技巧初始化。
用SGD优化算法,固定学习率0.1,动量0.9。用Caffe框架。训练直到损失收敛。为了保证在每个epoch中,每张图片仅迭代了一次,按照顺序取mini-batch 12(训练集已打乱顺序)。
选择的模型是在验证集上表现最好的模型。
损失: 交叉熵损失。损失在所有mini-batch中的所有像素点之间求和。当类别间的像素点个数变化很大的时候(比如天空、道路、建筑类别的像素点主导了整个CamVid数据库),对于不同类别的损失就需要增加权重了。这个操作称作class balancing。文中使用的是median frequency balancing,即分配给每个类别的权重的计算方式是,所有类别出现频率的中值除以类别频率。也就是说,出现频率大于中值的类别的权重小于1,而出现频率最小的类别的权重最大。论文作者也尝试了不使用class balancing或使用natural frequency balancing的方式训练不同的变体。
用以下三个度量定量衡量表现(Pascal VOC2012挑战赛使用的):
其中,mIoU比C要更严格,因为其惩罚了false positive predictions。但是,mIoU度量没有直接用于class balanced cross-entropy loss的优化。尽管mIoU(也叫Jacard Index)很常用,但是Csurka等人指出,这个度量并不总是符合人类对于分割质量的直观评判(ranks)。他们给出了mIoU很高但是没有边界精度的示例,而这个也被FCN的作者暗指了。因此,他们基于常用在无监督图像分割质量评估中的Berkeley contour matching score,提出了一种mIoU的妥协(主要针对了边界的情况)。
计算semantic contour score的核心思想是评估F1-measure,其包括了在给定了像素容忍度下,估计类别与真值之间的precision和recall的计算。这里设置图像对角线的0.75 percent作为torlerance distance。一幅图像内每个类别下的F1-score被平均了以生成该图像的F1-score。最后,平均整个测试集下所有图像的F1-socre以生成boundary F1-measure(BF)。
每1000次迭代算一下训练损失,直到损失收敛。在mini-batch为12的条件下,这差不多等同于每33个epoch测试一次。We also observed that reporting the numerical performance when class average is highest can often correspond to low global accuracy indicating a perceptually noisy segmentation output.
SUN RGB-D是一个很有挑战性的大规模室内场景数据库,包括5285张训练图片和5050张测试图片。图像由不同的传感器采集得到,因此分辨率也不同。任务是分割37个类别,包括墙、天花板、地板、桌子、椅子、沙发等。这个数据集的难点是各类别中不同的形状、尺寸和姿势;重叠和遮挡的概率很高,每张测试图片中包含许多不同的类别。这些特性也使得这个分割挑战是最难的挑战之一。这篇文章中只用到了RGB形式的图进行训练和测试。此外,早先的NYUv2也被包含在这个数据库中。
道路场景的图片更容易,因为感兴趣的类别和空间分布都更简单,从车辆视角来看也几乎永远平行于路面。与之相比,室内场景的视点多变、种类更多,每个场景内出现的类别个数和空间分布的情况也更复杂。另一个难点来自于场景内目标类别庞大的数量。下图是在SUN RGB-D数据库下的部分结果。
更多内容,欢迎加入星球讨论。