在图像分类任务上,现存网络有VGG、Resnet等,其中Resnet的出现使得计算机识别准确率超过人类自身。但是在目标检测和图像分割任务上准确率一直较低。现如今,在图像语义分割(对像素点进行分类)任务上,常见网络例如:FCN、SegNet、U-Net、SegNet、DeepLab、FC-Densenet E-Net 和 Link-Net、RefineNet、PSPNet、Mask-RCNN 以及一些半监督方法,例如 DecoupledNet 和 GAN-SS等。一般认为,发展到现在,基于深度学习的图像语义分割“通用框架已经确定”:前端FCN(包含基于此的改进 SegNet、DeconvNet、DeepLab)+ 后端 CRF/MRF(条件随机场/马尔科夫随机场)优化,如下图:
Berkeley团队提出 Fully Convolutional Networks(FCN)方法用于图像语义分割,将图像级别的分类扩展到像素级别的分类,获得CVPR2015 的 best paper,网络如下:
FCN 是像素级别的识别,也就是输入有多少像素,输出就要多少像素,像素之间完全映射,并且在输出图像上有信息标注,指明每一个像素可能是什么物体 / 类别。
与经典的CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全联接层+softmax输出)不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸, 最后在上采样的特征图上进行逐像素分类(即逐个像素计算softmax分类的损失, 相当于每一个像素对应一个训练样本)。
FCN与CNN的区别在于:FCN将CNN的全连接层转化为卷积层,输出是已经label好的一张图片,如下图粗略展示:
FCN的卷积网络部分可以采用VGG、GoogleNet、AlexNet等作为前置基础网络,再在这些的预训练基础上进行迁移学习与finetuning,对反卷积的结果跟对应的正向feature map进行叠加输出(这样做的目的是得到更加准确的像素级别分割),根据上采样的倍数不一样分为FCN-8S、FCN-16S、FCN-32S,其中不同结果如下:
论文中网络结构图,如下:
在FCN网络模型中,前一部分为正常卷积,类似于Alxnet,其中每一层卷积都包含卷积和池化(默认),并且每卷一次像素信息变为原来的1/2大小,到第五层时变为原图像的1/32;后一部分对1/32的热图(heatmap)、1/16、1/8的feature map进行还原,即进行反卷积上采样,扩充至原来大小(严格说是近似原始数据大小,此时一般进行裁剪操作)。
首先对原图像进行卷积 conv1、pool1后,原图像缩小为1/2;
继续对图像进行第二次卷积操作conv2、pool2,图像缩小为1/4;
继续对图像进行第三次卷积操作conv3、pool3,缩小为原图像的1/8,此时保留pool3的featureMap;
继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的featureMap;
继续对图像进行第五次卷积操作conv5、pool5,缩小为原图像的1/32;
然后把原来CNN操作中的全连接变成卷积操作——conv6、conv7,图像的featureMap数量改变,但是图像大小依然为原图的1/32,此时图像不再叫featureMap而是叫heatMap(热图)。现在我们有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap;
对1/32尺寸的heatMap进行upsampling操作,最后就完成了整个图像的还原。此时网络结构记为FCN-32s。
将conv4中保留的1/16尺寸的featureMap和1/32尺寸的heatMap进行融合,然后进行upsampling操作, 最后就完成了整个图像的还原。此时网络结构记为FCN-16s。
将conv3中保留的1/8尺寸的featureMap、conv4中保留的1/16尺寸的featureMap和1/32尺寸的heatMap三者进行融合,然后进行upsampling操作,最后就完成了整个图像的还原。 此时网络结构记为FCN-8s。
具体如下图:
不含全连接层的全卷积网络,可以适应任意尺寸的输入。
上采样,增大数据尺寸的反卷积(deconv)层。
结合不同深度结果的跳级结构,可同时保证鲁棒性(深层)和精确性(浅层)。
下面逐个解释
为什么FCN可以适应任意尺寸的输入?
对于传统CNN,一幅输入图片在经过卷积层时,这些层是不关心图片大小的。比如对于一个卷积层,对于一个inputsize大小的输入feature map,滑窗卷积,输出outputsize大小的feature map即可。但是在进入全连接层之前,feature map(假设大小为n×n×c,其中通道数为c)要变成一条向量,此时卷积核的大小应为n×n(假设4096个卷积核),则权值个数是4096×n×n,而我们知道神经网络结构一旦确定,它的权值个数都是固定的,所以这个n不能变化,而n和inputsize成固定大小关系,所以层层向回看,每个outputsize都要固定,那每个inputsize都要固定,因此输入图片大小要固定。但是对于FCN,所有的层均为卷积层,所以网络大小与输入图片无关,因此输入图片大小可以任意。
现阶段上采样方法有双线性插值上采样、反卷积上采样、反池化上采样等。论文中采用的是反卷积上采样(具体反卷积解释在其他笔记中)。
在试验中发现,得到的分割结果比较粗糙,所以考虑加入更多前层的细节信息,也就是把倒数第几层的输出和最后的输出做一个fusion,实际上也就是加和。能够同时保证模型的鲁棒性和准确性。跳级结构如下图:
输入为5005003,对每个像素分20个类别,外加一个背景类别,共21个类别,其中橙色为上采样、灰色为裁剪层、蓝色为卷积、绿色为池化、黄色为融合。
以经典的分类网络为初始化。最后两级是全连接(红色),参数弃去不用; 从特征小图(16164096)预测出分割小图(161621),再进行上采样,最后经过灰色裁剪层,输出和原图相同尺寸输出。 其中反卷积(橙色)的步长为32,这个网络称为FCN-32s。上采样分为两次完成(橙色×2)。
第一次上采样对heatmap得到的预测小图161621进行上采样,尺寸变为2倍;
接着在融合之前,使用裁剪层(灰色×2)统一两者大小;
接着在第二次上采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来(使用跳级结构提升精确性);
然后进行第二次上采样,尺寸变为16倍。
第二次反卷积步长为16,这个网络称为FCN-16s。
上采样分为三次完成(橙色×3)。
第一次上采样对heatmap得到的预测小图161621进行上采样,尺寸变为2倍;接着在融合之前,使用裁剪层(灰色×2)统一两者大小;接着在第二次上采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来(使用跳级结构提升精确性);然后进行第二次上采样,尺寸变为2倍。 在融合之前,使用裁剪层(灰色×2)统一两者大小。在第三次上采样前,把第3个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性。 然后进行第二次上采样,尺寸变为8倍。第三次反卷积步长为8,记为FCN-8s 比较2,3,4阶段可以看出,跳级结构利用浅层信息辅助逐步上采样,有更精细的结果。
得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感
对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性