图像语义分割之特征整合和结构预测

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012759136/article/details/59115476

前言

近来阅读了PASCAL VOC 2012排行榜上前几的文章,包括PSPNet和林国省老师的几篇论文,觉得现在在semantic segmentation领域对于Multi-scale Features ensembling的关注又多起来了(当然其实一直都应用的挺多),然后林国省老师对CRF有一些新的认识和解读。这些都将总结于此。

两个发展方向

  • 特征整合(Feature Ensembling)
    又分为:

    • 多尺度(multi-scale) 特征整合
    • 多级(multi-level)特征整合
  • 结构预测(Structure Prediction)
    比如之前经常使用的条件随机场

特征整合

多尺度整合

PSPNet

这个方法在前一段时间是PASCAL VOC 2012排行榜上的第一,现在的第二。

语义分割中常见问题

  • 关系不匹配(Mismatched Relationship)
    场景中存在着可视模式的共现。比如,飞机更可能在天上或者在跑道上,而不是公路上。
  • 易混淆的类别(Confusion Categories)
    许多类别具有高度相似的外表。
  • 不显眼的类别(Inconspicuous Classes)
    场景中包括任意尺寸的物体,小尺寸的物体难以被识别但是有时候对于场景理解很重要。

Note:这些大多数错误都部分或者完全和上下文关系以及全局信息有关系
而PSPNet就是为了整合不同区域的context来获取全局的context信息。

网络结构

PSPNet

其中的一些tricks:

  • 图片输入的CNN是ResNet,使用了dilated convolution
  • Pyramid Pooling Module中的conv是1×1的卷积层,为了减小维度和维持全局特征的权重
  • Pyramid Pooling Module中的pooling的数量以及尺寸都是可以调节的
  • 上采样使用的双线性插值
  • poly learning rate policy
  • 数据扩增用了:random mirror, random resize(0.5-2), random rotation(-10到10度), random Gaussian blur
  • 选取合适的batchsize

结构还是很清晰明确的,没太多可说的。
此外,文中还提到了为了训练使用了一个辅助的loss,并不在我们讨论内容之内仅展示一下示意图:
这里写图片描述

PSPNet在PASCAL VOC 2012 上测试的结果如下:
这里写图片描述

FeatMap-Net

这是林国省老师两篇论文中提到的网络结构的前面一部分,我把它抽取出来在此讨论特征整合
这部分网络结构利用多尺度CNNsliding pyramid pooling来获取patch-background的上下文信息。

网络结构

这里写图片描述

其中:

  • 图片进来先进行0.4, 0.8, 1.2的放缩
  • 前1-5 conv block是共享参数的
  • 向上采样还是我们熟悉的双线性插值~

Sliding Pyramid Pooling

这里写图片描述

其中使用的是滑动的pooling,即stride为1,所以不降低feature map的尺寸。不同尺寸的窗口有利于获得不同大小的背景信息,而且增加了field-of-view,这样feature vector能编码更大范围的信息(feature vector会在之后的结构中使用,下文会介绍到)、

多级整合

RefineNet

这个方法在前一段时间是PASCAL VOC 2012排行榜上的第三,现在的第四。
本方法主要想解决的限制是:
多阶段的卷积池化会降低最后预测结果图片的尺寸,从而损失很多精细结构信息。

现有方法的解决办法:

  • 反卷积作为上采样的操作
    反卷积不能恢复低层的特征,毕竟已经丢失了
  • Atrous Convolution (Deeplab提出的)
    带孔卷积的提出就是为了生成高分辨率的feature map,但是计算代价和存储代价较高
  • 利用中间层的特征
    最早的FCN-8S就是这样做的,但是始终还是缺少强的空间信息

以上所说方法在我的这篇文章中都有提到,感兴趣的同学可以猛戳,这里就不赘述了。
作者主张所有层的特征都是有用的,高层特征有助于类别识别,低层特征有助于生成精细的边界。所以有了接下来的网络结构,说实话我是觉得有点复杂。

网络结构

这里写图片描述

可以看见,整个结构其实是类似于FCN-8S的结构的,只是抽出特征更早,而且经过了RefineNet进行处理。
整个流程就是,1/32的feature map输入RefineNet处理后和1/16的feature map再一起又输入一个RefineNet优化,后面的过程类似。

RefineNet

这里写图片描述

可以看出,每个RefineNet的输入是可以调整的,所以整个网络的连接也是可以修改的,当然作者做实验说明在他提出的其他变体中这种连接的效果最好。

Residual Convolution Unit(RCU)

这里写图片描述

Multi-resolution Fusion

这里写图片描述

这里将输入的不同分辨率的feature map上采样到和最大feature map 等尺寸然后叠加,此处的conv用于输入的参数自适应。

Chained Residual Pooling

这里写图片描述

文中提到:

  • conv作为之后加和的权重
  • relu对接下来pooling的有效性很重要,而且使得模型对学习率的变化没这么敏感
  • 这个链式结构能从大范围区域上获取背景context

