deeplab系列对比总结 & deeplabv3+的实验测试

分割中的主要问题

DCNNs中语义分割存在三个挑战:

  • 连续下采样和池化操作,导致最后特征图分辨率低,丢失位置信息
  • 图像中存在多尺度的物体
  • 空间不变性导致细节信息丢失

deeplab v1

问题的引入:

关于DCNN的大量工作表明,采用端到端的训练方式,使得模型对图像的变换有着较好的不变性,但这一点却妨碍了分割任务中的定位。经过研究发现,在深度CNN中对于语义分割主要存在两个挑战:一个是重复池化与下采样使得图像的分辨率大幅降低,信息发生了丢失,不利于恢复;另一个是对图像转换的不变性影响了定位

解决方案:

1、对于不断下采样造成的分辨率降低的问题,论文使用了一种的新的卷积方式,空洞卷积,如下图所示。

deeplab系列对比总结 & deeplabv3+的实验测试_第1张图片
我们知道,池化层的存在不仅使得计算更为简单,而且扩大了卷积的感受野,使得卷积能够观察到较大的目标,然而,在进行池化的过程中,不可避免的丢失了一定的信息,不利于后期图片分辨率的恢复。论文中使用了空洞卷积代替了池化层,避免了信息的丢失,同时也扩大了感受野。

2、DCNN的得分图可以可靠的预测物体的存在与粗略的位置,但不能精确的定位目标的轮廓,其内在的不变性限制了对位置的推理,本文使用了全连接的CRF作为后处理操作,通过耦合DCNN的识别能力进一步优化分割的边缘。

deeplab v2

问题的引入:

此版本的deeplab主要解决的问题有两个:第一个是多尺度上存在的目标;第二个是由于DCNN内在的不变性造成的局部精度的下降。所谓的多尺度问题指的是同一尺度下不同的目标的响应不同,较小的目标在大的尺度下才方便提取特征,而较大的目标在较小的尺度下才能提取全局信息,这就是一个多尺度的矛盾。

解决方案:

1、金字塔池化用在全连接层之前,不仅可以突破全连接层对于输入图片尺寸固定的限制,而且可以捕获不同尺度的信息,使得网络更加健壮。受到金字塔池化的启发,文章采用类似的方法解决这个问题。论文尝试了两种方法来处理尺度变换的问题。第一种是标准的多尺度处理,提取不同尺寸图片的得分图,为了得到最终的结果,在不同的尺寸下取每个位置的最大响应,双线性插值这些并行的特征图到原始图片的分辨率并融合它们,但计算代价太大。第二种是受到了RCNN的空间金字塔池化的启发,对单个尺度下提取的卷积特征进行重采样,可以准确有效的对任意尺度下的区域进行分类,如下图所示:
deeplab系列对比总结 & deeplabv3+的实验测试_第2张图片

2、对于DCNN内在的不变性,这个版本的deeplab仍旧使用了CRF进行处理,这里不做赘述。

deeplab v3

问题的引入:

此版本的deeplab还是针对多尺度下目标的分割问题,同时重新思考了空洞卷积

解决方案:

网络结构图:
deeplab系列对比总结 & deeplabv3+的实验测试_第3张图片
框架中需要注意的:
①框架图中,从block3以后,卷积核的移动步长就都是1,图形的长宽就保持不变到最后
②图中的参数比如aspp的步长什么的,论文中有实验结果说明该参数是最优的

  • 提出了Multi-Grid,即在一个resnet-block里不同的block中的空洞卷积的大小不同,提高级联的性能。
  • 将 batch normalization 加入到 ASPP模块
  • 我们知道,使用空洞卷积可以在不引入池化层的前提下扩大感受野,然而,当采样率过大时,由于图像边缘的影响会不能捕获长距离信息,这个时候,会退化成1*1的卷积模块,为了克服这个问题,论文中使用了图片级的特征,将特征图作全局池化成(1,1)大小的张量,然后扩充到ASPP里其他一样的大小,并最终融合在一起进行上采样。就是上图中ASPP中的b模块。
  • 此论文的一大改进就是去掉了CRF操作,直接由得到的特征图进行上采样操作恢复原分辨率。deeplabv3的模型输出结果的分辨率是原图的1/8或者1/16,然后通过双线性插值上采样得到原图分辨率。

deeplab v3+

解决的问题:

编译码结构与空间金字塔模型都是语义分割任务常用的模型,前者通过使用多个采样率的滤波或者池化操作来探测输入特征,能够编码多个尺度的contextual information,后者可以在恢复分辨率时捕获更加清晰的边界,论文尝试结合这两种结构的优点,提出了deeplab v3+。

相关信息:
在deeplab v3+中,即便使用了空洞卷积,特征图也缩小了8倍,然后直接使用了双线性插值的方法进行上采样恢复原分辨率,然后这样操作并不能恢复丢失的信息,分割的效果仍有改进的地方。

解决方案:

模型框架
deeplab系列对比总结 & deeplabv3+的实验测试_第4张图片
deeplab系列对比总结 & deeplabv3+的实验测试_第5张图片

  • 编码译码结构,是一种较快的输出图信息扩充方法,论文中使用了这一方法,进行了两次上采样,第一次上采样到中间特征图大小,与中间一层的特征图组合起来,再进行上采样恢复到目标大小。相比DeepLabv3,v3+引入了Decoder模块,其将底层特征与高层特征进一步融合,提升分割边界准确度。从某种意义上看,DeepLabv3+在DilatedFCN基础上引入了EcoderDecoder的思路。
  • 如果aspp的最后输出是下采样16倍,则deeplabv3是特征图直接上采样16倍,而deeplabv3+则是先编码上采样4倍,然后特征图只需要上采样到4倍即可。
  • 在合并特征时候,低级特征维度可能会很高,为了防止encoder得到的高级特征被弱化,先采用1x1卷积对低级特征进行降维(paper中输出维度为48)
  • 注意:,模型图中的low_level_feat特征变量下采样了4倍,它并不是Resnet的最终输出,而只是Resnet的四个block中的第一个block的输出,第一个block的卷积步长为1,所以并不会压缩长宽,它的压缩来自进入四个block前的3*3卷积步长为2,还有一个池化下采样2,。所以deeplab无论下采样8还是16,low_level_feat的大小一直是4倍。
  • ASPP不会进行下采样,总下采样的8或者16发生在Resnet的第2个和第3个block。如果是8的话,ASPP在解码器中就是上采样8倍。

2、编码部分使用了修改后的Xception网络,且使用了可分离卷积,增加了编码能力,具体示意图如下:

deeplab系列对比总结 & deeplabv3+的实验测试_第6张图片

deeplabv3+ 实验结果

分割效果

  • 这两张图的分辨率都在500以下,在这种小分辨率的情况下,下采样过深不如下采样8倍的效果,可能是因为下采样过深时全局特征影响太大,误判了一些地方。

deeplab系列对比总结 & deeplabv3+的实验测试_第7张图片

  • 对于4k图片,如果下采样率不够高,则全局信息获取的不够,导致不能完全分割出人

下采样率参数需要根据人物所占大小,图片分辨率,人物姿势不一样所需全局特征也不一样等,来判断最终选择多少

速度

deeplabv3+在3090显卡上,处理4k照片,不计入读入图片时间,单纯的模型推荐时间在25ms左右,速度还挺快的。

参考文献

DeepLab 语义分割模型 v1、v2、v3、v3+ 概要(附 Pytorch 实现) - Uno Whoiam的文章 - 知乎
里面有比较简洁的模型代码实现

简书-deeplab 本文的目录参考

你可能感兴趣的:(深度学习,面试)