@Team
2019-04-06T12:23:03.000000Z
字数 6093
阅读 5439
黄海安
论文名称:Decoders Matter for Semantic Segmentation: Data-Dependent Decoding Enables Flexible Feature Aggregation
发表时间:2019.03 CVPR2019
非官方开源代码:https://github.com/LinZhuoChen/DUpsampling
语义分割目的是进行像素级分类,目前的语义分割模型都会对解码器最后一层输出进行各种双线性插值,本文指出这种过于简单和数据无关的操作可能会得到次优结果,故提出了和数据有关的上采样操作,在大幅降低计算量的前提下还能提高分割精度,具体创新如下:
(1) 提出一种简单高效的DUpsampling操作,可以有效替换双线性插值.
(2) 基于DUpsampling操作, 可以避免过度减少编码器的整体stride,显著减少计算时间和内存
(3) 由于DUpsampling 出色的表现,允许编码器将高低层特征进行任意组合,甚至是下采样,这种无限制的组合大大扩大了特征聚合的设计空间, 使得解码器能够利用更好的特征聚合
(4) 基于当前最高精度的deeplabv3+模型,加入DUpsampling,计算量缩减了70%,mIOU还有一定程度提高
总之,本文关注的是如何提高上采样模块计算速度和精度。
首先为了方便大家理解,下面列出目前常用的恢复高分辨率特征图的手段。
(1) 双线性插值
这个是最简单的,也是最常用的手段,直接对特征图进行双线性插值上采样到指定的倍数,其缺点是过于简单,无可学习参数,如果上采样倍数很多,分割效果会很差
(2) 反卷积插值
也就是常说的转置卷积,其优点是可训练,缺点是有补0操作 ,效果也一般,而且比较难训练
(3) 亚像素卷积插值
亚像素卷积sub-pixel,有些论文也叫作Depth-to-Space ,也叫dense upsampling convolution,一般大家都叫做Depth-to-Space,虽然实现上可能有一点区别,但是本质都一样,应用也比较广泛,其来源于超分辨率重建领域。
亚像素卷积提出的目的是在尽量减少可训练参数的前提下,保持空间结构信息,提高输出图分辨率。其简单示意图如下:
看图很容易理解,假设我想进行2倍上采样,那么我可以学习出特征图,其尺度为(h/2,w/2,4*C),然后通过上面的示意图中的特征重排,直接得到(h,w,C)的输出图。这种做法可以最大程度保存空间信息,且没有任何信息丢失,所以才叫做Depth-to-Space。如果希望不丢失信息,且进行下采样,那么可以用反操作Space-to-Depth,这个操作也应用非常广泛例如yolo系列中:
在yolo-v2的reorg层,其主要目标是前面的特征图维度(26 x 26 x 64)是后面的特征图(13 x 13 x1024)的2倍,passthrough层抽取前面层的每个的局部区域,然后将其转化为channel维度,对于(26 x 26 x 64)的特征图,经passthrough层处理之后就变成了(13 x 13 x256)的新特征图,然后才能特征融合。结合sub-pixel upsample的作用就很容易理解了,这样可以保证最大程度不丢失空间信息,且总的信息量不变,且可以保证能够和低分辨率特征融合。在yolo-v2中表明这种旁路+reorg操作可以提升1%。
亚像素卷积的完整流程如下:
上面三种常见的上采样操作各有优缺点,双线性插值方法最简单,应用也最多,反卷积做法训练参数太多,难以训练,相对而已亚像素卷积操作是最合适的做法,应用也是非常多,但是其问题是一般应用于低于4倍的上采样模块,如果一次上采样率过大,计算量和精度难以提高。针对上面三种问题,作者才提出DUSample,可以简单认为是亚像素卷积的提高版。
首先以DeepLabv3+为例分析:
编码器可以是renset或者Xnception,解码器包括了底层和高层特征融合,然后进行4倍双线性插值。
首先一个重要的发现是图片的语义分割标签Y并不是独立同分布的(i.i.d), 其中包含着结构信息, 以至于Y可以被压缩而不会造成太大的损失 。基于此我们可以对Y进行压缩,设,F是编码器最后一层输出的特征图,C是类别个数,注意C和可以不同,定义Y为one-hot形式的label,,通常,
好的,因为我们假设Y不是iid的,故可以对Y进行压缩变成,其尺度变的和F一样。那么我们压缩的流程是:
(1) 模仿Space-to-Depth操作流程,将原始的F使用大小为rxr的滑窗处理,提取数据, 获得一个个的(rxrxC')大小的数据块,r就是要进行上采样的倍数
(2) 每个patch都reshape为大小为1xN(N=rxrxC')的张量
(3) 对上述张量进行压缩, 从1xN变为1xC。核心就是步骤3
从1xN压缩为1xC,如下所示:
通过矩阵P进行压缩,通过W矩阵进行还原。尽管压缩方式有很多种,但是作者指出使用简单的线性映射就足够了。P和W矩阵的优化函数如下所示:
在我们得到W的基础上,整个语义分割的loss函数修改如下:
在实现方面,整个上采样过程可以采用point-wise点卷积实现,其实就是N个1x1xC卷积核进行计算,卷积核权重存储在W中固定的方式计算。点卷积计算如下所示:
上图来源参考文献1。具体实现,要把这个W矩阵参数分散到N个1x1xC的卷积核中才能计算,点卷积计算完成后进行特征重排即可。
文章还使用非线性自编码器进行了上采样实验。 对自编码器的训练也是为了最大限度地减少重建损失,实验观察来看,最终的语义预测精度几乎与使用更简单的线性重建手段是相同的,故本文全部使用简单的PCA方法计算权重。
作者发现如果直接这样实现,loss很难下降,作者怀疑是因为W矩阵的计算是采用one-hot的原因,原始softmax和DUpsampling联合,导致很难产生较为锐利的激活,结果导致交叉熵损失在训练中被卡住, 使得训练过程收敛很慢. 故在训练时候修改了下softmax,如下所示:
查看deeplabv3+,其融合策略可以总结为:
上面这种操作的优点,作者总结如下:
(1) 特征融合可以始终在低分辨率图上进行,也就是特征融合部分和上采样部分解耦
(2) 只有在与DUpsampling 联合时, 下采样低级特征的方案才能工作,因为上采样方法会限制住最终的性能
其实简单来说就是:我们的DUpsampling操作是非常强悍的,在输出低分辨率图的基础上就可以很好的恢复细节,故在特征融合上几乎没有限制,你甚至可以进行下采样操作,然后concat,但是以前的方法都不行,因为双线性插值能力非常有限,其必须在输出特征图本身就很高尺度的时候才不会损失信息(后面有实验验证),所以对高底层特征融合有限制,如果后面采用双线性插值上采样方法,那么前面的特征融合模块的作用很难发挥作用,因为被后面的上采样能力限制了。
总体网络结构修改如下:
采用ResNet-50和Xception-65作为骨架网络,其他设置和deeplabv3+完全相同。T初始化设置为1,最后一层输出特征图的通道数是ResNet=64,Xception=128,也就是说预计算的W尺度分别是N=4X4XC,,4是上采样倍数。使用以下两种数据集:PASCAL VOC 2012 和 PASCAL Context benchmark
为了证明本文所提上采样模块的优点,设计了一个非常简单的自编码网络,网络输入是GT label值,然后分别采用双线性插值和本文所提算法进行还原,验证其能力上限
最后一列是能力上限,可以看出所提算法不管是在16还是32 stride上都是能力都非常强。
然后采用 ResNet-50 作为骨架网络,解码器分别采用上述两种方法计算,得到的mIOU上图第三列所示。通过上表我们可以发现:DUpsampling效果优于bilinear,同时所提方法在output_stride=32的情况下效果与bilinear在output_stride=16的情况下结果相当。
下面验证说明融合不同的low-level特征对结果的影响
可以看出,融合后效果更好,但是值得说明的是,并不是所有底层特征融合都会提升结果,例如conv1_3,因为其结果不够鲁棒,或者说其特征过于低级。因此如何和low-level feature相结合对语义分割的结果有很大的影响,不知道Unet网络是否有这种现象。其实这个问题在EXFuse论文中有讲到,主要还是语义特征和空间特征的gap较大。
下表是不同的融合方式在两种上采样方法上的性能对比:
可以看到优于传统的双线性插值上采样方法,下图是可视化结果。
最终的指标如下:
一个容易想到的问题:W权重矩阵是预先计算的,那么如果我在预计算的基础上也进行微调,是否可以更好?或者我W矩阵就随机初始化,是否可以自己学习到W?个人看法是看你W矩阵恢复精度如何,如果已经可以恢复的很好,那么其实没有必要再次学习,但是对于某些数据集而言,例如强纹理数据或者说语义不明显数据集,那么就难说了,要看实验效果。
可以看出本文的FLOPS非常低,但是作者没有列出具体的FPS,代码也暂时没有公布,是否能达到实时还要看作者的代码。
纵览cvpr2019的语义分割论文,发现cvpr2018都在不考虑计算速度的前提下使劲提高mIOU,而2019年可能大家发现精度提高不了多少了,开始转向了实时语义分割,据我目前看到的论文,在实时方向上做文章的论文就有5篇,当然我把两篇蒸馏的也假设其满足实时要求,具体如下:
其中DUpsampling也就是本文在上采样方面做文章,思路非常不错;而fastFCN[ Rethinking Dilated Convolution in the Backbone for Semantic Segmentation]从空洞卷积计算效率很慢的角度进行考虑,提出了Joint Pyramid Upsampling,也是一个不错的思路;swiftNetRN直接从实时角度进行设计,并借助预训练权重的优点,从而得到较高精度和较快速度;其余两篇是蒸馏相关的操作,在不丢失精度的前提下压缩模型,其中用到的技巧很有借鉴意义。
由于本人水平有限,且作者代码没有开源,有理解错误或者不到位的,请各位谅解!部分内容参考了文献2。