Deeplab系列是谷歌团队的分割网络.

DeepLab V1

CNN处理图像分割的两个问题

  • 下采样导致信息丢失
    maxpool造成feature map尺寸减小,细节信息丢失.
  • 空间不变性
    所谓空间不变性,就是说比如一张狗的图,狗位于图片正中还是某一个角,都不影响模型识别出这是一个狗. 即模型对于输入图像的空间位置不敏感,不管这个图片旋转,平移等,都能够识别. 对分类来说,这是ok的.但是对于分割来说,这就不OK了,图片旋转以后,每一个像素所属的分类当然就改变了.
    究其原因,分类处理的是更"高级"的特征,而分割是对每一个像素做分类,需要更多的细节.

deeplab v1采用2个方法解决这两个问题

  • 空洞卷积
  • 条件随机场CRF

空洞卷积

为什么要有maxpool?
一方面是为了减小feature map尺寸.一方面也是为了增大feature map中的每一个元素的感受野.

FCN是怎么做的?
得到特征图后,用deconv的方式上采样将feature map恢复到原始图像尺寸.但是这种先max pool下采样再deconv上采样的过程势必会损失掉一部分信息.

deeplab如何解决这个问题?
deeplab提出了一种dilated conv(空洞卷积)的卷积方式,去替代max pool,但同时感受野不丢失.

dilated的好处是不做pooling损失信息的情况下,加大了感受野,让每个卷积输出都包含较大范围的信息。,对图像分割这种对空间位置,细节信息很敏感的任务而言,空洞卷积是一种很好的方式.

空洞卷积的卷积方式如下图所示:

(a)图对应3x3的1-dilated conv,和普通的卷积操作一样,(b)图对应3x3的2-dilated conv,实际的卷积kernel size还是3x3,但是空洞为1,也就是对于一个7x7的图像patch,只有9个红色的点和3x3的kernel发生卷积操作,其余的点略过。也可以理解为kernel的size为7x7,但是只有图中的9个点的权重不为0,其余都为0。 可以看到虽然kernel size只有3x3,但是这个卷积的感受野已经增大到了7x7(如果考虑到这个2-dilated conv的前一层是一个1-dilated conv的话,那么每个红点就是1-dilated的卷积输出,所以感受野为3x3,所以1-dilated和2-dilated合起来就能达到7x7的conv),(c)图是4-dilated conv操作,同理跟在两个1-dilated和2-dilated conv的后面,能达到15x15的感受野。对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野,也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

如何理解空洞卷积

CRF

由于CNN天然的空间不变性,使得对分割任务而言,CNN提取到的特征不够精细.所以在特征提取后,我们再加一个CRF,达到更精细的特征提取目的.

以前写过一篇条件随机场笔记

说白了,就是一堆特征提取函数(相当于CNN中的卷积核),对不同的特征提取函数赋以不同的权重(相当于全连接层),再做指数化和正则化(相当于softmax)得到一个概率值.

https://blog.csdn.net/hjimce/article/details/50888915

DeepLab V2

相较于v1

  • ASPP
  • 基础特征提取网络由vgg替换为resnet

重点是ASPP

ASPP(Atrous Spatial Pyramid Pooling)

看名字就知道了,空间金字塔.用以解决多尺度问题.即对同一个物体,不管其在图像中是大或小都可以准确识别.

具体如下:

用不同的空洞卷积对输入做卷积,再融合不同的feature map.


如上图所示,(a)是没有用ASPP的,(b)是用了ASPP的结构.

DeepLab V3

论文地址:https://arxiv.org/abs/1706.05587
v3对网络结构做了比较大的改变,主要是:

  • 去掉了crf.
  • 改造了resnet,在resnet中使用空洞卷积和金字塔空洞卷积

对resnet的改造体现在两点:

  1. 使用空洞卷积,去掉下采样,如此,保证感受野与feature map尺寸不变
  2. 在残差块内部使用ASPP,保证对多尺度的敏感

使用空洞卷积


feature map的尺寸减小的同时,相当于空间信息的丢失.图像分割对空间信息很敏感,所以保持feature map的size是非常重要的,deeplab系列的设计思路也是如此,即在保留感受野的情况下,同时保持feature map的size不变
(a)是普通的不带空洞卷积的方式,(b)通过空洞卷积的方式,在保持了感受野的同时,还没有减小feature map的尺寸.

aspp


在block内部使用rate不同的空洞卷积并行地做卷积,再对得到的feature做融合.

google团队的网络风格就是这样,总是喜欢在一种卷积方式上不断演化,inception系列如此,deeplab系列也是如此.

