深度学习论文笔记(七)---Deconvolution network-2016年(Learning Deconvolution Network for Semantic Segmentation )

深度学习论文笔记(七)---Deconvolution network

Learning Deconvolution Network for Semantic Segmentation

Author:H Noh , S Hong , B Han

Year:2016

1、  导引

2015年提出的FCN网络在Semantic segmentation上取得了较好的成绩,但是依然存在两个较为突出的缺点:

①First, the network has a predefined fixed-size receptive field.

所以那些大于或者小于感受野的目标,就可能被分裂或者错误标记。具体点来说,对于大目标,进行预测时只使用了local information所以可能会导致属于同一个目标的像素被误判为不连续的标签(即不同目标),如下图,左侧为input,中间为ground truth,右侧为result,可见这个大巴由于too large所以被分割成了很多不连续的部分。

对于小目标来说,经常会被忽略掉,就是被当作了背景了。如下图,左侧为input,中间为ground truth,右侧为result。由于人很远所以在图中面积too small,结果被当作背景了:

目标的细节结构常常丢失或者被平滑处理掉

所以输入deconvolution-layer的label map就太粗糙了,而且deconvolution 这个步骤在FCN这篇文章中做的过于简单了

缺少一个在大量数据上得到训练的deconvolution network使得准确地重构物体边界的高维非线性结构变得困难。

针对上面的两个limitations,这篇文章提出的贡献有:

We learn a deep deconvolution network, which is composed of deconvolution, unpooling, and rectified linear unit (ReLU) layers.

•   经过训练的网络被用于单个物体以获得 instance-wise(就是样例水平上)的分割,并最终和语义分割结合起来。

•   在PASCAL VOC 2012数据集上取得的效果很nice。

2、模型解读

总的来说,分为两个部分

Convolution part-- feature extractor that transforms the inputimage to multidimensional feature representation

Deconvolution part--a shape generator that produces objectsegmentation from the feature extracted from the convolution network

Finaloutput of the network is a probability map in the same size to input image,indicating probability of each pixel that belongs to one of the predefinedclasses.

①ConNet部分:以VGG-16laye为基础,只不过把最后分类的全连接层去掉了,所以有13个卷积层。在适当的层间应用Relu和Maxpooling.

②然后增加两个全连接层来强化特定类别的投影。有人可能会想,FCN中不是已经提到要用卷积层来替换掉全连接层吗?怎么这里还在接全连接层,是在退步吗?所以这里有个有意思的地方,看清楚哦,图中所示的全连接层是1x1大小的

这里就有个梗,当年FCN得到CVPR'15 best paper honorable mention的时候, Yann LeCun等人出来吐槽这个'FCN'的概念早就有了,AlexNet里面的fullyconnected layer (FC)本身就是个误导,因为FC layer可以看成是1x1的convolution, 本来就可以输入任意大小的图片.这段话摘自知乎答主周博磊。

为什么说FC layer可以看成是1x1的convolution呢,我个人的理解是,FC做运算的时候确实就是把输入给拉成一行(或是一列)来算的,输出的也是一个列(或是一行)。

③DeconNet是ConNet部分的一个镜像。只不过Maxpooling换成了Unpooling。

大致结构就是这样。

3、 特点分析

①Unpooling

他们采用的Unpooling的技术来源于论文Visualizing and understanding convolutional networks. In ECCV, 2014。 简单的说,就是利用一些switch variables记录下Maxpooling操作得到的activation的位置,然后Unpooling就是把它放回原位置,如下图:

要注意,switch variables记录的只是Pooling的时候被选中的那些值的位置,所以Unpooling之后得到的map虽然尺寸变回来了,但是只是对应的位置有值,如上图右边黑色的位置,其它地方是没有值的,所以是一个稀疏map。所以就要进行下一步操作,deconvolution

②Deconvolution

如图所示,Deconvolution的细节我就不描述了。简而言之,它的功能就和convolution相反。如果对于这个过程有很强兴趣的朋友,可看一下这篇文章。

#########    A guide to convolution arithmetic for deep learning。###########

       虽然名字是convolution…,但是里面较为详细的讲述了相关内容。

还有一点,把这个运算称为:deconvolution(逆卷积),似乎比较容易引起误会,更为精确的说法是Transposed Convolution (转置卷积)

这是我上面推荐的那个文章的目录,Transposed convolution就是在详细描述这个过程。有兴趣的朋友可以自行搜索下载查看。

