DeepLab系列总结

  • DeepLab系列
    • DeepLab V1
    • DeepLab V2
    • DeepLab V3
    • DeepLab V3+

DeepLab系列

DeepLab网络是由Liang-Chieh Chen(下文以大神指代)与google团队提出来的,是一个专门用来处理语义分割的模型。目前推出了4个(或者说3.5个)版本。最近把四个版本从头撸了一遍,做一个简单的总结。

DeepLab V1

  • 原文:Semantic image segmentation with deep convolutional nets and fully connected CRFs
  • 收录:ICLR 2015 (International Conference on Learning Representations)
  • Backbone:VGG16
  • Contributions
    • Atrous convolution
    • CRF

DeepLab V1是基于VGG16网络改写的,一共做了三件事。


首先,去掉了最后的全连接层。做语义分割使用全卷积网络是大势所趋,DeepLab当然也不能例外。

然后,去掉了最后两个池化层。池化层是神经网络中的一个经典结构,没记错的话,BP解决了神经网络训练的软件问题(权重更新),pooling解决了训练的硬件问题(对计算资源的需求)。这就是池化层的第一个作用,缩小特征层的尺寸。池化层还有另一个重要作用,快速扩大感受野。为什么要扩大感受野呢?为了利用更多的上下文信息进行分析。


既然pooling这么好用,为什么要去掉俩呢?这个问题需要从头捋。先说传统(早期)DCNN,主要用来解决图片的分类问题,举个栗子,对于下边这张语义分割的图,传统模型只需要指出图片中有没有小轿车,至于小轿车在哪儿,不care。这就需要网络网络具有平移不变性。我们都知道,卷积本身就具有平移不变性,而pooling可以进一步增强网络的这一特性,因为pooling本身就是一个模糊位置的过程。所以pooling对于传统DCNN可以说非常nice了。
再来说语义分割。语义分割是一个end-to-end的问题,需要对每个像素进行精确的分类,对像素的位置很敏感,是个精细活儿。这就很尴尬了,pooling是一个不断丢失位置信息的过程,而语义分割又需要这些信息,矛盾就产生了。没办法,只好去掉pooling喽。全去掉行不行,理论上是可行的,实际使用嘛,一来显卡没那么大的内存,二来费时间。所以只去掉了两层。
(PS:在DeepLab V1原文中,作者还指出一个问题,使用太多的pooling,特征层尺寸太小,包含的特征太稀疏了,不利于语义分割。)

矛盾解决了,喜大普奔。
em……等等,好像忘了点儿啥。
哦,去了两个pooling,感受野又不够了怎么办?没关系,大神想了个办法,把atrous convolution借来用一下,这也是对VGG16的最后一个修改。atrous convolution人称空洞卷积(好像多称为dilation convolution,不过这是DeepLab的总结,那就得按DeepLab的来啊),相比于传统卷积,可以在不增加计算量的情况下扩大感受野,厉害了(?)。先上张图


空洞卷积与传统卷积的区别在于,传统卷积是三连抽,感受野是3,空洞卷积是跳着抽,也就是使用图中的rate,感受野一下扩大到了5(rate=2),相当于两个传统卷积,而通过调整rate可以自由选择感受野。这样感受野的问题就解决了。
另外,原文指出,空洞卷积的优势在于增加了特征的密度。盯着上边这张图我想了很久这个问题,虽然你画的密,但是卷积都是一对一的输入多大输出多大,怎么空洞卷积的特征就密了呢。~~一道闪电划过后,~~我终于想明白了,这张图你不能单独看,上边的传统卷积是经过pooling以后的第一个卷积层,而下边卷积输入的浅粉色三角正是被pooling掉的像素。所以,下边的输出是上边的两倍,特征多出了一倍当然密啦(?‍♂️)。

DeepLab V1的另一个贡献是使用条件随机场CRF提高分类精度。效果如下图,可以看到提升是非常明显的。具体CRF是什么原理呢?没有去研究,因为懒到了V3就舍弃了CRF。


最后来张DeepLab V1的全流程图,其中上采样直接使用了双线性采样。

DeepLab V2

  • 原文:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
  • 收录:TPAMI2017 (IEEE Transactions on Pattern Analysis and Machine Intelligence, 2017)
  • Backbone:ResNet-101
  • Contributions:ASPP

在DeepLab V2中,可能是觉得VGG16表达能力有限,于是大神换用了更复杂,表达能力更强的ResNet-101。ResNet是由另一位大神Kaiming He 何恺明提出的。


在V2中,大神同样对ResNet动了刀,刀法和V1相同。V2的贡献在于更加灵活的使用了atrous convolution,提出了空洞空间金字塔池化ASPP。还是先给图


虽然名字挺复杂,但是看图就能轻易理解ASPP作用,说白了就是利用空洞卷积的优势,从不同的尺度上提取特征。这么做的原因也很简单,因为相同的事物在同一张图或不同图像中存在尺度上的差异。还是以这张图为例,图中的树存在多种尺寸,使用ASPP就能更好的对这些树进行分类。


