1.FCN
1.1 CNN与FCN的比较
简单的说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,其输出的是一张已经标记好的图,而不是一个概率值。如下两图所示:
(1)在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。
(2)FCN是对图像进行像素级的分类(也就是每个像素点都进行分类),从而解决了语义级别的图像分割问题。与上面介绍的经典CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。如下图所示:
总结:
在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。
1.2 三种上采样方法
经过全卷积化的网络后,我们会发现在整个过程中,原图象被进行了32倍的降采样。
但是FCN网络一般是用来对图像进行语义分割的,于是就需要对图像上的各个像素进行分类,这就需要一个上采样将降采样32倍的图像上采样到原图的大小。上采样对于低分辨率的特征图,常常采用上采样的方式将它还原高分辨率,这里陈述上采样的三种方法。
1.2.1 双线性插值上采样
简单来说,插值指利用已知的点来“猜”未知的点,一个分析帖。特点是不需要进行学习,运行速度快,操作简单。
单线性插值(一个方向上)就是知道两个点的值,并将两点连成一条直线,来确定中间的点的值,假设,现在有两点 (x1,y1)、(x2,y2)连成一条直线 [x1,x2]中的点就可以用线上的点表示。双线性插值(两个方向上)是一个三维的坐标系,因此,需要找到4个点来确定中心点坐标,如下图所示的例子:
已知的红色数据点和待插值的绿色数据点。咱们已知函数f在Q1,Q2,Q3,Q4四个点值,咱们想获得未知函数f在点P= (x,y) 的值。
第一步:X方向的线性插值,在Q12,Q22中插入蓝色点R2,Q11,Q21中插入蓝色点R1。
第二步 :Y方向的线性插值 ,经过第一步计算出的R1与R2在y方向上插值计算出P点。
在x与y方向上,z值成单调性特性的应用中,此种方法能够作外插运算,便可以求解Q11~Q22所构成的正方形之外的点的值,计算正方形之外的点就是上采样的过程!!!
1.2.2 反卷积上采样
首先要记住把反卷积理解成逆卷积(Deconvolution)比较容易引起误会,把反卷积理解为转置卷积(Transposed Convolution)是一个更为合适的叫法.
(1)外围全补零(Full padding)反卷积
(2)插零分数步长反卷积
其实上面这种补0的方法事有问题的,你想一下,只在四周补0会导致最边上的信息不太好,那我们把这个信息平均下,在每个像素与像素之间补0,这就是插零分数步长反卷积
1.2.3 反池化上采样
反池化可以用下图来理解,
(1)在池化时需要记录下池化的位置,形成“池化索引”
(2)反池化时把池化的位置直接还原,其他位置填0。
注意:
反卷积与反池化之间最大的区别在于反卷积过程是有参数要进行学习的。
理论上