PSPNet: Pyramid Scene Parsing Network

PSPNet在分割中取得了非常不错的效果。
文章地址:PSPNet

  在神经网络的驱动下,像场景解析和语义分割这种像素级的预测都取得了很好的效果。像素级的预测主要分为两个主线:

1、multi-scale feature ensembling 多尺度特征融合。因为在深度神经网络中,higher-layer包含更多的语义信息,较少的位置信息。多个尺度的特征融合有助于提高模型的效果。

2、conditional random field(CRF) 结构预测。使用CRF作为后处理

与全局金字塔池化不同的是,本文提出了通过PSPNet对不同区域信息的融合来实现全局上下文信息的融合。

Pyramid Scene Parsing Network

  通过对把FCN应用与场景解析产生的具有代表性的错误例子的观察和分析,来开始的本次研究
这里写图片描述

Import Observations

  ADE20K数据集包含150个类别,和1038个图像级的场景描述。通过观察FCN模型应用于这个数据集产生的结果,总结了三个常见的问题。

Mismatched Relationship(关系不匹配)。场景中存在共同发生的视觉模式,比如飞机可能在跑道上或者在天空中,但是不会在公路上。图2中FCN把一个船预测为汽车,仅仅是因为他的外型像汽车。但是一个常识问题是汽车很少出现在河中,缺少结合上下文信息的能力会提高误分类的可能。

**Confusion Categories(类别混淆)。**ADE20K中有许多类别的label是易混淆的。例如,field and earth; mountain and hill; wall, house, building and skyscraper。这些类别都具有非常相似的外表。

InconspicupousClasses(不显眼的类别)。物体具有任意的外形大小,许多较小的物体很难发现但是却很重要。相反,一些大的物体可能会超过FCN的感受野大小,导致不连续的预测。图2中枕头与床单具有相似的外观,过度重视全局信息会忽略掉枕头。为了提高明显较小或较大的物体的性能,应该注意包含不明显类别的不同子区域。
这里写图片描述

Pyramid Pooling Module

  全局平均池化(GAP)是一个很好的baseline,<\Looking wider to see better>把它很好的应用在语义分割中。但是ADE20K这个数据集中,GAP很难覆盖有效的信息。在这些场景解析图像中,像素被标定为许多label。直接把feature map混合成一个向量会丢失空间信息并且会造成歧义。具有子区域信息的全局上下文信息对于分辨多个类别具有帮助。更强大的表示可以将来自带有多个感受野的不同子区域的信息融合。 在经典的场景/图像分类工作[18,12]中得出了类似的结论。

  在<\Spatial pyramid pooling in deep convolutional networks for visual recognition>中,通过金字塔池化得到的多个层次的feature map最终经过falten和concatenated送入全连接网络用于分类。这个全局先验旨在消除图像分类中CNN的固定大小约束。为了进一步降低来自不同子区域的上下文信息损失,我们提出了多级全局先验,包含不同尺度和不同子区域的信息。我们将其称为金字塔池模块,用于在深层神经网络的最终层特征图上构建全局场景,如图(c)所示。

  金字塔池化模块混合4种不同尺度的特征。以红色突出显示的最粗糙级别是用于生成单个bin输出的全局池化。接下来的金字塔层把特征分成不同的子区域,并对不同的位置进行池化表达。不同层级的金字塔池化层产生的feature map大小不同。为了控制全局特征的比例,我们在每一个金字塔层后面采用1x1conv层来降低维度,如果有N个金字塔层,则每个层级后面的feature map个数为原始特征个数的1/N。然后我们直接把每一个层级的feature map通过双线性插值upsample到原始feature map的大小(送入金字塔池化层之前的)。最后所有的金字塔层特征以及原始特征concatenate在一起作为最终的金字塔池化特征。

  金字塔层的个数和每一层的特征大小都是可以调整的,这取决于送入金字塔池化模块特征的大小。这个结构不同大小的pooling kernel来提取不同子区域的的特征。因此,多个层级的pooling kernel 应该保持合理的差距。我们的金字塔池化模块具有4个层级,每一个层级的pooling kernel大小为1x1,2x2,3x3和6x6。对于采用最大池化还是平均池化,在5.2节进行了实验。

Network Architecture

  我们采用预训练好的带孔卷积Resnet来提取特征,如图3b,这个特征图是原始输入大小的1/8。我们采用金字塔池化模块来提取上下文信息。我们采用4层金字塔池化,我们的pooling keernel分别覆盖全部,一半,以及更小的图像区域。然后这些特征和输入的feature map混合在一起作为全局先验。然后再用卷积层来获得最终的预测图。

  我们的金字塔池化模块和全局池化相比可以提取更加具有代表性的信息。PSPNet和带孔的FCN相比,并没有增加多少计算量。在端到端的学习中,全局金字塔池模块和局部FCN功能可以同时优化。

Deep Supervision for ResNet-Based FCN

  我们相反地建议通过监督产生初始结果并增加损失,并在最终损失之后学习残差。 因此,深度网络的优化被分解为两个,每个都更容易解决。

  深度监督ResNet101模型如图4所示。除了主干路上采用softmax loss来训练最终的分类器,另一个分类器用于第四个stage之后。这两个损失函数可以传递到前面的所有层。辅助损失用于学习过程中的优化,主干上的损失有更大的责任。我们给辅助损失添加权重。

在测试过程中,去掉辅助损失,只保留最终分类器的损失。

Experiments

Data Augmentation

random mirror, random resize(0.5-2), random rotation(-10 ~ 10)。

文中还提到了大的cropsize和batchsize,这个地方我没看懂。请了解的朋友指教。

Ablation Study for PSPNet

这里写图片描述
分别对比了
max pooling vs average pooling 最大池化 vs 平均池化

one global feature vs four-level features 一个全局特征和四级特征

全局池化模块之后是否降维

对比结果如上图所示。

Ablation Study for Auxiliary Loss

这里写图片描述
对比采用辅助loss的结果。设置辅助loss的权重在0-1之间,baseline模型是基于FCN的带有空洞卷积的Resbet50,只有一个主干损失。实验证明,辅助损失的权重为0.4的时候,效果最好。

Ablation Study for Pre-trained Model

这里写图片描述
最终的测试结果为44.94\%, 81.69\%。

Concluding Remarks

  我们针对复杂场景解析问题提出了一个有效的金字塔场景解析模型。全局金字塔池化模块提供了额外的上下文信息。我们还提出了一个深度监督优化策略(多了一个辅助loss).

个人总结

正如结论所说,PSPNet主要有两大贡献:

1、提出金字塔池化模块。

2、辅助损失。

这两大贡献个人感觉并不是什么开创性的东西,金字塔在何凯明老师的一些文章甚至更早的文章中已经用过了,辅助损失更是很多地方都有使用。但是本文的效果太好。

其它的一些细节信息,

Resnet中使用了dilated convolution。

金字塔池化模块的层级个数和每一层的pooling kernel大小都是可调节的。

在金字塔池化之后使用1x1 conv来降低维度,减少计算量。

上采样部分还是使用双线性插值。

理解的还有不当的地方,请各位朋友批评指正,谢谢。

猜你喜欢

转载自blog.csdn.net/qq_18293213/article/details/79882890