【图像分割】FCN (Fully Convolutional Networks)
FCN (Fully Convolutional Networks)
原文:
实现:
https://github.com/shelhamer/fcn.berkeleyvision.org
https://github.com/wkentaro/pytorch-fcn
相关文章:
核心思想
-
卷积化(Convolutional)
不含全连接层(fc)的全卷积(fully conv)网络,可适应任意尺寸输入。 -
上采样(Upsample)
通过反卷积(deconvolution)/ 转置卷积(transposed convolution)增大特征图尺寸。 -
跳跃结构(Skip Layer)
结合不同深度层结果的跳级 (skip) 结构,得到更精细的分割结果。
优点和不足
-
优点
可以接受任意大小的输入图像,不用要求所有的训练图像和测试图像具有同样的尺寸
更加高效,因为避免了由于使用像素块而带来的重复存储和计算卷积的问题。 -
缺点
图像分割结果不够精细,没有分割出目标图像的细节。虽然8倍上采样比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
独立对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了通常在基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。
网络结构
网络结构如下。输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21。
-
全卷积 - 提取特征
虚线上半部分为全卷积网络(蓝:卷积,绿:max pooling)。对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。 这部分由深度学习分类问题中经典网络AlexNet修改而来。只不过,把最后两个全连接层(fc)改成了卷积层。 -
逐像素预测
虚线下半部分为 upsample 网络,分别从卷积网络的不同阶段预测深度为21的分类结果。
例:第一个预测模块的输入:16x16x4096,卷积核大小1x1,输出16x16x21。 相当于对每个像素施加一个全连接层,通过4096维特征预测21类结果。
训练过程
训练过程分为四个阶段
第1阶段
以经典的分类网络为初始化。最后两级是全连接(红色),参数弃去不用。
第2阶段
从特征小图(16164096)预测分割小图(161621),之后直接升采样为大图。
反卷积(橙色)的步长为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阶段可以看出,跳级结构利用浅层信息辅助逐步升采样,有更精细的结果。
upsample 过程
模型特征提取阶段通过卷积、池化、非线性**函数等操作输出特征图像(heatmap)。因为丢了很多细节,我们直接对heatmap进行反卷积等操作得到的输出图像分割效果差。因此需要找到一种方式填补丢失的细节数据,所以需要使用到跳跃结构(Skip Layer)。
论文中的upsample过程如下图所示:
image是原图像,conv1,conv2…,conv5为卷积操作,pool1,pool2,…pool5为pool操作(图片大小变为原图的1/2),con6-7是最后的卷积层,最右边一列是upsample后的end to end结果。图中nx 是指对应的特征图上采样n倍(即变大n倍),并不是指有n个特征图,如32x upsampled 中的32x 是指图像变大32倍,2x conv7是指conv7的特征图变大2倍。
第一行对应FCN-32s,第二行对应FCN-16s,第三行对应FCN-8s
- 对原图进行卷积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的大小经过conv6、conv7依然为原图的1/32,此时卷积的结果不再叫featuremap而是叫heatmap。
- 上采样通过 反卷积 (deconvolution) 实现。
FCN-32s 将conv7的输出反卷积到原图大小(32倍放大),但是得到的结果不够精确,一些细节无法恢复。于是将第四层的输出和第三层的输出也依次反卷积,分别进行16倍和8倍上采样,得到FCN-16s 和 FCN-8s。在分割表现上,FCN-8s 优于 FCN-16s 优于 FCN-32s。因为FCN-8s兼顾了local和global信息。 - 特征图之间的 fuse 操作通过求和实现
loss的计算
FCN 网络的输入batchsize=1,因为分割loss的计算在每一个像素点都一个真值(标签),相当于每一个像素点的都是一个分类任务,一个图像就有对应像素点个样本。所以分割任务的batch是一个图片,将一个图片最后在所有像素点上的分类loss加起来计算一次梯度的更新。因此损失函数是在最后一层的spatial map上的每一个pixel的loss和,在每一个pixel使用 softmax loss。