全卷积神经网络_卷积神经网络和全卷积神经网络 - CSDN
精华内容
参与话题
  • 卷积神经网络(CNN) 卷积层 卷积层尺寸的计算原理 标准卷积计算举例 1 x 1 卷积计算举例 全连接层计算举例 附:TensorFlow 中卷积层的简单实现 激励层 池化层 池化层的作用 输出层 VGG的特点: 全卷积...

    目录

    卷积神经网络(CNN)

    卷积层

    卷积层尺寸的计算原理

    标准卷积计算举例

    1 x 1 卷积计算举例

    全连接层计算举例

    附:TensorFlow 中卷积层的简单实现

    激励层

    池化层

    池化层的作用

    输出层

    VGG的特点:

    全卷积网络(FCN)

    核心思想

    1.卷积化(convolutionalization)

     2.上采样(Upsampling)

    3.跳跃结构(Skip Architecture)

    网络结构

    训练

    第1阶段 ​

    第2阶段 ​

    第3阶段 ​

    第4阶段 ​


    卷积神经网络(CNN)

    卷积网络,由卷积层、池化层、全连接层组成。其中卷积层与池化层配合,组成多个卷积组,逐层提取特征,最终通过若干个全连接层完成分类。

    CNN通过卷积来模拟特征区分,并且通过卷积的权值共享及池化,来降低网络参数的数量级,最后通过传统神经网络完成分类等任务。

    卷积:一组固定的权重和不同窗口内数据做内积

     

    卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

     

    CNN网络一共有5个层级结构:

    • 输入层
    • 卷积层
    • 激活层
    • 池化层
    • 全连接FC层

    卷积层

    卷积层中每一个节点的输入只是上一层神经网络的一小块,一般为3x3或者5x5。

    卷积层试图将神经网络中的每一小块进行更加深入的分析从而得到抽象程度更高的特征。

    卷积层尺寸的计算原理

                             

    • 输入矩阵格式:四个维度,依次为:样本数、图像高度、图像宽度、图像通道数
    • 输出矩阵格式:与输出矩阵的维度顺序和含义相同,但是后三个维度(图像高度、图像宽度、图像通道数)的尺寸发生变化。
    • 权重矩阵(卷积核)格式:同样是四个维度,但维度的含义与上面两者都不同,为:卷积核高度、卷积核宽度、输入通道数、输出通道数(卷积核个数)
    • 输入矩阵、权重矩阵、输出矩阵这三者之间的相互决定关系
      • 卷积核的输入通道数(in depth)由输入矩阵的通道数所决定。(红色标注)
      • 输出矩阵的通道数(out depth)由卷积核的输出通道数所决定。(绿色标注)
      • 输出矩阵的高度和宽度(height, width)这两个维度的尺寸由输入矩阵、卷积核、扫描方式所共同决定。计算公式如下。(蓝色标注)

    \begin{cases} height_{out} &= (height_{in} - height_{kernel} + 2 * padding) ~ / ~ stride + 1\\[2ex] width_{out} &= (width_{in} - width_{kernel} + 2 * padding) ~ / ~ stride + 1 \end{cases}

     

    * 注:以下计算演示均省略掉了 Bias ,严格来说其实每个卷积核都还有一个 Bias 参数。

    padding是增加各个边的pixels的数量,目的是保持feature map 不要太小,但也没必要超过原图的大小,所以不可以任意数量;
    padding的上限是维持feature map 大小与原图大小一致,具体增加pixel的数量多少,由filter(滤波器)的尺寸【也就是卷积核的大小】和stride大小共同决定;

    输出层每一个深度的计算过程。

    比如,输入层是28*28*3的图像,filter为3*3*3的滤波器。那么3个通道的filter会相应的每一个通道相互独立计算,然后再将3个通道的值相加在一起。下图是每一个filter的计提的计算过程。现在就是CNN卷积的处理过程。   

    标准卷积计算举例

    以 AlexNet 模型的第一个卷积层为例,
    - 输入图片的尺寸统一为 227 x 227 x 3 (高度 x 宽度 x 颜色通道数),
    - 本层一共具有96个卷积核,
    - 每个卷积核的尺寸都是 11 x 11 x 3。
    - 已知 stride = 4, padding = 0,
    - 假设 batch_size = 256,
    - 则输出矩阵的高度/宽度为 (227 - 11) / 4 + 1 = 55

    \begin{matrix} & \mathbf{Batch} & \mathbf{Height} && \mathbf{Width} && \mathbf{In~Depth} && \mathbf{Out~Depth}\\[2ex] \mathbf{Input} & \quad\quad 256 \quad\quad \times & \color{blue}{227} & \times & \color{blue}{227} & \times & \color{red}{3} \\[2ex] \mathbf{Kernel} &\quad\quad\quad\quad\quad & \color{blue}{11} & \times & \color{blue}{11} & \times & \color{red}{3} & \times & \color{green}{96} \\[2ex] \mathbf{Output} & \quad\quad 256 \quad\quad \times & \color{blue}{55} & \times & \color{blue}{55} &&& \times & \color{green}{96} \end{matrix}

     

    1 x 1 卷积计算举例

    后期 GoogLeNet、ResNet 等经典模型中普遍使用一个像素大小的卷积核作为降低参数复杂度的手段。
    从下面的运算可以看到,其实 1 x 1 卷积没有什么神秘的,其作用就是将输入矩阵的通道数量缩减后输出(512 降为 32),并保持它在宽度和高度维度上的尺寸(227 x 227)。

    \begin{matrix} & \mathbf{Batch} & \mathbf{Height} && \mathbf{Width} && \mathbf{In~Depth} && \mathbf{Out~Depth}\\[2ex] \mathbf{Input} & \quad\quad 256 \quad\quad \times & \color{blue}{227} & \times & \color{blue}{227} & \times & \color{red}{512} \\[2ex] \mathbf{Kernel} &\quad\quad\quad\quad\quad & \color{blue}{1} & \times & \color{blue}{1} & \times & \color{red}{512} & \times & \color{green}{32} \\[2ex] \mathbf{Output} & \quad\quad 256 \quad\quad \times & \color{blue}{227} & \times & \color{blue}{227} &&& \times & \color{green}{32} \end{matrix}

     

    全连接层计算举例

    实际上,全连接层也可以被视为是一种极端情况的卷积层,其卷积核尺寸就是输入矩阵尺寸,因此输出矩阵的高度和宽度尺寸都是1。

    \begin{matrix} & \mathbf{Batch} & \mathbf{Height} && \mathbf{Width} && \mathbf{In~Depth} && \mathbf{Out~Depth}\\[2ex] \mathbf{Input} & \quad \quad 256 \quad \quad \times & \color{blue}{32} & \times & \color{blue}{32} & \times & \color{red}{512} \\[2ex] \mathbf{Kernel} &\quad\quad\quad\quad\quad & \color{blue}{32} & \times & \color{blue}{32} & \times & \color{red}{512} & \times & \color{green}{4096} \\[2ex] \mathbf{Output} & \quad \quad 256 \quad \quad \times & \color{blue}{1} & \times & \color{blue}{1} &&& \times & \color{green}{4096} \end{matrix}

     

    总结下来,其实只需要认识到,虽然输入的每一张图像本身具有三个维度,但是对于卷积核来讲依然只是一个一维向量。卷积核做的,其实就是与感受野范围内的像素点进行点积(而不是矩阵乘法)。

     

    附:TensorFlow 中卷积层的简单实现

    def conv_layer(x, out_channel, k_size, stride, padding):
        in_channel = x.shape[3].value
        w = tf.Variable(tf.truncated_normal([k_size, k_size, in_channel, out_channel], mean=0, stddev=stddev))
        b = tf.Variable(tf.zeros(out_channel))
        y = tf.nn.conv2d(x, filter=w, strides=[1, stride, stride, 1], padding=padding)
        y = tf.nn.bias_add(y, b)
        y = tf.nn.relu(y)
        return x
    
    • 输入 x:[batch, height, width, in_channel]
    • 权重 w:[height, width, in_channel, out_channel]
    • 输出 y:[batch, height, width, out_channel]

           局部感知:人的大脑识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息。 

           卷积层使用“卷积核”进行局部感知。举个例子来讲,一个32×32×3的RGB图经过一层5×5×3的卷积后变成了一个28×28×1的特征图,那么输入层共有32×32×3=3072个神经元,第一层隐层会有28×28=784个神经元,这784个神经元对原输入层的神经元只是局部连接,如下图所示: 

    123

           通过局部感知特性,大大减少了模型的计算参数。但是仅仅这样还是依然会有很多参数。这就有了权值共享机制: 

           在上面的局部感知中,假设有1m的隐层神经元,每个神经元10*10的连接,这样就会有1m*10*10个参数。实际上,对于每一层来讲,所有神经元对应的权值应该是相等的,也就是说,第一个神经元的参数向量为[w1,w2,…,w100],那么其他同层的神经元也是[w1,w2,…,w100],这就是权值共享。 

           为什么需要权值共享呢?同一层下的神经元的连接参数只与特征提取的有关,而与具体的位置无关,因此可以保证同一层中所有位置的连接是权值共享的。例如:第一层隐层是一般用边缘检测,第二层是对第一层学到的边缘曲线组合得到一些特征,比如:角度、线形等;第三层会学到更加复杂的特征,比如:眼睛、眉毛等。对于同一层来说,他们提取特征的方式是一样的,第三层的神经元都是用来提取“眼睛”的特征,因此,需要计算的参数是一样的。

    激励层

    所谓激励,实际上是对卷积层的输出结果做一次非线性映射。

    激活函数介绍

    池化层

    池化(Pooling):也称为欠采样或下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。主要有:

    • Max Pooling:最大池化
    • Average Pooling:平均池化 

    123

    通过池化层,使得原本4*4的特征图压缩成了2*2,从而降低了特征维度。 

    池化层的作用

    1. 不变性,更关注是否存在某些特征而不是特征具体的位置。可以看作加了一个很强的先验,让学到的特征要能容忍一些的变化。
    2. 减小下一层输入大小,减小计算量和参数个数。
    3. 获得定长输出。(文本分类的时候输入是不定长的,可以通过池化获得定长输出)
    4. 防止过拟合或有可能会带来欠拟合。

    输出层

    经过前面若干次卷积+激励+池化后,终于来到了输出层,模型会将学到的一个高质量的特征图片全连接层。

    当来到了全连接层之后,可以理解为一个简单的多分类神经网络(如:BP神经网络),通过softmax函数得到最终的输出。整个模型训练完毕。 

     

    从图像中提取CNN特征,VGG模型是首选算法。

    VGG的特点:

    • 小卷积核。作者将卷积核全部替换为3x3(极少用了1x1);
    • 小池化核。相比AlexNet的3x3的池化核,VGG全部为2x2的池化核;
    • 层数更深特征图更宽。基于前两点外,由于卷积核专注于扩大通道数、池化专注于缩小宽和高,使得模型架构上更深更宽的同时,计算量的增加放缓;
    • 全连接转卷积。网络测试阶段将训练阶段的三个全连接替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。

    感受野:在卷积神经网络CNN中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野receptive field。我们看这段定义非常简单,用数学的语言就是感受野是CNN中的某一层输出结果的一个元素对应输入层的一个映射。再通俗点的解释是,feature map上的一个点对应输入图上的区域。

    全卷积网络(FCN)

    代码

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

    核心思想

    1.不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。 
    2.增大数据尺寸的反卷积(deconv)层。能够输出精细的结果。 

    3.结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。

    1.卷积化(convolutionalization)

         分类所使用的网络通常会在最后连接全连接层,它会将原来二维的矩阵(图片)压缩成一维的,从而丢失了空间信息,最后训练输出一个标量,这就是我们的分类标签。FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题。FCN可以接受任意尺寸的输入图像,但是至少是二维的。所以,我们丢弃全连接层,换上卷积层,而这就是所谓的卷积化了。

                               

    这幅图显示了卷积化的过程,图中显示的是AlexNet的结构,简单来说卷积化就是将其最后三层全连接层全部替换成卷积层。

     

     2.上采样(Upsampling)

         采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。

                                                è¿éåå¾çæè¿°

    输入:每个像素值等于filter的权重 
    输出:步长为stride,截取的宽度为pad。

    3.跳跃结构(Skip Architecture)

             直接将全卷积后的结果上采样后得到的结果通常是很粗糙的。所以这一结构主要是用来优化最终结果的,思路就是将不同池化层的结果进行上采样,然后结合这些结果来优化输出,具体结构如下:

                      

           对原图进行卷积conv1、pool1后图像缩小为1/2;对图像进行第二次卷积conv2、pool2后图像缩小为1/4;对图像进行第三次卷积conv3、pool3后图像缩小为1/8,此时保留pool3的featuremap;对图像进行第四次卷积conv4、pool4后图像缩小为1/16,此时保留pool4的featuremap;对图像进行第五次卷积conv5、pool5后图像缩小为1/32,然后把原来CNN操作过程中的全连接变成卷积操作的conv6、conv7,图像的featuremap的大小依然为原图的1/32,此时图像不再叫featuremap而是叫heatmap(热力图)

             其实直接使用前两种结构就已经可以得到结果了,这个上采样是通过反卷积(deconvolution)实现的,对第五层的输出(32倍放大)反卷积到原图大小。但是得到的结果还上不不够精确,一些细节无法恢复。于是将第四层的输出和第三层的输出也依次反卷积,分别需要16倍和8倍上采样,结果过也更精细一些了。这种做法的好处是兼顾了local和global信息。
     

    网络结构

          输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21。 (在PASCAL数据集上进行的,PASCAL一共20类)

                         è¿éåå¾çæè¿°

      全卷积-提取特征:虚线上半部分为全卷积网络。(蓝:卷积,绿:max pooling)。对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。

      逐像素预测  :虚线下半部分中,分别从卷积网络的不同阶段,以卷积层(蓝色×3)预测深度为21的分类结果。其中的crop层的作用是指从图像中移除不需要的信息,只保留需要的部分。

    例:第一个预测模块 
    输入16*16*4096,卷积模板尺寸1*1,输出16*16*21。 

    相当于对每个像素施加一个全连接层,从4096维特征,预测21类结果。

                     

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

    训练

    训练过程分为四个阶段,也体现了作者的设计思路,值得研究。

    第1阶段
     è¿éåå¾çæè¿°

    以经典的分类网络为初始化。最后两级是全连接(红色),参数弃去不用。

    第2阶段
     è¿éåå¾çæè¿°

    从特征小图(16*16*4096)预测分割小图(16*16*21),之后直接升采样为大图。 
    反卷积(橙色)的步长为32,这个网络称为FCN-32s。 
    这一阶段使用单GPU训练约需3天。

    第3阶段
     è¿éåå¾çæè¿°

    升采样分为两次完成(橙色×2)。 
    在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性。 
    第二次反卷积步长为16,这个网络称为FCN-16s。 
    这一阶段使用单GPU训练约需1天。

    第4阶段
     è¿éåå¾çæè¿°

    升采样分为三次完成(橙色×3)。 
    进一步融合了第3个pooling层的预测结果。 
    第三次反卷积步长为8,记为FCN-8s。 
    这一阶段使用单GPU训练约需1天。

    较浅层的预测结果包含了更多细节信息。比较2,3,4阶段可以看出,跳级结构利用浅层信息辅助逐步升采样,有更精细的结果。 
     

    FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,输出一张已经label好的图。

    扩展阅读

    https://blog.csdn.net/yjl9122/article/details/70198357

    https://blog.csdn.net/qq_36269513/article/details/80420363

    配置caffe运行FCN:http://melonteam.com/posts/quan_juan_ji_shen_jing_wang_luo_fcn_xue_xi_bi_ji/

    https://blog.csdn.net/qq_37274615/article/details/73251503
     

    展开全文
  • 全卷积神经网络FCN

    万次阅读 2018-07-19 14:48:55
    卷积神经网络CNN(YannLecun,1998年)通过构建多层的卷积层自动提取图像上的特征,一般来说,排在前边较浅的卷积层采用较小的感知域,可以学习到图像的一些局部的特征(如纹理特征),排在后边较深的卷积层采用较大...

    卷积神经网络CNN(YannLecun,1998年)通过构建多层的卷积层自动提取图像上的特征,一般来说,排在前边较浅的卷积层采用较小的感知域,可以学习到图像的一些局部的特征(如纹理特征),排在后边较深的卷积层采用较大的感知域,可以学习到更加抽象的特征(如物体大小,位置和方向信息等)。CNN在图像分类和图像检测领域取得了广泛应用。
     
    CNN提取的抽象特征对图像分类、图像中包含哪些类别的物体,以及图像中物体粗略位置的定位很有效,但是由于采用了感知域,对图像特征的提取更多的是以“一小块临域”为单位的,因此很难做到精细(像素级)的分割,不能很准确的划定物体具体的轮廓。
     
    针对CNN在图像精细分割上存在的局限性,UC Berkeley的Jonathan Long等人2015年在其论文 “Fully convolutional networks for semantic segmentation”(用于语义分割的全卷积神经网络)中提出了Fully Convolutional Networks (FCN)用于图像的分割,要解决的核心问题就是图像像素级别的分类。论文链接: https://arxiv.org/abs/1411.4038
     
    FCN与CNN的核心区别就是FCN将CNN末尾的全连接层转化成了卷积层:


    以Alexnet为例,输入是227*227*3的图像,前5层是卷积层,第5层的输出是256个特征图,大小是6*6,即256*6*6,第6、7、8层分别是长度是4096、4096、1000的一维向量。

     

    在FCN中第6、7、8层都是通过卷积得到的,卷积核的大小全部是1*1,第6层的输出是4096*7*7,第7层的输出是4096*7*7,第8层的输出是1000*7*7(7是输入图像大小的1/32),即1000个大小是7*7的特征图(称为heatmap)。

     

    经过多次卷积后,图像的分辨率越来越低,,为了从低分辨率的heatmap恢复到原图大小,以便对原图上每一个像素点进行分类预测,需要对heatmap进行反卷积,也就是上采样。论文中首先进行了一个上池化操作,再进行反卷积,使得图像分辨率提高到原图大小:

     

     对第5层的输出执行32倍的反卷积得到原图,得到的结果不是很精确,论文中同时执行了第4层和第3层输出的反卷积操作(分别需要16倍和8倍的上采样),再把这3个反卷积的结果图像融合,提升了结果的精确度:


    最后像素的分类按照该点在1000张上采样得到的图上的最大的概率来定。
     

    FCN可以接受任意大小的输入图像,但是FCN的分类结果还是不够精细,对细节不太敏感,再者没有考虑到像素与像素之间的关联关系,丢失了部分空间信息。

    展开全文
  • 全卷积神经网络图像分割(U-net)-keras实现

    万次阅读 多人点赞 2018-11-04 19:10:13
    最近在研究全卷积神经网络在图像分割方面的应用,因为自己是做医学图像处理方面的工作,所以就把一个基于FCN(全卷积神经网络)的神经网络用 keras 实现了,并且用了一个医学图像的数据集进行了图像分割。全卷积神经...

    最近在研究全卷积神经网络在图像分割方面的应用,因为自己是做医学图像处理方面的工作,所以就把一个基于FCN(全卷积神经网络)的神经网络用 keras 实现了,并且用了一个医学图像的数据集进行了图像分割。

    全卷积神经网络

    大名鼎鼎的FCN就不多做介绍了,这里有一篇很好的博文 http://www.cnblogs.com/gujianhan/p/6030639.html。
    不过还是建议把论文读一下,这样才能加深理解。

    医学图像分割框架

    医学图像分割主要有两种框架,一个是基于CNN的,另一个就是基于FCN的。

    基于CNN 的框架

    这个想法也很简单,就是对图像的每一个像素点进行分类,在每一个像素点上取一个patch,当做一幅图像,输入神经网络进行训练,举个例子:

    cnnbased

    这是一篇发表在NIPS上的论文Ciresan D, Giusti A, Gambardella L M, et al. Deep neural networks segment neuronal membranes in electron microscopy images[C]//Advances in neural information processing systems. 2012: 2843-2851.

    这是一个二分类问题,把图像中所有label为0的点作为负样本,所有label为1的点作为正样本。

    这种网络显然有两个缺点:

    1. 冗余太大,由于每个像素点都需要取一个patch,那么相邻的两个像素点的patch相似度是非常高的,这就导致了非常多的冗余,导致网络训练很慢。
    2. 感受野和定位精度不可兼得,当感受野选取比较大的时候,后面对应的pooling层的降维倍数就会增大,这样就会导致定位精度降低,但是如果感受野比较小,那么分类精度就会降低。

    基于FCN框架

    在医学图像处理领域,有一个应用很广泛的网络结构----U-net ,网络结构如下:

    这里写图片描述

    可以看出来,就是一个全卷积神经网络,输入和输出都是图像,没有全连接层。较浅的高分辨率层用来解决像素定位的问题,较深的层用来解决像素分类的问题。

    问题分析

    我采用的数据集是一个isbi挑战的数据集,网址为: http://brainiac2.mit.edu/isbi_challenge/

    数据集需要注册下载,我的GitHub上也有下载好的数据集。

    这个挑战就是提取出细胞边缘,属于一个二分类问题,问题不算难,可以当做一个练手。

    这里写图片描述

    这里最大的挑战就是数据集很小,只有30张512*512的训练图像,所以进行图像增强是非常有必要的。

    在这里,我参考了一篇做图像扭曲的论文,http://faculty.cs.tamu.edu/schaefer/research/mls.pdf

    实现的效果如下:

    这是扭曲之前:

    这里写图片描述

    这是扭曲之后:

    这里写图片描述

    这是我进行图像增强的代码: http://download.csdn.net/detail/u012931582/9817058

    keras 实现

    keras是一个非常简单地深度学习框架,可以很方便的搭建自己的网络,这是我的keras实现: https://github.com/zhixuhao/unet

    效果

    最后在测试集上的精度可以达到95.7。

    效果如下所示:

    这里写图片描述

    这里写图片描述

    展开全文
  • 全卷积网络FCN与卷积神经网络CNN的区别

    万次阅读 多人点赞 2018-06-05 13:59:34
    神经网络大神Jonathan Long发表了《Fully Convolutional Networks for Semantic Segmentation》在图像语义分割挖了一个坑,于是无穷无尽的人往坑里面跳。全卷积网络 Fully Convolutional NetworksCNN 与 FCN...

    背景

    CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015年之前还是一个世界难题。神经网络大神Jonathan Long发表了《Fully Convolutional Networks for Semantic Segmentation》在图像语义分割挖了一个坑,于是无穷无尽的人往坑里面跳。

    这里写图片描述

    全卷积网络 Fully Convolutional Networks

    CNN 与 FCN

    通常CNN网络在卷积层之后会接上若干个全连接层, 将卷积层产生的特征图(feature map)映射成一个固定长度的特征向量。以AlexNet为代表的经典CNN结构适合于图像级的分类和回归任务,因为它们最后都期望得到整个输入图像的一个数值描述(概率),比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。

    栗子:下图中的猫, 输入AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高。

    这里写图片描述

    FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在上采样的特征图上进行逐像素分类。

    最后逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本。下图是Longjon用于语义分割所采用的全卷积网络(FCN)的结构示意图:

    这里写图片描述

    简单的来说,FCN与CNN的区域在把于CNN最后的全连接层换成卷积层,输出的是一张已经Label好的图片。

    这里写图片描述

    其实,CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。下图CNN分类网络的示意图:

    这里写图片描述

    这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。

    传统的基于CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:一是存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。二是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。三是像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。

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

    全连接层 -> 成卷积层

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

    • 对于任一个卷积层,都存在一个能实现和它一样的前向传播函数的全连接层。权重矩阵是一个巨大的矩阵,除了某些特定块,其余部分都是零。而在其中大部分块中,元素都是相等的。

    • 相反,任何全连接层都可以被转化为卷积层。比如,一个 K=4096 的全连接层,输入数据体的尺寸是 77512,这个全连接层可以被等效地看做一个 F=7,P=0,S=1,K=4096 的卷积层。换句话说,就是将滤波器的尺寸设置为和输入数据体的尺寸一致了。因为只有一个单独的深度列覆盖并滑过输入数据体,所以输出将变成 114096,这个结果就和使用初始的那个全连接层一样了。

    全连接层转化为卷积层:在两种变换中,将全连接层转化为卷积层在实际运用中更加有用。假设一个卷积神经网络的输入是 224x224x3 的图像,一系列的卷积层和下采样层将图像数据变为尺寸为 7x7x512 的激活数据体。AlexNet使用了两个尺寸为4096的全连接层,最后一个有1000个神经元的全连接层用于计算分类评分。我们可以将这3个全连接层中的任意一个转化为卷积层:

    • 针对第一个连接区域是[7x7x512]的全连接层,令其滤波器尺寸为F=7,这样输出数据体就为[1x1x4096]了。
    • 针对第二个全连接层,令其滤波器尺寸为F=1,这样输出数据体为[1x1x4096]。
    • 对最后一个全连接层也做类似的,令其F=1,最终输出为[1x1x1000]

    实际操作中,每次这样的变换都需要把全连接层的权重W重塑成卷积层的滤波器。那么这样的转化有什么作用呢?它在下面的情况下可以更高效:让卷积网络在一张更大的输入图片上滑动,得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。

    举个栗子:如果我们想让224×224尺寸的浮窗,以步长为32在384×384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6×6个位置的类别得分。上述的把全连接层转换成卷积层的做法会更简便。如果224×224的输入图片经过卷积层和下采样层之后得到了[7x7x512]的数组,那么,384×384的大图片直接经过同样的卷积层和下采样层之后会得到[12x12x512]的数组。然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出((12 – 7)/1 + 1 = 6)。这个结果正是浮窗在原图经停的6×6个位置的得分!

    面对384×384的图像,让(含全连接层)的初始卷积神经网络以32像素的步长独立对图像中的224×224块进行多次评价,其效果和使用把全连接层变换为卷积层后的卷积神经网络进行一次前向传播是一样的。

    Evaluating the original ConvNet (with FC layers) independently across 224x224 crops of the 384x384 image in strides of 32 pixels gives an identical result to forwarding the converted ConvNet one time.

    如下图所示,FCN将传统CNN中的全连接层转化成卷积层,对应CNN网络FCN把最后三层全连接层转换成为三层卷积层。在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,使用的是之前CNN已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核。因此FCN网络中所有的层都是卷积层,故称为全卷积网络。

    这里写图片描述

    下图是一个全卷积层,与上图不一样的是图像对应的大小下标,CNN中输入的图像大小是同意固定resize成 227x227 大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为13*13。而FCN输入的图像是H*W大小,第一层pooling后变为原图大小的1/4,第二层变为原图大小的1/8,第五层变为原图大小的1/16,第八层变为原图大小的1/32(勘误:其实真正代码当中第一层是1/2,以此类推)。

    这里写图片描述

    经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32W/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特诊图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小。

    这里写图片描述

    最后的输出是1000张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如下图右侧有狗狗和猫猫的图。

    这里写图片描述

    upsampling

    相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算,使用转化后的卷积神经网络进行一次前向传播计算要高效得多,因为36次计算都在共享计算资源。这一技巧在实践中经常使用,一次来获得更好的结果。比如,通常将一张图像尺寸变得更大,然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分,然后在求这些分值的平均值。

    最后,如果我们想用步长小于32的浮窗怎么办?用多次的向前传播就可以解决。比如我们想用步长为16的浮窗。那么先使用原图在转化后的卷积网络执行向前传播,然后分别沿宽度,沿高度,最后同时沿宽度和高度,把原始图片分别平移16个像素,然后把这些平移之后的图分别带入卷积网络。

    这里写图片描述

    如下图所示,当图片在网络中经过处理后变成越小的图片,其特征也越明显,就像图像中颜色所示,当然啦,最后一层的图片不再是一个1个像素的图片,而是原图像 H/32xW/32 大小的图,这里为了简化而画成一个像素而已。

    这里写图片描述

    如下图所示,对原图像进行卷积conv1、pool1后原图像缩小为1/2;之后对图像进行第二次conv2、pool2后图像缩小为1/4;接着继续对图像进行第三次卷积操作conv3、pool3缩小为原图像的1/8,此时保留pool3的featureMap;接着继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的featureMap;最后对图像进行第五次卷积操作conv5、pool5,缩小为原图像的1/32,然后把原来CNN操作中的全连接变成卷积操作conv6、conv7,图像的featureMap数量改变但是图像大小依然为原图的1/32,此时图像不再叫featureMap而是叫heatMap。

    现在我们有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap进行upsampling操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此在这里向前迭代。把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个差值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。

    这里写图片描述

    缺点

    在这里我们要注意的是FCN的缺点:

    1. 是得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。

    2. 是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

    展开全文
  • 卷积神经网络连接神经网络

    万次阅读 2018-05-02 16:33:09
    卷积神经网络也是通过一层一层的节点组织起来的,对于卷积神经网络,相邻两层之间只有部分节点相连。在卷积神经网络的前几层中,每一层的节点都被组织成一个三维矩阵。前几层中每一个节点只和上一层中部分节点相连。...
  • 卷积神经网络也是通过一层一层的节点组织起来的。和全连接神经网络一样,卷积神经网络中的每一个节点就是一个神经元。在连接神经网络中,每相邻两层之间的节点都有边相连,于是会将每一层的连接层中的节点组织...
  • FCN(全卷积神经网络

    万次阅读 2016-06-03 16:16:27
    原文链接: ...从CNN 发展到 FCN ,从有监督训练到end to end, 通常CNN网络
  • 全卷积神经神经网络-深度学习笔记

    千次阅读 2017-09-29 22:28:44
    全卷积网络FCN是深度学习运用于图像语义分割的代表作,是一种端到端的图像分割方法,可以做到像素级别的预测,直接得出label map,输出分割结果。
  • 卷积神经网络

    万次阅读 多人点赞 2020-10-14 11:43:27
    自今年七月份以来,一直在实验室负责卷积神经网络(Convolutional Neural Network,CNN),期间配置和使用过theano和cuda-convnet、cuda-convnet2。为了增进CNN的理解和使用,特写此博文,以其与人交流,互有增益。...
  • 我的毕设做的是基于opencv和卷积神经网络的人脸识别项目。在做完这个项目之后,我一直想好好总结一下所学到的关于卷积神经网络的知识。现在趁着有点空闲,随手记录一点以前学过的,或者正在学习的知识点,相当于一个...
  • FCN全卷积神经网络

    千次阅读 2019-01-15 16:20:25
    CNN的强大之处在于它的多层神经网络结构能够自动学习影像的深层次特征。同时CNN的局部感知、权值共享、下采样的特点,是学习到的特征具有平移、旋转、缩放不变性,这保证了网络结构能够适应不同形态的二维图像,更...
  • 全卷积神经网络实现图像分割

    千次阅读 2018-05-30 23:41:56
    全卷积神经网络医学图像分割框架医学图像分割主要有两种框架,一个是基于CNN的,另一个就是基于FCN的。基于CNN 的框架这个想法也很简单,就是对图像的每一个像素点进行分类,在每一个像素点上取一个patch,当做一幅...
  • 卷积神经网络概念与原理

    万次阅读 多人点赞 2020-08-03 09:09:36
    一、卷积神经网络的基本概念 受Hubel和Wiesel对猫视觉皮层电生理研究启发,有人提出卷积神经网络(CNN),Yann Lecun 最早将CNN用于手写数字识别并一直保持了其在该问题的霸主地位。近年来卷积神经网络在多个方向...
  • 前段时间一直忙于用深度学习做医学图像分割,采用的方法是FCN,也就是全卷积神经网络全卷积神经网络是基于卷积神经网络的改进,使得输入和输出的尺寸一致,并且对每个像素点进行分类,达到图像分割的目的。下图是...
  • CNN笔记:通俗理解卷积神经网络

    万次阅读 多人点赞 2020-05-26 17:24:27
    通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有...
  • Ubuntu下全卷积神经网络(FCN)框架的配置和基本使用教程,适合新手
  • 背景 CNN能够对图片进行分类,可是怎么样才能识别图片中特定部分的物体,在2015...神经网络大神Jonathan Long发表了《Fully Convolutional Networks for Semantic Segmentation》在图像语义分割挖了一个坑,于是无...
  • 第五章 卷积神经网络

    千次阅读 2020-02-06 16:10:51
    第五章 卷积神经网络第五章 卷积神经网络卷积一维卷积二维卷积互相关卷积的变种卷积的数学性质交换性导数卷积神经网络用卷积来代替连接卷积层汇聚层(池化层)典型的卷积网络结构参数学习误差项的计算几种典型的卷积...
  • 何恺明课题组目标检测最近工作《R-FCN: Object Detection via Region-based Fully Convolutional Networks》: We present region-based, fully convolutional networks for accurate and efficient object ...
1 2 3 4 5 ... 20
收藏数 50,655
精华内容 20,262
关键字:

全卷积神经网络