LargeFishPKU / segmentation

to record some knowledge about segmentation
0 stars 0 forks source link

2.history and papers of image segmentation #2

Open LargeFishPKU opened 5 years ago

LargeFishPKU commented 5 years ago

基于深度学习的图像分割发展及论文概述

FCN

众所周知,FCN 是深度学习应用到图像分割的开山之作,FCN是将神经网络中的全连接层用卷积取代,这样的好处就是可以输入任意大小的图片,并且弥补了全连接带来的位置信息的损失,网络结构如下图: image 但是从上图可以看到一个很明显的缺陷,那就是进行像素分类的时候,直接从一个分辨率特别小的featrue map上采样到了原图大小的featrue map,这样不可避免的会带来误差。作者也根据这个问题引入了skip connection的结构,就是将不同的feature map信息融合,如下图所示; image 从上图可以很清晰的看出作者是怎么融合不同feature map信息的,就是把每层pooling之后的feature map拿出来和之后的上采样的feature map进行相加,这也是为什么FCN源码中会有32s、16s、8s的版本,其中8s的版本(对应上图的8x)是融合的feature map最多的结果,因此也是效果最好的。

SegNet

SegNet 采用了很经典的Encoder-Decoder结构,其网络结构如下: image 可以看到,其结构是非常对称的,并且也是用了skip connection的结构来曾强信息,但不只是简单的进行了skip,SegNet在下采样(也就是pooling)的时候,保存了pooling 的坐标信息,那么在上采样(upsampling)的时候,就可以把值填到对应的位置上,其他的位置补0就可以了,如下图所示: image 之后,很多分割网络都是采用的Encoder-Decoder的网络结构,也算是很经典

DeconvNet

DeconvNet的结构跟SegNet非常像,都是经典Encoder-Decoder结构,但是区别在于上采样,SegNet的上采样其实是不可学习的(上采样之后的卷积除外),因为就只是max pooling的逆过程,所以导致了上采样之后feature map会比较稀疏(大部分都是0)。但是在DeconvNet里面引入了反卷积(deconvolution),应用到unpooling之后,用来密集化整个feature map。其网络结构如下: image 基本和SegNet是一样的,只不过多了反卷积,其中反卷积的过程如下: image 在DeconvNet中,反卷积就是为了丰富unpooling之后的feature map用的,但是经过了反卷积,整个feature map会变大,因此,论文中通过把反卷积之后的featrue map边缘裁剪掉来恢复到之前经过unpooling层feature map的大小。

U-Net

U-Net从论文的名字来看是主要针对医学图像提出来的,为什么叫U-Net,是因为作者在画网络结构图的时候把整个框架画成了一个“U”型,如下图: image 其实把整个网络结构压到同一条水平线上的话,就是一个跟之前非常像的Encoder-Decoder结构,也用到了skip connection来增强信息,但是它的skip connection不是简单的相加,而是进行了copy & crop操作。具体来看,在同一水平面上的feature map并不是一样大的,比如就input来说,size的变化是:572->570->568。那么用Encoder的featrue map跟Decoder的feature map融合的时候,就需要进行裁剪,保留中间的feature map的信息。但是输入的图片是572572,但是最终输出的mask确实338338的,那么作者是通过以下方法来解决的: image 为了输出结果,理论上原图和mask 必须是一样大小的(否则像素分类怎么一一对应),但是该网络的输入尺寸是大于输出的,那么作者在增大输入图片的时候,很巧妙的用了镜像翻转来扩大原来的输入图片,可以仔细看上图,是不是靠近原图边界的图像跟框内的图像是成镜像的。 值得一提的是,2015年提出的U-Net到现在都很流行,因为在医学中,训练图片一般都不会特别多,但是U-Net却可以使用较少的训练图片就可以到达比较理想的结果。

Deeplab v1

