图像分割deeplab系列

DeepLab系列是谷歌团队提出的一系列语义分割算法。DeepLab v1于2014年推出,并在PASCAL VOC2012数据集上取得了分割任务第二名的成绩,随后2017到2018年又相继推出了DeepLab v2,DeepLab v3以及DeepLab v3+。DeepLab v1的两个创新点是空洞卷积(Atros Convolution)和基于全连接条件随机场(Fully Connected CRF)。DeepLab v2的不同之处是提出了空洞空间金字塔池化(Atros Spatial Pyramid Pooling,ASPP)。DeepLab v3则是对ASPP进行了进一步的优化包括添加 1×1 卷积,BN操作等。DeepLab v3+则是仿照U-Net的结构添加了一个向上采样的解码器模块,用来优化边缘的精度。下面我们依次介绍这四个算法。

1. DeepLab v1

DeepLab v1有两个核心点,即:空洞卷积和CRF。它首先将VGG的普通卷积替换为空洞卷积得到分隔图,在通过CRF将得到的分割图进行后处理优化,如图1所示。

1.1 空洞卷积

在全卷积网络中,Feature Map上像素点的感受野取决于卷积和池化操作。普通卷积的感受野每次只能增加两个像素,增长速度过于缓慢。传统卷积网络的感受野的增大一般采用池化操作来完成,但是池化操作在增大感受野的同时会降低图像的分辨率,从而丢失一些信息。而且对池化之后的图像在进行上采样会使很多细节信息无法还原,最终限制了分割的精度。

那么如何在不使用池化的情况下扩大感受野呢?空洞卷积应运而生。顾名思义,空洞卷积就是往卷积操作中加入“空洞”(值为0的点)来增加感受野。空洞卷积引入了扩张率(dilated ration)这个超参来制定空洞卷积上两个有效值之间的距离:扩张率为 r的空洞卷积,两个有效值之间有 r−1 个空洞,如图2所示。其中红色的点为有效值,绿色的放个为空洞。如图2.(a)所示,$r=1$是空洞卷积变为普通卷积。

扩张率为 � 的空洞卷积可以标识为式(1)。

如图2的(b)和(c)所示, r=1 和 r=3 的空洞卷积的感受野分别是 7×7 和 15×15 ,但是它们的参数数量依旧是 9 个。目前的深度学习框架对空洞卷积都支持的非常好,仅设置扩张率一个超参即可。

1.2 全连接条件随机场

1.3 DeepLab v1的网络结构

DeepLab v1采用了VGG-16作为基础架构,不同的是DeepLab将降采样的倍数从32 倍下降至 8 倍,它是通过将最后两个block的步长为 2 的max-pooling替换为步长为 1 的max-pooling(另一种说法是将max-pooling去掉)。

在DeepLab v1的论文中共提出了4个不同的网络结构,它们的的参数,准确率以及速度如表1。其中卷积的操作是指添加到网络中最后一层(fc6)的空洞卷积的超参。 从表中我们可以看出,DeepLab-CRF-LargeFOV(Field of View)无论是速度还是精度都表现比较优秀,因此也是被业内广泛采用的网络结构。

2. DeepLab v2

对比DeepLab v1,DeepLab v2依旧保持了图1的流程,即以空洞卷积和CRF为核心。DeepLab v2的改进点之一是将VGG-16替换成了残差网络。另外一个核心点便是引入了空洞空间金字塔池化(Atrous Spatial Pyramid Pooling,ASPP)。

2.1 ASPP

空间金字塔池化是在目标检测的经典算法SPP-Net[6]中提出的思想,它的核心思想是聚集不用尺度的感受野,ASPP的提出也是用于解决不同分割目标不同尺度的问题。它的网络结构如图3所示。

ASPP共提出了ASPP-S和ASPP-L两个不同尺度的ASPP,它们的不同点在扩张率的不同,两个ASPP的扩张率分别是 {2,4,8,12} 和 {6,12,18,24} 。在进行完空洞卷积后再增加两个 1×1 卷积进行特征融合,最后通过单位加得到最终的输出结果,如图4所示。在DeepLab v2中,Pool5之后的空洞卷积被替换为ASPP。

3. DeepLab v3

