您的位置:首页 > 其它

【图像语义分割】Fully Convolutional Networks for Semantic Segmentation

2017-09-05 21:20 716 查看
FCN这篇文章是第一次用CNN的方式端对端(end-to-end)的解决了图像语义分割问题,在Semantic Segment这个领域中也算划时代的论文了

不同于常规的classification network, Sementic Segment侧重于像素级的分类。本文通过对常规classification network(Alexnet, VGG, GoogLeNet)进行fine-tuning, 通过去掉FC layer,而将其转化为fully convolution network,以得到有个heatmap。

FCN的主要模型



以VGG16网络为例:



在整个网络流动的过程如下:

假设输入图像为hxh大小的,

先经过两层conv层:

conv1_1: h1 = (h + 2*pad - kernel) / stride + 1

conv1_2: h2 = (h1 + 2*pad - kernel) / stride + 1)

当代入参数时(pad=1, kernel = 3,stride=1),会发现卷积后图像大小不变。

而图像大小缩小的地方只在pool layer,(pool主要的作用是可以增加感受野,可以保持某种不变性,同时不增大参数的数量):

pool1 = h1 = (h - kernel)/stride+1.

其中pooling层的kernel为2,stride为2,代入参数得到:

pool1 = (h-2)/2 + 1 = h/2

pool5 = (h1 - 2)/2 + 1 = h/(2^2)



pool5 = (h4 - 2)/2 + 1 = h/(2^5)

在 contemprary classification network,此时的输出应该接入到FC layer. 在ImageNet中,输入图像大小一般为224x224,则pool5输出的大小应该为7x7。为了防止FC去将7x7的图拉成vector,去破坏其空间信息,本文提出全卷积。顾名思义,即去掉FC,采用核大小为7x7的kernel去扫pool5输出的(7x7 map)来模拟FC,然后在之后的网络中选取1x1的kernel。这样我们就可以通过全卷积过程来模拟了contemprary classification Networks.

接着整个网络的流动来看,pool5的输出现在被接到一个卷积层,kernel_size = 7, 则该层输出大小为:

h6 = (h -7)/1 + 1 = (h-192)/(2^5)

这也就看出来了,假如输入大小为224x224的话,输出heatmap大小为1x1,而当输入图像较大的话,输出会得到一个nxn的heatmap。从而FCN可以保证多尺度大小的输入。

这种想法实际上也不是FCN特有的,在Overfeat文章中就有类似的想法:



然而,这里会出现一个问题,图像尺寸较大时输出的heatmap并没有什么问题,然而当输入图像的size小于192的时候,则会出错,由h6的公式得知。

作者在这里做了个很粗暴的操作,就是不管三七二十一,对输入图像都进行100的padding,从而h6输出图像的大小会在h6 = (h + 6)/ (2^5),这样在真正意义上解决了任何尺寸的输入问题。然而这么粗暴的操作肯定会带来一定的问题,就是边界分割不清楚。不过就算这样,在当时的Sementic Segment准确度也是最高的。

到这里实际上,我们实际上已经得到了一个heatmap,其感受野是32x32,此时只有deconvolution 32倍上去即可(由于作者发现deconvolution的学习得到的结果与双线性插值算法得到的结果相差无几,然而双线性插值的速度却很快,所以作者直接采用了双线性插值)。

upscore: h7 = (h6-1)*32+64 = h+38

此时作者给出了一个crop layer进行裁剪,以保证输出大小与输入大小一致。实际上到这里语义分割也就结束了。

作者在这基础提出了多次的修整:



这样FCN-8s得到的效果会比FCN-32s上好一个level。

效果如下:



参考链接:

https://zhuanlan.zhihu.com/p/22976342
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cnn
相关文章推荐