这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN

前言

看论文写总结不易。喜欢就点个赞或者关注下。

RefineNet

这是16年底的论文,看完PSPNet和DeepLabV3+再回来看此论文,感觉乏善可陈。RefineNet给我的感觉就是一个resnet思想改造的U-Net,参数和计算量都大了很多。作者的一些trick没有很充分的对比实验来说明非此不可,我只能说本网络效果不错,但是谈不上多大的创新,也没耳目一新的见解,论文写的还不是很充分。

说说几大卖点

作者再论文给自己总结了几大卖点,来捋一下。

多路径(multi-path):跟FCN和deeplab一代相比复用了encoder所有阶段的特征跟decoder阶段的特征融合,故此得名。这招U-Net已经用过了。

恒等映射:也就是resnet风格的跳层连接,可以减少梯度弥散,更容易训练,可以做到端到端训练。这算是一个还不错的点。但是文中没有对比相同参数量下使用和不使用跳层连接的效果,所以我感觉这点不够充分。直观上,每个decoder阶段的梯度确实可以更容易的传递到encoder的对应阶段,但是作者的实验不够。

链式残差池化(chained residual pooling):作者说这个模块可以捕捉到大范围内的背景上下文信息,这个倒是有一个对比试验,但是作者没说对比时是去掉这个模块,还是用参数相同的卷积层代替。又是一个不充分的地方。

我的总结:我觉得RefineNet还是一个加强版的U-Net,效果好是因为参数和计算量上来了(RefineNet部分参数变多了),之所以还能端到端训练是因为内部使用了大量跳层连接减少了梯度弥散。

网络结构

我觉得和U-Net没本质区别,但是作者的贡献在于把融合部分称为RefineNet,我觉得refine这个词很能表达decoder阶段的意义,可以推广来用。

可以看到decoder顺次往上融合更高阶段的特征,最后做softmax分类,然后4倍线性插值恢复到原图大小。(下图的黄色箭头有点迷惑人,去掉应该更清晰)

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第1张图片

RefineNet结构如下:

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第2张图片

虽然上图显示RefineNet可以接收多个特征输入,但是作者使用的就是2个。所以这个图很迷惑人。RCU部分和resnetV2的残差单元很像,但是去掉了BN。可以看到有一个“long-range residual connections”贯穿RefineNet,这有助于训练收敛。

测试效果

作者在论文开头贴出了一个人体解析的图,我觉得还是很有心机的,让人眼前一亮。这张图坚定了我语义分割可以搞部件解析的信心,之前我对此没什么了解。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第3张图片

虽然论文写的一般,这个网络当时在PASCAL VOC 2012获得了最佳效果,所以其本身效果还是不错的。

PSPNet

PSPNet全称是‘金字塔场景解析网络’。也就是说网络结构是专用于场景解析的。本网络利用“金字塔池化模块”,通过融合不同区域的( different-region-
based)上下文信息增强语义分割对场景的解析能力。

复杂场景解析的几大难点

宝剑造出来是要杀敌的,如果敌人没有对应强度的盔甲,这宝剑也就没意义。怎么“树敌”呢, 本文主要针对ADE20K这个比较难的数据集总结了几个复杂场景解析的难点作为本网络的切入方向。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第4张图片

Mismatched Relationship(共现的规律):上下文关系匹配对理解复杂场景很重要。比如飞机和跑道经常一起出现。上图第一行FCN根据外观把黄色盒子内的物体识别为汽车,根据常识汽车不可能出现在河里,而FCN不具备这种结合上下文信息的能力。(我觉得这么说不公平,FCN利用了上下文,知识没有利用的很好)

Confusion Categories(容易混淆的分类):ADE20K数据集里有很多让人都很容易弄错的分类:田野和泥土、墙和房子、建筑和摩天大楼。上图第二行黄框内,不可能既是摩天大楼又是建筑。这可以通过类别之间的关系弥补。(我理解,需要利用更大范围内的上下文才能知道黄框内是同一个分类,属于同一个物体)