CRF在DeepLab v3中被移除,而这些都要得益于在网络层部分得到的优异表现,那么为什么DeepLab v3仅凭卷积网络就能达到由于DeepLab v2的效果呢,这得得益于它下面几点改进:

  1. 引入了Multi-Grid策略,即多次使用空洞卷积核而不像在v1和v2中仅使用一次空洞卷积;
  2. 优化ASPP的结构,包括加入BN等。

3.1 Multi-Grid策略

DeepLab v3的Multi-Grid策略参考了[7]的HDC(hybrid dilated convolution )的思想,它的思想是在一个block中连续使用多个不同扩张率的空洞卷积。HDC的的提出是为了解决空洞卷积可能会产生的gridding问题(图5)。这是因为空洞卷积在高层使用的扩张率变大时,它对输入的采样会变得很稀疏,进而导致丢失一些局部信息。而且会丢失一些局部相关性反而捕获了长距离一些语义上不相关的信息。

Gridding产生的原因是因为连续的空洞卷积使用了相同的扩张率。在图6.(a)中,连续使用了三个 r=2 的空洞卷积,那么对中心点分类结果的影响则源自于周围分连续的像素点。HDC的原理是对连续的空洞卷积使用不同的扩张率,如图6.(b)中使用的扩张率依次是 (1,2,3) ,那么影响中心点类别的则是连续的一个区域,因此也更容易产生连续的分割效果。同时因为使用了HDC后感受野变得更大了,一定程度上也可以提升模型的分割效果。

在DeepLab v3中,multi-grid的策略是指每个block的三个扩张率由multi-grid参数和unit-rate参数计算而来,例如 Multi-Grid=(1,2,4) ,unit_rate=2 ,那么这个block的三个空洞卷积的扩张率依次等于 2×(1,2,4)=(2,4,8) 。作者设计了一组对照实验来优化multi-gird的参数值,最终得到最优的结果是 (1,2,1) 。

3.2 DeepLab v3的ASPP

作者通过实验发现,随着空洞卷积的扩张率的增大,卷积核中有效的权重越来越少,因为随着扩张率的变大,会有越来越多的像素点的计算没法使用全部权重。当扩张率足够大时,只有中间的一个权重有作用,这时空洞卷积便退化成了 1×1 卷积。这里丢失权重的缺点还是其次,重要的丢失了图像全局的信息。

为了解决这个问题,DeepLab v3参考ParseNet[8]的思想,增加了一个由来提升图像的全局视野的分支。具体的说,它先使用GAP将Feature Map的分辨率压缩至 1×1 ,再使用 1×1 卷积将通道数调整为 256 ,最后再经过BN以及双线性插值上采样将图像的分辨率调整到目标分辨率。因为插值之前的尺寸是 1×1 ,所以这里的双线性插值也就是简单的像素复制。

DeepLab v3的另外一个分支则是由1个 1×1 卷积核三个扩张率依次为 (6,12,18) 的 3×3 空洞卷积组成。最后两个分支通过拼接操作组合在一起,再通过一个 1×1 卷积将通道数调整为 256 ,如图7所示。

3.3 DeepLab v3的网络结构

DeepLab v3也是使用残差网络作为骨干网络,它的Block-1到Block-4直接复制的残差网络的原始结构,然后又把block4复制了3次,得到了block5-7,它们的不同是使用了不同的扩张率,如图8所示。

4. DeepLab v3+

到目前为止,DeepLab系列都是在降采样8倍的尺度上进行预测的,导致了边界效果不甚理想。考虑到卷积网络的特征,DeepLab v3的网络的特征并没有包含过多的浅层特征,为了解决这个问题,DeepLab v3+借鉴了FPN等网络的encoder-decoder架构,实现了Feature Map跨block的融合。DeepLab v3+的另一个改进点在于使用了分组卷积来加速。下面我们详细介绍这两个改进

4.1 Encoder-Decoder架构

DeepLab v3+使用DeepLab v3作为Encoder,我们重点关注它的解码器模块。它分成7步:

  1. 首先我们先通过编码器将输入图像的尺寸减小16倍;
  2. 使用 1×1 卷积将通道数减小为 256 ,后再接一个BN,ReLU激活函数和Dropout;
  3. 使用双线性插值对对齐进行上采样 4 倍;
  4. 将缩放$4$倍处的浅层的特征依次经过 1×1 卷积将通道数减小为 48 ,BN,ReLU;
  5. 拼接3和4的Feature Map;
  6. 经过两组 3×3 卷积,BN,ReLU,Dropout;
  7. 上采样4倍得到最终的结果。

