目录
2、ASPP(Atrous Spatial Pyramid Pooling)
一、DeepLabV1
1、DeepLab网络
DeepLab 是一个深度学习神经网络架构系列,用于语义分割和图像分割任务。DeepLab 系列由 Google Brain 团队推出,通过引入深度可变形卷积网络(DeepLabv1),空间金字塔池化模块(DeepLabv2),空洞卷积(ASPP)模块(DeepLabv3),以及在DeepLabv3+中的改进,逐步提高了在图像分割任务上的性能。
DeepLab 的关键特点包括:
-
多尺度特征融合:通过使用多尺度池化技术,DeepLab 能够同时捕获不同尺度的特征,有利于提高分割准确性和减少分割边界模糊。
-
空洞卷积(ASPP)模块:ASPP 模块能够有效地扩大感受野,并在不引入额外参数的情况下增加网络的感知能力,有助于提高分割性能。
-
引入深度孪生学习:在 DeepLabv3+ 中,引入了深度孪生学习的概念,通过在不同分支上使用不同分辨率的特征图,并结合全连接层进行互补学习,进一步提高了分割效果。
2、语义分割任务中存在的问题
在DeepLabV1原论文中,作者提出了两个存在于语义分割任务中的问题:(1)、信号下采样导致分辨率降低;(2)、空间“不敏感”问题。
- 信号下采样导致分辨率降低,作者认为是图像经过MaxPooling操作之后会降低特征图的高宽,其次会丢失细节信息以及小目标且无法通过上采样进行还原,作者给出的解决方案是引入了膨胀卷积模块。
- 空间不敏感,在分类网络中,希望对图像做任何变换之后并不会影响最终分类结果,但是在语义分割任务中,即使对图像做了很小的变动,如平移了一下图片,那么此时得到的结果与移动之间应该是不相同的。作者认为分类器网络自身就有一定的空间不变性,原博文作者认为是MaxPooling造成的。作者采用了fully-connected CRF(Conditional Random Field)方法解决,在当时常用于语义分割任务中,但是在DeepLabV3就不再使用了。
3、DeepLabV1网络优势
- 因为使用了膨胀卷积所以速度更快,但是fully-connected CRFs很耗时间
- 准确率更高
- 模型结构简单,主要由DCNNs和CRFs联级构成
4、LargeFOV(Field of View)
保证mIoU不下降的前提下,减少模型参数数量和加快模型训练速度。
在原论文中使用的backbone是当时较为主流的VGG-16网络,将全连接层的权重卷积化,将全连接层转化为卷积层,对于VGG-16的第一个全连接层有4096个节点,通过转化之后变为卷积核大小为[7x7],卷积核个数为4096个卷积层。但是如果直接使用这样的卷积层会成为计算瓶颈,为了解决这个问题,作者对该卷积层进行了一个下采样结果,变成[4x4]或者[3x3]大小。
- DeepLab-CRF-7x7就是直接将FC1按照FCN论文中的方法转换成大小[7x7]、个数4096个卷积核的卷积层,并且膨胀因子r=4,感受野receptive field=224。
- DeepLab-CRF是将[7x7]卷积核下采样到[4x4]大小的卷积层,同样膨胀因子r=4,感受野receptive field=128,参数数量减半,训练速度翻倍,但mean IOU由于感受野降低下降了约4个点。
- DeepLab-CRF-4x4,是在DeepLab-CRF的基础上把膨胀系数r改成了8,感受野receptive field=224,mean IOU又提升了回去了。
- DeepLab-CRF-LargeFOV,是将[7x7]下采样到[3x3]大小的卷积层,膨胀系数r=12,感受野receptive field=224,不止将卷积核大小下采样了,卷积核个数从4096下采样到了1024,按照FCN中第二个卷积层应该转化成卷积核大小[1x1],卷积核个数为4096的卷积层,这里由于采样FOV,将第二个卷积层的卷积核个数也下采样为1024个,相比DeepLab-CRF-7x7,参数数量减少了6倍,训练速度提升了3倍多,mean IOU不变。
5、DeepLab-LargeFOV结构
采用的backbone是VGG-16,在VGG-16原论文当中采用的MaxPool层是卷积核大小为[2x2],步距为2的池化层,在DeepLabV1中改成了卷积核大小为[3x3],步距为2,padding为1的MaxPool层。
首先通过三个MaxPool下采样层之后,下采样倍率为8倍,接下来的两个下采样层的步距设置为1,说明在DeepLabV1网络中只下采样8倍。蓝色框中的第一个卷积层block中有三个[3x3]大小、膨胀系数r=2的膨胀卷积,在最后的MaxPool层之后新加了一个平均池化层AvgPool,卷积核大小为[3x3],步距为1,padding为1,特征图的高和宽也不会发生变化。
FC1需要进行卷积化,LargeFOV卷积核大小为[3x3],步距为1,膨胀系数r=12,padding为12,通过全卷积层FC1之后特征图的高和宽不会发生变化。FC2通过卷积化转化为卷积层,卷积核大小为[1x1],卷积核个数从4096下采样到1024。最后通过一个[1x1]卷积层,卷积核个数等于类别个数num_cls,包含背景,再通过双线性插值将特征图还原回原图大小。
6、MSc(Multi-Scale)
融合多个尺度的数据,包含原图尺度的数据,还包含前四个MaxPool层输出的数据。使用MSc模块大概可以提升mIoU1.5个百分点,在官方提供的源码中,作者推荐使用DeepLab-CRF-LargeFOV模型,并不推荐使用带有MSc的版本,因为使用MSc模块之后会增加训练参数数量,其次会增大训练时所占用的GPU显存,也会减缓模型推理速度。
DeepLab-MSc-LargeFOV版本模型,增加了MSc模块之后,主分支中并没有任何变化,在原图尺度以及前四个MaxPool层的输出进行了融合。在原图尺度中首先通过了一个卷积核尺寸[3x3],步距为8,padding为1的卷积层,通过8倍下采样之后,输出的特征图的高和宽和主分支上输出的特征图高和宽是一样的,再通过[1x1]的卷积层,再通过一个卷积核大小[1x1],个数为num_cls的卷积层,之后得到的特征图大小和通道数和主分支得到的特征图大小通道数相同都为num_cls。前四个MaxPool层额外接的分支构建基本相同,唯一不同是在四个MaxPool层中,第一个卷积层当中,采用的步距为4,第二个采用的步距为2,第三个和第四个采用的步距都为1。
除了主分支的输出之外,还额外添加了5个尺度上的输出,包含原图尺度上和四个MaxPool层的输出,最后进行一个各尺度特征图相加操作,特征图shape保持不变,之后进行一个8倍上采样将特征图还原为原图大小。
二、DeepLab V2
1、介绍
DeepLabV2相比于DeepLabV1有两个提升的地方:(1)、将backbone更换为ResNet;(2)、引入了新结构ASPP。
论文在引言中提出了DCNNs应用在语义分割任务中会出现的问题:(1)、分辨率被降低,主要由于下采样步距s>1的层导致;(2)、目标的多尺度问题;(3)、DCNNs的不变性会降低定位精度。
- 针对分辨率被降低的问题,通常将最后几个MaxPool层的步距s设置为1,如果是通过卷积下采样的(ResNet),同样将步距s设置为1,配合使用膨胀卷积。
- 针对目标多尺度的问题,将图像缩放到多个尺度分别通过网络进行推理,最后将多个结果进行融合即可,但是这样做的计算量太大。DeepLabV2中提出了ASPP模块(Atrous spatial pyramid pooling)。
- 针对DCNNs不变性导致的定位精度降低问题,和DeepLabV1差不多还是通过CRFs解决,但是DeepLabV2使用fully connected pairwise CRF,相比V1的更高效。
2、ASPP(Atrous Spatial Pyramid Pooling)
对于backbone处理得到的特征图,通过并联四个分支,每个分支都使用一个[3x3]的膨胀卷积,但是不同分支使用的膨胀系数并不相同,针对每个分支使用的膨胀系数不同,则不同分支对应的感受野也不相同,对四个分支的输出结果进行融合,可以应对不同尺度下的图像语义分割的需求。
作者提出了两种ASPP模型,ASPP-S与ASPP-L。对于ASPP-S对应的四个分支的膨胀系数设定为{2,4,8,12},对于ASPP-L对应的四个分支的膨胀系数设定为{6,12,18,24}。通过LargeFOV与ASPP-S、ASPP-L进行对比实验,可以看出ASPP-L效果更好,在使用场景下更推荐。
上图是针对backbone为VGG-16的ASPP模块,首先针对每个分支都接上[3x3]的膨胀卷积,设定不同的膨胀系数,之后在膨胀卷积之后依次接上两个[1x1]的卷积层,然后将四个分量的输出相加融合。如果是针对采用ResNet作为backbone,那ASPP结构只有一个[3x3]的膨胀卷积层,并没有之后的两个[1x1]卷积层。
3、消融实验
消融实验是一种常见的实验方法,目的是通过逐步削减或去除模型的某些组件或功能,以评估它们对模型性能的影响。这种实验可以帮助研究人员理解模型的各个组成部分的作用和贡献,从而进一步优化和改进模型设计。
在消融实验中,研究人员通常会设计一系列的对比实验,比如分别去除不同的组件或功能,并与完整的模型进行对比。例如,在图像分类任务中,可以逐步去除网络中的卷积层、池化层、正则化等组件,或者去除数据增强、学习率优化等训练策略。然后通过比较实验结果,分析去除某个组件后模型性能的变化,来确定该组件的重要性和对模型性能的贡献。
消融实验的结果可以提供对模型的深入理解,并有助于指导模型设计和功能改进。通过逐步去除或削减模型的不同组件,可以确定哪些是关键组件,哪些是次要组件,以及哪些组件可以进一步优化或简化。这对于提高模型性能、减少计算资源的使用和加快模型推理速度都非常有帮助。
需要注意的是,消融实验虽然可以提供有用的信息,但也有一定的局限性。在设计消融实验时,需要确保所去除的组件或功能不会导致模型的整体结构或性能丧失太多,以免影响实验结果的可靠性。此外,消融实验的结论也需要进行合理解释和论证,不能仅凭实验结果做出片面的推断。
- 首先MSc对应一种多尺度方法,在论文中介绍,将输入的图片分别缩放到0.5倍,0.75倍,和1倍(原尺度),将这三种尺度图片输入到网络进行正向传播,那么就可以得到每一个尺度对应的Score map(得分图是一个三维或四维的张量,每个维度表示不同的目标类别或像素标签),然后将三个score map进行融合,融合过程是针对每个像素取三个尺度的score map中的最大值,采用多尺度对结果是有一定提升的。
- 是否在COCO数据集进行预训练,可以看到可以提升大概两个百分点。
- Aug表示对数据进行增广,所采用的方法是对输入的图片在0.5倍到1.5倍进行一个随机缩放。
- LargeFOV结构对mIoU的提升并不是很高。
- ASPP模块的使用可以提升大概1.5个百分点。
- CRF模块可以提升大概1.3个点左右。
可以得出结论,在DeepLabV2中使用CRF对于mIoU的提升并没有那么大,但是耗费模型运算时间。
通过将backbone从VGG-16更换为ResNet-101可以将mIoU从65.76%提升到68.72%,大概三个百分点。
4、Learning rate policy
作者提出了关于学习率的变化策略,即在DeepLabV2的训练过程中采用的学习策略称为poly,相比普通的step学习策略(即每间隔一定步数就降低一次学习率)效果更好。
-
对应设置的初始学习率
对应当前训练的步数
对应在整个训练过程中所需要训练的步数
对应超参数
5、DeepLabV2网络结构
不考虑MSc的情况下,backbone为ResNet-101,DeepLabV2网络结构如下。
Layer2层及之前的结构都与ResNet-101结构相同。为了防止下采样导致分辨率过低,在Layer3之前通过残差模块和MaxPool层已经下采样8倍了,Bottleneck1中对于[3x3]的卷积层步距调整为1,更改为膨胀卷积,分支上的[1x1]卷积步距调整为1,并不进行下采样。Bottleneck2在分支上没有卷积层,直接连接,主分支上的[3x3]的卷积也更改为膨胀卷积。
在Layer4的输出之后接上ASPP结构,并行连接4个膨胀卷积结构,分别对应的膨胀系数为{6,12,18,24}。每个分支上都采用偏执bias,所采用的卷积核个数都为类别个数num_cls。将四个分支的输出进行相加,最后通过双线性插值进行8倍上采样,还原回原图尺寸。
三、DeepLab V3
1、介绍
DeepLabV3网络相较于DeepLabV2网络基础上,引进了Multi-grid,改进了ASPP结构,移除了CRFs后处理。
在DeepLabV3中作者提出了两种模型结构:(1)、cascaded model;(2)、ASPP model。
通过作者论文中所作的对比实验,这两种模型的最终效果差不多,ASPP model会更好一点,所以使用的也是更多。
2、cascaded model
级联结构模型中的Block1、Block2、Block3和Block4都是ResNet-101网络中原有的结构,分别对应conv2、conv3、conv4和conv5当中所对应的一系列残差结构。除了这些原有结构还新增加了Block5、Block6和Block7,需要注意的是新增加的三个Block的结构和前端的Block都是通过三个残差结构堆叠而成,Block4中将第一个残差结构里的3x3卷积层以及分支上的1x1卷积层步距stride由2改成了1(即不再进行下采样),并且所有残差结构里3x3的普通卷积层都换成了膨胀卷积层,只不过在5、6、7中采用的膨胀系数都不相同。
在DeepLabV1和V2中的下采样率都是8倍,但是在cascaded model级联模型中训练时将特征图下采样到16倍,但是在验证和推理过程中将特征图下采样到8倍,即Block3在训练时会对特征图进行下采样,但是在非训练时就不会对特征图进行下采样。作者的解释是:如果在训练时将下采样率设置为16倍,batch_size可以设置的更大,能够加速训练,但是如果在验证时还将下采样率设置为16倍,最终的验证结果会粗糙一些。但是现如今训练模型时可以直接将下采样率设置为8倍。
膨胀卷积中的膨胀系数由rate和multi-grid相乘得到。
3、ASPP model
前端的Block基本与ResNet-101相同,在ASPP模块中与DeepLabV2的模块略有不同。ASPP模块改进为五个分支:
- 第一个分支为[1x1]的普通卷积层
- 后三个分支为[3x3]的膨胀卷积层,膨胀系数分别对应为{6,12,18}
- 最后一个分支为全局池化层,为了获取全局上下文信息
五个分支输出的融合使用了Concat拼接,并不是DeepLabV2中相加,而是沿着channels方向将特征图拼接在一起,特征图高和宽不变,通道数增加。再通过一个[1x1]的卷积进一步融合。
DeepLabV2中的ASPP模块
V2中的ASPP模块是通过四个分支组成,四个分支上采用的卷积都是[3x3]的膨胀卷积,且并没有采用BN层和ReLU层,将四个分支上的输出相加之后直接上采样还原回原图大小。
DeepLabV3中的ASPP模块
V3中的ASPP模块,首先有[1x1]的分支,然后是三个[3x3]的膨胀卷积分支且膨胀系数各不相同,图中是{12,24,36},刚好是{6,12,18}的两倍,因为作者在论文中提到,将下采样率更改为8倍时,膨胀系数进行下×2处理。最后是全局池化层分支,全局平均池化层将特征图池化为[1x1]的大小,之后通过[1x1]的卷积调整一下通道数,最后通过双线性插值的方法将特征图还原回输入时的高和宽。
经五个分支处理过后,五个分支输出的特征图的高和宽都是相同的,然后通过Concat操作在通道维度进行拼接,再通过[1x1]的卷积进行进一步融合。
4、Multi-grid
Multi-grid模型的参数为三个,对应的为一个Block结构中的三个串联Bottleneck模块中的膨胀卷积膨胀参数。膨胀系数r的计算应该为,如Block4中rate为2,Multi-grid为(1,2,4),则此时Block4的膨胀系数为r=(2,4,8)。
Block5、6、7与Block4的结构是一样的,由三个残差层构成。
- 对于cascade model来说,Multi-grid设置为(1,2,1)时mIoU最高
- 对于ASPP model来说并没有引入Block5、6、7模块,则Multi-grid设置为(1,2,4)时mIoU最高
5、消融实验
cascaded model消融实验
模型是Block7加上Multi-grid为(1,2,1)的情况下,采用的OS为Output_stride,也等于下采样倍率。MS为Multi-scale,此时scale={0.5,0.75,1.0,1.25,1.5,1.75}。Flip为输入额外增加一个沿水平方向翻转的一个输入。
ASPP model消融实验
在ASPP模型中,首先引入了Multi-grid为(1,2,4),Image Pooling也为改进后的ASPP的全局平均池化分支。采用多尺度Multi-scale,增加一个Flip翻转,且在COCO数据集上训练也对mIoU有提升。
6、训练细节
在DeeLabV2过渡到DeepLabV3之后mIoU提升了大概6个百分点,训练细节的变动十分重要。
- 采用了更大的crop size,训练时将输入网络的尺寸设置的更大些。
- 训练时将得到最终结果上采样回原图尺寸再去计算损失,如在DeepLabV2模型中是将没有上采样的特征图预测结果和真实标签下采样8倍后的结果进行损失计算,原因是可以提升训练速度,也可以减少所需显存。
- 训练结束之后冻结BN层的参数,再去fine-tuning微调其他参数
notes:
在训练神经网络时,输入网络的crop size是指在进行图像处理任务时所采用的裁剪尺寸。图像裁剪是指从原始图像中选择并提取出一部分区域,以在训练过程中输入给神经网络。裁剪尺寸可以影响网络的性能和训练结果。
通过使用不同的裁剪尺寸,可以改变输入图像的视角和内容,从而增加数据的多样性和丰富性。这有助于提高网络的鲁棒性和泛化能力,使其能够更好地适应不同的图像场景和应用。
通常,crop size会根据具体的任务和数据集进行调整。较大的crop size可以包含更多的上下文信息,但会增加计算负担和内存需求。较小的crop size可能会丢失一些细节,但可以提高训练速度和模型的轻量化。
因此,选择合适的crop size需要考虑到具体的应用场景、计算资源和模型性能的平衡。
Fine-tuning(微调)是在预训练的模型基础上进行进一步训练的过程。在深度学习中,通常会使用预训练的模型,该模型在大规模数据集上进行了训练,如ImageNet数据集。这些预训练的模型通常具有较好的特征提取能力和泛化能力。
Fine-tuning的过程是将预训练模型的权重加载到新的模型中,并在特定的任务和数据集上进行进一步训练。在这个过程中,新的模型会根据特定任务的需求进行调整和优化。通常,只有最后的几层或全连接层会进行调整,而其他层的权重保持不变。
通过Fine-tuning,可以利用预训练模型中学到的通用特征,在特定任务上快速地训练出高性能的模型。这种迁移学习的方法有助于节省训练时间和数据量,并且能够充分利用大型预训练模型的优势。
需要注意的是,Fine-tuning的成功与否取决于预训练模型和目标任务之间的相似性。如果预训练模型与目标任务有很大的差异,可能需要更多的调整和训练才能达到最佳性能。
7、DeepLabV3网络结构
- 在Pytorch官方实现的DeepLab V3中,并没有使用Multi-Grid。
- 在Pytorch官方实现的DeepLab V3中多了一个FCNHead辅助训练分支,可以选择不使用。
- 在Pytorch官方实现的DeepLab V3中无论是训练还是验证output_stride都使用的8。
- ASPP中三个膨胀卷积分支的膨胀系数是12,24,36,因为论文中说当output_stride=8时膨胀系数要翻倍。
四、DeepLabV3+
1、语义分割
语义分割网络所做的工作即是将图像中的每个像素点进行类别划分。在深度神经网络中通过Encoder过程提取特征,在获得足够特征信息之后对特征图进行反卷积,将图像上采样到原图尺寸大小。
2、DeepLabV3+网络结构
网络可以分为提取特征部分和恢复原图部分,encoder部分通过backbone将输入图片下采样提取特征,将输出的浅层特征图分为两个分支,一部分通过ASPP模块扩大感受野,然后上采样与浅层特征进行Concat拼接,之后通过一个[3x3]卷积层融合特征,再进行上采样还原回原图尺寸大小。
在backbone中通过一系列膨胀卷积提取特征,将ASPP模块处理过后的特征图与只经由backbone膨胀卷积之后的输出特征图进行Concat拼接,相当于在DeepLabV3的基础上再融合一个浅层的细节特征信息。
3、backbone网络介绍
Xception主干网络
- Xception是由Google在2016年提出的一种深度卷积神经网络架构。其名称源自"extreme inception",即在Inception网络的基础上做了一些极端的改造。
- Xception采用了深度可分离卷积(Depthwise Separable Convolution)的思想,将传统的卷积操作分成两步:首先对每个输入通道进行空间卷积(depthwise卷积),然后再用1x1的卷积核对通道间特征进行整合(pointwise卷积)。
- 这种深度可分离卷积的思想减少了参数数量,降低了计算复杂度,同时提升了网络的表征能力。
- Xception在ImageNet数据集上取得了很好的性能,被广泛应用于图像识别等任务。
MobilenetV2
- MobileNetV2是Google在2018年提出的一种轻量级神经网络架构,专门设计用于移动设备等资源受限的环境。
- MobileNetV2引入了倒残差结构和线性瓶颈函数,使得网络更加有效地利用了参数和计算资源,进一步提升了性能。
- 与Xception不同,MobileNetV2主要关注网络的轻量化和高效性,适用于对速度和模型大小有要求的场景。
- MobileNetV2在计算机视觉任务中表现优异,广泛用于移动端图像识别、实时目标检测等应用中。
4、ASPP模块构建
与DeepLabV3中的ASPP模块相同, 通过一个[1x1]卷积,三个[3x3]膨胀卷积层,膨胀系数依据下采样率变化,还包含一个全剧平均池化层添加全局上下文信息,将五个分支的输出按照通道维度进行Concat拼接处理,然后接[1x1]卷积层进行特征融合。
5、浅层特征和深层特征的融合
经过ASPP模块输出的特征图包含较高语义信息,进行上采样之后需要和经[1x1]卷积调整通道数的浅层特征图进行Concat拼接。
在深度学习中,特征图通道数拼接(channel concatenation)是一种常见的操作,它将多个特征图的通道数进行拼接,得到一个更深的特征图。
假设我们有两个特征图A和B,它们的通道数分别为C_a和C_b。通道数拼接操作会将A和B的特征图按照通道数进行拼接,得到一个新的特征图,其中通道数为C_a + C_b。
具体来说,对于特征图A和B,假设它们的大小为H×W,那么通道数拼接操作会将它们的通道数分别为C_a和C_b的对应位置的特征图拼接在一起。结果特征图的大小仍然是H×W,但通道数为C_a + C_b。
通道数拼接操作在很多深度学习模型中被广泛应用,可以帮助模型更好地捕捉特征。例如,在卷积神经网络(CNN)中,通道数拼接操作可以用于将不同层的特征图进行拼接,以提供不同层次的特征信息。在残差网络(ResNet)中,通道数拼接操作也被用于实现跳跃连接(skip connection),帮助模型更好地学习残差信息。
6、预测结果
在Concat拼接浅层和深层特征图之后,需要利用一个[1x1]卷积来进行特征图通道数调整,该卷积层的卷积核大小为[1x1],卷积核个数为任务所需的num_cls,经卷积过后即输出调整好通道数的特征图。
最后需要将特征图上采样恢复到原图尺寸大小, DeepLabV3+ 在对特征图进行上采样回原尺寸大小时通常使用双线性插值方法。这个方法通过在特征图之间进行插值来增加分辨率,使得输出的特征图与输入图像尺寸相匹配。这有助于提高图像语义分割的准确性。
双线性插值是一种常用的图像处理技术,用于在两个已知点之间估计新的像素值。在双线性插值中,假设图像中每个像素值可以由其相邻四个像素的值按比例加权得到。具体地,对于一个给定位置的像素,双线性插值会通过该位置周围最近的四个像素的像素值以及距离该位置的相对位置来进行插值计算。这种方法可以使得图像在放大或缩小时更加平滑地过渡,减少锯齿状边缘和失真。双线性插值在图像处理、计算机视觉和计算机图形学等领域广泛应用。