至于ASPP如何融合到ResNet中,看图说话。将VGG16的conv6,换成不同rate的空洞卷积,再跟上conv7,8,最后做个大融合(对应相加或1*1卷积)就OK了。

DeepLab V3

  • 原文:Rethinking Atrous Convolution for Semantic Image Segmentation
  • Backbone:ResNet-101
  • Contributions
    • ASPP
    • Going deeper with atrous convolution
    • Remove CRF

说是三个贡献也不准确,姑且这么说吧。先来说最后一个,舍弃了CRF,因为分类结果精度已经提高到不需要CRF了(也可能是CRF不起作用了,谁知道呢)。

另外两个贡献,一个是改进了ASPP,另一个是使用空洞卷积加深网络,这两者算是一个二选一吧,是拓展网络的宽度,还是增加网络的深度。一般说起DeepLab V3模型指的是前者,因为从大神给出的结果和后续发展来看,明显前者效果更好一些。

对于ASPP,大神在V3中做了两点改进。一是在空洞卷积之后使用batch normalization,大神说BN对训练很有帮助。理由嘛,没有。第二点是增加了1*1卷积分支和image pooling分支。增加这两个分支是为了解决使用空洞卷积带来的问题,随着rate的增大,一次空洞卷积覆盖到的有效像素(特征层本身的像素,相应的补零像素为非有效像素)会逐渐减小到1(这里没有图全靠脑补)。这就与我们的初衷(获取更大范围的特征)相背离了。所以为了解决这个问题,一是使用1*1的卷积,也就是当rate增大以后3*3卷积的退化形式,替代3*3卷积,减少参数个数;另一点就是增加image pooling,可以叫做全局池化,来补充全局特征。具体做法是对每一个通道的像素取平均,之后再上采样到原来的分辨率。

ASPP的变化就这么多,再来简单说说另一种思路Going deeper with atrous convolution。为什么要加深网络呢,我理解的是为了获取更大的感受野。提到感受野自然离不开空洞卷积。还是看图说话,很显然pooling用多了特征层都快小的看不见了,所以大神给出了使用空洞卷积不断加深网络的一种思路。就这么回事儿,没啥可说的了。

DeepLab V3+

  • 原文:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
  • Backbone:Xception
  • Contributions
    • Xception
    • Encoder-decoder structure

DeepLab V3+再次修改了主网络,将ResNet-101升级到了Xception。在原始的Xception的基础上,大神进行了三点修改:1)使用更深的网络;2)将所有的卷积层和池化层用深度分离卷积Depthwise separable convolution进行替代,也就是下图中的Sep Conv;3)在每一次3*3 depthwise convolution之后使用BN和ReLU。

因为V3+使用深度分离卷积替代了pooling,那么为了缩小特征层尺寸,有几个block的最后一层的stride就必须为2,也就是下图中标红的层。具体有几个取决于输出output stride(下采样的大小)的设置。


Xception的核心是使用了Depthwise separable convolution。Depthwise separable convolution的思想来自inception结构,是inception结构的一种极限情况。Inception 首先给出了一种假设:卷积层通道间的相关性和空间相关性是可以退耦合的,将它们分开映射,能达到更好的效果。在inception结构中,先对输入进行1*1的卷积,之后将通道分组,分别使用不同的3*3卷积提取特征,最后将各组结果串联在一起作为输出。

Depthwise separable convolution是将这种分组演化到了极致,即把每一个通道作为一组。先对输入的每一个通道做3*3的卷积,将各个通道的结果串联后,再通过1*1的卷积调整到目标通道数。


说了这么多,好像还没说到使用depthwise separable convolution的好处。好处也很简单,大幅缩减参数个数。幅度有多大呢?举个简单的栗子,假设输入输出都是64通道,卷积核采用3*3,那么传统卷积的参数个数为
3 ∗ 3 ∗ 64 ∗ 64 = 36864 3*3*64*64=36864 3∗3∗64∗64=36864
而Depthwise separable convolution为
3 ∗ 3 ∗ 64 + 1 ∗ 1 ∗ 64 ∗ 64 = 4672 3*3*64+1*1*64*64=4672 3∗3∗64+1∗1∗64∗64=4672
只有前者的八分之一多点儿,而且通道数越多,节省的参数越多。em……很逆天。

说完了backbone,再来说说V3+的整体结构。前三个版本都是backbone(ASPP)输出的结果直接双线性上采样到原始分辨率,非常简单粗暴的方法,下图中的(a)。用了三个版本,大神也觉得这样做太粗糙了,于是吸取Encoder-Deconder的结构,下图中的(b),增加了一个浅层到输出的skip层,下图中的©。

