2017 CVPR
Pyramid Scene Parsing Network
Semantic Segmentation on PyTorch (include FCN, PSPNet, Deeplabv3, DANet, DenseASPP, BiSeNet, EncNet, DUNet, ICNet, ENet, OCNet, CCNet, PSANet, CGNet, ESPNet, LEDNet)
PyTorch Implementations for DeeplabV3 and PSPNet
Pytorch implementation of pspnet
Introduce
本文提出的金字塔池化模块( pyramid pooling module)能够聚合不同区域的上下文信息,从而提高获取全局信息的能力。
场景解析(Scene Parsing)
难度与场景的标签密切相关。大多数先进的场景解析框架大多数基于FCN
FCN存在的问题
- Mismatched Relationship
上下文关系匹配对理解复杂场景很重要,例如在,在水面上的大很可能是“boat”,而不是“car”。虽然“boat和“car”很像。FCN缺乏依据上下文推断的能力。
- Confusion Categories
许多标签之间存在关联,可以通过标签之间的关系弥补。上图第二行,把摩天大厦的一部分识别为建筑物,这应该只是其中一个,而不是二者。这可以通过类别之间的关系弥补。
- Inconspicuous Classes
模型可能会忽略小的东西,而大的东西可能会超过FCN接收范围,从而导致不连续的预测。如上图第三行,枕头与被子材质一致,被识别成到一起了。为了提高不显眼东西的分割效果,应该注重小面积物体。
总结这些情况,许多问题出在FCN不能有效的处理场景之间的关系和全局信息。本论文提出了能够获取全局场景的深度网络PSPNet,能够融合合适的全局特征,将局部和全局信息融合到一起。并提出了一个适度监督损失的优化策略,在多个数据集上表现优异。
本文的主要贡献
- 提出了一个金字塔场景解析网络,能够将难解析的场景信息特征嵌入基于FCN预测框架中
- 在基于deeply supervised loss 的 deep ResNet上制定有效的优化策略
- 构建了一个实用的系统,用于场景解析和语义分割,并包含了实施细节
比赛
- champion of ImageNet scene parsing challenge 2016
- 1st place on PASCAL VOC 2012 semantic segmentation benchmark
- 1st place on urban scene Cityscapes data
主要工作
-
multi-scale feature ensembling 多尺度特征融合。多个尺度的特征融合有助于提高模型的效果。
高层特征具有强的语义信息较少的位置信息,底层特征包含更多的细节。
-
基于结构预测
比如 conditional random field(CRF) 结构预测。使用CRF作为后处理。
与全局金字塔池化不同的是,本文提出了通过PSPNet对不同区域信息的融合来实现全局上下文信息的融合。
这两个方向都改善了场景解析中预测语义边界与对象匹配的定位能力。
获取全局信息
一般CNN中感受野可以粗略的认为是使用上下文信息的大小,论文指出在许多网络中没有充分的获取全局信息,所以效果不好。常用的方法是:
-
用全局平均池化处理。
但这在某些数据集上,可能会失去空间关系并导致模糊。
-
Spatial pyramid pooling
由金字塔池化产生不同层次的特征最后被平滑的连接成一个FC层做分类。这样可以去除CNN固定大小的图像分类约束,减少不同区域之间的信息损失。
Architecture
baseline network : FCN + dilated network
Pyramid Pooling Module
Network Architecture
-
图(b) CNN
基础层经过预训练的模型(ResNet101)和 dilated 策略提取feature map
使用了残差网络、空洞卷积和降维卷积的方法(先使用11降低维度,然后使用33卷积,再用1*1恢复维度)。网络中一共出现三次特征图缩小,一次使用maxpool,两次使用conv,每次减少二分之一
最终的feature map大小为输入图像的1/8
- 图© Spatial pyramid pooling
feature map经过Pyramid Pooling Module得到融合的带有整体信息的feature,在上采样与池化前的feature map相concat
- 金字塔池模块融合了四种不同金字塔尺度下的特征。
金字塔池模块中不同层次的输出包含不同大小的feature map
bin size 分别为 1×1 , 2×2 , 3×3 ,6×6
- 第一行红色是最粗糙的特征–全局池化生成单个bin输出,后面三行是不同尺度的池化特征。
- 为了保证全局特征的权重,如果金字塔共有N个级别,则在每个级别后使用1×1 的卷积将对于级别通道降为原本的1/N。
- 再通过双线性插值获得未池化前的大小,最终concat到一起。
- PSPNet提供了一个全局上下文的先验(即指代Pyramid Pooling Module这个结构)
论文提出了一个具有层次全局优先级,包含不同子区域之间的不同尺度的信息,称之为pyramid pooling module。
Deep Supervision for ResNet-Based FCN
用额外损失的监督产生初始结果,然后用最终损失来学习剩余的结果。
- 在ResNet101的基础上做了改进
- 除了使用后面的softmax分类做loss,额外的在第四阶段添加了一个辅助的loss
- 两个loss一起传播,使用不同的权重,共同优化参数。
- 后续的实验证明这样做有利于快速收敛。
Experiments
论文在ImageNet scene parsing challenge 2016, PASCAL VOC 2012,Cityscapes 三个数据集上做了实验。
项目 | 设置 |
---|---|
学习率 | 采用“poly”策略 设置 l r b a s e lr_{base} lrbase=0.01,power=0.9,衰减动量设置为0.9 and 0.0001 |
迭代次数 | ImageNet上设置150K,PASCAL VOC设置30K,Cityscapes设置90K |
数据增强 | 随机翻转、尺寸在0.5到2之间缩放、角度在-10到10之间旋转、随机的高斯滤波 |
batchsize | batch很重要,设置batch=16(这很吃显存啊~) |
训练分支网络 | 设置辅助loss的权重为0.4 |
平台 | Caffe |
ImageNet scene parsing challenge 2016
- 测试不同配置下的ResNet的性能,找到比较好的预训练模型:
- 对比了 max pooling vs average pooling 最大池化 vs 平均池化
- one global feature vs four-level features 一个全局特征和四级特征
- 全局池化模块之后是否降维
-
测试辅助loss的影响
设置辅助loss的权重在0-1之间
baseline 使用基于ResNet50的扩展网络FCN , a = 0.4 时最好
-
测试 pre-trained model 深度
测试的{50,101,152,269}这四个层次的网络中,网络越深,效果越好。
Reference
https://blog.csdn.net/u011974639/article/details/78985130
https://blog.csdn.net/qq_18293213/article/details/79882890
https://blog.csdn.net/py184473894/article/details/84205779