全卷积网络(FCN)
全卷积网络(FCN)
在CNN中,通过卷积的引入能够很好的对图片进行分类,但是如何识别图片中的物体依然是一个难题。CNN会在卷积层之后接入若干全连接层,将卷积层产生的特征图映射为固定长度的特征向量进行输出,每个值代表样本属于某个类别的概率。
全卷积网络(Fully Convolutional Nerworks,FCN)则是抛弃最终的全连接层,直接对图像进行像素级的分类,在FCN中将引入反卷积层将对卷积层的输出进行采样恢复为输入图像的大小,从而对每个像素产生一个预测值,最后逐个像素计算softmax分类损失获取最终分类预测。
全连接->卷积
对于全连接层,每个神经元都将和全部输入信息相关联而在卷积层中每个神经元只和局部相关联。
所以卷积层中只需要更少的权重参数,并且可以利用参数共享减少运算,当然FCN不使用全连接层的主要原因是因为全连接层需要固定输入图像的大小,而FCN的全卷积层则可以在不同尺寸的图像上滑动再通过反卷积和跳步得到相同尺寸的特征图。
上采样
在CNN中池化层的目的便是进行下采样,用来减少特征数量和数据维度,而在FCN中经过多层卷积得到的最终输出称为热图(heatmap),还需要对该图进行上采样来对图像进行放大到原图大小。
上图最后一步的upsampling即上采用,这也是FCN实现逐像素分类的关键所在。一般由反卷积、跳步技术实现。
反卷积
反卷积中也包含一个卷积核,通过每个位置乘上卷积核得到一个矩阵再叠加上其他位置的得到的矩阵来放大原矩阵,具体操作可以看
同样反卷积也有步幅(stride)的概念,不同的步幅将增加扩大的尺寸。同时反卷积本质上也是一种特殊的卷积,这也是计算的关键(加快计算),例如上面的反卷积过程我们可以变成一个卷积
上图分别是步幅为1和2的反卷积过程,可以发现只需要对原数据进行填充再进行卷积即可得到反卷积结果,而填充的具体位置和大小则由步幅决定。
跳层
随着卷积层数的增加,输出的特征图会更小,最后一层的感受野将变得更大,此时如果直接对这里得到的热图进行上采样至原图大小将会丢失细节,所以此时可以通过跳层(skip layers)结构来优化这个问题。
上图中对原图经过7次卷积和5次池化,在最终上采样时不是直接用
conv7
得到的热图进行反卷积直接得到原尺寸预测图。而是对热图做一个小比例上采样(例如上图中2倍上采样),再从中间层选取特征图数据相加。再对得到的结果进行上采用+融合操作直到尺寸达到原图大小。引入跳层结构的好处是同时兼顾了局部和全局的信息,对于深层卷积网络,感受野增加代表输出关联的全局信息越多,能够很好的对图像进行分类,但是要做到图像语义分割还要解决物体在哪的问题,而深层卷积会丢失掉特征外的空域信息(也就是细节),所以跳层便是将深层网络和浅层网络相结合兼顾二者的优点。