全卷积神经网络FCN详解(附带Tensorflow详解代码实现)

在图像语义分割领域,困扰了计算机科学家很多年的一个问题则是我们如何才能将我们感兴趣的对象和不感兴趣的对象分别分割开来呢?比如我们有一只小猫的图片,怎样才能够通过计算机自己对图像进行识别达到将小猫和图片当中的背景互相分割开来的效果呢?如下图所示:

全卷积神经网络FCN详解(附带Tensorflow详解代码实现)

 

 

 而在2015年出来的FCN,全卷积神经网络完美地解决了这个问题,将曾经mean IU(识别平均准确度)只有百分之40的成绩提升到了百分之62.2(在Pascal VOC数据集上跑的结果,FCN论文上写的),像素级别识别精确度则是90.2%。这已经是一个相当完美的结果了,几乎超越了人类对图像进行区分,分割的能力。如上图所示,小猫被分割为了背景,小猫,边缘这三个部分,因此图像当中的每一个像素最后只有三个预测值,是否为小猫,背景,或者边缘。全卷积网络要做的就是这种进行像素级别的分类任务。那么这个网络是如何设计和实现的呢?

二.网络的实现

这个网络的实现虽然听名字十分霸气,全卷积神经网络。不过事实上使用这个名字无非是把卷积网络的最后几层用于分类的全连接层换成了1*1的卷积网络,所以才叫这个名字。这个网络的首先对图片进行卷积——>卷积——>池化,再卷积——>卷积——>池化,直到我们的图像缩小得够小为止。这个时候就可以进行上采样,恢复图像的大小,那么什么是上采样呢?你估计还没有听说过,等下咱们一 一道来。这个网络的结构如下所示(附上论文上的原图):

全卷积神经网络FCN详解(附带Tensorflow详解代码实现)

 

 

 从中可以看到我们输入了一个小猫和小狗在一起时的图片,最后再前向传播,在这个前向传播网络的倒数第三层,卷积神经网络的长度就变成了N*N*21,因为在VOC数据集上一共有21个softmax分类的结果,因此每个类别都需要有一个相关概率(置信度)的输出。而前面这个前向传播的卷积神经网络可以是VGG16,也可以是AlexNet,Google Inception Net,甚至是ResNet,论文作者在前三个Net上都做了相应的尝试,但是因为ResNet当时还没出来,也就没有尝试过在前面的网络当中使用它。当我们的网络变成了一个N*N*21的输出时,我们将图像进行上采样,上采用就相当于把我们刚才得到的具有21个分类输出的结果还原成一个和原图像大小相同,channel相同的图。这个图上的每个像素点都代表了21个事物类别的概率,这样就可以得到这个图上每一个像素点应该分为哪一个类别的概率了。那么什么是图像的上采样呢?

三.图像的上采样

图像的上采样正好和卷积的方式相反,我们可以通过正常的卷积让图像越来越小,而上采样则可以同样通过卷积将图像变得越来越大,最后缩放成和原图像同样大小的图片,关于上采样的论文在这这篇论文当专门做了详解:https://arxiv.org/abs/1603.07285。上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution),反池化(Unpooling)。在全卷积神经网络当中我们采用了反卷积来实现了上采样。我们先来回顾一下正向卷积,也称为下采样正向的卷积如下所示,首先我们拥有一个这样的3*3的卷积核:

全卷积神经网络FCN详解(附带Tensorflow详解代码实现)

 

然后对一个5*5的特征图利用滑动窗口法进行卷积操作,padding=0,stride=1,kernel size=3,所以最后得到一个3*3的特征图:

全卷积神经网络FCN详解(附带Tensorflow详解代码实现)

 

 

 那么上采样呢?则是这样的,我们假定输入只是一个2*2的特征图,输出则是一个4*4的特征图,我们首先将原始2*2的map进行周围填充pading=2的操作,笔者查阅了很多资料才知道,这里周围都填充了数字0,周围的padding并不是通过神经网络训练得出来的数字。然后用一个kernel size=3,stride=1的感受野扫描这个区域,这样就可以得到一个4*4的特征图了!:

全卷积神经网络FCN详解(附带Tensorflow详解代码实现)

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygpzs.html