近期在看一些Segmentation的文章,很多用到了encoder-decoder的结构,encoder基本都是各类的CNN很熟悉了,decoder涉及到上采样或者反卷积的各种方法,这里直接做一个总结。
网上很多的总结都是按照方法总结,但总感觉缺点儿上下文,因此本文以论文为梳理对象,总结一下不同论文里用到的上采样方法。
当然,论文的梳理不只包括Segmentation的文章,后面遇到涉及到上采样的文章也会总结到这里。
1. Semantic Segmentation
1.1 Fully Convolutional Networks for Semantic Segmentation(CVPR2015)
FCN文中上采样用的是反卷积(Transpose conv),然后用二次插值做初始化。
1.2 Learning Deconvolution Network for Semantic Segmentation (ICCV2015)
这篇文章decoder用到了deconvolution network,其中包括deconvolution以及unpooling层,来预测每个像素的label以及segmentation mask。
1.3 SegNet(TPAMI 2017)
实现: en_output,indices = torch.nn.functional.max_pool2d(*args,return_indices=True)// de_output = torch.nn.functional.max_unpool2d(input,indices,*args,target_size=None)
SegNet的主要创新点在于decoder中上采样的方法。
SegNet使用与decoder相关联的encoder中的max-pooling的indices来实现对输入feature map的非线性的上采样(这里和deconvnet是一样的,区别是encoder没有全连接且是端到端训练)。这样的操作有以下几个好处:
- 可以提升边缘的划分
- 可以减少参数量,实现端到端训练
- 适用于所有encoder-decoder结构的模型
文中也分析了SegNet的decoder和FCN、DeconvNet、UNet的不同 - 与DeconvNet的不同:DeconvNet有更多的参数(由于fc层的存在),难以端到端训练;
- 与U-Net的不同:U-Net没有使用pooling indices,是将整个encoder的feature map给到decoder(skip connection)来通过反卷积上采样,耗费更多的内存;U-Net没有使用VGG的最后一层con5和max-pool
- 与FCN比较:FCN的decoder需要在inference的时候存encoder的feature map,消耗内存。Table1可以看出,SegNet与FCN相比胜在了内存占用,但是输在了inference的时间。
1.4 DeepLab Family(v1~v3+)
DeepLab v1和v2(TPAMI2018)中上采样的方法使用的就是二次线性插值,后面跟CRF来优化边缘。
DeepLab v3没有用到DanseCRF进行后处理。用ASPP进行下采样,然后直接一次性用二次线性插值(16x)上采样到原图的分辨率。
DeepLab v3+在v3的基础之上加了一个decoder,融合了encoder的某一层,进行两次二次线性插值的上采样,具体操作看下图。
1.5 RefineNet (CVPR2017)
这篇工作提出:
对于使用反卷积进行上采样的方法难以恢复因为下采样而导致的low-level的视觉特征,从而导致边缘和细节的预测精度下降;
对于DeepLab等使用空洞卷积的工作,需要对于高维特征进行多次的空洞卷积,导致computation expansive。此外,大量的高维高解析的feature map需要耗费大量的GPU内存,尤其是在训练的时候(最大1/8,in practice)。另外,空洞卷积是一种粗糙的下采样方式,导致失去了重要的细节信息;
对于FCN等使用中间层来生成高解析的预测方法,该工作认为,不同level的特征对于语义分割都是有帮助的。其中,high-level用来进行分类,low-level用来进行生成细节和边缘。对于中间层的特征如何进行利用需要进一步的讨论。
因此,本篇工作提出了新的模型结构来高效的利用多level的特征来生成高解析的预测。具体而言,其利用low-level的视觉特征来细化high-level的语义特征。