语义分割——PSPNet

《Pyramid Scene Parsing Network》

大名鼎鼎的PSPnet, 2016年 ILSVRC'16 MIT Scene Parsing Challenge冠军。原文请戳https://arxiv.org/abs/1612.01105

基于像素级别的预测任务比如场景解析或者语义分割,最先使用卷积层替换分类任务中的全连接层得到了较好的效果(Fully Convolutional Networks for Semantic Segmentation——FCN),为了进一步扩大神经网络的感知野,使用了dilated卷积; 本文基于FCN 和dilated卷积改进。 如今研究方向主要有两个,一个是融合多尺度特征,因为高层的特征包含更多的语义信息和更少的位置信息,通过不同尺度的特征可以提高性能(比如fcn-16和fcn-8都融入了不同尺度信息)。另一个方向是基于结构预测,早先一些工作使用crf进行后处理来优化分割结果的边缘,后续就出现了一些端到端的网络, 这两个方向都是为了提高对语义分割边界的预测能力。

为了提高场景的理解能力利用好全局图像的先验信息,一些方法使用传统的特征提取算子提取全局的上下文信息。(Parsenet: Looking wider to see better)提出FCN和全局池化可以提高语义分割结果,但是本文发现全局描述子表达能力不够,本文通过金字塔场景解析网络得到不同区域的全局上下文信息。

  • 几类语义分割常见错误的原因分析:

不平衡的关系:在复杂场景理解任务中上下文关系是重要的,比如fcn可能会将河流上船当作小汽车,但是如果理解图像的上下文关系就不会认为河流上是汽车,河流上一般停的是船。

混淆的类别:训练集中可能会有一些容易混淆的类别,比如mountain和hill,比如违规类别中的跨门经营和摆摊; 这些类别的外形是相似的,这个问题可以通过利用类别之间的相互关系来解决,比如相同的物体如果摆在人行道上属于摆摊 摆在门店旁是跨门经营。

不显眼的类别:数据集中可能有一些不太显阳的类别,比如路灯,标志牌;比如有相同花纹的枕头和床单,枕头就容易漏检,为了提高小目标或者不明显的大目标的识别准确度,就需要更多的关注包含不显眼的类别的子区域;

综上,大部分的问题都和上下文关系、全局信息有关,因此全局先验信息的网络可以提高场景分类的准确度。

  • 金字塔池化模块:

       在深度网络中,感知野的大小可以粗略指出能应用的上下文信息. 其中,全局平均池化是常用的获取图像全局上下文信息的方法,但是像mit ade20k这样复杂的数据,直接池化融合得到的向量将会损失空间信息引起歧义,拥有子区域上下文信息的全局上下文信息对于在诸多类别中分类是有效的,文献[Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition]中,不同层级的特征图通过金字塔池化融合 最终变成列向量连接起来输入全连接网络用于分类,这个全局先验的设计移除了cnn固定大小的限制,为了进一步减少不同子区域间上下文信息的损失,我们提出分层的全局先验,包含了不同尺度信息和不同子区域间的变化,本文叫做金字塔池化模块,如下图所示,其中红色是池化到1*1的结果最粗糙的结果,剩下的金字塔层将原特征图分为不同的子区域,形成了不同位置的池化表示,下图中conv是1*1的卷积核,为了减少特征层个数,

      上图是用netron打开的onnx模型文件,可以更清晰的看到PSPnet这里是怎么做的,原始的该层特征2048*150*150,然后是分别池化到1*1、2*2、3*3、6*6、然后分别过卷积将2048ffeature层降到512,再过激活函数和上采样后分别得到四个512*150*150, 最终将结果cancat = 2048*150*150+4*(512*150*150) = 4096*150*150

        下面再来看看本文该架构的参考文献[Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition]这里是怎么做的,原始的featuremap是池化到1*1,2*2,4*4,然后flatten之后concat起来,由于是非像素级别的图像分类所以可以进行flatten,本文将这个思想用到了二维向量中,

  • deep supervision:

如下图所示,除了在最后一层加softmax损失分类器,在第四个模块后增加了一个分类器,训练时最终的损失是loss1+loss2;在预测阶段,只有到最后一层全部网络做预测,

上图是一些实验结果比较,B1是金子塔只有一层池化到1*1,max使用最大池化,ave使用平均池化;B1236是本文提出的金字塔架构,分别池化到1*1、2*2 3*3 6*6,DR是一些数据增强策略,有几点结论:一是平均池化比最大值池化要好,最大的提升是实验的第一行到第二行,增加一个池化到1*1的B1 有比较显著的提升,acc和iou都提升了一个点。

上图是添加的deep supervision损失的提升效果,也有比较下显著的提升,参数取0.4效果最好,即loss = loss1+ 0.4*loss2.

       综上,文章的实验跑的很充分,想到的trick也很多,并且每一个小点trick提升效果也有相应的实验说明,一点点的小改进积累到一定程度才有大的突破啊

猜你喜欢

转载自blog.csdn.net/whatwho_518/article/details/102715419