Inconspicuous Classes(不显眼的分类):物体的尺度是变化的,比如街道这种大的物体超过了最深层特征的视野域,可能导致不连续的预测。上图第三行的枕头和床单很像,如果着眼于全局是无法准确预测枕头的。所以上下文信息也应该具有不同的粒度。

综上,Mismatched Relationship需要综合局部上下文就能解决,Confusion Categories需要较大范围的上下文,而Inconspicuous Classes问题则说上下文需要的粒度会随着场景改变。

结论就是要设计一个网络,能同时融合不同粒度的上下文信息。我个人觉得,上文说的不同区域的( different-region- based)上下文信息其实是说特征能融合的高级语义信息具有不同的(区域)大小粒度。

那怎么才能融合不同粒度的上下文信息呢?答案就是论文的核心:金字塔池化网络

网络结构

网络的backbone使用空洞卷积改进的resnet,在网络中间增加了一个辅助loss分支,测试的时候辅助loss分支本删掉。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第5张图片

backbone将图像变为1/8大小的特征图,然后通过金字塔池化模块将特征变为不同的大小,然后上采样后和原特征拼接在一起。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第6张图片

注意上图(b)处的特征被金字塔池化模块使用最大池化分别池化为1x1、2x2、3x3、6x6大小,然后用1x1卷积把通道数降为1/K(K是金字塔池化模块内的分支数,这里为4),再把4个分支上采样到(b)处的大小,和(b)处的特征拼接在一起。最后一起被3次2倍上采样(外加一些卷积)输出原图大小的预测值。最后用交叉熵求分类损失。

一些trick的对比测试

每个技术点和trick作者都做了一些对比试验。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第7张图片
上文说了辅助loss分支,那么这个分支的权重是多少呢?作者对比试验表明,resnet50下0.4最佳。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第8张图片

加深网络深度,能够增加网络的性能。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第9张图片

上图表明,和没有金字塔池化比,有一个分支效果更好,4个分支效果更好。池化算法上,max比avg效果好。池化中缩减通道数也会增加性能。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第10张图片

上图表明数据增广、辅助损失分支、金字塔池化模块和多尺度测试都是加分项。特别是金字塔池化模块,收益很明显。

测试效果

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第11张图片
这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第12张图片

到目前(2019年3月)为止,PSPNet还在PASCAl VOC 2012的靠前位置,这说明了这个网络底子不错。

总结

我觉得金字塔池化模块和inception模块的思路很像,那就是同时提供不同粒度(视野域)的上下文来供网络自己选择。最后证实这种思路很OK。

问题:UNet也利用了从高到低各个尺度的特征(上下文),怎么没这么独秀呢?PSPNet是通过3次2倍上采样恢复到原图大小的,这过程中如果把对应编码部分的3层特征复用上会不会表现更好呢?

补充:关于‘问题’第二点,后来看到deeplabV3+,其结构就是结合了空间金字塔池化模块和decoder跳跃连接。看来英雄所见略同。

关于上面第一点,个人猜测串联的特征融合方式可能是有缺陷的,并联的融合更能保留有用的信息。

GCN

虽然我看完了论文,这一小节还是多摘抄自《语义分割江湖的那些事儿——从旷视说起》,融合了一些我自己的体验。

GCN 主要将 Semantic Segmentation分解为:ClassificationLocalization两个问题。但是,这两个任务本质对特征的需求是矛盾的,Classification需要特征对多种Transformation具有不变性,而 Localization需要对 Transformation比较敏感。但是,普通的 Segmentation Model大多针对 Localization Issue设计,而这不利于 Classification。

所以,为了兼顾这两个 Task,本文提出了两个 原则(Principle):

从 Localization 来看,我们需要全卷积网络,而且不能有全连接或者全局池化等操作丢失位置信息。
从 Classification 来看,我们需要让 Per-pixel Classifier 或者 Feature Map 上每个点的连接更稠密一些,也就需要更大的 Kernel Size。

网络结构

根据这两条 Principle,本文提出了Global Convolutional Network(GCN)。如下图所示,这个方法整体结构是U-shape结构,其核心模块主要包括:GCN 和 BR。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第13张图片

