先谈谈背景
对于传统的图像分类问题而言,我们希望图像分类算法产生的特征尽量拥有空间不变性、尺度不变性和旋转不变性。因为图像中如果是一只鹰,无论他的大小、位置、旋转角度,我们都希望算法能识别出他是一只鹰,所以我们都希望在图像分类算法最后产生的特征具有空间不变性、尺度不变性和旋转不变性。这样就导致了分类算法中,卷积网络产生的特征一般经过多层卷积、经过多次池化(池化会引入空间不变性、尺度不变性和旋转不变性),产生的特征图会比较小,且常常会在网络的最后一层添加 FC 层或者全局池化层用来综合全图的信息,这样大范围的特征融合会产生非局部的特征,综合了整个特征图的信息,产生对大小、位置、旋转角度不敏感的特征。
对于一般的目标检测 (定位) 问题而言,我们希望目标检测的算法产生的特征对位置敏感、对大小敏感。因为目标的位置和大小都有可能产生变化,因此算法产生的特征需要对这些变化比较敏感。所以一般的检测算法会在保留信息方面下功夫,因为浅层的空间信息是有利于目标检测 (定位) 的。
有一种假设在直觉上说明了何种特征对分类问题有利、何种特征对检测 (定位) 有利:浅层的特征通常包含轮廓、纹理等空间信息对检测 (定位) 问题有利,而深层特征通常包含我们无法从视觉上直接理解的信息,即语义信息,对分类问题有利。
进入正题:
DeepLabV1\V2\V2\V3 + 瞄准的领域是语义分割:即给定一张图,将图中每个像素点进行分类。大概完成的工作如图 1 所示。
图 1:语义分割的任务
这个图上我们大概可以知道,语义分割的任务其实涉及了定位和分类两个问题。单纯的定位能力强或者分类能力强的算法在语义分割这一领域并不能表现很好的分割效果。
DeepLab V1
DeepLabV1的创新点主要在于,引入了 “atrous convolution” 即我们常说的空洞卷积、引入了 DenseCRF 和多尺度 (特征融合) 预测。其中最大的创新点在于空洞卷积”,DenseCRF 在 V3 版本被作者放弃,而多尺度融合的方法在后面的论文中一直在变,唯一一直没有变化的就是在 V1 版本中提出的空洞卷积。
先说说空洞卷积大概是什么,我们再谈为什么会引入空洞卷积:
图 2:一维情况下常规卷积和空洞卷积,a) 部分是常规的 kernel 为 3 卷积 b) 引入的 rate 为 2 的 kernel 为 3 的空洞卷积
从图 2 可以看出,相比于普通的卷积,空洞卷积实际上就是在利用卷积核进行点乘的时候跳过了 rate 个像素。依照一维的情况,二维的空洞卷积应当不难推出。具体的空洞卷积解释可以上网进行搜索,很多大佬都对这个进行过说明和解释,我就不在此赘述了。
那空洞卷积有什么用?在最开始的段落中我们提到,为了保障算法产生的特征的空间不变性、尺度不变性和旋转不变性,针对分类问题的网络通常会执行多个下采样层以保障特征具有以上的三个特性。但是下采样层的应用会造成特征图的减小,在下采样的过程中我们会丢失很多细节信息,会造成网络整体定位能力的缺失。所以在语义分割网络中,下采样的过多使用会造成目标分割边界的不准确,但过少又会造成整体分割的不足。而空洞卷积则正是瞄准这个问题而来的。
我们可以看到 rate 为 2,kernel 为 33 的空洞卷积,在感受野上同经过 2 倍下采样再进行 33 的卷积十分接近的。(rate 为 2 的 33 空洞卷积感受野为 7 或 5,而下采样后在 33 普通卷积感受野为 6)。两倍下采样其实可以理解为将图像中四分之三的像素点值变成零,rate 为 2 的 3*3 空洞卷积则可以理解为将卷积核中四分之三个参数置为 0,所以两者基本等效的。
图 3:空洞卷积原文的示例图,显示 rate 为 2 的空洞卷积感受野为 7,但我认为是 5,最外围一圈是不算的
这样,我们通过空洞卷积即消除了因为下采样带来的定位能力退化的这一问题,也保持了网络的分类能力。
但是空洞卷积也有自己的缺点,就是太耗显存了。
然后我们再谈,DeepLabV1 中使用的多尺度预测:
他的方法其实就是常用的信息综合方法,即从主干网络的不同 pooling 层提取特征图,同最高层信息融合再输出。论文中没有给出他具体的网络结构,所以我大概画一下他的示意图。
而 DenseCRF 部分,由于这个系列 V3\V3 + 都没有应用此技术,所以就不再此多做赘述了。但是值得一提的是,DenseCRF 是有效果的,但是效果和收益不成正比,在论文中提到 DenseCRF 做一次的平均时间是 0.5S,所以小伙伴们酌情考量哦。
DeepLabV1 了解了之后,这个系列后续文章就很简单了。
DeepLabV2
DeepLabV2 核心的创新在于空洞卷积和 ASPP:
空洞卷积方面和 V1 基本一致,不过相比于 V1, 他补充了一个空洞卷积和下采样再卷积再上采样回来的效果对比图,意在展示下采样造成的信息丢失情况。这个可以更加直观的展示空洞卷积的效果,很 NICE。
图 4 下采样层带来的空间信息丢失
SPP和ASPP的对比区别可以参照:https://blog.csdn.net/lipengfei0427/article/details/109368471?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
注意SPP最初是提出来解决分类网络的,背景是不同尺寸的图片如何进行统一提取特征,简单说SPP是将特征图以固定3种数量的格子进行划分,对每个格子进行池化,最后再将结果进行concat;譬如3种数量为:16、4、1,则输出的shape为:16channel、4channel、1channel,最终输出为21cahnnel。
ASPP 全称空洞空间特征金字塔 (Atrous Spatial Pyramid Pooling),受启发与 SPP 的应用:瞄准的问题是语义分割中对象的多尺度问题,即,目标大小不均与导致的分割效果不佳的问题。大概是利用不同感受野大小的卷积去捕捉不同大小物体的特征,通常 ASPP 放在网络上采样层前的最后一层。(对于给定的输入以不同采样率的空洞卷积并行采样,将得到的结果concat到一起,扩大通道数,然后再通过1*1的卷积将通道数降低到预期的数值。相当于以多个比例捕捉图像的上下文。)
图 5:V2 版本中的 ASPP
DeepLabV3
在空洞卷积卷积部分 Multi_Grid 策略,同时对 ASPP 做了改进。
Multi_Grid 策略:**
为了利用卷积采样到不同尺寸的数据,在空洞卷积部分使用了 multi_grid 方法。我们首先定义一个空洞卷积 block,其内含 3 个空洞卷积,BR 为他的基础扩张率,mult_grid 为(1,2,4),那么 BR 为 2 的 block 中三个卷积的 rate 分别为 (BR, 2BR, 4BR)。
按我个人的理解:论文意思是以multi grid规律设定的空洞卷积扩张率(譬如这里是成倍rate:2、4、8、16)能带来更好的效果。
这个部分作者是拿来主义,所以论文中没有细讲,想要对此有详细了解的同学可以根据参考文献去找对应的论文详细了解。
ASPP 改进:(两个改进)
作者通过实验发现,膨胀率越大,卷积核中的有效权重越少,当膨胀率足够大时,只有卷积核最中间的权重有效,即退化成了1x1卷积核,并不能获取到全局的context信息。3x3的卷积核中有效权重与膨胀率的对应如下:
当 rate 率过大而特征图过小的时候,就可能造成产生的特征图仅有中间一部分是有效的,可以想象一下,一个 rate 为 9 的 33 卷积在 1010 大小的特征图上卷积,很显然仅有最中间的那几个像素点会有正常的值。所以在 V3 中作者删除了 rate 为 24 的空洞卷积。
为了融合图片级别的信息 (提高分类能力),作者又在 ASPP 中添加了这样一路(注意ASPP是(a),全局池化是(b),并行的两路):首先对特征进行全局平均池化、再进行 1*1 卷积调整 channel、上采样到原特征图大小。
两个分支都包含256个通道和正则化,最终concat到一起,1x1卷积将通道数为256。
图 6 v3 版本中改进的 ASPP
DeepLab V3+
https://www.jianshu.com/p/755b001bfe38
概述
在语义分割任务中,spatial pyramid pooling module(SPP)可以捕获更多尺度信息,encoder-decoder结构可以更好恢复物体的边缘信息。
作者主要工作:
- 原DeepLabv3当作
encoder
,添加decoder
得到新的模型(DeepLabv3+)。
如下图所示,作者把spatial pyramid pooling module
和Encoder-Decoder
融合成一体: - 把
Xception
和Depthwise separable convolution
应用到Atrous Spatial Pyramid Pooling
和decoder
中。
膨胀卷积
v1、v2中已详细说明,略….
深度可分离卷积(Depthwise separable convolution)
depthwise separable convolution
=depthwise convolution
+pointwise convolution
- depthwise convolution是在每个通道上独自的进行空间卷积
- pointwise convolution是利用1x1卷积核组合前面depthwise convolution得到的特征
- tensorflow支持atrous版的depthwise convolution
如下图所示:
为什么说要用它呢?
因为它能够保持性能
的同时大大减少计算量
,举个例子:
假若输入2通道
的特征,输出3通道
特征,卷积核大小为3x3
正常版卷积:参数量=2x(3x3)x3=54
深度可分离卷积:参数量=2x3x3+2x1x1x3=24
注意:
第一部分为depthwise convolution(2x3x3),第二部分为
pointwise convolution(2x1x1x3)
网络整体结构
- Encoder
Encoder就是原来的DeepLabv3,注意点有2点:
- 输入尺寸与输出尺寸比(output stride = 16),最后一个stage的膨胀率rate为2
- Atrous Spatial Pyramid Pooling module(ASPP)有四个不同的rate,额外一个全局平均池化
- Decoder
明显看到先把encoder的结果上采样4倍,然后与resnet中下采样前的Conv2特征concat一起,再进行3x3的卷积,最后上采样4倍得到最终结果
需要注意点:
- 融合低层次信息前,先进行1x1的卷积,目的是降通道(例如有512个通道,而encoder结果只有256个通道)
主干网络
作者在MSRA基础上作了些修改:
- 更深的Xception结构,并不修改entry flow network结构
- 所有的max pooling结构被stride=2的深度可分离卷积代替
- 每个3x3的depthwise convolution都跟BN和Relu
改进后的结构如下:
实验
- decoder结构上的探索
- 训练时
上采样输出结果
比下采样真值
提升1.2% - 低层次信息通道数多少个比较合适(1x1卷积的通道数)
- 哪个底层的细节信息较好&3x3的卷积如何构成
- 作者验证了U-Net和SegNet类似的解码结构在此网络上并没有多少提升
- Backbone为Resnet101的结果
- Backbone为Xception的结果后记:
DeepLab 系列文章,最主要的是提出了空洞卷积和 ASPP 的概念,通过这两个策略的使用,DeepLab 成功对的提升了语义分割领域的效果。但最应该关注的点并不是空洞卷积和 ASPP,而是他们关注的两个问题,1)如何尽可能的在提取语义信息的时候不丢失空间信息。2)如何融合多尺度信息。
https://zhuanlan.zhihu.com/p/114601776
https://zhuanlan.zhihu.com/p/114601776