总之,Deconvolution网络中的filters,位于低层的filter能捕获目标的形状信息,位于高层的filter能够捕获特定类别的细节信息,所以整个网络就能兼顾这两方面。

③示例

图a为输入,图b为我第2部分结构图中14 × 14 deconvolutional layer中的最后一层的输出,然后经过Unpooling,得到图c,可以看到c是一个sparse map,详见我的①中unpooling的分析。然后图d又是结构图中28 × 28 deconvolutional layer最后一层的输出,然后再unpooling得到图e,以此类推后面的图。

然后他们和FCN-8S做了个对比,效果确实还是有提升的:

④系统分析

他们的算法将语义分割作为实例分割问题,也就是说,网络采用可能包含对象的子图像(我们以后称为实例)作为输入,并产生像素级类预测作为输出。

对于他们的网络来说,整张图的Semantic segmentation是通过将网络应用于每一个从图中提取出来的候选项并将所有候选项的输出聚合起来 得到的。就是说他们先通过输入图得到足够数量的candidate proposals然后把proposals输入进去,最后再聚合到一起。

他们认为:instance-wise prediction is useful for handling objects with various scales

聚合的方法:

在聚合的时候要抑制一些噪声(如错位),他们证明 对应所有类别的得分图的像素最大值平均值 是足够有效 来获得鲁棒的结果的。

来代表第i个proposal的得分图,W X H代表这个proposal的尺寸,C代表类别的数量。我们首先把它放在gi的外围有零填充的图像空间上,我们用下面的Gi来表示 在原始图像尺寸中与gi对应的分割图。然后我们通过下面这两个公式来 聚合所有proposals的输出 进而来构建一幅图像的像素级别的类别得分图,

利用像素最大值

  利用像素平均值

⑤另外的发现:

       当他们减小proposal的大小(相对的就增加了proposal的数量),发现效果会得到提升,如下图:

两种方法结合:

In addition, instance-wise prediction is useful for handling objects with various scales,

while fully convolutional network with a coarse scale may be advantageous to capture context within image.

就是说,他们的方法对目标的尺度多样性有较好的适应性,之前的FCN方法能较好的捕捉背景信息,所以他们试着将两种方法结合起来。就是把一张图片输入这两个网络进行单独的处理,然后把把两个网络的输出计算均值当作最后的输出,然后还用到了CRF来获得更好的结果。对比图如下:

从左致右依次是:输入、ground truth、FCN、DeconNet、FCN+DeconNet、FCN+DeconNet+CRF

A、 这是他们的DeconNet处理结果比FCN好的情况

B、 这是FCN处理结果好的情况

C、 FCN和DeconNet都不好的情况但是被二者结合起来得到好结果的示例

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

Spark踩坑——java.lang.AbstractMethodError

百度了一下说是版本不一致导致的。于是重新检查各个jar包,发现spark-sql-kafka的版本是2.2,而spark的版本是2.3,修改spark-sql-...

1300
来自专栏开发与安全

算法:AOV网(Activity on Vextex Network)与拓扑排序

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,我们称之为AOV网(Activity on Vextex ...

4067
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1242
来自专栏ml

朴素贝叶斯分类器(离散型)算法实现(一)

1. 贝叶斯定理:        (1)   P(A^B) = P(A|B)P(B) = P(B|A)P(A)   由(1)得    P(A|B) = P(B|...

3667
来自专栏Java爬坑系列

【Java入门提高篇】Day21 容器类详解(四)ArrayList源码分析

   今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作。

1746
来自专栏alexqdjay

HashMap 多线程下死循环分析及JDK8修复

1.2K4
来自专栏拭心的安卓进阶之路

Java 集合深入理解(12):古老的 Vector

今天刮台风,躲屋里看看 Vector ! 都说 Vector 是线程安全的 ArrayList,今天来根据源码看看是不是这么相...

2547
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

20910
来自专栏xingoo, 一个梦想做发明家的程序员

AOV网络拓扑排序

这个算法,主要是为输出一个无环图的拓扑序列 算法思想: 主要依赖一个栈,用来存放没有入度的节点,每次读取栈顶元素,并将栈顶元素的后继节点入度减一,如果再次出现入...

1975
来自专栏xingoo, 一个梦想做发明家的程序员

AOE关键路径

这个算法来求关键路径,其实就是利用拓扑排序,首先求出,每个节点最晚开始时间,再倒退求每个最早开始的时间。 从而算出活动最早开始的时间和最晚开始的时间,如果这两个...

2657

扫码关注云+社区