语义分割:FCN学习2

前面写了一篇文章,大概了解了一下,现在打算再仔细看看。

全卷积网络(Fully Convolutional Network)将CNN应用到了图像语义分割领域。图像语义分割,就是对一张图片上的所有像素点进行分类。

以往的CNN都是对整张图片进行分类,不能识别图片中特定部分的物体,而全卷积网络是对一张图片中的每个像素进行分类,以此达到对图片特定部分进行分类的效果。

1 卷积化(convolutionalization)

卷积化
以往分类的网络通常会在最后使用全连接层,将原来二维特征图转换成一维的固定长度的特征向量,这就丢失了空间信息,最后输出一个特定长度的向量,表示输入图像属于每一类的概率,以此作为分类的标签。

比如将下图输入AlexNet,得到一个长度为1000的输出向量,表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高,所以分类标签为“tabby cat”。

与传统CNN在卷积层之后使用全连接层得到固定长度的特征向量进行分类(全连接层+softmax)不同,FCN可以接受任意尺寸的输入图像,然后通过反卷积层对最后一个卷积层的feature map进行上采样, 使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测, 同时保留了原始输入图像中的空间信息, 最后在与输入图等大小的特征图上对每个像素进行分类,逐像素地用softmax分类计算损失,相当于每个像素对应一个训练样本(输入的原始图片也是这样打好标签的图片)。

因为语义分割需要输出整张图片的分割图,所以要求网络中的特征图至少是二维的,这样才能通过上采样还原到输入图片的同等大小。这就需要替换掉全连接层,改换为卷积层(特征图才是二维的),而这就是卷积化

上面这幅图展示了卷积化,具体来说,就是将最后仨全连接层替换为卷积层

全连接层和卷积层的转化
全连接层和卷积层唯一的不同就是卷积层中的神经元只与输入数据中的一个局部区域连接,并且在卷积列中的神经元共享参数。
但是这两类层的神经元都是计算点积,它们的函数形式是一样的。因此,将此两者相互转化是可能的。

全卷积网络称谓的由来
FCN将传统CNN中的全连接层转化成卷积层,对应CNN网络FCN把最后三层全连接层转换成为三层卷积层。这个和DCGAN的生产网络很像,整个网络都是全卷积层构成的。
在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。
FCN将这3层转换为卷积层,卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,使用的是之前CNN已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核。因此FCN网络中所有的层都是卷积层,故称为全卷积网络

下图是一个全卷积层,与上图不一样的是图像对应的大小下标,CNN中输入的图像大小是同意固定resize成 227x227 大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为13*13。

而FCN输入的图像是H*W大小,第一层pooling后变为原图大小的1/4,第二层变为原图大小的1/8,第五层变为原图大小的1/16,第八层变为原图大小的1/32。

经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32?W/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大到原图像的大小。

最后的输出是1000张(因为有1000类)heatmap经过上采样得来的图片。
接着就是对每个像素进行分类预测:逐像素地求其在1000张图像该像素位置的最大数值描述(概率),并将其作为该像素的分类。

这样就产生了一张已经分类好的图片,如下图。

小结:

CNN的强大之处在于它的多层结构能自动学习特征,并且可以学习到多个层次的特征:较浅的卷积层感知域较小,学习到一些局部区域的特征;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征。这些抽象特征对物体的大小、位置和方向等敏感性更低,从而有助于识别性能的提高。这些抽象的特征对分类很有帮助,可以很好地判断出一幅图像中包含什么类别的物体,但是因为丢失了一些物体的细节,不能很好地给出物体的具体轮廓、指出每个像素具体属于哪个物体,因此做到精确的分割就很有难度。

传统的基于CNN的分割方法:为了对一个像素分类,使用该像素周围的一个图像块作为CNN的输入用于训练和预测。这种方法有几个缺点:一是存储开销很大。例如对每个像素使用的图像块的大小为15x15,然后不断滑动窗口,每次滑动的窗口给CNN进行判别分类,因此则所需的存储空间根据滑动窗口的次数和大小急剧上升。二是计算效率低下。相邻的像素块基本上是重复的,针对每个像素块逐个计算卷积,这种计算也有很大程度上的重复。三是像素块大小的限制了感知区域的大小。通常像素块的大小比整幅图像的大小小很多,只能提取一些局部的特征,从而导致分类的性能受到限制。

全卷积网络(FCN)则是从抽象的特征中恢复出每个像素所属的类别(这个可以仔细看最后那个跳跃结构图里面整合其他pool层预测图来精修结果图,同类涂同色,异类异色,背景涂黑色)。即从图像级别的分类进一步延伸到像素级别的分类。


=======================================

2 反卷积(Deconvolution)

可能叫做转置卷积(Transposed Convolution)更为合适。

反卷积过程可以理解为上采样过程(Upsampling)。即上图中黄色字体部分上也就是对应于上图中最后生成heatmap的过程。

在一般的CNN结构中,如AlexNet,VGGNet均是使用池化层来缩小输出图片的size,例如VGG16,五次池化后图片被缩小了32倍;而在ResNet中,某些卷积层也参与到缩小图片size的过程。我们需要得到的是一个与原图像size相同的分割图,因此我们需要对最后一层进行上采样,在caffe中也被称为反卷积(Deconvolution),可能叫做转置卷积(conv_transpose)更为恰当一点。
在语义分割中,我们需要输出和输入图像尺寸相同的分割图片,因此需要对特征图进行上采样,应该恢复原图尺寸一方面,关键要对恢复图进行像素预测分类涂色,这里资料不多,有时间再研究。参看下面的第3步优化结果图。

注意:

为了得到和输入图像尺寸完全相同的特征图,FCN中还使用了crop操作来辅助反卷积操作,因为反卷积操作并不是将特征图恰好放大整数倍。

3 跳跃结构(Skip Architecture)

经过前两步操作,基本就能实现语义分割了(具体实现不清楚),但是直接将全卷积后的结果进行反卷积,得到的结果往往比较粗糙。

如上图所示,对原图像进行卷积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操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此在这里向前迭代。把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个线性插值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。

具体来说,就是将不同池化层的结果进行上采样,然后结合这些结果来优化输出,具体结构如下:

缺点

在这里我们要注意的是FCN的缺点:

  1. 得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多(作者实验发现4倍上采样不好所以没做了),但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。

  2. 是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

这篇文章有翻译论文https://www.cnblogs.com/xuanxufeng/p/6249834.html。

参考:https://www.2cto.com/kf/201611/565936.html

https://www.cnblogs.com/gujianhan/p/6030639.html

https://juejin.im/entry/58e5aa47a22b9d0058888816


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值