收录于cvpr2018
论文地址:Context Encoding for Semantic Segmentati
代码实现:https://github.com/zhanghang1989/PyTorch-Encoding
Abstract
之前的研究通过使用空洞卷积、多尺度特征和微调边界的全卷积神经网络(FCN)对像素分类,有效的提升了空间分辨率。在这篇论文中,我们引入了上下文编码模块(Context Encoding Module)来探索全局上下文信息对于语义分割的影响,用于捕获场景的上下文语义并选择性的突出与类别相关的特征图。实验证明上下文编码模块能够显著的提升语义分割性能,在Pascal-Context上达到了51.7%mIoU, 在 PASCAL VOC 2012上达到了85.9% mIoU,单模型在ADE20K测试集上达到了0.5567的分数。此外,我们还探讨了上下文编码模块如何改进相对浅层网络的特征表示,在CIFAR-10数据集上基于14层的网络达到了3.45%的错误率,和比这个多10倍的网络层有相同的效果。
1 Introduction
扩张卷积存在的问题
先进的语义分割系统通常是基于FCN架构,采用的深度卷积神经网络受益于从不同图片中学习到的丰富的对象类别信息和场景语义。CNN通过非线性叠加卷积层和下采样来捕获带全局接受野的信息表示,为了解决下采样带来的空间分辨率损失,使用扩张卷积策略从预训练模型上生成密集预测。然而,这种策略也将像素与全局场景上下文隔离,导致像素分类错误。如下图的第三行,错误的将窗分为门。
金字塔结构存在的问题
近期的工作中使用基于金字塔多分辨率表示扩大接受野。例如,PSPNet采用的PSP模块将特征图池化为不同尺寸,再做联接上采样;DeepLab采用ASPP模块并行的使用大扩张率卷积扩大接受野。这些方法都有提升,但是这对上下文表示都不够明确,这出现了一个问题: 增加感受野就等同于整合了上下文信息了吗?
考虑到如下情况,如图所示是来自于ADE20K中的一张图片,包含150个类别。如果允许标注者先选择图像的语境(如卧室),接着工具会提供一个小的相关的类别列表(如床,椅子等),这会极大地减少可能的类别搜索空间。同样,如果可以设计一个方法来充分利用场景语境类别的概率的关系,对网络来说语义分割会更容易。说白了,这就是加入一个场景的先验知识进去,这样对图片中像素分类更有目的性。
通过传统图像方法引入图像全局上下文信息
前面讲了大概的思路。这里就想怎么将识别场景的先验知识加进去。
经典的计算机视觉方法具有捕获场景上下文语义的优点。例如对于给定的输入图像,SIFT提取密集特征或滤波器组响应密集提取图像特征。学习一个视觉字典,BoW,VLAD和Fish Vector通过类别编码描述特征统计信息。 经典方法通过捕获特征、统计信息编码全局信息,虽然手工提取特征通过CNN方法得到了很大的改进,但传统方法的总体编码过程更为方便和强大。
我们能否利用经典方法的上下文编码结合深度学习?
最近有研究在CNN框架中推广传统编码器方法获得了极大的进步,Zhang等人引入了一个编码层将整个字典学习和残差编码集成到CNN层中用于捕获无序表示(orderless)。这在纹理分类任务上达到了state-of-the-art,在本文中,使用扩展编码层用于捕获全局特征的统计信息,用于理解上下文语义。
Contribution
第一个贡献
引入了上下文编码模块,该单元用于捕获全局场景上下文信息和选择性的突出与类别相关的特征图。
集成了语义编码损失(Semantic Encoding Loss,SE-loss)。 举例来讲,我们不考虑车辆出现在卧室的可能性,在现有标准的训练过程使用的是像素分割损失,这不强调场景的全局信息。我们引入语义编码损失(SE-loss)可进一步规范网络训练,让网络预测能够预测场景中对象类别的存在,强化网络学习上下文语义。 与逐像素的损失不同,SE-Loss对于大小不同的物体有相同的贡献,在实践中这能够改善识别小物体的表现。
第二个贡献
设计了一个新的语义分割架构Context Encoding Network (EncNet)。如下图所示,EncNet通过上下文编码模块增强了预训练的ResNet:
从图中可以看出,这个网络结构中,给定一个输入图像,我们首先使用一个预先训练的CNN来提取密集的featuremap; 对前面网络提取出的丰富的特征使用全连接层FC进行编码,其中一个编码分支直接送给SE-loss,使上下文编码模块能够预测场景中类别的存在;另一个分支对每个类别预测加权的尺度因子,用于突出和类别相关的特征图,然后这个加权的尺度因子对前面提出的每个通道的类别进行加权;最后,将上下文编码模块的表示形式送入最后一个卷积层进行上采样,逐像素预测 。
2 Context Encoding Module
Context Encoding
- 编码层认为一个shape是C×H×W的输入特征图为一组C维度的输入特征X={x1,..,xN},其中N是特征的总个数即H×W,学习固有的codebook D={d1,...,dK}包含K个codewords,和一组视觉中心平滑因子S={s1,...,sK}。编码层输出K个残差编码。
通过将图像的H×W个C维特征,每一个都与语义词dk做差,然后和所有语义词做差的结果相加进行归一化,获得一个像素位置相对于某个语义词的信息,然后将这N个结果求和加在一块获得最终的
,获得整张图像相对于第k个语义词的信息。
是C维的,最后将k个
融合到一起,ϕ表示带ReLU的BN层,避免K个独立编码器被排序,并减少了特征表示的维度。这里没有用concat,一方面concat包含了顺序信息,另一方面用加的方法节省了显存。这里加起来的含义是获得整张图像相对于K个语义词的全部信息
最后的e也是c维的
- 然后利用产生的e来产生通道权重
- 利用e再加一个全连接构成一个SEloss
Featuremap Attention
为了使用编码层捕获的编码语义,我们预测一组特征图的放缩因子作为循环,以强调或弱化类依赖的特性。在编码层顶部使用FC层和sigmoid作为激活函数,输出预测特征图的放缩因子
其中W表示层的权重,δ表示sigmoid激活函数。模块通过乘以缩放因子得到输出,每个通道在特征图X和放缩因子
之间做逐像素相乘。
这样的方法受SE-Net等工作的启发,即考虑强调天空出现飞机,不强调出现车辆的可能性。
Semantic Encoding Loss
标准的语义分割训练过程,使用的是输入像素与ground truth的交叉熵,将像素独立开学习。这样网络在没有全局上下文情况下可能会难以理解上下文,为了规范上下文编码模块的训练过程,使用Semantic Encoding Loss (SE-loss)在添加少量额外计算消耗的情况下强制网络理解全局语义信息。
在编码层之上添加了一个带Sigmoid激活的FC层用于单独预测场景中出现的目标类别,并学习二进制交叉熵损失。不同于逐像素损失,SE-Loss把大的和小的物体都看成是一样的。在实践中,我们发现小物体的分割得到改进。
Context Encoding Network (EncNet)
在提出的上下文编码模块基础上,基于使用了扩张卷积的预训练ResNet构建了Context Encoding Network (EncNet)。 细节如下图所示:
扩张卷积策略: 在stage3使用了扩张率为2,stage4扩张率为4。
为了进一步的提升和规范上下文编码模块的训练,使用了单独的分离分支用于最小化SE-loss,该Loss采用已编码的语义作为输入并预测对象类别的存在。因为上下文模块和SE-loss是轻量级的,在stage3上端添加另一个上下文编码模块用于最小化SE-loss作为额外的正则化。SE-loss的ground truth是从真实的ground-truth分割mask上直接生成的。
上下文编码模块插入到现存的CNN模型上是不需要额外的修正和监督的。
3 Experiment
实验部分为如下几个部分
语义分割部分
- 提供EncNet的baseline实现,及其设计细节
- 在Pascal-Context dataset上做完整的ablation实验
- 在PASCAL VOC2012和ADE20K上的测试
论文也测试了上下文编码模块在图像分类任务上的表现
- 在CIFAR-10上使用浅层网络
3.1 Implementation Details
基础层使用带扩张卷积策略的预训练ResNet,最终输出为输入的1/8。使用双线性上采样到指定大小并计算loss。
实际情况下,越大的crop尺度对语义分割任务性能更好,但这同时需要更大的GPU存储空间,相应的这会减少Batch Normalization的batchsize,弱化训练过程。
为了解决这个问题,论文在PyTorch中实现了同步跨gpu批处理,实际的训练过程中使用batchsize为16。 论文以dilated ResNet FCN为对比的baseline。对于训练的EncNet,在编码层使用32个codewords,SE-loss的ground truth通过在给定的ground-truth 分割mask中通过”unique”操作查找类别,最终的loss是逐像素loss和SE-Loss的加权和。
3.2 Results on PASCAL-Context
Ablation Study: 不同的设置如下表
与基本的FCN-baseline相比,添加一个上下文编码模块能够大幅度提升性能,这只引入3-5%的计算量。同时SE-Loss可以进一步提升性能。
为了测试SE-loss对性能的影响,论文测试了不同SE-loss加权值,如下图测试了α={0,0.1,0.2,0.4,0.8}:
最终发现α=0.2效果最佳。
同时论文也测试了编码层中不同K对模型性能的影响:
可以看到K=32达到了性能的饱和,对于K=0即意味着使用全局平均池化。
EncNet在不使用COCO预训练或更深层次的模型(ResNet152)的情况下达到了state-of-the-art:
可视化结果:
3.3 Results on PASCAL VOC 2012
使用增强的数据集,在train+val上做训练,在原始的PASCAL 训练集上做微调,EncNet达到了新的state-of-the-art,与先进的PSPNet和DeepLabv3相比,EncNet的计算复杂度更低。
3.4 Results on ADE20K
ADE20K dataset包含150个对象类别标签。数据集包括20K/2K/3K图像,用于训练、验证和设置。
EncNet-101与其他模型对比
EncNet性能显著优于基线FCN。EncNet-101比最先进的PSPNet-269使用更浅的基础网络实现了类似的结果。
对EncNet-101进行了微调,在train-val集合上添加了20个epoch,并提交了测试集的结果。EncNet的最终得分为0.55675,超过了PSP-Net-269(2016年第一名)
可视化结果如下:
3.5 Image Classification Results on CIFAR10
论文测试了上下文编码模块在分类任务上的表现,实验测试多少个上下文编码模块可以提升相对浅层的网络性能(14层的ResNet)。 论文将ResNet和SENet作为baseline。对比结果如下:
可以看到上下文编码模块对性能是有提升的。
4 Conclusion
为了在语义分割任务上捕获和利用上下文信息,论文引入了上下文编码模块,可有选择的突出与类相关的特征图并简化网络问题。实验证明了提出的EncNet的优越性能,同时论文贡献了同步跨gpu批处理规范化和编码层的实现。