美文网首页
全卷积网络《Fully Convolutional Networ

全卷积网络《Fully Convolutional Networ

作者: 井底蛙蛙呱呱呱 | 来源:发表于2019-04-09 19:11 被阅读0次

    大部分转自 https://www.cnblogs.com/gujianhan/p/6030639.html

    卷积神经网络的强大之处在于其多层卷积层能够自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感受野较小,学习一些局部特征;较深的卷积层感受野较大,能够学习到更加抽象、全局的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。


    传统卷积网络一般都会在卷积层之后接上若干个全连接层,将卷积层产生的特征图映射成一个固定长度的特征向量作为最后几层全连接层的输入特征,利用全连接网络进行分类。简言之,就是讲卷积层当成一个特征提取器,提取完特征然后用后面的全连接网络进行分类。

    如下图中的上半部分为AlexNet模型对ImageNet 1000类图像进行分类,进过卷积层,全连接层后输出一个长度为1000的向量,表示输入图像属于每一类的概率,其中“tabby cat”的概率最高。



    而FCN则可以对图像进行密集甚至是像素水平的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层后使用全连接进行分类(全连接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,因为其在多次下采样提取特征后会使用反卷积(更多人认为称为转置卷积更准确)进行上采样,使他恢复到与输入图像相同的尺寸,从而可以对每一个像素进行预测,同时保留了原始输入图像中的空间信息,最后在上采样的特征图上进行逐像素分类。

    最后逐个像素计算softmax相当于每一个像素都是一个样本对应一个label。如下图下半部分所示,FCN与CNN的区别在于FCN把最后几层全连接换成了卷积层,输出的是一张对每个像素都进行了预测的图片。

    传统的基于CNN的分割方法一般是将某一个像素及其周围的一小块patch作为CNN的输入用于训练和预测。这种方法有几个缺点:第一是储存开销大,例如对每个像素使用的图像块的大小为15x15,则对于一个300x300的图片需要储存20x20张图片,当图片变得更大时,储存需求会更加急剧的上升;第二是计算效率低下,对于一个300x300的图片,如果将15x15的分类作为其一块patch的分类,则其一共需要计算20x20次;第三是像素块的大小限制了感受区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部特征,从而导致了分类性能受到限制。

    而全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。

    全连接层转换为全连接层

    全连接层和卷积层的唯一不同就是卷积层中的神经元仅与输入数据中的一个局部区域连接,并且在卷积中的神经元共享参数。而在两类中,神经元都是计算点积,所以他们的函数形式是一样的。因此,将两者进行转化是可行的:

    • 对于任何一个卷积层,都存在一个能实现和他一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块,其余部分都为零。而在其中大部分块中,元素都是相等的。
    • 相反,任何全连接层都可以被转化为卷积层。比如,一个k=4096的全连接层,输入数据的尺寸为7x7x512,这个全连接层可以被等效的看做一个filter=7, padding=0, stride=1, c=4096的卷积层。换句话说,就是将滤波器的尺寸设置为和输入数据的尺寸一致。这时的输出就变成了1x1x4096了,这个结果和全连接层是一样的。

    为何将全连接层转化为卷积层在实际中会更有用?假设一个卷积神经网络的输入是224x224x3的图像,一系列的卷积层和下采样层将图像尺寸变为7x7x512的feature map。AlexNet使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于输出各个分类的概率。我们可以将这三个全连接层中的任何一个转化为卷积层:

    • 针对第一个连接区域是7x7x512的全连接层,令其滤波器尺寸为filter=7,这样输出feature map九尾1x1x4096了;
    • 针对第二个全连接层,令其滤波器尺寸为filter=1,则输出feature map为1x1x4096;
    • 针对最后一个全连接层也做类似的,令其filter=1,最终输出为1x1x1000.

    实际操作中,每次这样的变换都需要吧全连接层的权重矩阵变为卷积层的滤波器。这样可以让卷积网络在一张更大的输入图片上进行滑动,一次性得到更多输。

    举个栗子:如果我们想让224x224尺寸的浮窗以32的步长在384x384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6x6个位置的分类结果。而将全连接层转化为卷积层后224x224的图片经过卷积层会得到7x7的feature map,那么384x384的图片,经过卷积层则会得到12x12的feature map,然后在经过上面全连接层转化而来的卷积层,最终得到6x6x1000的输出,而这个结果正是浮窗在原图经停的6x6个位置的预测结果。

    上面的转化为全卷积网络后的一次前向传播预测相当于6x6个(224经过6次步长32的移动)原来最后三层是全连接层的计算结果。

    上采样(Upsampling)

    原图为227大小的图像经过多次卷积核下采样后,得到的图像越来越小,分辨率越来越低。其中图像H/32xW/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特诊图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小。
    最后的输出是1000张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如下图右侧有狗狗和猫猫的图。

    论文中提及的上采样方式有三种:

    • (1)shift and stitch. 是一个插值重构的过程,具体的也没看太懂,可参考关于FCN 论文中的 Shift-and-stitch 的详尽解释;
    • (2)filter rarefaction. 即放大CNN网络中下采样层filter的尺寸,得到新的filter

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

    以上两种方法均未被作者采用,主要是因为这两种方法都是trade-off的:

    • 对于第一种方法,虽然receptive fileds没有变小,但是由于原图被划分成f*f的区域输入网络,使得filters无法感受更精细的信息;
    • 对于第二种方法,下采样功能被减弱,使得更细节的信息能被filter看到,但是receptive fileds会相对变小,可能会损失全局信息,且会对卷积层引入更多运算。
    第三种上采样的方式是通过反卷积(转置卷积)实现的,关于转置卷积实现上采样可通过下面的图简要理解。 如下图所示,经过5次下采样后,feature map 大小变为原来的1/32,对这个feature map使用转置卷积进行上采样,可以还原到conv5的feature map, 但是这样得到的结果仍然是非常粗糙,无法很好地还原图像中的特征,因此这里继续向前迭代,加入最后几层的输出来补充细节,和最后的输出做一个fusion,实际上也就是加和。最后完成整个图像的还原。

    缺点:

    1、得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
    2、是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

    参考:
    Shift and stitch理解
    全卷积网络 FCN 详解
    FCN: Fully Convolutional Networks for Semantic Segmentation
    [译] 用于语义分割的全卷积网络FCN(UC Berkeley)

    相关文章

      网友评论

          本文标题:全卷积网络《Fully Convolutional Networ

          本文链接:https://www.haomeiwen.com/subject/ildmiqtx.html