深度学习之语义分割DeepLabv3+算法解读

0 背景

与检测模型类似,语义分割模型也是建立是分类模型基础上的,即利用 CNN 网络来提取特征进行分类。对于 CNN 分类模型,一般情况下会存在 stride>1 的卷积层和池化层来降采样,此时特征图维度降低,但是特征更高级,语义更丰富。这对于简单的分类没有问题,因为最终只预测一个全局概率,对于分割模型就无法接受,因为我们需要给出图像不同位置的分类概率,特征图过小时会损失很多信息。其实对于检测模型同样存在这个问题,但是由于检测比分割更粗糙,所以分割对于这个问题更严重。但是下采样层又是不可缺少的,首先 stride>1 的下采样层对于提升感受野非常重要,这样高层特征语义更丰富,而且对于分割来说较大的感受野也至关重要;另外的一个现实问题,没有下采样层,特征图一直保持原始大小,计算量是非常大的。相比之下,对于前面的特征图,其保持了较多的空间位置信息,但是语义会差一些,但是这些空间信息对于精确分割也是至关重要的。这是语义分割所面临的一个困境或者矛盾,也是大部分研究要一直解决的。

对于这个问题,主要存在两种不同的解决方案,如下图所示。

其中 a 是原始的 FCN(Fully Convolutional Networks for Semantic Segmentation),图片送进网络后会得到小 32x 的特征图,虽然语义丰富但是空间信息损失严重导致分割不准确,这称为 FCN-32s,另外 paper 还设计了 FCN-8s,大致是结合不同 level 的特征逐步得到相对精细的特征,效果会好很多。

为了得到高分辨率的特征,一种更直观的解决方案是 b 中的 EncoderDecoder 结构,其中 Encoder 就是下采样模块,负责特征提取,而 Decoder 是上采样模块(通过插值,转置卷积等方式),负责恢复特征图大小,一般两个模块是对称的,经典的网络如 U-Net(U-Net: Convolutional Networks for Biomedical Image Segmentation)。而要直接将高层特征图恢复到原始大小是相对困难的,所以 Decoder 是一个渐进的过程,而且要引入横向连接(lateral connection),即引入低级特征增加空间信息特征分割准确度,横向连接可以通过 concat 或者 sum 操作来实现。

另外一种结构是 c 中的 DilatedFCN,主要是通过空洞卷积(Atrous Convolution)来减少下采样率但是又可以保证感受野,如图中的下采样率只有 8x,那么最终的特征图语义不仅语义丰富而且相对精细,可以直接通过插值恢复原始分辨率。天下没有免费的午餐,保持分辨率意味着较大的运算量,这是该架构的弊端。

这里介绍的 DeepLabv3+ 就是属于典型的 DilatedFCN,它是 Google 提出的 DeepLab 系列的第 4 弹。

1 整体架构

论文链接:https://arxiv.org/pdf/1802.02611.pdf

DeepLabv3+ 模型的整体架构如上图所示,它的 Encoder 的主体是带有空洞卷积的 DCNN,可以采用常用的分类网络如 ResNet,然后是带有空洞卷积的空间金字塔池化模块(Atrous Spatial Pyramid Pooling, ASPP)),主要是为了引入多尺度信息;相比DeepLabv3,v3+ 引入了 Decoder 模块,其将底层特征与高层特征进一步融合,提升分割边界准确度。从某种意义上看,DeepLabv3+ 在 DilatedFCN 基础上引入了 EcoderDecoder 的思路。

对于 DilatedFCN,主要是修改分类网络的后面 block,用空洞卷积来替换 stride=2 的下采样层,如下图所示:其中 a 是原始 FCN,由于下采样的存在,特征图不断降低;而 b 为 DilatedFCN,在第 block3 后引入空洞卷积,在维持特征图大小的同时保证了感受野和原始网络一致。

在 DeepLab 中,将输入图片与输出特征图的尺度之比记为 output_stride,如上图的 output_stride 为16,如果加上 ASPP 结构,就变成如下图所示。其实这就是 DeepLabv3 结构,v3+ 只不过是增加了 Decoder 模块。这里的 DCNN 可以是任意的分类网络,一般又称为 backbone,如采用 ResNet 网络。

2 空洞卷积

空洞卷积(Atrous Convolution)是 DeepLab 模型的关键之一,它可以在不改变特征图大小的同时控制感受野,这有利于提取多尺度信息。空洞卷积如下图所示,其中rate(r)控制着感受野的大小,r 越大感受野越大。通常的 CNN 分类网络的 output_stride=32,若希望 DilatedFCN 的 output_stride=16,只需要将最后一个下采样层的 stride 设置为1,并且后面所有卷积层的 r 设置为 2,这样保证感受野没有发生变化。对于 output_stride=8,需要将最后的两个下采样层的 stride 改为 1,并且后面对应的卷积层的 rate 分别设为 2 和 4。另外一点,DeepLabv3 中提到了采用 multi-grid 方法,针对 ResNet 网络,最后的 3 个级联 block 采用不同 rate,若 output_stride=16 且 multi_grid = (1, 2, 4), 那么最后的 3 个 block 的 rate= 2 · (1, 2, 4) = (2, 4, 8)。这比直接采用 (1, 1, 1) 要更有效一些,不过结果相差不是太大。

