关于「Xception」和「DeepLab V3+」的那些事

简介:

前言
最近读了 Xception [1] 和 DeepLab V3+ [2] 的论文,觉得有必要总结一下这个网络里用到的思想,学习的过程不能只是一个学习网络结构这么简单的过程,网络设计背后的思想其实是最重要的但是也是最容易被忽略的一点。
Xception (Extreme Inception)
卷积层的学习方式
在一层卷积中我们尝试训练的是一个 3-D 的 kernel,kernel 有两个 spatial dimension,H 和 W,一个 channel dimension,也就是 C。
这样一来,一个 kernel 就需要同时学习 spatial correlations 和 cross-channel correlations,我把这里理解为,spatial correlations 学习的是某个特征在空间中的分布,cross-channel correlations 学习的是这些不同特征的组合方式。
Inception的理念
首先通过一系列的 1x1 卷积来学习 cross-channel correlations,同时将输入的维度降下来;再通过常规的 3x3 和 5x5 卷积来学习 spatial correlations。这样一来,两个卷积模块分工明确。Inception V3 中的 module 如下图。
89
Inception的假设
corss-channels correlations 和 spatial correlations 是分开学习的,而不是在某一个操作中共同学习的。
Inception到Xception的转变
首先考虑一个简版的 Inception module,拿掉所有的 pooling,并且只用一层 3x3 的卷积来提取 spatial correlations,如 Figure2。
90

▲ 简版Inception


可以将这些 1x1 的卷积用一个较大的 1x1 卷积来替代(也就是在 channel 上进行 triple),再在这个较大卷积产生的 feature map 上分出三个不重叠的部分,进行 separable convolution,如 Figure3。
91
这样一来就自然而然地引出:为什么不是分出多个不重叠的部分,而是分出三个部分来进行 separable convolution 呢?如果加强一下 Inception 的假设,假设 cross-channel correlations 和 spatial correlations 是完全无关的呢?
沿着上面的思路,一种极端的情况就是,在每个 channel 上进行 separable convolution,假设 1x1 卷积输出的 feature map 的 channel 有 128 个,那么极端版本的 Inception 就是在每个 channel 上进行 3x3 的卷积,而不是学习一个 3x3x128 的 kernel,取而代之的是学习 128 个 3x3 的kernel。
将 spatial correlations 的学习细化到每一个 channel,完全假设 spatial correlations 的学习与 cross-channel correlations 的学习无关,如 Figure4 所示。
92
Xception Architecture
一种 Xception module 的线性堆叠,并且使用了 residual connection,数据依次流过 Entry flow,Middle flow 和 Exit flow。
93
顺便写一点读 Xception 时的小发现,Xception 的实验有一部分是关于应不应该在 1x1 卷积后面只用激活层的讨论,实验结果是:如果在 1x1 卷积后不加以激活直接进行 depthwise separable convolution,无论是在收敛速度还是效果上都优于在 1x1 卷积后加以 ReLU 之类激活函数的做法。
这可能是因为,在对很浅的 feature(比如这里的 1-channel feature)进行激活会导致一定的信息损失,而对很深的 feature,比如 Inception module 提取出来的特征,进行激活是有益于特征的学习的,个人理解是这一部分特征中有大量冗余信息。
DeepLab V3+
论文里,作者直言不讳该框架参考了 spatial pyramid pooling (SPP) module 和 encoder-decoder 两种形式的分割框架。前一种就是 PSPNet 那一款,后一种更像是 SegNet 的做法。
ASPP 方法的优点是该种结构可以提取比较 dense 的特征,因为参考了不同尺度的 feature,并且 atrous convolution 的使用加强了提取 dense 特征的能力。但是在该种方法中由于 pooling 和有 stride 的 conv 的存在,使得分割目标的边界信息丢失严重。
Encoder-Decoder 方法的 decoder 中就可以起到修复尖锐物体边界的作用。
关于Encoder中卷积的改进
DeepLab V3+ 效仿了 Xception 中使用的 depthwise separable convolution,在 DeepLab V3 的结构中使用了 atrous depthwise separable convolution,降低了计算量的同时保持了相同(或更好)的效果。
Decoder的设计
Encoder 提取出的特征首先被 x4 上采样,称之为 F1;
Encoder 中提取出来的与 F1 同尺度的特征 F2' 先进行 1x1 卷积,降低通道数得到 F2,再进行 F1 和 F2 的 concatenation,得到 F3;
为什么要进行通道降维?因为在 encoder 中这些尺度的特征通常通道数有 256 或者 512 个,而 encoder 最后提取出来的特征通道数没有这么多,如果不进行降维就进行 concate 的话,无形之中加大了 F2' 的权重,加大了网络的训练难度。
对 F3 进行常规的 3x3 convolution 微调特征,最后直接 x4 upsample 得到分割结果。
94
还有值得关注的一点是,论文提出了 Xception 的改良版,可以用来做分割:
95
与 Xception 不同的几点是:
层数变深了
所有的最大池化都被替换成了 3x3 with stride 2 的 separable convolution
在每个 3x3 depthwise separable convolution 的后面加了 BN 和 ReLU
作者也把 Xception 当作了 Encoder,没有使用 DeepLab V3 中的 multi-grid 方法,得到的效果是所有模型中最好的。
在 PASCAL VOC 2012 验证集上的表现:
96
在 PASCAL VOC 2012 测试集上的表现:
97
一点总结
纵观语义分割的模型发展,从最初的 Encoder-Decoder 框架,到后来的 DeepLab、PSPNet 框架,到去年的 RefineNet 框架,每个框架都有其独到之处,但是 DeepLab V3+ 综合了 DeepLab、PSPNet 和 Encoder-Decoder,得到的效果是最好的,是思想的集大成者,或许在 RefineNet 类的框架和其他的框架之间也有可以探寻的结构。
相关链接
[1] Xception: Deep Learning with Depthwise Separable Convolutions
https://www.paperweekly.site/papers/1460
https://github.com/kwotsin/TensorFlow-Xception
[2] Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
https://www.paperweekly.site/papers/1676
https://github.com/tensorflow/models/tree/master/research/deeplab