这个图真是清晰易懂,特别是右侧,特征的形状都标出来了。除了U-Net,语义分割的论文就数这个简单、清晰。

GCN采用了较大 Kernel Size的卷积核,来同时解决上述的两个 Issue;然后根据矩阵分解,利用 1 x k + k x 1 和 k x 1 + 1 x k 的卷积来替代原来的 k x k 大核卷积。相对于原本的大核卷积,该设计能明显降低参数量和计算量。注意GCN里是没有BN和激活函数的,有点类似分类的全连接。这种稠密连接会伤害定位的性能(会增加物体边界像素错分的情况),因此又引入了一个使用小卷积核的BR模块做平衡。总之就是既要分类准,又要定位准。而且要注意的是,右侧decoder部分通道数只有21,和FCN类似。

下图可视化了 Large Kernel Conv 和 普通 Conv网络有效感受野的对比。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第14张图片

实验对比

在GCN中,随着 Kernel Size的增加,网络参数也随之增长,那么网络性能的提升是否得益于使用了更多的参数?为了证明提升来自于设计的有效性而不是增加了复杂度,文中设计了不同 Kernel Size的GCN和普通Conv的对比实验。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第15张图片

通过实验结果可知,随着 Kernel Size的增加,普通 Conv的参数量远大于GCN,但是GCN的性能却持续地优于普通 Conv。

GCN使用 Large Kernel Size增大了感受野,是否可以通过堆叠多个 Small Kernel Size的 Conv来替代?
文章为此设计了实验对比两者的结果。

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第16张图片

可以看到 GCN 依然优于普通 Conv 的堆叠,尤其是在较大 Kernel Size 的情况下。个人认为,有些上下文信息经过多次映射会被稀释,这也许能解释PSPNet的成功(直接多个尺度的池化,减少的中间映射的次数)。

训练过程

作者在论文里公布了自己的训练流程,很有参考意义:

  • 阶段1:使用COCO, SBD 和 PASCAL VOC 2012的数据集混合起来训练
  • 阶段2:使用SBD 和 PASCAL VOC 2012 图片做训练
  • 阶段3:PASCAL VOC 2012 图片做训练

在阶段1,图片被填充到640x640,后面两个阶段填充到512x512.

测试效果

这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第17张图片
这就是神经网络 10:深度学习-语义分割-RefineNet、PSPNet 、GCN_第18张图片

总结

我个人感觉GCN模块利用了更大范围内的上下文。

我的疑问是decode阶段的通道数有点少效果还这么好?如果把通道数加上去,会不会效果更好。

论文及代码

RefineNet: Multi-Path Refinement Networks
for High-Resolution Semantic Segmentation

RefineNet官方实现:https://github.com/guosheng/refinenet

Pyramid Scene Parsing Network

PSPNet官方实现:https://github.com/hszhao/PSPNet

Large Kernel Matters ——
Improve Semantic Segmentation by Global Convolutional Network

Learning a Discriminative Feature Network for Semantic Segmentation

参考资料

语义分割挑战赛结果:http://host.robots.ox.ac.uk:8080/leaderboard/displaylb.php?cls=mean&challengeid=11&compid=6&submid=15347

语义分割论文-PSPNet

PSP-Net

RefineNet 理解

语义分割江湖的那些事儿——从旷视说起

CVPR 2018 | 旷视科技Face++提出用于语义分割的判别特征网络DFN

代码和论文聚合资料

语义分割、实例分割、数据集、标准工具等资源汇总github:https://github.com/mrgloom/awesome-semantic-segmentation

语义分割资源汇总网页:https://handong1587.github.io/deep_learning/2015/10/09/segmentation.html

TensorFlow语义分割套件工程主页: https://github.com/GeorgeSeif/Semantic-Segmentation-Suite

标注工具

https://blog.csdn.net/c20081052/article/details/79999755

https://github.com/lzx1413/labelImgPlus

你可能感兴趣的:(机器学习,DL/ML/AI,深度学习,机器视觉,深度学习论文笔记和实践)