看论文写总结不易。喜欢就点个赞或者关注下。
这是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倍线性插值恢复到原图大小。(下图的黄色箭头有点迷惑人,去掉应该更清晰)
RefineNet结构如下:
虽然上图显示RefineNet可以接收多个特征输入,但是作者使用的就是2个。所以这个图很迷惑人。RCU部分和resnetV2的残差单元很像,但是去掉了BN。可以看到有一个“long-range residual connections”贯穿RefineNet,这有助于训练收敛。
作者在论文开头贴出了一个人体解析的图,我觉得还是很有心机的,让人眼前一亮。这张图坚定了我语义分割可以搞部件解析的信心,之前我对此没什么了解。
虽然论文写的一般,这个网络当时在PASCAL VOC 2012获得了最佳效果,所以其本身效果还是不错的。
PSPNet全称是‘金字塔场景解析网络’。也就是说网络结构是专用于场景解析的。本网络利用“金字塔池化模块”,通过融合不同区域的( different-region-
based)上下文信息增强语义分割对场景的解析能力。
宝剑造出来是要杀敌的,如果敌人没有对应强度的盔甲,这宝剑也就没意义。怎么“树敌”呢, 本文主要针对ADE20K这个比较难的数据集总结了几个复杂场景解析的难点作为本网络的切入方向。
Mismatched Relationship(共现的规律):上下文关系匹配对理解复杂场景很重要。比如飞机和跑道经常一起出现。上图第一行FCN根据外观把黄色盒子内的物体识别为汽车,根据常识汽车不可能出现在河里,而FCN不具备这种结合上下文信息的能力。(我觉得这么说不公平,FCN利用了上下文,知识没有利用的很好)
Confusion Categories(容易混淆的分类):ADE20K数据集里有很多让人都很容易弄错的分类:田野和泥土、墙和房子、建筑和摩天大楼。上图第二行黄框内,不可能既是摩天大楼又是建筑。这可以通过类别之间的关系弥补。(我理解,需要利用更大范围内的上下文才能知道黄框内是同一个分类,属于同一个物体)
Inconspicuous Classes(不显眼的分类):物体的尺度是变化的,比如街道这种大的物体超过了最深层特征的视野域,可能导致不连续的预测。上图第三行的枕头和床单很像,如果着眼于全局是无法准确预测枕头的。所以上下文信息也应该具有不同的粒度。
综上,Mismatched Relationship需要综合局部上下文就能解决,Confusion Categories需要较大范围的上下文,而Inconspicuous Classes问题则说上下文需要的粒度会随着场景改变。
结论就是要设计一个网络,能同时融合不同粒度的上下文信息。我个人觉得,上文说的不同区域的( different-region- based)上下文信息其实是说特征能融合的高级语义信息具有不同的(区域)大小粒度。
那怎么才能融合不同粒度的上下文信息呢?答案就是论文的核心:金字塔池化网络
网络的backbone使用空洞卷积改进的resnet,在网络中间增加了一个辅助loss分支,测试的时候辅助loss分支本删掉。
backbone将图像变为1/8大小的特征图,然后通过金字塔池化模块将特征变为不同的大小,然后上采样后和原特征拼接在一起。
注意上图(b)处的特征被金字塔池化模块使用最大池化分别池化为1x1、2x2、3x3、6x6大小,然后用1x1卷积把通道数降为1/K(K是金字塔池化模块内的分支数,这里为4),再把4个分支上采样到(b)处的大小,和(b)处的特征拼接在一起。最后一起被3次2倍上采样(外加一些卷积)输出原图大小的预测值。最后用交叉熵求分类损失。
每个技术点和trick作者都做了一些对比试验。
上文说了辅助loss分支,那么这个分支的权重是多少呢?作者对比试验表明,resnet50下0.4最佳。
加深网络深度,能够增加网络的性能。
上图表明,和没有金字塔池化比,有一个分支效果更好,4个分支效果更好。池化算法上,max比avg效果好。池化中缩减通道数也会增加性能。
上图表明数据增广、辅助损失分支、金字塔池化模块和多尺度测试都是加分项。特别是金字塔池化模块,收益很明显。
到目前(2019年3月)为止,PSPNet还在PASCAl VOC 2012的靠前位置,这说明了这个网络底子不错。
我觉得金字塔池化模块和inception模块的思路很像,那就是同时提供不同粒度(视野域)的上下文来供网络自己选择。最后证实这种思路很OK。
问题:UNet也利用了从高到低各个尺度的特征(上下文),怎么没这么独秀呢?PSPNet是通过3次2倍上采样恢复到原图大小的,这过程中如果把对应编码部分的3层特征复用上会不会表现更好呢?
补充:关于‘问题’第二点,后来看到deeplabV3+,其结构就是结合了空间金字塔池化模块和decoder跳跃连接。看来英雄所见略同。
关于上面第一点,个人猜测串联的特征融合方式可能是有缺陷的,并联的融合更能保留有用的信息。
虽然我看完了论文,这一小节还是多摘抄自《语义分割江湖的那些事儿——从旷视说起》,融合了一些我自己的体验。
GCN 主要将 Semantic Segmentation分解为:Classification 和 Localization两个问题。但是,这两个任务本质对特征的需求是矛盾的,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。
这个图真是清晰易懂,特别是右侧,特征的形状都标出来了。除了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网络有效感受野的对比。
在GCN中,随着 Kernel Size的增加,网络参数也随之增长,那么网络性能的提升是否得益于使用了更多的参数?为了证明提升来自于设计的有效性而不是增加了复杂度,文中设计了不同 Kernel Size的GCN和普通Conv的对比实验。
通过实验结果可知,随着 Kernel Size的增加,普通 Conv的参数量远大于GCN,但是GCN的性能却持续地优于普通 Conv。
GCN使用 Large Kernel Size增大了感受野,是否可以通过堆叠多个 Small Kernel Size的 Conv来替代?
文章为此设计了实验对比两者的结果。
可以看到 GCN 依然优于普通 Conv 的堆叠,尤其是在较大 Kernel Size 的情况下。个人认为,有些上下文信息经过多次映射会被稀释,这也许能解释PSPNet的成功(直接多个尺度的池化,减少的中间映射的次数)。
作者在论文里公布了自己的训练流程,很有参考意义:
在阶段1,图片被填充到640x640,后面两个阶段填充到512x512.
我个人感觉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