在这里插入图片描述

3 空间金字塔池化(ASPP)

SPP-Net是出自2015年发表在IEEE上的论文-《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》。在此之前,所有的神经网络都是需要输入固定尺寸的图片,比如 224×224(ImageNet)、32×32 (LenNet)、96×96 等。这样对于我们希望检测各种大小的图片的时候,需要经过 crop,或者 warp 等一系列操作,这都在一定程度上导致图片信息的丢失和变形,限制了识别精确度。而且,从生理学角度出发,人眼看到一个图片时,大脑会首先认为这是一个整体,而不会进行 crop 和 warp,所以更有可能的是,我们的大脑通过搜集一些浅层的信息,在更深层才识别出这些任意形状的目标。

ASPP(Atrous Spatial Pyramid Pooling)是 DeepLab 中用于语义分割的一个模块。由于被检测物体具有不同的尺度,给分割增加了难度。一种方法是通过 rescale 图片,分别经过 DCNN(Deep Convolutional Neural Network) 检测,然后融合,但这种方法计算量大。DeepLab 就设计了一个 ASPP 的模块,既能得到多尺度信息,计算量又比较小,其中还使用了空洞卷积(Atrous Convolution)的方法

在 DeepLab 中,采用空间金字塔池化模块来进一步提取多尺度信息,这里是采用不同 rate 的空洞卷积来实现这一点。ASPP 模块主要包含以下几个部分:

(1) 一个 1×1 卷积层,以及三个 3x3 的空洞卷积,对于 output_stride=16,其 rate 为(6, 12, 18) ,若 output_stride=8,rate 加倍(这些卷积层的输出 channel 数均为 256,并且含有 BN 层);

(2)一个全局平均池化层得到 image-level 特征,然后送入 1x1 卷积层(输出 256 个 channel),并双线性插值到原始大小;

(3)将(1)和(2)得到的 4 个不同尺度的特征在 channel 维度 concat 在一起,然后送入 1x1 的卷积进行融合并得到 256-channel 的新特征。

在这里插入图片描述

4 Decoder

对于 DeepLabv3,经过 ASPP 模块得到的特征图的 output_stride 为 8 或者 16,其经过 1x1 的分类层后直接双线性插值到原始图片大小,这是一种非常暴力的 decoder 方法,特别是 output_stride=16。然而这并不利于得到较精细的分割结果,故 v3+ 模型中借鉴了 EncoderDecoder 结构,引入了新的 Decoder 模块,如下图所示。首先将 encoder 得到的特征双线性插值得到 4x 的特征,然后与 encoder 中对应大小的低级特征 concat,如 ResNet 中的 Conv2 层,由于 encoder 得到的特征数只有 256,而低级特征维度可能会很高,为了防止 encoder 得到的高级特征被弱化,先采用 1x1 卷积对低级特征进行降维(paper 中输出维度为 48)。两个特征 concat 后,再采用 3x3 卷积进一步融合特征,最后再双线性插值得到与原始图片相同大小的分割预测。

5 改进的Xception

DeepLabv3 所采用的 backbone 是 ResNet 网络,在 v3+ 模型作者尝试了改进的 Xception,Xception 网络主要采用 depthwise separable convolution,这使得 Xception 计算量更小。改进的 Xception 主要体现在以下几点:
(1)参考 MSRA 的修改(Deformable Convolutional Networks),增加了更多的层;
(2)所有的最大池化层使用 stride=2 的 depthwise separable convolutions 替换,这样可以改成空洞卷积 ;
(3)与 MobileNet 类似,在 3x3 depthwise convolution 后增加 BN 和 ReLU。

采用改进的 Xception 网络作为 backbone,DeepLab 网络分割效果上有一定的提升。作者还尝试了在 ASPP 中加入 depthwise separable convolution,发现在基本不影响模型效果的前提下减少计算量。

6 总结

关于 DeepLab 模型的实现,Google 已经开源在 tensorflow/models,采用 Google 自家的 slim 来实现的。DeepLab 作为 DilatedFCN 的典范还是值得学习的,其分割效果也是极其好的。但是由于存在空洞卷积,DeepLab 的计算复杂度要高一些,特别是 output_stride=8,对于一些要求低延迟的场景如无人车,还是需要更加轻量级的分割模型,这也是近来的研究热点。

参考

(1)人人必须要知道的语义分割模型:DeepLabv3+

(2)SPP-Net、Atrous Convolution以及ASPP by Rose

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页