fcn_fcntl - CSDN
精华内容
参与话题
  • 语义分割-FCN

    2019-03-01 16:02:02
    1.熟悉Flink大数据生态圈以及未来发展趋势 2.快速上手开发Flink批处理程序和流处理程序 3.掌握了Flink核心知识与编程模型,深入理解Flink计算框架 4.掌握了Flink HA分布式集群安装部署
  • FCN是深度学习应用在图像分割的代表作, 是一种端到端(end to end)的图像分割方法, 让网络做像素级别的预测直接得出label map。因为FCN网络中所有的层都是卷积层,故称为全卷积网络。 全卷积神经网络主要使用了三种...

    一.概述

    FCN是深度学习应用在图像分割的代表作, 是一种端到端(end to end)的图像分割方法, 让网络做像素级别的预测直接得出label map。因为FCN网络中所有的层都是卷积层,故称为全卷积网络。

    全卷积神经网络主要使用了三种技术:

    1. 卷积化(Convolutional)

    2. 上采样(Upsample)

    3. 跳跃结构(Skip Layer)

    二.网络结构

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

     

    三.全卷积详解

    1.全连接与全卷积相互转化的可能性

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

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

      全连接层实际就是卷积核大小为上层特征大小的卷积运算,卷积后的结果为一个节点,就对应全连接层的一个点。
      即若全卷积上一层的feature map尺寸为:N_{H}\times N_{W}\times N_{C}

      全卷积层为:1\times 1\times K

      则可以通过一个卷积操作来代替全连接层,该卷积核大小为N_{H}\times N_{W}\times N_{C},且共有K个。

    • 卷积层到全连接层的实现:可以通过一个W和b完成卷积层到全连接层的转化,W:[K,W],b:[K,1]。

    2.为什么传统CNN的输入图片是固定大小?

    对于CNN,一幅输入图片在经过卷积和pooling层时,这些层是不关心图片大小的。比如对于一个卷积层,outputsize = (inputsize - kernelsize) / stride + 1,它并不关心inputsize多大,对于一个inputsize大小的输入feature map,滑窗卷积,输出outputsize大小的feature map即可(主要是这里的卷积核个数K可以自己指定)。pooling层同理。但是在进入全连接层时,feature map(假设大小为n×n)要拉成一条向量,而向量中每个元素(共n×n个)作为一个结点都要与下一个层的所有结点(假设4096个)全连接,这里的权值个数是4096×n×n,而我们知道神经网络结构一旦确定,它的权值个数都是固定的,所以这个n不能变化,n是conv5的outputsize,所以层层向回看,每个outputsize都要固定,那每个inputsize都要固定,因此输入图片大小要固定。

    3.把全连接层的权重W重塑成卷积层的滤波器有什么好处?

    一个确定的CNN网络结构之所以要固定输入图片大小,是因为全连接层权值数固定,而该权值数和feature map大小有关, 但是FCN在CNN的基础上把1000个结点的全连接层改为含有1000个1×1卷积核的卷积层,经过这一层,还是得到二维的feature map,同样我们也不关心这个feature map大小, 所以对于输入图片的size并没有限制

    如下图所示,FCN将传统CNN中的全连接层转化成卷积层,对应CNN网络FCN把最后三层全连接层转换成为三层卷积层 :

             

    • 全连接层转化为全卷积层 : 在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,使用的是之前CNN已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核
    • CNN中输入的图像大小是统一固定成227x227大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为13x13, 而FCN输入的图像是H*W大小,第一层pooling后变为原图大小的1/2,第二层变为原图大小的1/4,第五层变为原图大小的1/8,第八层变为原图大小的1/16
    • 经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大几次到原图像的大小

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

    三. 反卷积

     Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层,不关心input大小,滑窗卷积后输出output。deconv并不是真正的deconvolution(卷积的逆变换),最近比较公认的叫法应该是transposed convolution,deconv的前向传播就是conv的反向传播。
       反卷积参数: 利用卷积过程filter的转置(实际上就是水平和竖直方向上翻转filter)作为计算卷积前的特征图。
       反卷积的运算如下所示:

                
                      蓝色是反卷积层的input,绿色是反卷积层的outputFull padding, transposed Full padding, transposed。

    四.跳级(skip)结构

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

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

    五.模型训练

    1. 用AlexNet,VGG16或者GoogleNet训练好的模型做初始化,在这个基础上做fine-tuning,全部都fine-tuning,只需在末尾加上upsampling,参数的学习还是利用CNN本身的反向传播原理。
    2. 采用whole image做训练,不进行patchwise sampling。实验证明直接用全图已经很effective and efficient。
    3. 对class score的卷积层做全零初始化。随机初始化在性能和收敛上没有优势。

    FCN例子: 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet

    • 蓝色:卷积层
    • 绿色:Max Pooling层
    • 黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒
    • 灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出
    • 对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变
    • 全卷积层部分进行特征提取, 提取卷积层(3个蓝色层)的输出来作为预测21个类别的特征

    • 图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定

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

                      

    2.从特征小图()预测分割小图(),之后直接上采样为大图。 

                        

                                                         反卷积(橙色)的步长为32,这个网络称为FCN-32s

    3.上采样分为两次完成(橙色×2), 在第二次上采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性 

                            

                                                               第二次反卷积步长为16,这个网络称为FCN-16s

    4.升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果

                              

    其他参数:

    • minibatch:20张图片

    • learning rate:0.001

    • 初始化:分类网络之外的卷积层参数初始化为0

    • 反卷积参数初始化为bilinear插值。最后一层反卷积固定位bilinear插值不做学习

                   

    六.FCN总结

    FCN总结:

    • 想要精确预测每个像素的分割结果必须经历从大到小,再从小到大的两个过程
    • 在升采样过程中,分阶段增大比一步到位效果更好
    • 在升采样的每个阶段,使用降采样对应层的特征进行辅助

    缺点:

    • 得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感
    • 对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性
    展开全文
  • 论文Fully Convolutional Networks for Semantic ...fcn开源代码github下载地址https://github.com/shelhamer/fcn.berkeleyvision.org核心思想该论文包含了当下CNN的三个思潮- 不含全连接层(fc)的全卷积(fu...

     

    论文Fully Convolutional Networks for Semantic Segmentation 是图像分割的milestone论文。

     

    理清一下我学习过程中关注的重点。

     

    fcn开源代码

    github下载地址https://github.com/shelhamer/fcn.berkeleyvision.org 

     

    核心思想

    该论文包含了当下CNN的三个思潮 
    - 不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。 
    - 增大数据尺寸的反卷积(deconv)层。能够输出精细的结果。 

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

     

    一些重点:

    损失函数是在最后一层的 spatial map上的 pixel 的 loss 和,在每一个 pixel 使用 softmax loss 

    使用 skip 结构融合多层(3层)输出,底层网络应该可以预测更多的位置信息,因为他的感受野小可以看到小的 pixels

    上采样 lower-resolution layers 时,如果采样后的图因为 padding 等原因和前面的图大小不同,使用 crop ,当裁剪成大小相同的,spatially aligned ,使用 concat 操作融合两个层 

     

    预备知识:

     

    CNN与FCN

    • 通常cnn网络在卷积之后会接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率,如ALexNet网络最后输出一个1000维的向量表示输入图像属于每一类的概率。
    • FCN对图像进行像素级的分类,从而解决了语义级别的图像分割问题。与经典的CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。
      -全卷积网络(FCN)是从抽象的特征中恢复出每个像素所属的类别。即从图像级别的分类进一步延伸到像素级别的分类。
    • FCN将传统CNN中的全连接层转化成一个个的卷积层。如下图所示,在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。 

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

     

     

    网络结构

     

    网络结构如下。输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21。 (在PASCAL数据集上进行的,PASCAL一共20类)
    这里写图片描述

    全卷积-提取特征

    虚线上半部分为全卷积网络。(蓝:卷积,绿:max pooling)。对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。 
    这部分由深度学习分类问题中经典网络AlexNet1修改而来。只不过,把最后两个全连接层(fc)改成了卷积层。

    论文中,达到最高精度的分类网络是VGG16,但提供的模型基于AlexNet。此处使用AlexNet便于绘图。

     

     

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

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

    针对第二个全连接层,令其滤波器尺寸为F=1,这样输出数据体为[1x1x4096]

    对最后一个全连接层也做类似的,令其F=1,最终输出为[1x1x1000]

    逐像素预测

    虚线下半部分中,分别从卷积网络的不同阶段,以卷积层(蓝色×3)预测深度为21的分类结果。

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

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

     

    怎么具体逐像素点预测分类的:

    参考博客:http://www.cnblogs.com/gujianhan/p/6030639.html

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

    具体过程:

     

    这里写图片描述

    经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32∗W/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图

    得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小。

    (也就是将高维特征图翻译成原图时对应的分割图像!!)

    这里写图片描述

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

    反卷积-升采样

    (这里会先进行上采样,即扩大像素;再进行卷积——通过学习获得权值)

    下半部分,反卷积层(橙色×3)可以把输入数据尺寸放大。和卷积层一样,上采样的具体参数经过训练确定。

    这里图像的反卷积与下图的full卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现end to end

    (feature map值与权重不同,生成的上采样的二值区域也是不一样的。)

    例:反卷积2 
    这里写图片描述 
    输入:每个像素值等于filter的权重 
    输出:步长为stride,截取的宽度为pad。

    跳级结构

     

    • 如下图所示:对原图进行卷积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信息。

    0672a434af63ac7728b6f2f71d679a20efbcb48629eae7d40bbcf2efa0b00b09uploading.4e448015.gif转存失败重新上传取消0672a434af63ac7728b6f2f71d679a20efbcb48629eae7d40bbcf2efa0b00b09uploading.4e448015.gif转存失败重新上传取消

     

    网络的loss层

     

    这里写图片描述 
    sem是网络输入层的top:’sem’ 是数据的标签 

     

    fcn网络的输入batchsize是1,因为分割loss的计算在每一个像素点都一个真值(标签),相当于每一个像素点的都是一个分类任务,一个图像就有对应像素点个样本。所以分割任务的batch是一个图片,将一个图片最后在所有像素点上的分类loss加起来计算一次梯度的更新。

     

    训练

     

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

    第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阶段可以看出,跳级结构利用浅层信息辅助逐步升采样,有更精细的结果。 
    这里写图片描述

    其他参数

    minibatch:20张图片 
    learning rate:0.001 
    初始化: 
    分类网络之外的卷积层参数初始化为0。 
    反卷积参数初始化为bilinear插值。最后一层反卷积固定位bilinear插值不做学习。

    结论

    总体来说,本文的逻辑如下: 
    - 想要精确预测每个像素的分割结果 
    - 必须经历从大到小,再从小到大的两个过程 
    - 在升采样过程中,分阶段增大比一步到位效果更好 
    - 在升采样的每个阶段,使用降采样对应层的特征进行辅助

     

    后续的一个发展:

    采用条件随机场建立类别的关系。

    举个简单的例子,"天空"""这样的像素在物理空间是相邻的概率,应该要比"天空"""这样像素相邻的概率大,那么天空的边缘就更应该判断为鸟而不是鱼(从概率的角度)。https://blog.csdn.net/DL_CreepingBird/article/details/78574059

     

    参考博客:https://blog.csdn.net/xxiaozr/article/details/74159614

    配置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详细讲解(超级详细哦)

    万次阅读 多人点赞 2019-08-25 18:37:30
    四、FCN全卷积网络+upsampling上采样+opencv图像金字塔(超级详细哦)1、全卷积网络(FCN)的简单介绍1.1、CNN与FCN的比较1、上采样理论2、OpenCV图像金字塔 1、全卷积网络(FCN)的简单介绍 1.1、CNN与FCN的比较 ...

    1、全卷积网络(FCN)的简单介绍

    1.1、CNN与FCN的比较

    CNN: 在传统的CNN网络中,在最后的卷积层之后会连接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率,如ALexNet网络最后输出一个1000维的向量表示输入图像属于每一类的概率。如下图所示:
    在这里插入图片描述
    在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。

    FCN: FCN是对图像进行像素级的分类(也就是每个像素点都进行分类),从而解决了语义级别的图像分割问题。与上面介绍的经典CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。如下图所示:
    在这里插入图片描述
    简单的说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,其输出的是一张已经标记好的图,而不是一个概率值。

    2、FCN上采样理论讲解

    FCN网络一般是用来对图像进行语义分割的,于是就需要对图像上的各个像素进行分类,这就需要一个上采样将最后得到的输出上采样到原图的大小。上采样对于低分辨率的特征图,常常采用上采样的方式将它还原高分辨率,这里陈述上采样的三种方法。

    2.1、双线性插值上采样

    单线性插值(一个方向上)就是知道两个点的值,并将两点连成一条直线,来确定中间的点的值,假设,现在有两点 x1,y1x2,y2(x_1,y_1 )、(x_2,y_2)连成一条直线,[x1,x2][x_1,x_2]中的点就可以用线上的点表示。双线性插值(两个方向上)是一个三维的坐标系,因此,需要找到4个点来确定中心点坐标,如下图所示的例子:
    在这里插入图片描述
    假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11=(x1,y1)Q12=(x1,y2),Q21=(x2,y1)Q_11 = (x_1, y_1)、Q_12 = (x_1, y_2), Q_21 = (x_2, y_1) 以及 Q22=(x2,y2)Q_22 = (x_2, y_2) 四个点的值。最常见的情况,f就是一个像素点的像素值。首先在 x 方向进行线性插值,得到:
    在这里插入图片描述
    然后在 y 方向进行线性插值,得到:
    在这里插入图片描述
    综合起来就是双线性插值最后的结果:
    在这里插入图片描述
    由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。opencv中的源码如下,用了一些优化手段,比如用整数计算代替float(下面代码中的*2048就是变11位小数为整数,最后有两个连乘,因此>>22位),以及源图像和目标图像几何中心的对齐

    • SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5
    • SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5,
      这个要重点说一下,源图像和目标图像的原点(0,0)均选择左上角,然后根据插值公式计算目标图像每点像素,假设你需要将一幅5x5的图像缩小成3x3,那么源图像和目标图像各个像素之间的对应关系如下。如果没有这个中心对齐,根据基本公式去算,就会得到左边这样的结果;而用了对齐,就会得到右边的结果:
      在这里插入图片描述

    2.2、反卷积上采样

    怎样上采样: 普通的卷积操作,会使得分辨率降低,如下图33的卷积核去卷积44得到2*2的输出。
    在这里插入图片描述
    上采样的过程也是卷积,那么怎么会得到分辨率提高呢?之前我们看卷积时有个保持输出与输入同分辨率的方法就是周围补0。
    在这里插入图片描述
    其实上面这种补0的方法事有问题的,你想一下,只在四周补0会导致最边上的信息不太好,那我们把这个信息平均下,在每个像素与像素之间补0,如下图所示:
    在这里插入图片描述

    2.3、反池化上采样

    反池化可以用下图来理解,再池化时需要记录下池化的位置,反池化时把池化的位置直接还原,其他位置填0。
    在这里插入图片描述
    上面三种方法各有优缺,双线性插值方法实现简单,无需训练;反卷积上采样需要训练,但能更好的还原特征图;

    2、 FCN具体实现过程

    FCN与CNN的核心区别就是FCN将CNN末尾的全连接层转化成了卷积层:以Alexnet为例,输入是2272273的图像,前5层是卷积层,第5层的输出是256个特征图,大小是66,即25666,第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进行反卷积,也就是上采样。论文中首先进行了一个上池化操作,再进行反卷积(上述所提到的上池化操作和反卷积操作,其实可以理解为上卷积操作),使得图像分辨率提高到原图大小。如下图所示:
    在这里插入图片描述
    跳级(strip)结构:对第5层的输出执行32倍的反卷积得到原图,得到的结果不是很精确,论文中同时执行了第4层和第3层输出的反卷积操作(分别需要16倍和8倍的上采样),再把这3个反卷积的结果图像融合,提升了结果的精确度:
    在这里插入图片描述
    最后像素的分类按照该点在1000张上采样得到的图上的最大的概率来定。FCN可以接受任意大小的输入图像,但是FCN的分类结果还是不够精细,对细节不太敏感,再者没有考虑到像素与像素之间的关联关系,丢失了部分空间信息。

    3、 FCN模型实现过程

    3.1、模型训练

    • 用AlexNet,VGG16或者GoogleNet训练好的模型做初始化,在这个基础上做fine-tuning,只需在末尾加上upsampling,参数的学习还是利用CNN本身的反向传播原理。

    • 采用全图做训练,不进行局部抽样。实验证明直接用全图已经很高效。
    FCN例子: 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet。

    • 蓝色:卷积层。

    • 绿色:Max Pooling层。

    • 黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒。

    • 灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。

    • 对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。
    在这里插入图片描述
    • 全卷积层部分进行特征提取, 提取卷积层(3个蓝色层)的输出来作为预测21个类别的特征。

    • 图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定。

    1、 以经典的AlexNet分类网络为初始化。最后两级是全连接(红色),参数弃去不用。
    在这里插入图片描述
    2、 反卷积(橙色)的步长为32,这个网络称为FCN-32s

    从特征小图()预测分割小图(),之后直接升采样为大图。
    在这里插入图片描述
    3、 第二次反卷积步长为16,这个网络称为FCN-16s

    升采样分为两次完成(橙色×2), 在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性。
    在这里插入图片描述
    4、 第三次反卷积步长为8,记为FCN-8s。

    升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果。
    在这里插入图片描述
    其他参数:
    • minibatch:20张图片
    • learning rate:0.001
    • 初始化:分类网络之外的卷积层参数初始化为0
    • 反卷积参数初始化为bilinear插值。最后一层反卷积固定位bilinear插值不做学习
    在这里插入图片描述
    总体来说,本文的逻辑如下:

    • 想要精确预测每个像素的分割结果
    • 必须经历从大到小,再从小到大的两个过程
    • 在升采样过程中,分阶段增大比一步到位效果更好
    • 在升采样的每个阶段,使用降采样对应层的特征进行辅助

    缺点:

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

    3.2、FCN模型的简单总结

    FCN的卷积网络部分可以采用VGG、GoogleNet、AlexNet等作为前置基础网络,在这些的预训练基础上进行迁移学习与finetuning,对反卷积的结果跟对应的正向feature map进行叠加输出(这样做的目的是得到更加准确的像素级别分割),根据上采样的倍数不一样分为FCN-8S、FCN-16S、FCN-32S,图示如下:

    详情:

    对原图像进行卷积 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之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。(具体怎么做,本博客已经在3.1节进行了详细的讲解,不懂的地方可以回过头不查看。)如下图所示:注,上下两个图表达相同的意思。
    在这里插入图片描述

    展开全文
  • FCN详解

    千次阅读 2019-06-12 11:02:31
    FCN对图像进行像素级的分类,从而解决了语义级别的图像分割(semantic segmentation)问题。与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全连接层+softmax输出)不同,FCN可以接受任意...

    FCN(fully convolution net)

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

     

     (1)在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。

    (2)FCN与CNN的区别在于把CNN最后的全连接层转换成卷积层,输出的是一张已经带有标签的图片, 而这个图片就可以做语义分割。

    (3)CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征: 较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。高层的抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高, 所以我们常常可以将卷积层看作是特征提取器。

     

    (1)全连接层转化为全卷积层 : 在CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小分别为 (1,1,4096)、(1,1,4096)、(1,1,1000)。

    (2)经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。上图中7*78channel之后对原图像进行unpooling,把图像进行放大几次到原图像的大小。

     

    UnPooling UnsamplingDeconvolution的区别:

    unpooling是填充0unsampling是填充相同的值

    上图是full卷积,full卷积:输入(蓝色2*2大小的图形)为N1*N1,卷积核(灰色的3*3)大小为N2*N2,卷积后图像大小为N1+N2-1(绿色4*4)

     

    图像的deconvolution实现过程:

    输入:2X2, 卷积核4X4,滑动步长:3,输出7X7

    输入与输出的关系为:outputSize = (input - 1) * stride + kernel_size

    1.先对每一个像素做full卷积,卷积后输出大小为1+4-1=4,得到4*4大小的特征图(2*2大小分开卷积,相当于4个1*1的图形做卷积)

    2.对四个特征图进行步长为3的fusion(相加),步长为3是指每隔3个像素进行fusion,重叠部分进行相加,即输出的第一行第四列是由红色特征图的第一行第四列与绿色特征图第一行第一列相加得到,其他的依此类推

     

    反卷积说明

    反卷积(deconvolutional)运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层,不关心input大小,滑窗卷积后输出output。deconv并不是真正的deconvolution(卷积的逆变换),最近比较公认的叫法应该是transposed convolution,deconv的前向传播就是conv的反向传播。

    反卷积参数: 利用卷积过程filter的转置(先水平翻转,再竖直方向上翻转filter)作为计算卷积前的特征图。

    蓝色是反卷积层的input,绿色是output

    跳级(skip)结构

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

     

    FCN例子: 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet。

    蓝色:卷积层。

    绿色:Max Pooling层。

    黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒。

    灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。

    对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。

     

     

    FCN缺点

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

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

     

    参考:https://github.com/scutan90/DeepLearning-500-questions

    展开全文
  • FCN算法详解

    万次阅读 2018-12-02 09:28:55
    基于全卷积网络的语义分割 1. 摘要  卷积网络是一种强大的视觉模型,可产生特征的层次结构。卷积网络在语义分割方面的应用已超过了最先进的水平。本文关键是建立“全卷积”网络,它接受任意大小的输入,并通过...
  • FCN原理浅析

    千次阅读 2018-12-17 18:37:42
    FCN全卷积网络和CNN网络十分相似,主要区别在于取消全连接层并以卷积层的方式进行替代,最终输出heat map而不是feature map。本文选取AlexNet作为典型的CNN并将其转换为FCN以分析思路,AlexNet有五个卷积层、三个...
  • FCN

    2018-09-12 11:32:18
    从图像分类到图像分割 卷积神经网络(CNN)自2012年以来,在图像分类和图像检测等方面取得了巨大的成就和广泛的应用。 CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层...
  • 全卷积网络(FCN)与图像分割

    万次阅读 多人点赞 2016-05-16 18:00:39
    与传统用CNN进行图像分割的方法相比,FCN有两大明显的优点:一是可以接受任意大小的输入图像,而不用要求所有的训练图像和测试图像具有同样的尺寸。二是更加高效,因为避免了由于使用像素块而带来的重复存储和计算...
  • 【论文笔记】FCN

    千次阅读 多人点赞 2019-10-09 17:03:31
    《Fully Convolutional Networks for Semantic Segmentation》,CVPR 2015 核心思想: 建立全卷积网络,使其可以输入任意大小的图片,并输出一个对应大小的 spatially dense prediction task:就是需要对图像中所有...
  • 基于Pytorch的FCN实现

    万次阅读 2018-03-21 16:58:43
    https://zhuanlan.zhihu.com/p/32506912
  • 关于FCN代码实现(实践篇)

    万次阅读 2016-11-22 21:00:25
    1.FCN做图像语义分割--测试和训练(matlab) http://blog.csdn.net/zhjm07054115/article/details/51569450 2.使用FCN做图像语义分割(实践篇)(Keras) http://www.itdadao.com/articles/c15a229744p0.html 3.Ubuntu下...
  • 新版caffe FCN的使用教程

    万次阅读 热门讨论 2016-07-07 15:44:10
    引言FCN的出现,大幅度改变了近两年来的CNN方向。之前我曾写过caffe版本FCN的使用。最近做实验正好要用到FCN,发现FCN的code已有较大改动。因此,记录一下新版FCN的使用和需要注意的地方。新版FCN的更新内容FCN的...
  • 之前写过一篇博客是制作自己的数据集利用FCN-32s模型训练,对FCN-16s和FCN-8s训练写的比较粗略,所以写这篇博客主要是补充FCN-16s和FCN-8s训练过程。 训练前准备 在使用fcn之前需要配置caffe环境,可以参考win10+...
  • Transfer Fcn

    千次阅读 2016-10-28 22:56:32
    点击打开链接
  • keras FCN实现(2)

    千次阅读 热门讨论 2019-06-04 11:38:23
    fcn8的实现,承接上篇。 代码位置: https://github.com/lsh1994/keras-fcn 结构: 训练曲线: 可视化结果:
  • Ubuntu下全卷积神经网络(FCN)框架的配置和基本使用教程,适合新手
  • keras语义分割FCN实现

    千次阅读 热门讨论 2019-05-25 20:33:56
    实验环境 win10;python3.6 .7 ; 项目 Value keras 2.2.4 tensorflow-gpu 1.10.0 实验参考:https://github.com/divamgupta/image-segmentation-keras 实验数据:...
  • FCN网络结构

    千次阅读 2019-06-16 16:07:31
  • 我用的是voc-fcn8,制作好数据集后 我不知道那个网络层的名字和输出种类怎么改 具体改哪里 改哪些层?求告知?另外那个我gpu溢出 那个bachsize在哪里 怎么改?
1 2 3 4 5 ... 20
收藏数 16,444
精华内容 6,577
关键字:

fcn