FCN网络学习笔记

前言

FCN网络是首个端对端的针对像素级预测的全卷积网络。
其中,全卷积的含义是将分类网络的全连接层全部替换成了卷积层。使用了分类网络作为backbone,将会复用分类网路在ImageNet上的预训练权重,这就涉及到将全连接层的权重转化到卷积层当中。FCN网络结构十分简单,却又十分有效。从下图中可以看到,FCN-8s的效果已经与GT十分接近。
在这里插入图片描述

1. 网络结构

在这里插入图片描述

从上图可以看到FCN网络正向推理以及反向学习的过程。通过一系列的卷积下采样得到特征层。由于使用的数据集是PASCAL VOC,其中有20个类别,再加上1个背景类,所以输出的通道数目为21。接着再对其进行上采样,就得到和原图同样大小的一个特征图,其channel为21。特征图中每一个像素都有21个通道,对这21个值进行softmax处理,就可以得到该像素针对每一个类别的预测概率。取概率最大的一个类别即为该像素的预测类别。

在分类网络中,最后三层往往是三个全连接层,最后会得到针对1000个类别的预测值,这1000个预测值经过softmax处理之后就能得到每个类别的概率。绘制成柱状图,可以看到预测类别概率越大,高度越高。

可以看到,对于全连接层来说,其输入的节点个数是固定的,训练过程中如果输入个数发生变化,全连接层就会报错。所以,对于当时的分类网络来说,输入图片大小是固定的。(后面提出的全局池化操作解决了这一问题)

如果将全连接层全部转化为卷积层,对于输入的大小则没有严格的限制。对应convolutionalization的过程,将全连接层的权重参数转化到卷积层当中。如果输入图像的大小大于 224 × 224 224 \times 224 224×224最终得到的特征图高度和宽度是大于1的,这样输出的每一个通道的数据变成了二维数据,就可以将其可视化为一个heatmap的形式。
在这里插入图片描述

回忆VGG16的网络模型,输入图片从 224 × 224 × 3 224 \times 224 \times 3 224×224×3 7 × 7 × 512 7 \times 7 \times 512 7×7×512,总共下采样了32倍。最后经过三个全连接层,转化为1000个节点的向量进行输出。
在这里插入图片描述
全连接层的参数如何转换到卷积层当中呢?
在这里插入图片描述
在分类网络当中,将 7 × 7 × 512 7 \times 7 \times 512 7×7×512的矩阵首先进行Flatten展平处理,得到一个长度为25088个节点的向量,通过全连接层输出后得到长度4096维的向量。每一维输出向量都要和输入进行全连接,则总共有 25088 × 4096 25088 \times 4096 25088×4096个权重参数。

当不适用全连接层,直接使用卷积核大小 7 × 7 7 \times 7 7×7,步距为1,卷积核个数为4096的卷积操作时,其中一个卷积核对应 7 × 7 × 512 7 \times 7 \times 512 7×7×512个参数,刚好与全连接层的输入节点个数相同,所以全连接层输出中一个节点所对应的参数个数与一个卷积核的参数是一样的。故直接将全连接层每一个节点所对应的权重参数进行reshape处理,就能直接赋值给卷积层进行使用了。

原论文中提到的FCN-32s、FCN-16s和FCN-8s分别是什么意思?

FCN-32s是指将预测结果上采样了32倍还原回了原图大小,同理16s指上采样16倍,8s指上采样8倍。
FCN-32s的详细结构如下:
在这里插入图片描述

其中,VGG16 Backbone对应到全连接层之前的网络,FC6代表第一个全连接层对应的卷积层,FC7代表第二个全连接层对应的卷积层。对于FC6,由于卷积核大小为 7 × 7 7 \times 7 7×7,所以当 p a d d i n g = 3 padding=3 padding=3时,根据公式 H = H − K + 2 × p a d d i n g s t r i d e + 1 H = \frac{H - K + 2 \times padding}{stride} + 1 H=strideHK+2×padding+1,输出大小不会发生变化。对于FC7,由于卷积核大小为 1 × 1 1 \times 1 1×1,所以输出大小也不会发生变化。

通过 1 × 1 1 \times 1 1×1的卷积层,高宽仍不发生变化,输出通道数变为类别个数(包含背景类)。最后,同通过一个转置卷积上采样32倍,恢复原图大小。其中,原论文的代码实现是使用双线性插值的参数初始化转置卷积的参数。针对每一个像素都有num_cls个参数,对其进行softmax处理,就能得到每一个像素的预测类别。

注意:原论文中对应的源码在backbone的第一个卷积层处,将padding设置为100。这是为了防止输入图片过小而导致模型报错。(现在看来并没有必要)

FCN-16s结构如下:
在这里插入图片描述
与FCN-32s第一个不同之处在于第一个转置卷积。FCN-32s是直接上采样32倍,而FCN-16s则是先上采样2倍,再与来自Max-pooling4输出的特征图相加,最后上采样16倍,得到了原图尺寸。

FCN-8s结构如下:
在这里插入图片描述
FCN-8s中不仅利用到了来自Maxpooling4的输出,还利用到了来自Maxpooling3的输出,最终上采样8倍,得到最终的原图尺寸。

2. 损失计算:Cross Entropy Loss

在这里插入图片描述
左边的图为最终预测还原回原图尺寸的特征图,针对每一个像素的预测类别,可以与其对应的True Label计算交叉熵损失,最后将所有像素的交叉熵损失求平均,得到整个网络的平均交叉熵损失。

参考

FCN网络结构详解(语义分割)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值