语义分割之FCN网络详解 全卷积网络

1. FCN网络结构图

原论文链接:https://paperswithcode.com/paper/fully-convolutional-networks-for-semantic
参考B站视频:https://www.bilibili.com/video/BV1J3411C7zd/?spm_id_from=333.788
语义分割之FCN网络详解 全卷积网络_第1张图片

简介:Backbone用的是VGG16(pytorch实现用的是Resnet),将原来的卷积网络的最后两层(全连接和池化)去掉,替换为1X1的卷积和转置卷积。在原来的分类网络中,全连接层的大小限制了图像的输入,因为全连接层的需要固定输入和输出,而卷积层不需要,所以考虑将全连接转换为卷积。

通道数为21,每个通道上的值是一个概率,每个像素的预测类别分别取21个通道上概率值最大的那个类别。

转换之后就变成了这样:卷积层 + 1X1卷积 + 转置卷积

论文中给出的三个模型:FCN-32s,FCN-16s,FCN-8s

给出VGG16模型作为上图参考

语义分割之FCN网络详解 全卷积网络_第2张图片

2. FCN-32s

原论文中设置了backbone的第一个卷积层处设置了padding=100,是为了适应不同大小的输入图像,如果不设置padding,那么当输入图片大小小于192X192,则在下图中7X7的卷积核处做卷积时会报错,因为此时经过下采样后图像大小已经小于7X7了,无法进行卷积操作。同时,如果输入图像小于32X32,那在backbone中就已经报错了。但是在实际使用时,很少有人会对小于32X32的图像做语义分割(因为本来就是对像素分割,你这么低分辨率的图像那分割出来岂不是很丑)。所以这个padding100可以不用设置,根据自己的需求来做。

在VGG16去掉最后两层的基础上,在FC6的卷积层出加上padding=3,使用4096个卷积核,输出图像大小不变;再经过FC7输出图像大小和通道数未发生改变;然后经过一个1X1大小的卷积,通道数是num_class,即分类的类别;最后再经过一个转置卷积层(上采样),将图像放大32倍后,使用双线性插值的参数来初始化转置卷积的参数,所以最终的输出和原图大小一样,最后用softmax对一个像素的num_class个类别做处理,就可以得到最终的预测类别。

注:原论文中直接将转置卷积层的权重冻结了,相当于直接为双线性插值的参数,因为冻结和不冻结结果没什么差别,所以冻结了还可以不用训练权重。可能是因为上采样率太大,上采样32倍,效果不是很好,所以这个转置卷积层好像用处不大。

语义分割之FCN网络详解 全卷积网络_第3张图片

3. FCN-16s

和FCN32s的区别在于融合了一次底层特征图信息,经过FC7后先做一次转置卷积,上采样是2倍,然后将BackBone中MaxPool4(下采样16倍,在Backbone中的特征图)的特征图相加后在经过一轮上采样为16倍的转置卷积,得到最终结果。

语义分割之FCN网络详解 全卷积网络_第4张图片

4. FCN-8s

和FCN-16s的区别在于融合了两次底层特征图信息,经过FCN-16s的中的两部分特征图相加后,再做一次上采样2倍的转置卷积,再加上来自Backbone中MaxPool3(下采样8倍),然后再经过上采样8倍的转置卷积,得到最终结果。

语义分割之FCN网络详解 全卷积网络_第5张图片

5. 膨胀卷积

如图所示,也叫空洞卷积,和普通卷积的区别在于增加了一个膨胀因子r,也就是每两个卷积参数之间的距离,当r=1时,膨胀卷积和普通卷积之间并无区别。

  • 作用:

    • 增大感受野,从图中可以很明显看出来,在相同3X3卷积核参数的情况下,感受野是5X5。
    • 可以保持原输入特征图的宽和高不变。

    在VGG16中使用池化来增大感受野,但是池化层会导致原图的特征丢失,并且输出特征图大小也发生了改变。如果去掉池化层就会使感受野变小,所以可以考虑使用膨胀卷积。
    语义分割之FCN网络详解 全卷积网络_第6张图片
    gridding effect问题,关于膨胀卷积使用不当引起的问题及解决可以阅读论文:“Understanding Convolution for Semantic Segmentatio” https://arxiv.org/pdf/1702.08502v3.pdf 有时间再补充这部分的内容
    未完待续……

你可能感兴趣的:(语义分割,计算机视觉,神经网络)