Context Encoding for Semantic Segmentation
原文地址:EncNet
收录:CVPR2018(IEEE Conference on Computer Vision and Pattern Recognition)
备注:本文中的Encoding Layer参考纹理识别–(Deep TEN)Deep TEN: Texture Encoding Network介绍。
代码:
简介:
论文引入了上下文编码模块(Context Encoding Module)用于捕获全局上下文信息和突出与场景相关联的类别信息,这相当于加入场景的先验知识,类似于attention机制。论文提出的Encnet在多个数据集上获得了state-of-the-art结果。
Abstract
本文提出了上下文编码模块(Context Encoding Module)引入全局上下文信息(global contextual information),用于捕获场景的上下文语义并选择性的突出与类别相关的特征图。 并结合现先进的扩张卷积策略和多尺度策略提出了语义分割框架EncNet(Context Encoding Network)。
实验证明上下文编码模块能够显著的提升语义分割性能,在Pascal-Context上达到了51.7%mIoU, 在 PASCAL VOC 2012上达到了85.9% mIoU,单模型在ADE20K测试集上达到了0.5567。 此外,论文进一步讨论上下文编码模块在相对浅层的网络中提升特征表示的能力,在CIFAR-10数据集上基于14层的网络达到了3.45%的错误率,和比这个多10倍的层网络有相当的表现。
Introduction
Motivation
扩张卷积存在的问题
先进的语义分割系统通常是基于FCN架构,采用的深度卷积神经网络受益于从不同图片中学习到的丰富的对象类别信息和场景语义。CNN通过堆叠带非线性激活和下采样的卷积层能够捕获带全局接受野的信息表示,为了克服下采样带来的空间分辨率损失,最近的工作使用扩张卷积策略从预训练模型上产生密集预测。然而,此策略依然会将像素从全局场景上下文相隔开,这会导致像素错误分类。 如下图,错误的将窗格分为门。
金字塔结构存在的问题
近期的工作使用基于金字塔多分辨率表示扩大接受野。例如,PSPNet采用的PSP模块将特征图池化为不同尺寸,再做联接上采样;DeepLab采用ASPP模块并行的使用大扩张率卷积扩大接受野。这些方法都有提升,但是这对上下文表示都不够明确,这出现了一个问题: 捕获上下文信息是否等同于增加接受野大小?
考虑到如下情况,在一个大型数据集上,如下图:
如果我们能够先捕获到图像上下文信息(例如这是卧室),然后,这可以提供许多相关小型目标的信息(例如卧室里面有床、椅子等)。这可以动态的减少搜索区域可能。说白了,这就是加入一个场景的先验知识进去,这样对图片中像素分类更有目的性。依照这个思路,可以设计一种方法,充分利用场景上下文和存在类别概率的之间的强相关性,这样语义分割会就容易很多。
通过传统图像方法引入图像全局上下文信息
前面讲了大概的思路。这里就想怎么将识别场景的先验知识加进去。
经典的计算机视觉方法具有捕获场景上下文语义的优点。例如SIFT提取密集特征或滤波器组响应密集提取图像特征。学习一个视觉字典,BoW,VLAD和Fish Vector通过类别编码描述特征统计信息。 经典表示通过捕获特征统计信息编码全局信息,虽然手工提取特征通过CNN方法得到了很大的改进,但传统方法的总体编码过程更为方便和强大。
我们能否利用经典方法的上下文编码结合深度学习?
最近有工作在CNN框架中推广传统编码器方法获得了极大的进步,Zhao等人引入了一个编码层将整个字典学习和残差编码管道集成到CNN层中用于捕获无序表示(orderless)。这在纹理分类任务上达到了state-of-the-art,在本文中,使用扩展编码层用于捕获全局特征的统计信息用于理解上下文语义。
Contribution
第一个贡献:
引入了上下文编码模块,该单元用于捕获全局场景上下文信息和选择性的突出于类别相关的特征图。
集成了语义编码损失(Semantic Encoding Loss,SE-loss
)。 举例来讲,我们不考虑车辆出现在卧室的可能性,在现有标准的训练过程使用的是像素分割损失,这不强调场景的全局信息。我们引入语义编码损失(SE-loss)可进一步规范网络训练,让网络预测能够预测场景中对象类别的存在,强化网络学习上下文语义。 与逐像素的损失不同,SE-Loss对于大小不同的物体有相同的贡献,在实践中这能够改善识别小物体的表现,这里提出的上下文编码模块和语义编码损失在概念上是直接的并且和现存的FCN方法是兼容的。
第二个贡献:
设计了一个新的语义分割架构Context Encoding Network (EncNet)。如下图所示,EncNet通过上下文编码模块增强了预训练的ResNet:
论文采用了扩张卷积策略,在PASCAL VOC 2012 上达到了85.9% mIoU,PASCAL-Context上达到了51.7%;单模型的EncNet-101在ADE20K上达到了0.5567,这超过了2017年冠军。
此外,论文还CIFAR-10上测试了上下文编码模块的功能,使用上下文编码模块能够显著的提升浅层网络的性能,在只有3.5M参数的条件下达到了3.96%的错误率。 同时论文发布了完整的系统实现,包括多GPU同步BN和内存高效编码层。
Context Encoding Module
论文将新的CNN模块称为Context Encoding Module,如下图:
Context Encoding:
对于预训练网络,使用编码层捕获特征图的统计信息作为全局上下文语义,将编码层的输出作为编码语义
(encoded semantics),为了使用上下文,预测了一组放缩因子(scaling factors
)用于突出和类别相关的特征图。编码层学习带有上下文语义的固有字典,输出丰富上下文信息的残差编码。 这里简单描述一下编码层工作。
编码层认为一个shape是C×H×WC×H×W:
通过rik=xi−dkrik=xi−dk个独立编码器被排序,并减少了特征表示的维度。
Featuremap Attention:
为了使用编码层捕获的编码语义,我们预测一组特征图的放缩因子作为循环用于突出需要强调的类别。在编码层端上使用FC层,使用sigmoid作为激活函数,预测特征图的放缩因子γ=δ(We)γ=δ(We)之间做逐像素相乘。 这样的方法受SE-Net等工作的启发,即考虑强调天空出现飞机,不强调出现车辆的可能性。
Semantic Encoding Loss:
标准的语义分割训练过程,使用的是逐像素的交叉熵,这将像素独立开学习。这样网络在没有全局上下文情况下可能会难以理解上下文,为了规范上下文编码模块的训练过程,使用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作为额外的正则化,这类比于PSPNet的辅助分支但比那个轻量了许多。SE-loss的ground truth是从真实的ground-truth分割mask上直接生成的。
上下文编码模块插入到现存的CNN模型上是不需要额外的修正和监督的。
Relation to Other Approaches
Segmentation Approaches:
CNN在包括语义分割的计算机视觉领域上成为了标准方法。FCN开创了端到端的训练方式,但是因为在图像分类任务上预训练导致的特征图空间分辨率的损失,语义分割任务需要恢复细节信息。 有工作是学习上采样滤波器,即decoder等;另一个方法是使用扩张卷积保持特征大的接受野生成密集预测。早期有使用CRF做后端处理,也实现了端对端训练;最近基于FCN架构通过大扩张率卷积或全局/金字塔池化提升接受野达到性能上的提升。
这些策略是以牺牲模型效率为代价,例如PSPNet在PSP模块和上采样后对平面特征图使用卷积,DeepLab使用大扩张率卷积在极端情况下会退化为1×11×1的卷积。 我们提出的上下文编码模块能够有效的利用全局上下文用作语义分割。这只需要少量的计算消耗成本。
Featuremap Attention and Scaling:
逐通道式的特征attention是受到其他工作启发。 Spatial Transformer Network在没有额外监督的条件下在网络内部学习了空间变换。Batch Normalization 是的小批量数据的均值和方差作为网络的一部分做标准化,成功的允许使用更大的学习率,并使得网络对初始方法不是那么敏感。最近在风格转换方面的工作处理特征图均值和方差或二阶统计信息用于启动网络内部风格变换。SE-Net探究了跨通道信息以学习逐通道attention。
受这些方法启发,论文使用以编码语义预测特征图通道的放缩因子,这提供了在给定场景上下文的情况下强调个别特征图的机制。
Experiment
实验部分分如下几个部分:
语义分割部分:
- 提供EncNet的baseline实现,及其设计细节
- 在Pascal-Context dataset上做完整的ablation study实验
- 在PASCAL VOC2012和ADE20K上的测试
论文也测试了上下文编码模块在图像分类任务上的表现:
- 在CIFAR-10上使用浅层网络
Implementation Details
基础层使用带扩张卷积策略的预训练ResNet,最终输出为输入的1/8。使用双线性上采样到指定大小并计算loss。
项目 | 配置 |
---|---|
开发工具 | PyTorch |
学习策略 | lr=lrbase∗(1−itertotal_iter)powerlr=lrbase∗(1−itertotal_iter)power |
学习率设置 | ADE20K的base_lr=0.01,其他的为0.001。power=0.9 |
正则项 | 权重衰减为0.0001,momentum=0.9 |
迭代次数 | ADE20K上迭代120epochs,其他的迭代50epochs |
数据增强 | 随机翻转,放缩图片,随机旋转图片,最终使用零填充crop固定大小 |
预测 | 平均多尺度预测结果 |
Evaluation Metrics | 使用标准的pixAcc和mIoU. |
实际情况下,越大的crop尺度对语义分割任务性能更好,但这同时需要更大的GPU存储空间,相应的这会减少Batch Normalization的batchsize,弱化训练过程。
为了解决这个问题,论文在PyTorch中实现了跨GPU的Sync-BN,实际的训练过程中使用batchsize为16。 论文以dilated ResNet FCN为对比的baseline。对于训练的EncNet,在编码层使用32个codewords,SE-loss的ground truth通过在给定的ground-truth 分割mask中通过”unique”操作查找类别,最终的loss是逐像素loss和SE-Loss的加权和。
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,0.1,0.2,0.4,0.8}:
最终发现α=0.2α=0.2效果最佳。
同时论文也测试了编码层中不同KK对模型性能的影响:
可以看到K=32K=32即意味着使用全局平均池化。
使用更深的ResNet152和在COCO上做预训练,EncNet达到了state-of-the-art水准:
可视化结果:
Results on PASCAL VOC 2012
使用增强的数据集,在train+val上做训练,在原始的PASCAL 训练集上做微调:
ENet达到了新的state-of-the-art,与先进的PSPNet和DeepLabv3相比,EncNet的计算复杂度更低。
Results on ADE20K
EncNet-101与其他先进模型对比:
在官方的测试集上结果:
可视化结果如下:
Image Classification Results on CIFAR10
论文测试了上下文编码模块在分类任务上的表现,实验测试多少个上下文编码模块可以提升相对浅层的网络性能(14层的ResNet)。 论文实现了宽版的ResNet和最近的SENet作为baseline。对比结果如下:
可以看到上下文编码模块对性能是有提升的。
Conclusion
为了在语义分割任务上捕获和利用上下文信息,论文引入了上下文编码模块,可有选择的突出与类相关的特征图并简化网络问题。实验证明了提出的EncNet的优越性能,同时论文贡献了跨GPU的Sync-BN和编码层的实现。
原博地址:https://blog.csdn.net/u011974639/article/details/79806893
非常感谢原博主的贡献!