Fully Convolutional Networks for Semantic Segmentation

主要思想

传统的做图像分割的方式大概是这样的:

以某个像素点中心取一个区域,取图像块的特征做样本训练分类器,分类结果作为此像素点的结果

这样做缺点很明显,比如:

如何确定图像块的大小

从小的图像块(patch)中获得的上下文信息(contex)较少,且极端耗时

FCN的做法是训练一个end-to-end的网络,做pixel-wise的prediction,使用ground-truth作为监督信息,预测label map,实现semantic segmentation的任务,荣获CVPR2015的Best Paper

主要的改进是对传统的分类网络,比如googlenet,VGG16等,将其改造成fully convolutional network,原文如是说:

We adapt contemporary classification networks (AlexNet, the VGG net, and GoogLeNet) into fully convolutional networks and transfer their learned representations by fine-tuning to the segmentation task.

网络的修改

FCN的关键就是如何将传统的分类网络改造为全卷积的网络,FCN有个最大的好处就是输入图像的尺寸是任意的,输出和原图像相同尺寸的predict map

An FCN naturally operates on an input of any size, and produces an output of corresponding (possibly resampled) spatial dimensions

其它我总结的几个特点如下:

Extend deep classification architecture(AlexNet, VGG, GoogLeNet)

fine-tune, pixel-to-pixel

input of any size, output classification maps(heatmap)

deconvolution(upsample), can be learned

For pixelwise prediction, connect coarse output back to pixels

对于一个原始图像,将其放入FCN中,得到多个coarse output map,之后对得到的output map“映射”到原图,即得到最终的segmentation结果

convert classification nets into fully convolutional nets that produce coarse output maps. For pixelwise prediction, we need to connect these coarse outputs back to the pixels

那么具体是如何操作的呢?

将传统分类网络的最后的全连接层变为卷积层

这里比较难以理解,我举个具体的例子来说明,比如对于经典的分类网络AlexNet来说,其结构如下所示:

我们可以看到最后接着三个全连接层(FC6,FC7,FC8),假如要将此网络转换为FCN,可以如下这么做:

对于FC6(4096),使用4096个filter,filter的大小是6*6,做完以后大小为1*1*4096

对于FC7(4096),使用4096个filter,filter的大小是1*1,做完以后大小为1*1*4096

对于FC8(1000),使用1000个filter,filter的大小是1*1,做完以后大小为1*1*1000

我们其实可以看到,其实就是将全连接看成是卷积,和自身大小一样的filter去卷积则卷积之后的大小是1*1

示意图如下:

之后对得到的1*1*1000的输出,做upsampling(deconvolution)得到和原图一样大小的输出,所有输出合并之后得到如上图所示的heat map

当然这里作者的deconvolution做的很简单,就只是简单的双线性插值而已,这是个改进点

合并dense prediction

这里通过upsampling得到dense prediction,作者研究过3种方案:

shift-and-stitch

设原图与FCN所得输出图之间的降采样因子是f,那么对于原图的每个f*f 的区域(不重叠),”shift the input x pixels to the right and y pixels down for every (x,y) ,0 < x,y < f.” 把这个f*f区域对应的output作为此时区域中心点像素对应的output,这样就对每个f*f的区域得到了f^2个output,也就是每个像素都能对应一个output,所以成为了dense prediction

filter rarefaction

就是放大CNN网络中的subsampling层的filter的尺寸,得到新的filter:

其中s是subsampling的滑动步长,这个新filter的滑动步长要是为1的话,这样subsampling就没有缩小图像尺寸,最后可以得到dense prediction

以上两种方法作者都没有采用,主要是因为这两种方法都是trad-off的,原因是:

对于第二种方法, 下采样的功能被减弱,使得更细节的信息能被filter看到,但是receptive fileds会相对变小,可能会损失全局信息,且会对卷积层引入更多运算

对于第一种方法,虽然receptive fileds没有变小,但是由于原图被划分成f*f的区域输入网络,使得filters无法感受更精细的信息

deconvolution

upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到

以上是对CNN的结果做处理,得到了dense prediction,而作者在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和:

这样就得到第二行和第三行的结果,实验表明,这样的分割结果更细致更准确。在逐层fusion的过程中,做到第三行再往下,结果又会变差,所以作者做到这里就停了。可以看到如上对应的结果:

实验结果

资源

  1. FCN阅读笔记
  2. 如何将分类网络转换为FCN的caffe实现

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏人工智能头条

图像分类 | 深度学习PK传统机器学习

862
来自专栏绿巨人专栏

机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

3488
来自专栏机器学习算法全栈工程师

Object Detection系列(二) SPP-Net

作者:张 旭 编辑:黄俊嘉 ? 该内容是目标检测系列的第二篇,第一篇请移步: Object Detection系列(一) R-CNN SPP-Net简介 ...

37510

调整渐变下降的学习率

在大多数监督性机器学习问题中,我们需要定义一个模型并基于训练数据集预估其参数。计算这些参数的广泛且容易使用的一个技术是通过梯度下降来最小化模型的误差。梯度下降通...

2028

对于小批量梯度下降以及如何配置批量大小的入门级介绍

随机梯度下降是训练深度学习模型的主要方法。

2055
来自专栏机器学习原理

深度学习——CNN(2)池化层怎么反向传播?为什么采用小批量梯度下降?学习率设置

3963
来自专栏大数据挖掘DT机器学习

机器学习-R-特征选择

特征选择是实用机器学习的重要一步,一般数据集都带有太多的特征用于模型构建,如何找出有用特征是值得关注的内容。 1. Feature selection: Al...

4078
来自专栏专知

人人都能读懂卷积神经网络:Convolutional Networks for everyone

【导读】近日,Rohan Thomas发布一篇博文,通俗地讲解了卷积神经网络的结构、原理等各种知识。首先介绍了卷积神经网络(CNN)和人工神经网络(ANN)的不...

3489
来自专栏杨熹的专栏

使聊天机器人的对话更有营养

这篇论文的目的是让聊天机器人的回复更有营养,例如下面这种场景,要尽量避免‘我也是’‘明白。

4658
来自专栏新智元

【干货】TensorFlow 实用技巧:模型盘点,使用情况及代码样例

本文将介绍当前 TensorFlow 上的所有抽象模型,描述每个模型的使用情况以及简单的代码样例。详细的示例请访问这里:https://github.com/c...

3327

扫码关注云+社区