该方法的出发点是因为DCNN的最后一层的featrue不能有效的预测的物体的位置信息,这是因为神经网络的平移不变性(正是由于这种特性,才能让网络在图像分类任务中表现的很棒)。于是Deeplab将条件随机场和最后的DCNN的层结合起来,去弥补神经网路的定位性能差的缺点。最终在PASCAL VOC-2012图像分割的test set上达到了71.6%的IoU accuracy。 首先,作者分析了VGG-16最后得到的feature map是非常稀疏的,最后的stride=32,希望得到的空间信息更加的密集(eg.stride=8),作者引入了带洞卷积,如下图所示: image 其次, 作者使用了条件随机场来恢复边缘信息,如下图所示: image 从可视化图像中可以看到,使用了CRF之后,图像中的物体边缘信息提取明显有所提高。文中提到了,一般用short-CRF是用来平滑feature map的,但是一般来说,网络输出的最后一层的feature map已经足够平滑了,所以会导致边缘信息不是很明显,如果再加上short-CRF显然是对边缘信息的检测是很不友好的。于是,作者使用了全连接的CRF模型,整体结构如下: image 至于能量方程怎么定义的,可以参考原文,在这里说一下自己的理解,为什么引入CRF就能可以使得边缘信息更加明显?条件随机场本质就是描述一个无向图中的概率问题,一个无向图里面包含了很多的点和无向边,其中能量函数就是可以理解为附着在每个点和边上面的概率方程。如果是全连接 的话,那么每两个点之间都有一条边,也就是至少有一个边上的函数,那么这个函数我可以定义使得同一个像素值或者距离比较小的两点之间的概率值较大,否则就小。没错,高斯核就是一个很好的函数选项,文中也是用的高斯核。通过这样的变换,那么就可以使得两个比较像的点更加的像(比较通俗)。如果相似像素更加的相似,也就是说不相似之间的像素就会更加的不相似,那么边缘信息也就更明显了。

Deeplab v2

Deeplab v2从名字上就可以看出是对Deeplab v1进行的改进,主要的改进就是使用空洞卷积代替原有的上采用的方法,在增加了感受野的基础上得到了更高分辨率的score map,并且引入了 atrous spatial pyramid pooling(ASPP),通过金字塔的形式来融合不同空洞卷积出来的feature map来更好的预测像素分类。最终在PASCAL VOC-2012语义分割任务中实现了79.7% 的mIOU。 其中使用空洞卷积上采样代替原有的方法可视化如下: image 可以看到,就信息来说,使用空洞卷积是更丰富的。 其中ASPP的结构如下: image 网络的整体结构跟v1 差不多的,如下: image

PSPNet

该方法的提出主要是分析了之前工作(特别是FCN)的几个问题: 关系不匹配:文中说明了上下文关系的捕捉是很重要的,比如下图第一行第三列,FCN根据形状把一艘船预测成了车,但是车一般不会在水上,如果考虑了水这个信息,那么预测的精度就能提高,所以需要加入一些全局的信息。 种类的混淆:文中还指明了,在比较复杂的分割数据集ADE20K中,有很多类是比较相似的,如田野和大地、建筑和摩天大楼。即使专业的标注人员也能引入17.6%的像素错误。在下图第二行中,FCN把同一个物体的一部分预测成了建筑,另一部分预测成了摩天大楼。那么这种问题是需要考虑类和类之间的关系来解决的。 不起眼的物体种类:场景包含了各种各样尺寸的对象,有些特别小的物体比如路灯很难发现,有些比较大的物体由于感受野的限制也可能导致预测结果的不连续,如下图的第三行。那么想要解决这个问题,就需要多注意一些子区域,并且这些子区域是包含这些极大极小的物体的。 image 其实可以看到,以上这三个发现,要解决其实就是要引入上下文信息和不同到感受野信息,基于这个思想,作者提出了PSPNet,整体框架如下: image 从上图到框架结构图中可以看出,PSPNet和之前到主要不同就是加入了中间那个Pyramid Pooling Module,不同数量的pooling(1x1,2x2,3x3,6x6)可以理解为之前要引入的不同大小的区域,最终和之前的feature map进行拼接,可以理解为之前要引入的全局信息。其中pooling出来的这四个feature map进行上采样的时候是通过双线性插值法来实现的。 另外文中还提到了一个比较有意思的事情就是所谓的deep supervision,其实实现这个功能就是加了一个loss,由于PSPNet是基于ResNet的,所以,作者把另外一个loss函数加入到了第四个卷积阶段后面,以ResNet101为例,下图所示: image 值得注意的是,这两个loss都可以回传到之前所有的层,那么为了保证主loss函数的梯度主导作用,作者对另外一个loss施加了一个权值(文中为0.4)来控制。 最终PSPNet在PASCAL VOC2012分割任务中实现了85.4%的IoU精度

