什么是语义分割?

语义分割就是从像素水平上理解、识别图片的内容。输入的是图片,输出的是同尺寸的分割标记,每个像素会被标识为一个类别。

python 语义分割代码 语义分割 fcn_python 语义分割代码


语义分割的用处:

·机器人视觉和场景理解

·辅助/自动驾驶

·医学X光

一、简介

FCN是深度学习用于语义分割任务的开山之作,提出了“全卷积神经网络”,将全连接层替换为卷积层的end-to-end的全卷积网络,可以适应任意尺寸的输入,在不破坏空间结构的基础上,可以对图像进行像素级别的分类。解决了降采样后的低分辨率问题。

python 语义分割代码 语义分割 fcn_卷积_02


FCN采用反卷积层对最后一个卷积层的热力图进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测,通过逐个像素地求其在1000张特征图(1000个通道、1000个类别)上,该像素位置的最大数值描述(概率)作为该像素的分类,也就是求每个像素的所属类别,损失函数是在最后一层的特征图上各像素的损失之和。

二、FCN-反卷积

反卷积更倾向于称为转置卷积。反卷积核是卷积核的转置,学习率为0。如下图:

方法一:

python 语义分割代码 语义分割 fcn_卷积_03


反卷积:

· 外围全补零

· 输入:2x2

· 输出:4x4

· 参数设置

· 卷积核尺寸:3x3

· 步长:1

· Padding:2

具体参数可参考:

python 语义分割代码 语义分割 fcn_神经网络_04


方法二:

插零分数步长反卷积:

python 语义分割代码 语义分割 fcn_深度学习_05


· 输入:3x3

· 输出:5x5

· 参数设置:

· 卷积核尺寸:3x3

· 步长:2

· Padding:1

具体参数设置可参考:

python 语义分割代码 语义分割 fcn_卷积_06


反卷积是为了还原原有的特征图,类似消除原有卷积的某种效果,所以叫反卷积。

反卷积只是上采样中的一种实现方法,除了反卷积,还有双线性插值,反池化等。具体可参考:双线性插值反池化。这里就不再描述。

二、跳层结构(Skip-layer)

对图像进行5次卷积+池化,图像会缩小至原图的1/2、1/4、1/8、1/16、1/32,如下:

python 语义分割代码 语义分割 fcn_神经网络_07


把CNN中的全连接层变成卷积核为11outputsize的卷积层conv6、conv7,图像大小不变,得到heatmap,如下:

python 语义分割代码 语义分割 fcn_卷积_08


如果要将小的热力图恢复到原始大小的尺寸,并指出每个像素点是属于哪个物体类别。直接使用32倍的反卷积得到的分割效果粗糙,特别是对于边缘的识别其实是很糟糕的。在这里引入了跳层结构(Skip-layer)。如下图:

python 语义分割代码 语义分割 fcn_计算机视觉_09


现在有1/32、1/16、1/8的特征图:

· 将1/32尺寸的heatMap进行反卷积上采样(stride=2,得到1/16的特征图),加上(concat操作)pool4的结果(1/16的特征图)补充细节(相当于一个插值过程),得到1/16的特征图;

· 再对这个concat的结果(1/16的特征图)进行再次反卷积上采样(stride=2,得到1/8的特征图),加上(concat操作)pool3的结果(1/8的特征图)补充细节,得到1/8的特征图;

· 再对这个concat的结果(1/8的特征图)进行一次反卷积(stride=8,得到原图大小的特征图),也就完成了整个图像的还原。

具体来说,就是将不同池化层的结果进行上采样。其中,使用 concat 操作融合两个层 ,然后结合这些结果来优化输出。

最后像素的分类按照该点在1000张上采样得到的图上的最大的概率来定。

三、FCN架构图例

python 语义分割代码 语义分割 fcn_神经网络_10


参考:FCN详解