全卷积神经网络通常用来实现图像分割的功能,下面以U-net为例来说明其是如何实现的:
上采样:上采样又称之为编码阶段,可以看到整个网络结构并不复杂,这里以二维图像为例,输入图像的维度是572*572,先进行两次3*3*64的卷积,由于未补0,所以每卷积一次,得到的每个feature map的长宽均会减2,紧接着对其进行2*2的池化处理,feature map大小减半,变为284*284*64,接下来和之前步骤类似,不断地做卷积和池化。在不断向下的处理过程中,feature map的层数越来越深,而宽度变得越来越小,可以看到最后一层的feature map 为28*28*1024,倒数第二层的feature为56*56*1024。
下采样:下采样又称之为解码阶段,接下来看右边的操作,绿色向上的箭头表示反卷积,简单说例如2*2的卷积就是每2*2个像素点卷积得到一个像素点,而2*2的反卷积就是1*1的像素点分别有四个权重滤波得到2*2的像素点集合。故我们看左边最下面一层是28*28*1024,经过2*2的反卷积后变为56*56*1024。后面的操作类似,右边会不断的往上做反卷积。
跨层连接:还有一个重要的特征,我们看灰色的箭头,不同的层间会有跨层连接,例如第一层生成的feature map 为568*568*64,这是会截取中的392*392*64与右边上采样得到的392*392*64的feature map拼在一起,从而得到392*392*128的feature map,通常称之为跨层连接,跨层连接的作用就在于优化细节结果,如果将编码后的高维特征直接解码,得到的结果很粗糙,所以将不同阶段的编码的池化层输出结果输入到解码阶段。
输出层:最后的特征层宽、高和输入图象宽高完全相同,可以看到最后图例中给出的最后feature map为2,是因为这个是一个二分类分割问题,所以必须要注意,这里有个设定那就是分类数等于最后输出feature map的层数,这个必须要注意,因为后面的分割损失函数中会用到。
损失函数:最后我们来说下损失函数,对于U-Net每个像素都对应的一个softmax,softmax的定义如下:
其中,表示分类、位置()处像素点的激活,表示分类数,为近似的最大函数。对于有最大激活的 ,,而对于其他的,。故每一个像素点的交叉熵可以表示为:
其中表示每个像素点的真实label,为该像素点的权重,在训练中,可以给一些像素点更高的权重。
还有一个损失函数是Dice coefficient:
Dice coefficient是常见的评价分割效果的方法之一,同样的也可以作为损失函数衡量分割的结果和标签之间的差距。