Deeplab的更多相关文章

  1. 第一章 DeepLab的创作动机

    这一段时间一直在做深度学习方面的研究,目前市场上的深度学习工具主要分为两大块.一块是基于Python语言的theano:另一块是可以在多个语言上使用并能够在GPU和CPU之间随意切换的Caffe.但是 ...

  2. deeplab hole algorithm

    最近看了几篇文章,其中均用到了hole algorithm. 最早用的就是deeplab的文章了,Semantic Image Segmentation with Deep Convolutional ...

  3. 从FCN到DeepLab

    图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类. 图像语义分割,从FCN把深度学习引入这个任务,一个通用的框架事:前端使用FCN全卷积网络输出粗糙的label map,后端使用CR ...

  4. 完整工程,deeplab v3+(tensorflow)代码全理解及其运行过程,长期更新

    前提:ubuntu+tensorflow-gpu+python3.6 各种环境提前配好 1.下载工程源码 网址:https://github.com/tensorflow/models 下载时会遇到速 ...

  5. 论文阅读笔记十:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs (DeepLabv2)(CVPR2016)

    论文链接:https://arxiv.org/pdf/1606.00915.pdf 摘要 该文主要对基于深度学习的分割任务做了三个贡献,(1)使用空洞卷积来进行上采样来进行密集的预测任务.空洞卷积可以 ...

  6. Deeplab v3+中的骨干模型resnet(加入atrous)的源码解析,以及普通resnet整个结构的构建过程

    加入带洞卷积的resnet结构的构建,以及普通resnet如何通过模块的组合来堆砌深层卷积网络. 第一段代码为deeplab v3+(pytorch版本)中的基本模型改进版resnet的构建过程, 第 ...

  7. Deeplab v3+的结构的理解,图像分割最新成果

    Deeplab v3+ 结构的精髓: 1.继续使用ASPP结构, SPP 利用对多种比例(rates)和多种有效感受野的不同分辨率特征处理,来挖掘多尺度的上下文内容信息. 解编码结构逐步重构空间信息来 ...

  8. DeepLab 使用 Cityscapes 数据集训练模型

    原文地址:DeepLab 使用 Cityscapes 数据集训练模型 0x00 操作环境 OS: Ubuntu 16.04 LTS CPU: Intel® Core™ i7-4790K GPU: Ge ...

  9. ubuntu——caffe配置deeplab

    1. 下载deeplab 2. 安装matio sudo apt-get install libmatio-dev 3. 修改Makefile文件 LIBRARIES += glog gflags p ...

  10. 封装caffe版的deeplab为库供第三方使用

    1.解决deeplab编译问题 http://m.2cto.com/kf/201612/579545.html

随机推荐

  1. vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多

    一.思路分析和效果图 用vue来实现一个瀑布流效果,加载网络图片,同时有下拉刷新和上拉加载更多功能效果.然后针对这几个效果的实现,捋下思路: 根据加载数据的顺序,依次追加标签展示效果: 选择哪种方式实 ...

  2. pinpoint实现告警推送至钉钉和微信群

    前言 在前面的文章中,我们学习了如何通过java实现将消息发送到钉钉.和将消息发送到微信群聊. 基于上述基础,我们今天来接入pinpoint的告警,发送到钉钉群. 实操前准备 开始之前,推荐阅读一下, ...

  3. 微信小程序--百度地图坐标转换成腾讯地图坐标

    最近开发小程序时出现一个问题,后台程序坐标采用的时百度地图的坐标,因为小程序地图时采用的腾讯地图的坐标系,两种坐标有一定的误差,导致位置信息显示不正确.现在需要一个可以转换两种坐标的方法,经过查询发现 ...

  4. Netty之缓冲区ByteBuf解读(一)

    Netty 在数据传输过程中,会使用缓冲区设计来提高传输效率.虽然,Java 在 NIO 编程中已提供 ByteBuffer 类进行使用,但是在使用过程中,其编码方式相对来说不太友好,也存在一定的不足 ...

  5. C# HttpWebRequest传递参数多种方式混合使用

    在做CS调用第三方接口的时候遇到了这样的一个问题,通过PSOTman调试需要分别在parmas.Headers.Body里面同时传递参数.在网上查询了很多资料,以此来记录一下开发脱坑历程. POSTm ...

  6. Java 集合源代码——ArrayList

    (1)可以查看大佬们的 详细源码解析 : 连接地址为 : https://blog.csdn.net/zhumingyuan111/article/details/78884746 (2) Array ...

  7. python shutil 文件(夹)的复制、删除、移动、压缩和解压

    高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 import shutil shutil.copy ...

  8. MongoDB数据库备份和恢复

    1.数据库备份 mogodbdump -h dbhost -d dbname -o dbdirectory -h: 服务器地址,也可以指定端口号 -d: 需要备份的数据库的名称 -o: 备份的数据库存 ...

  9. Kettle自定义jar包供javascript使用

    我们都知道 Kettle 是用 Java 语言开发,并且可以在 JavaScript 里面直接调用 java 类方法.所以有些时候,我们可以自定义一些方法,来供 JavaScript 使用. 本篇文章 ...

  10. selenium之窗口滚动

    在这里和大家分享一下,selenium里面常用于处理窗口滚动的方法. location_once_scrolled_into_view 一般用于定位窗口底部元素.将窗口拉到最底部. window.sc ...