此处不得不提到,这个结构中大量使用了identity mapping这样的连接,无论长距离或者短距离的,这样的结构允许梯度从一个block直接向其他任一block传播。

现在回过头来看看RefineNet整个网络结构还是有些复杂的,但是确实还是有一些效果,这种直接将低层特征抽取来优化高层特征的措施可以想象能对结果进行一些优化。但是始终还是觉得这样的处理有点太复杂了。

接下来看一下RefineNet在PASCAL VOC 2012上测试的结果:
这里写图片描述

终于可以松一口气了,特征整合这一块结构太多,有点眼花缭乱吧,让我休息休息。
休息好了吧,接下来是CRF 的show time。

结构预测(CRF)

其实在语义分割这个领域很早就开始使用CRF或者MRF等对语义信息进行建模,在深度学习火起来之前就有不少这样的方法了。所以后来大家很自然地想到了深度学习和条件随机场的结合。但是,林国省老师指出现在利用条件随机场的方法都不太“地道”。
现有方法:

  • dense CRF作为FCN输出的后处理,并没有真正地结合进CNN
  • CRFasRNN中将二者真正结合了,但是只有其中一元势函数的输入来自CNN,二元势函数的输入来自于一元以及迭代,而且这里的二元势函数被强制考虑为局部平滑度

以上所说方法在我的这篇文章中都有提到,感兴趣的同学可以猛戳,这里就不赘述了。

Contextual CRF

此处提到的结构是和前文所述FeatMap-Net为统一网络结构

整体结构

这里写图片描述

此处我们主要讨论FeatMap-Net之后的CRF的处理。
林老师提出的这个方法对一元势函数和二元势函数都用CNN来直接进行处理,而且二元势函数是直接对空间语义建模更精确。

  • feature map中的每个空间位置(即每个像素点)对应CRF图中的一个节点
  • Pairwise connection就是通过每个节点与预定义的spatial range box中其他节点连接来体现的
  • 不同的空间关系通过定义不同类型的range box来实现的,每种空间关系通过特定的pairwise potential function来建模

不同空间关系:
这里写图片描述

Surrounding这样的关系就在对应节点的周围画框,Above/Below这样的关系就让节点在一条边的中间然后在其上方或者下方画框,此处的框是原图最短边的0.4.
此处我们回顾一下CRF的公式:

P(y|x)=1Z(x)exp[E(y,x)]

E(y,x)=UΨpΩU(yp,xp)+VΘ(p,q)ΦV(yp,yq,xpq)

其中, Ψ 是不同类型一元势函数的集合, Ω 是一元势函数对应的节点集合; Θ 是不同类型二元势函数的集合, Φ 是二元势函数对应的边的集合。

Unary Potential Functions

U(yp,xp;θU)=zp,yp(x;θU)

这里, zp,yp 对应与第 p 个节点和第 yp 个类别
这里写图片描述
一元势函数对应的处理就是从Feature map上的一个节点提取出feature vector,然后连接几层全连接层,输出 K 个值,这个K就是需要预测的类别数。

Pairwise Potential Functions

V(yp,yq,xpq;θV)=zp,q,yp,yq(x;θV)

pairwise-potential
我觉得这里对二元势函数的处理很巧妙,将两个节点对应的feature vector提取出来然后连接到一起来学习两个节点之间的边,很棒!之后自然也是连接几层全连接层输出的是 K2 个值,为了将所有类别之间的配对关系都考虑进去,但是这里产生的值应该有很多冗余。

Asymmetric Pairwise Functions

对于不对称的关系比如Above\Below就需要这样的不对称二元势函数进行学习,而这种势函数主要依赖于两个节点输入的顺序,这个可以通过两个feature vector连接的顺序来体现,所以我说这样的处理很巧妙啊。

至此,这种对CRF的解读讲完了~但是这篇文章中的有一些内容还不得不提一下:

  • 这些CRF是用于coarse prediciton stage的,为了提升低分辨率的预测;文中提到在最后的输出的时候还是使用来的dense crf 进行细化输出的(这就比较尴尬了,最开始还说人家不好,现在还是要使用……)
  • 文中提到Piecewise Learning作为新的一种对CRF的训练方法,这里就没有阐述了,感兴趣的同学可以看看原文。

以上
真是辛苦大家了~

参考文献

  1. Zhao H, Shi J, Qi X, et al. Pyramid Scene Parsing Network[J]. 2016.
  2. Lin G, Shen C, Hengel A V D, et al. Efficient Piecewise Training of Deep Structured Models for Semantic Segmentation[C]// IEEE Conference on Computer Vision and Pattern Recognition. IEEE Computer Society, 2016:3194-3203.
  3. Lin G, Shen C, Hengel A V D, et al. Exploring Context with Deep Structured models for Semantic Segmentation[J]. 2016.
  4. Lin G, Milan A, Shen C, et al. RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation[J]. 2016.

猜你喜欢

转载自blog.csdn.net/u012759136/article/details/59115476