原文发布时间为:2018-03-26
本文作者:崔权
本文来自云栖社区合作伙伴“PaperWeekly”,了解相关信息可以关注“PaperWeekly”微信公众号

相关文章
|
4月前
|
编解码 Python
解读deepLabV3+时遇到的问题总结
环境问题 python :3.10.12 ModuleNotFoundError: No module named ‘torchvision.models.utils 起初pip以下这个包,也没有解决问题;后来发现是版本的问题。
50 0
|
8月前
|
机器学习/深度学习 数据挖掘 PyTorch
图像分类经典神经网络大总结(AlexNet、VGG 、GoogLeNet 、ResNet、 DenseNet、SENet、ResNeXt )
图像分类经典神经网络大总结(AlexNet、VGG 、GoogLeNet 、ResNet、 DenseNet、SENet、ResNeXt )
925 0
图像分类经典神经网络大总结(AlexNet、VGG 、GoogLeNet 、ResNet、 DenseNet、SENet、ResNeXt )
|
9月前
|
机器学习/深度学习 编解码
EfficientNet介绍
EfficientNet介绍
91 0
EfficientNet介绍
|
10月前
|
机器学习/深度学习 编解码
UNet介绍及其相关思考
UNet介绍及其相关思考
|
11月前
|
编解码 人工智能 固态存储
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(2)
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型
188 0
|
11月前
|
机器学习/深度学习 数据采集 编解码
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型(1)
R-FCN、Mask RCNN、YoLo、SSD、FPN、RetinaNet…你都掌握了吗?一文总结目标识别必备经典模型
101 0
|
11月前
|
机器学习/深度学习 PyTorch TensorFlow
DenseNet、MobileNet、DPN…你都掌握了吗?一文总结图像分类必备经典模型(三)
DenseNet、MobileNet、DPN…你都掌握了吗?一文总结图像分类必备经典模型
160 0
|
11月前
|
机器学习/深度学习 人工智能 搜索推荐
DenseNet、MobileNet、DPN…你都掌握了吗?一文总结图像分类必备经典模型(四)
DenseNet、MobileNet、DPN…你都掌握了吗?一文总结图像分类必备经典模型
131 0
|
11月前
|
机器学习/深度学习 编解码 PyTorch
DenseNet、MobileNet、DPN…你都掌握了吗?一文总结图像分类必备经典模型(二)
DenseNet、MobileNet、DPN…你都掌握了吗?一文总结图像分类必备经典模型(二)
117 0
|
11月前
|
机器学习/深度学习 编解码 自然语言处理
EfficientNet、ShuffleNet、NFNet…你都掌握了吗?一文总结图像分类必备经典模型(三)
EfficientNet、ShuffleNet、NFNet…你都掌握了吗?一文总结图像分类必备经典模型(三)
149 0
EfficientNet、ShuffleNet、NFNet…你都掌握了吗?一文总结图像分类必备经典模型(三)