下面说说具体的skip方法。首先,选取block2中的第二个卷积输出(看代码这个是固定的),使用1*1卷积调整通道数到48(减小通道数是为了降低其在最终结果中的比重),然后resize到指定的尺寸,也就是output stride。然后,将ASPP的输出resize到output stride。最后将两部分串联起来做两次3*3的卷积。最后的最后再做一次1*1的卷积,得到分类结果。最后的最后的最后将分类结果resize到原来的分辨率,嗯,还是熟悉的双线性采样。

写不动了,最后来张完整的流程图吧。

以上纯属个人浅见,仅供参考。

DeepLab系列总结相关推荐

  1. 语义分割论文-DeepLab系列

    语义分割论文-DeepLab系列 DeepLabv1 收录:ICLR 2015 (International Conference on Learning Representations) 代码:gi ...

  2. 深度学习从入门到精通——图像分割之DeepLab系列算法

    DeepLab系列算法 图像分割传统做法 解决方案 参数计算 图像金字塔 SPP-Layer 常用的多尺度提取方法 ASPP(atrous convolution SPP) deepLabv3+ 图像 ...

  3. 【语义分割专题】语义分割相关工作--DeepLab系列

    DeepLab系列: DeepLabV1 贡献:首次把空洞卷积引入图形分割领域. 基本内容: 基于VGG16 去掉最后两个池化层改为卷积层(控制分辨率不要太小) 去掉全连接层(保留最后一个用于soft ...

  4. 语义分割丨DeepLab系列总结「v1、v2、v3、v3+」

    花了点时间梳理了一下DeepLab系列的工作,主要关注每篇工作的背景和贡献,理清它们之间的联系,而实验和部分细节并没有过多介绍,请见谅. DeepLabv1 Semantic image segmen ...

  5. DeepLab系列(v1,v2,v3,v3+)总结

    U-net: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 语义分割面临的挑战 1. DeepLab ...

  6. 深入理解DeepLab系列语义分割网络

    语义分割是指在像素级别上进行分类,从而转换得到感兴趣区域的掩膜.说起语义分割的发展则肯定绕不开DeepLab系列语义分割网络,该系列网络由谷歌团队提出并发展,在VOC2012等公用语义分割数据集上,取 ...

  7. Deeplab系列算法

    1.图像分割中的传统做法 为了增大感受野,通常都会选择pooling操作,但是也会丢失一部分信息   2. DeepLab系列方法 传统卷积 空洞卷积 通过设置dilated参数可以得到不同感受野的特 ...

  8. DeepLab大盘点 | 深入理解DeepLab系列语义分割网络

    作者 | 深蓝AI  编辑 | 汽车人 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[分割综述]获取语义分割.实 ...

  9. deeplab系列总结(转)

    转载 原文链接:https://blog.csdn.net/fanxuelian/article/details/85145558 DeepLab系列总结 文章目录 转载 DeepLab系列总结 De ...

最新文章

  1. 人像摄影哪家强?同为双摄的OPPO R11不敌金立S10
  2. oracle tarmout off,如何关闭oracle rac选项 make rac_off
  3. 光伏等新能源信用风险事件频繁爆发
  4. [翻译]创建ASP.NET WebApi RESTful 服务(9)
  5. 面向数据科学家的 Docker 最佳实践
  6. (四)BP神经网络预测(上)
  7. Grad-CAM绘画热力图 使用教程 pycharm+anaconda 论文画图 卷积神经网络CNN Resnet
  8. 【联盛德W806上手笔记】九、DMA
  9. 项目进度管理__计划评审技术之标准正态分布表
  10. 免费P2P穿透通信(4) RDT可靠通信模块测试使用
  11. docker安装linux-ubuntu桌面环境
  12. 电脑怎么既录屏又录人脸?分享2个宝藏方法,轻松学会
  13. Linux-Shell脚本练习
  14. centos7 SSH服务启动时报“main process exited, code=exited”status 255错误
  15. 怎么判断数字n是否为2的x次方,即2的幂次呢,比如2,4,8,16,32
  16. python分段函数图像画法_数值实验分段函数图像-Python绘图
  17. 如何提升专注力-----谨记
  18. 接招吧!最强“高并发”系统设计 46 连问,分分钟秒杀一众面试者
  19. 小孩孩子应用题计算机错误,为什么一二年级的孩子数学应用题总出错?
  20. 社交电商独角兽meesho融资5.7亿美元,海外S2B2C火热

热门文章

  1. 贝叶斯例题(一)先验分布与后验分布
  2. 2.1.1计算机网络(奈氏准则 香农定理 码元 速率 波特 带宽 物理层概念 通信方式 传输方式)
  3. 利用七牛云作为图片服务器
  4. python append使用方法
  5. oracle环境配置全过程
  6. Java生鲜电商平台-商城后台架构与原型图实战
  7. 论文阅读_中文医学预训练模型_MC-BERT
  8. 14.运算符(operator)
  9. 辨别 利用AAC转成无损格式音乐 的假无损
  10. Java代码审计——WebGoat CSRF (上)