FCN语义分割算法详细介绍及源码详解(一)论文详解

FCN语义分割算法详细介绍(一)论文详解

FCN语义分割算法详细介绍及源码详解(一)论文详解_第1张图片
这一篇讲解论文的一下几个方面,下一篇我们解析一下源码:

一、提要

二、论文详解:

  1. 前馈神经网络
  2. 反卷积层(deconvolution layers)的实现
  3. 上采样(upsample)的实现

三、总结

——————分割线——————

照例先扯淡:

emmm吐槽一下吧,这个周复现FCN的时候发现训练的模型,要么是一片黑(全部归为背景分类),要么是这样的:
FCN语义分割算法详细介绍及源码详解(一)论文详解_第2张图片
然后找来找去以为是反卷积层的问题(感谢tensorflow的静态图,大大增加了调试难度),改来改去好几天,最后才发现是读取label image并resize的时候出了错,,,cv2.resize函数默认的插值方式是双线性插值,把label image的许多标签转换成了小数从而被归为了背景类,,,好吧╮(╯-╰)╭是在下输了。后来改成最邻近插值,完美解决~

——————分割线——————

一、提要

语义分割是计算机视觉中的基本任务之一,在语义分割中我们需要将视觉输入分为不同的语义可解释类别;不同于目标检测只是简单地将图片或视频中的目标区域用一个矩形框标注出来,语义分割将目标的检测精准到了像素级别,如图:FCN语义分割算法详细介绍及源码详解(一)论文详解_第3张图片
我们就讲一下语义分割最著名的一个网络——FCN(Fully Convolutional Networks for Semantic Segmentation),论文传送门:
https://arxiv.org/abs/1411.4038

总体来说就是,FCN使用了反卷积(或者叫作转置卷积)实现把小的特征图映射到了原图大小。

二、论文详解:

由于语义分割模型相比于目标检测模型,实际上更为简单,只是有许多新概念和一些训练技巧需要注意,这里就简单讲一下论文中的重要部分。

1.前馈神经网络:

FCN语义分割算法详细介绍及源码详解(一)论文详解_第4张图片特征层的提取用的一般是VGG或者其他的图像识别网络,作用是提取出不同大小的特征层,供给upsample上采样层使用;

作者在这里也对比了使用不同的前馈神经网络的效果,可以看到VGG是效果比较好的,那我们复现的话也是用VGG吧(果然越简洁越好用):
FCN语义分割算法详细介绍及源码详解(一)论文详解_第5张图片

这里的话我们去掉了VGG最后面的全连接层,只留下了这部分:FCN语义分割算法详细介绍及源码详解(一)论文详解_第6张图片
如果输入图片大小是224×224×3的话,我们得到的最后一个特征层大小就是7×7×512,当然我们还会做一些微调,讲解源码的时候会仔细讲一下;

2.反卷积层:

FCN语义分割算法详细介绍及源码详解(一)论文详解_第7张图片
反卷积层的作用是,将一个小的特征图(如7×7×512)大小,映射为大的特征图(如映射为原图上,每个像素点的类别向量,224×224×21);21代表20分类+背景分类。

反卷积的原理是,先将原特征图的特征点之间进行填充,然后使用卷积核在原特征图上滑动,就得到了一个更大的特征图。

如图,正常的卷积层是这样的:
FCN语义分割算法详细介绍及源码详解(一)论文详解_第8张图片
反卷积顾名思义,就是将这个卷积过程反过来,如图:
FCN语义分割算法详细介绍及源码详解(一)论文详解_第9张图片
这是一个步长为1、卷积核大小为2的反卷积层,通过特征图边缘的padding,我们成功地从一个2×2大小的特征图,得到了一个4×4大小的新特征图;

我们再来看一个步长为2的反卷积层,需要注意的是,这里的步长(stride)不再代表卷积核滑动的距离,而是代表了特征图上每个特征点相邻两点之间的距离:
FCN语义分割算法详细介绍及源码详解(一)论文详解_第10张图片
这里步长为2,就是在特征图每个特征点之间再填充一行(或一列),然后再进行卷积操作。

这样的话我们就能够通过反卷积,将前馈神经网络得到的7×7×512大小的特征层,映射回原图大小,并得到每个像素点的分类向量了(224×224×21)。

3.上采样:

上采样的过程与残差神经网络ResNet的残差单元有点类似:
FCN语义分割算法详细介绍及源码详解(一)论文详解_第11张图片
也是通过与前面的特征层求和来得到新的特征层。

上采样是通过将反卷积得到的大的特征图,与前面相同大小的特征图(通常取pooling层)求和:
FCN语义分割算法详细介绍及源码详解(一)论文详解_第12张图片
论文中写的可能并不是那么清楚,我们就简单分析一下:

我们使用VGG-16,得到了一个7×7×512大小的特征层,然后我们使用一个stride为2的反卷积层,得到了一个14×14×21的反卷积层;我们再取pool4(14×14×512大小,通过1×1卷积核大小的卷积层转换为14×14×21大小),再与得到的反卷积特征图相加,就实现了我们的一个上采样单元,在原图里的表示就像这样:
FCN语义分割算法详细介绍及源码详解(一)论文详解_第13张图片
通过多个反卷积层和上采样单元,我们最终就得到了原图大小的分类预测向量(大小为224×224×21);

三、总结:

FCN的全卷积与上采样,在上采样最后加上softmax,就可以对不同类别的大小概率进行估计,实现端到端(end to end)的学习,最后输出的图是一个概率估计,对应像素点的值越大,其像素为该类的结果也越大。

下一期我们详细解析一下源码,再见~

你可能感兴趣的:(深度学习-语义分割)