FCN是深度学习应用在图像分割的代表作, 是一种端到端(end to end)的图像分割方法, 让网络做像素级别的预测直接得出label map。
论文 : Fully Convolutional Networks for Semantic Segmentation
基本概念
图像分割分类
semantic segmentation- 只标记语义, 也就是说只分割出人这个类来。
instance segmentation- 标记实例和语义, 不仅要分割出人这个类, 而且要分割出这个人是谁, 也就是具体的实例。
FCN网络结构
与经典的CNN 在卷积层之后使用全连接层得到固定长度的特征向量,进行分类(全连接层+softmax输出)不同,FCN可以接收任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map 进行上采样,使它恢复到输入图像相同尺寸,从而可以对每个像素都产生了一个预测,同时保留了原始输入图像的中的空间信息,最后在上采样的特征图上进行逐像素分类。
最后逐个像素计算softmax分类的损失函数,相当于每个像素对应一个训练样本。
简单来说,FCN与CNN 的区别在于:
FCN把CNN 最后的全连接层换成了卷积层,输出的是一张已经Label 好的图片。
全连接层的实现:(https://www.jianshu.com/p/a4b8b0fc7d21)
全连接层的每一个节点都与上一层每个节点连接,是把前一层的输出特征都综合起来,所以该层的权值参数是最多的。例如在VGG16中,第一个全连接层FC1有4096个节点,上一层POOL2是7*7*512 = 25088个节点,则该传输需要4096*25088个权值,需要耗很大的内存。
由于可以把全连接层看成卷积层的一个特例,比如VGG16,POOL2到FC1层是全连接的,把pool2的输出节点按向量排列,即有25088个维,每一维大小为1*1,卷积核可以看成num_filters = 4096,channal = 25088,kernel_size = 1,stride=1,no pad。
前向传播
下面用一个简单的网络具体介绍一下推导过程(https://blog.csdn.net/qq_36955294/article/details/80237529)
下图中连线最密集的2个地方就是全连接层,这很明显的可以看出全连接层的参数的确很多。在前向计算过程,也就是一个线性的加权求和的过程,全连接层的每一个输出都可以看成前一层的每一个结点乘以一个权重系数W,最后加上一个偏置值b得到,即 。如下图中第一个全连接层,输入有50*4*4个神经元结点,输出有500个结点,则一共需要50*4*4*500=400000个权值参数W和500个偏置参数b。
下面用一个简单的网络具体介绍一下推导过程
其中,x1、x2、x3为全连接层的输入,a1、a2、a3为输出,
可以写成如下矩阵形式:
反向传播:
参考:https://www.jianshu.com/p/244c7340984e
CNN 的强大之处在于:
它的多层结构能自动学习特征,并且可以学习到多个层次的特征;
较浅的卷积层感知域较小,学习到一些局部区域的特征;
较深的卷积层具有较大的感知域,能够学习到更加抽象的一些特征。
这些抽象的的特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。
抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。
以AlexNet为例:
在卷积层之后会接上若干个全连接层,最后得到整个输入图像的一个概率向量。比如AlexNet的ImageNet模型输出一个1000维的向量表示输入图像属于每一类的概率(softmax归一化)。
传统CNN为什么需要固定输入图片大小?
对于CNN,一幅输入图片在经过卷积和pooling层时,这些层是不关心图片大小的。比如对于一个卷积层,它并不关心input size多大,对于一个input size大小的输入feature map,滑窗卷积,输出output size大小的feature map即可。pooling层同理。但是在进入全连接层时,feature map(假设大小为n×n)要拉成一条向量,而向量中每个元素(共n×n个)作为一个结点都要与下一个层的所有结点(假设4096个)全连接,这里的权值个数是4096×n×n,而我们知道神经网络结构一旦确定,它的权值个数都是固定的,所以这个n不能变化,n是conv5的output size,所以层层向回看,每个output size都要固定,那每个input size都要固定,因此输入图片大小要固定。
把全连接层的权重W重塑成卷积层的滤波器有什么好处呢?
这样的转化可以在单个前向传播的过程中, 使得卷积网络在一张更大的输入图片上滑动,从而得到多个输出(可以理解为一个label map)。
一个确定的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已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核。
经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大几次到原图像的大小。
反卷积
Upsampling的操作可以看成是反卷积(deconvolutional),卷积运算的参数和CNN的参数一样是在训练FCN模型的过程中通过bp算法学习得到。反卷积层也是卷积层,不关心input大小,滑窗卷积后输出output。deconv并不是真正的deconvolution(卷积的逆变换),最近比较公认的叫法应该是transposed convolution,deconv的前向传播就是conv的反向传播。
反卷积的运算如下所示:
蓝色是反卷积层的input,绿色是反卷积层的outputFull padding, transposed
Full padding, transposed
Zero padding, non-unit strides, transposed
上图中的反卷积,input是2×2, output是4×4Zero padding, non-unit strides, transposed
上图中的反卷积,input feature map是3×3, 转化后是5×5, output是5×5
跳级(skip)结构
对CNN的结果做处理,得到了dense prediction,而作者在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和:
举例
FCN例子:输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet
···蓝色:卷积层
···绿色:Max Pooling层
···黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒
···灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出
···对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变
···全卷积层部分进行特征提取, 提取卷积层(3个蓝色层)的输出来作为预测21个类别的特征
···图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定
以经典的AlexNet分类网络为初始化。最后两级是全连接(红色),参数弃去不用
从特征小图预测分割小图,之后直接升采样为大图。
反卷积(橙色)的步长为32,这个网络称为FCN-32s
升采样分为两次完成(橙色×2), 在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性
第二次反卷积步长为16,这个网络称为FCN-16s
升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果
第三次反卷积步长为8,记为FCN-8s
https://blog.csdn.net/tuuzhang/article/details/81004731
网友评论