在上一讲中我们对深度学习图像语义分割和实例分割的发展历程和主要技术架构进行了简单的梳理,基本厘清了基于 CNN 的图像分割发展脉络。从本节开始,笔者将连续对 FCN 全卷积网络、用于医学影像分割的 u-net 以及实例分割的代表作 mask R-CNN 相关论文进行研读。本节就先来看全卷积网络 FCN。

      由上一讲我们知道图像分割是基于图像分类和目标检测计基础上更为复杂的一种计算机视觉任务。简单而言,图像分割需要做到像素级别的分类,就是要对图像的每一个像素点进行分类。此前的诸如 AlexNet 和 VGG 这样的经典网络只能做到图像分类,而像 R-CNN 和 yolo 又仅能做到分类+定位这样层级的任务,对于更细粒度的图像分割显然不够用。因此要做到像素级别的分类任务必须对此前的网络结构进行改造创新,以 FCN 为代表的语义分割网络的最大特点就是将经典网络的全连接层改为了卷积层,构造一个全部都是卷积层的网络结构。

语义分割图像数据旋转增强 图像语义分割fcn_池化

      所以一句话总结来说就是:FCN 作为一种端到端的语义分割,以分割的 groudtruth 作为标签做像素级别的密集预测。

语义分割图像数据旋转增强 图像语义分割fcn_语义分割图像数据旋转增强_02

卷积化

      那么如何让网络做到像素级别的预测?如我们所知的是此前的经典网络从图像输入开始就一直在做卷积和池化这样的下采样过程,卷积和池化后的全连接层使得网络可以完成分类和检测任务,但是分割任务的输出是和输入一样也是像素级别的图像,因而为了保证输出大小 FCN 将经典网络中的全连接层改为了卷积层,因而构建了一个全是卷积层的卷积网络结构。所以这一步的修改我们称之为卷积化。

语义分割图像数据旋转增强 图像语义分割fcn_池化_03

      如上图所示,将经典的分类网络的最后一层全连接层改为卷积层之后可以使得网络输出空间热图,再加上一些插值层即可让网络实现端到端的语义分割称为可能。

上采样

      仅仅是将经典网络进行卷积化还远不足以使得网络实现像素级别的分类任务。在卷积化的基础上,FCN 的另一个关键在于上采样操作。也叫反卷积、解卷积或者转置卷积,对应到池化层就是反池化,本质上而言上采样就是对下采样的一种逆操作,目的是让经过下采样的特征图能够逐步恢复到输入像素时的尺寸。

      如果大家对之前讲卷积操作时有深入理解,相信对于上采样反卷积操作也能够深入理解,这里贴几张卷积和反卷积的对比动图,供大家学习参考。

语义分割图像数据旋转增强 图像语义分割fcn_语义分割图像数据旋转增强_04

无步长无填充的卷积过程

语义分割图像数据旋转增强 图像语义分割fcn_池化_05

无步长无填充的反卷积过程

语义分割图像数据旋转增强 图像语义分割fcn_卷积_06

有步长有填充的卷积过程

语义分割图像数据旋转增强 图像语义分割fcn_池化_07

有步长有填充的反卷积过程

refine 跨越融合

      有了下采样、卷积化和上采样是不是就可以搭建一个语义分割系统了?虽然是可以的,但极有可能你的分割系统最后的效果变成了下面第一幅图的这种情况:

语义分割图像数据旋转增强 图像语义分割fcn_语义分割图像数据旋转增强_08

      论文中上采样的反卷积步长设定为 32 ,原始输入为 500x500x3,经下采样和上采样之后的输出为 554x554x3,这就使得输入输出对不上,输出的分割图像边缘效果很差。因而 FCN 使用了一种对多个不同池化层进行上采样之后的融合策略。对全卷积下采样的特征图进行单一路线的直接上采样,最后得到的输出肯定是粗糙的。为此,FCN 的另一大关键策略在于添加多个池化层和反池化层之间的跳跃连接,使得不同层级的池化都能实现上采样,最后进行结果的融合,从理论上讲也符合此前卷积进行多层特征提取的基本思路。

语义分割图像数据旋转增强 图像语义分割fcn_语义分割图像数据旋转增强_09

      FCN-32s 原本为59.4,添加了这种跳跃连接融合之后使得 FCN-16s 提升到了62.4,FCN-8s 提升到62.7,可见这种 refine 的像素修正效果非常显著。

模型分割效果

      除了以上三大基本关键点之外,论文中还有许多关于网络及其训练更多的细节,感兴趣的朋友可以找来原文进行详细研读,笔者这里不再细述。至于 FCN 的分割效果,自然就是各种 state of the art 了。下表是 FCN 在 PASCAL 59 个类别分割任务上的各项性能指标:

语义分割图像数据旋转增强 图像语义分割fcn_语义分割图像数据旋转增强_10

FCN论文:Fully Convolutional Networks for Semantic Segmentation

FCN开源实现参考:https://github.com/MarvinTeichmann/tensorflow-fcn

参考资料:

Long J, Shelhamer E, Darrell T. Fully convolutional networks for semantic segmentation[J]. IEEE Transactions on Pattern Analysis & Machine Intelligence, 2014, 39(4):640-651.