Deeplab v3

Deeplab v3是当前Deeplab系列性能最好的,也是该系列中第一次丢掉随机场处理的方法。 首先,该文章中指出了图像分割的两大挑战:1.卷积神经网络在提取特征的时候导致了特征图的分辨率越来越低,造成了详细的空间信息的丢失,这对于密集预测任务(图像分割)是非常不友好的;2.图像中的物体大小不确定,尺度有大有小,这样造成了很大的问题。 为了解决上述问题,文章总结了当前存在的4种方法,如下图所示:1.图像金字塔。根据之前个人jin经验,这个方法确实很有效果,但是速度是最慢的,特别是对于很大的网络,简直怀疑人生,但是效果确实好!2.使用编码-解码结构的网络。之前讲解的很经典的FCN,U-Net等都是这样的结构。3.在原始网络的基础上附加额外的模块来增强特征图的表达能力。比如Deeplab系列之前用的条件随机场,或者使用多个空洞卷积在后面级连来进一步处理特征图;4.空间特征图的pooling。这个跟图像金字塔思想很相似,但是只需要处理图片一次,在速度上要快很多。 image 之后文章中提出了自己的方法,本质上就是在空洞卷积上做文章。文章中使用了大量的篇幅来介绍空洞卷积以及相关的特性。首先空洞卷积可以有效的扩大感受野,这个特性就非常重要!因为多尺度融合的本质就是感受野的不同,多尺度融合就包括了全局特征的加入和金字塔的加入。另外,文中在提出的级连模块(包括空洞卷积)中加入batch-normalization,因为实验证明加入batch-normalization效果会更好并且更好训练(个人觉得这个不应该算是创新点并且还特别强调一下)。 总的来说,文中总结了两个点很有必要:级连的空洞卷积+Atrous Spatial Pyramid Pooling (ASPP)。所以最终作者提出的模块就是以上两个点结合起来,如下图所示: image 这样既包括了全局的信息(Image Pooling)和多尺度信息。 最终也在PASCAL VOC2012 test set上精度达到了85.75%

Deeplab v3+

Deeplab v3+是在Deeplab v3的基础上又添加了一些新的元素(下文会说到)构成的,文章中主要大篇幅说明了两个点:Spatial pyramid pooling module和encode-decoder structure。Spatial pyramid pooling module主要是为了引入更多的多尺度信息,而encode-decoder structure可以更好还原物体的边缘信息,这样对于密集预测任务就非常的友好。 总体框架为:把之前的Deeplab v3当作一个整体encode结构,之后再加入一个比较轻量级的decoder结构。如下图: image 不过文章中还用到了Depthwise separable convolution,深度可分离卷积相比于传统的卷积会大大的缩小参数量,具体是先对feature map逐个channel进行卷积,再通过1x1卷积实现channel的变化。Atrous separable convolution就是在逐个channel卷积的时候换成空洞卷积,如下图: image 另外,由于当时Xception取得了分类很好的效果,作者也把Xception融合到了Deeplab v3+中,但是作者做了一点变动,就是把Xception中原来的max pooling操作全部换成了depthwise separable convolution,并且在3x3深度卷积后面都加入了BN和ReLU操作。具体如下图: image 最终的结构在VOC2012上面达到了89.0%,对比Deeplab v3提高了3个多点。