4.2 DeepLab v3+的Xception

这一部分的工作则是受到了可变形卷积[11]的影响,它们提出的基于Xception[10]的改进的网络结构叫做Aligned Xception(图10),DeepLab v3+的改进如下:

  1. Entry flow保持不变,但是增加了更多的Middle flow;
  2. 将步长为2的max-pooling替换为深度可分离卷积,这样也便于随时替换为空洞卷积;
  3. 在深度可分离卷积之后增加了BN和ReLU。

DeepLab v3+的Xception结构如图11所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/345160.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI教我学编程之C#类型

前言 在上一课 中我们通过C#入门程序了解到关于C#的基础知识,这节课我们来感受作为C家族最大的黑马,在TIOBE榜单 上受欢迎程度未来两个月可能超越java的存在:C#的魅力 重点先知 1、C#程序或DLL的源代码是一组类型声明。 2、对于可执行程序&…

Git新手?这篇文章带你飞!基础操作一网打尽!

推荐阅读 智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) 文章目录 推荐阅读Git初识Git啥是版本控制系统??集中式VS分布式 git使用…

基于kkFileView实现万能文件预览

基于kkFileView实现万能文件预览 1.简介 文档在线预览项目解决方案,项目使用流行的spring boot搭建,易上手和部署。万能的文件预览开源项目,基本支持主流文档格式预览 官网:https://kkview.cn/zh-cn/docs/home.html github地址…

如何使用网络测试仪构造特殊流量

为什么要仿真特殊流量 在现网中,网络流量时常伴随着突发,突发流量可能会造成网络的拥塞,从而产生丢包、抖动和时延,导致网络服务质量整体下降。面对宏观上的突发,通常采用在网络设备入向限速或者流量整形功能来消除突…

SQL性能分析-整理

昨日对MySQL的索引整理了一份小文档,对结构/分类/语法等做了一个小总结,具体文章可点击:MySQL-索引回顾,索引知识固然很重要,但引入运用到实际工作中更重要。 参考之前的文章:SQL优化总结以及参考百度/CSDN…

linux多进程基础(2):僵尸进程以及解决方法wait()函数(大白话解释)

在我的linux多线程多进程基础专栏中,已和大家一起分享了僵尸线程.在这一篇文章中我将分享僵尸进程以及解决方法wait()函数. 1.僵尸进程 什么是僵尸进程呢?用最通俗易懂的话来说就是子进程执行结束的时候其父进程并没有及时回收该子进程导致成为僵尸进程.如果僵尸进程数量较多…

FLUKE 8588A数字多用表

181/2461/8938产品概述: 福禄克校准8588A参考万用表是世界上最稳定的数字化万用表。这款长量程高精度参考万用表专为校准实验室设计,具有出色的精度和长期稳定性,测量范围广泛,具有直观的用户界面和彩色显示屏。8588A具有超过12种…

Java重修第五天—面向对象2

通过学习本篇文章可以掌握如下知识 static;设计单例;继承。 之前文章我们已经对面向对象进行了入门学习,这篇文章我们就开始深入了解面向对象设计。 static 我们定义了一个 Student类,增加姓名属性:name &#xff1…

Manjora 中使用idm,linux通用

说明 在Mnajora中的idm需要在wine中运行,idm是一款很不错的下载工具,但是在linux不能直接使用,借助wine也无法使用浏览器的集成插件,在网上偶然发现一款第三方插件能够在linux的浏览器中将链接捕捉到idm中,虽然使用起…

未来已来:C++17 并行STL性能测评

C17 并行STL使用与测评 目录 各个编译器支持进度并行算法库要求如何使用性能测试 最近在研究一些并行框架,发现C17之后STL支持并行,于是使用并做了个性能测评,在测评过程中遇到一些问题,特别是TTB,本文将会带大家扫盲学…

python24.1.13for循环

对列表、字典、字符串等进行迭代 range

【AI大模型应用开发】1.1 Prompt Engineering(提示词工程)- 用OpenAI API实战,优化方法论总结

书接上文 【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt,我们开始实战。 文章目录 0. 从最简单的开始0.1 通用代码封装0.2 使用 - 从最简单的Prompt开始0.2.1 temperature参数…