从FCN到DeepLab
图像语义分割,简单而言就是给定一张图片,对图片上的每一个像素点分类。

图像语义分割,从FCN把深度学习引入这个任务,一个通用的框架事:前端使用FCN全卷积网络输出粗糙的label map,后端使用CRF条件随机场/MRF马尔科夫随机场等优化前端的输出,最后得到一个精细的分割图。


前端
为什么需要FCN?
分类网络通常会在最后连接几层全连接层,它会将原来二维的矩阵(图片)压缩成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。
而图像语义分割的输出需要是个分割图,且不论尺寸大小,但是至少是二维的。所以,流行的做法是丢弃全连接层,换上全卷积层,而这就是全卷积网络了。具体定义请参看论文:《Fully Convolutional Networks for Semantic Segmentation》
FCN结构
在FCN论文中,作者的FCN主要使用了三种技术:
卷积(Convolutional)、上采样(Upsample)、跳层连接(Skip Layer)
卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。

上采样即是反卷积(Deconvolution)。当然关于这个名字不同框架不同,Caffe和Kera里叫Deconvolution,而tensorflow里叫conv_transpose,在《信号与系统》这门课上,我们学过反卷积有定义,不是这里的上采样。所以叫conv_transpose更为合适。
众所周知,池化会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了得到和原图等大的分割图,我们需要上采样/反卷积。反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。所以无论优化还是后向传播算法都是没有问题。上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0。图解如下:

虽然文中说是可学习的反卷积,但是作者实际代码并没有让它学习,可能正是因为这个一对多的逻辑关系。代码如下:
layer {
name: "upscore"
type: "Deconvolution"
bottom: "score_fr"
top: "upscore"
param {
lr_mult:
}
convolution_param {
num_output:
bias_term: false
kernel_size:
stride:
}
}
可以看到lr_mult被设置为0。
跳层连接的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样,得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:

不同上采样得到的结果对比如下:

当然,你也可以将pool1, pool2的结果输出,再上采样输出。不过,作者说了这样得到的结果提升并不大。FCN是深度学习应用于图像语义分割的开山之作,所以得了CVPR2015的最佳论文。但是,还是有一些处理比较粗糙的地方,具体和后面对比就知道了。
FCN-alike
《SegNet: A Deep Convolutional Encoder-Decoder Architecture for Robust Semantic Pixel-Wise Labelling》则是一种结构上更为优雅的网络,SegNet使用一种概率自编码模型,这是一种无监督特征生成网络。当然,他们的label还是需要监督的。

DeepLab
DeepLab是Google提出的一个model,在VOC上的排名要比CRF as RNN的效果好。Deeplab仍然采用了FCN来得到score map,并且也是在VGG网络上进行fine-tuning。但是在得到score map的处理方式上,要比原FCN处理的优雅很多。
还记得FCN中是怎么得到一个更加dense的score map的吗? 是一张500x500的输入图像,直接在第一个卷积层上conv1_1加了一个100的padding。最终在fc7层勉强得到一个16x16的score map。虽然处理上稍显粗糙,但是毕竟人家是第一次将图像分割在CNN上变成end-to-end,并且在当时performance是state-of-the-art。
而怎样才能保证输出的尺寸不会太小而又不必加100 padding这样“粗糙的”做法呢?可能有人会说减少池化层不就行了,这样理论上是可以的,但是这样直接就改变了原先可用的结构了,而且最重要的一点是不能用以前的结构参数进行fine-tune了。
所以,Deeplab这里使用了一个非常优雅的做法:将VGG网络的pool4和pool5层的stride由原来的2改为了1,再加上 1 padding。就是这样一个改动,使得vgg网络总的stride由原来的32变成8,进而使得在输入图像为514x514时,fc7能得到67x67的score map, 要比FCN确实要dense很多很多。
但是这种改变网络结果的做法也带来了一个问题: stride改变以后,如果想继续利用vgg model进行fine tuning,会导致后面感受野发生变化。这个问题在下图(a) (b)体现出来了,注意花括号就是感受野的大小:

感受野就是输出feature map某个节点的响应对应的输入图像的区域。比如我们第一层是一个3*3的卷积核,那么我们经过这个卷积核得到的feature map中的每个节点都源自这个3*3的卷积核与原图像中3*3的区域做卷积,那么我们就称这个feature map的节点感受野大小为3*3。
具体计算公式为:

其中rn表示第n层layer的输入的某个区域,sn表示第n层layer的步长,kn表示kernel/pooling size
Deeplab提出了一种新的卷积,带孔的卷积:Atrous Convolution。来解决两个看似有点矛盾的问题:
既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加dense的score map。
如下图(a) (b)所示,在以往的卷积或者pooling中,一个filter中相邻的权重作用在feature map上的位置是连续的。
为了保证感受野不发生变化,某一层的stride由2变为1以后,后面的层需要采用hole算法,具体来讲就是将连续的连接关系根据hole size大小变成skip连接。
上图(C)中使用hole为2的Atrous Convolution则感受野依然为7。(C)中的padding为2,如果再增加padding大小,是不是又变”粗糙”了?当然不会,因为是Atrous Convolution,连接是skip的,所以2个padding不会同时和一个filter相连。

所以,Atrous Convolution能够保证在这样的池化后感受野不变,从而可以fine tune,同时也能保证输出的结果更加精细。即:

后端
DeepLab后面接了一个全连接条件随机场(Fully-Connected Conditional Random Fields)对分割边界进行refine。
DeepLab里只是变成了refine label map。CRF经常用于 pixel-wise的label 预测。把像素的label作为随机变量,像素与像素间的关系作为边,即构成了一个条件随机场且能够获得全局观测时,CRF便可以对这些label进行建模。全局观测通常就是输入图像。


在全连接的CRF模型中,标签x 的能量可以表示为:


精细化的结果如下:

CRF-alike
CRFasRNN
在深度学习中,我们都追求end-to-end的系统,所以Conditional Random Fields as Recurrent Neural Networks 这篇文章的套路更深了……把Mean Field算法嵌入在网络层中。自己写了caffe一层,用类似于Conv的操作模拟Mean Field的四步,具体实现细节可以参照论文中所给的代码。
马尔科夫随机场(MRF)
在Deep Parsing Network中使用的是MRF,它的公式具体的定义和CRF类似,只不过作者对二元势函数进行了修改:


这个结构的优点在于:
- 将Mean fied 构造成CNN
- 联合训练并且可以one-pass inference,而不用迭代。
总结
深度学习+概率图模型(PGM)是一种趋势。深度学习可以更好的提取特征,而PGM能够从数学理论很好的解释事物本质间的联系。概率图模型的网络化也是一种趋势,我们目标是end-to-end的学习系统。
引用
[1]Fully Convolutional Networks for Semantic Segmentation
[2]Learning Deconvolution Network for Semantic Segmentation
[3]DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
[4]Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs
[5]Conditional Random Fields as Recurrent Neural Networks
[6]SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation
原文地址: http://blog.csdn.net/junparadox/article/details/52610744
从FCN到DeepLab的更多相关文章
- 【Semantic Segmentation】Segmentation综述
部分转自:https://zhuanlan.zhihu.com/p/37618829 一.语义分割基本介绍 1.1 概念 语义分割(semantic segmentation) : 就是按照" ...
- 第六讲_图像分割Image Segmentation
第六讲_图像分割Image Segmentation 语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet 目录 +三大数 ...
- 论文翻译:Conditional Random Fields as Recurrent Neural Networks
Conditional Random Fields as Recurrent Neural Networks ICCV2015 cite237 1摘要: 像素级标注的重要性(语义分割 图像理解) ...
- 比较语义分割的几种结构:FCN,UNET,SegNet,PSPNet和Deeplab
简介 语义分割:给图像的每个像素点标注类别.通常认为这个类别与邻近像素类别有关,同时也和这个像素点归属的整体类别有关.利用图像分类的网络结构,可以利用不同层次的特征向量来满足判定需求.现有算法的主要区 ...
- 深度学习与CV教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- deeplab hole algorithm
最近看了几篇文章,其中均用到了hole algorithm. 最早用的就是deeplab的文章了,Semantic Image Segmentation with Deep Convolutional ...
- 笔记︱图像语义分割(FCN、CRF、MRF)、论文延伸(Pixel Objectness、)
图像语义分割的意思就是机器自动分割并识别出图像中的内容,我的理解是抠图- 之前在Faster R-CNN中借用了RPN(region proposal network)选择候选框,但是仅仅是候选框,那 ...
- CocoStuff—基于Deeplab训练数据的标定工具【一、翻译】(未完)
一.CocoStuff简介 CocoStuff是一款为deeplab设计的,运行在Matlab中的语义标定工具,其标定结果和结合Deeplab训练出的结果均为mat文件格式,该项目源码已在github ...
- FCN图像分割
一. 图像语义分割 传统的图像分割方法主要包括以下几种: 1)基于边缘检测 2)基于阈值分割 比如直方图,颜色,灰度等 3)水平集方法 这里我们要说的是语义分割,什么是语义分割呢?先来看张图: 将目标 ...
随机推荐
- MTU介绍以及在windows和linux下怎么设置MTU值
最大传输单元MTU(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位).最大传输单元这个参数通常与通信接口有关(网络接口卡 ...
- Mysql内置的profiling性能分析工具
要想优化一条 Query,我们就需要清楚的知道这条 Query 的性能瓶颈到底在哪里,是消耗的 CPU计算太多,还是需要的的 IO 操作太多?要想能够清楚的了解这些信息,在 MySQL 5.0 和 M ...
- ios设备触发虚拟键盘输入后position:fixed 无效的一些简单另类的解决方法。
首先看一下我要解决的问题,第一张图是正常的情况下,第二张图是点击了输入框之后的情况,就是要解决此问题~! 百度了一下解决方法,好像有以下的一些方法: 1. iscroll 2. Jquery Mobi ...
- Egret学习笔记 (Egret打飞机-5.实现子弹对象)
上一章把飞机添加到屏幕上,但是飞机要发射子弹对吧?那么这一章我们就来实现一下发射子弹,并实现一个简单的子弹对象池 先来捋一捋思路 1.创建一个子弹对象 2.然后添加一个bitmap,显示子弹贴图 3. ...
- Win10 部署 依赖 NET3.5 项目,报错 无法安装 NET3.5 ,该如何解决?
下载 NetFx3.cab Cab 安装包 拷贝 NetFx3.cab 文件至 C:\Windows 目录 打开命令行窗口(管理员权限) 输入以下内容: dism /online /Enable-Fe ...
- 由select引发的思考
一.前言 网络编程里一个经典的问题,selec,poll和epoll的区别?这个问题刚学习编程时就接触了,当时看了材料很不明白,许多概念和思想没有体会,现在在这个阶段,再重新回头看这个问题,有一种豁然 ...
- 地牢逃脱 (BFS)
题意:给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指 ...
- CodeForces - 796C Bank Hacking
思路:共有n-1条边连接n个点,即形成一棵树.一开始需要选择一个点hack--将这个点视为根结点,与它相邻的点防御值加1,与它相隔一个在线点的点的防御也加1.当根节点被hack,即这个点被删除,又变成 ...
- uva10003 区间DP
很清晰的区间dp问题.d(i,j)表示断点i到断点j的最小费用,由于开头和结尾也是断点,所以应该加入断点数组,即 cut[0]=0; cut[n+1]=len; 边界就是d(i,i+1)=0; 转移方 ...
- LRUCache原理分析
一.注释 LRUCache的原理,基本都在注释里面描述清楚了. /** * A cache that holds strong references to a limited number of va ...