系列文章目录
DeepLab语义分割系列(一):
SS-Model【2】:DeepLabv1
DeepLab语义分割系列(二):
SS-Model【3】:DeepLabv2
DeepLab语义分割系列(三):
SS-Model【4】:DeepLabv3
前言
DeepLabv3 是在 DeepLabv1,DeepLabv2 的基础上发展而来。
相比于前两代模型,DeepLabv3 网络有以下几点变化:
- 引入了 Multi-grid(设置膨胀系数)
- 改进 ASPP 结构
- 移除 CRFs 后处理(CRFs 给 mean IoU的提升很小)
原论文链接:
Rethinking Atrous Convolution for Semantic Image Segmentation
1. Abstract & Introduction
1.1. Abstract
主要贡献:
- 重新探讨空洞卷积
- 显式地调整滤波器的视场
- 控制由深度卷积神经网络计算的特征响应的分辨率
- 采用级联或并行梯度卷积的模块
- 解决多尺度分割对象的问题
- 采用多尺度膨胀率来捕获多尺度上下文
- 改进 ASPP 模块
- 在多个尺度上探测卷积特征
- 图像级特征编码全局上下文
1.2. Introduction
对于语义分割的任务,我们考虑了应用深度卷积神经网络(DCNNs)的两个挑战:
- 由连续的池化操作或卷积跨步导致的特征分辨率降低
- 使用空洞卷积
- 允许我们重新利用 ImageNet 的预训练网络,通过去除最后几层的下采样操作和上采样相应的滤波核来提取更密集的特征图
- 能够让我们控制 DCNN 内计算特征响应的分辨率,而不需要学习额外的参数
- 使用空洞卷积
- 获取多尺度问题的上下文
- Image Pyramid
- 将图片缩放到不同的尺寸,分别输入到网络中进行正向的推理,最后将多个尺度的输出进行融合,得到最后的输出
- 将 DCNN 应用到图像金字塔中,提取每个尺度输入的特征,不同尺度的目标在不同的特征地图上变得突出
- 同样的模型,通常具有共享的权重,被应用于多尺度输入
- 大尺度输入保留了小对象的细节
- Encoder - Decoder
- 按照分类网络 backbone 对输入的图片进行一系列的下采样,然后对最后得到的特征层进行上采样,并与浅层的特征层进行融合,重复上述操作,直到将图片还原回原图的大小
- 利用编码器部分获取多尺度特征,从解码器部分恢复空间分辨率
- 在编码器中,特征图的空间维数逐渐减少,从而更容易在编码器输出的深度中捕获更长的距离信息
- 在解码器中,目标细节和空间维数逐渐恢复
- Deeper w. Atrous Convolution
- 与 DeepLabv1 中的操作相似
- 将分类网络中,最后几个下采样层的 stride 设置为 1,然后引入膨胀卷积来增大网络的感受野
- 该模型包含以级联方式排列的额外模块,以编码远程上下文
- 一种有效的方法是将 DenseCRF (结合高效的高维滤波算法)加入到 DCNN
- 提出联合训练 CRF 和 DCNN 组件
- 在 DCNN 的置信图(置信图是最终包含输出通道等于预测类数的DCNN特征图)上使用几个额外的卷积层来捕获上下文信息
- Spatial Pyramid Pooling
- 在 DeepLabv2 中提到过的方法
- 空间金字塔池化通过多速率、多有效视场的过滤器或池化操作探测进入的 feature map,从而捕获多个比例尺的目标
- 在特征图上应用了4个不同 Atrous 速率的并行 Atrous 卷积
- 在级联模块和
SPP
的框架下,我们使用Atrous Convolution
来增大滤波器的感受野去融合多尺度的语境信息。 - 表明它可以有效地对不同尺度的特征进行重采样,从而准确有效地分类任意尺度的区域
- 随着采样率的增大,有效滤波器权值(即应用到有效特征区域的权值,而不是填充的零)的数量会变小
- Image Pyramid
2. Related work
- Image pyramid
- 具有共享权重的模型,被应用于多尺度的输入
- Encoder-decoder
- 编码器中特征图的空间维数逐渐减少,因此更大范围的信息更容易在更深的编码器捕获
- 对象细节和空间尺度逐渐恢复的解码器
- Context module
- 这个模型包含以级联形式排列的额外模块,用于编码大尺度上下文
- Spatial pyramid pooling
- 该模型使用空间金字塔池来捕获多个范围内的上下文
- Atrous convolution
- 基于孔洞卷积的模型已经被积极地用于语义分割
3. Model Structure
3.1. Atrous Convolution for Dense Feature Extraction
考虑二维数据,对于输出 y y y 上的每个位置 i i i 和一个滤波器 w w w,在输入特征映射 x x x 上应用空洞卷积:
y [ i ] = ∑ k x [ i + r ⋅ k ] w [ k ] y[i] = \displaystyle\sum_k x[i + r \cdot k] w[k] y[i]=k∑x[i+r⋅k]w[k]
其中,衰减率 r r r 对应于我们采样输入信号的步长,这相当于用插入 r r r 产生的上采样滤波器卷积输入 x − 1 x−1 x−1 沿每个空间维度在两个连续的滤波器值之间取零(因此命名为 Atrus 卷积)。标准卷积是间隔 r = 1 r = 1 r=1 的特例,而空洞卷积允许我们通过改变间隔值来自适应地修改滤波器的视场。
空洞卷积还允许我们明确控制在全卷积网络中计算特征响应的密度。这允许我们提取更密集的特征响应,而不需要学习任何额外的参数.
更多关于空洞卷积以及论文中提到的转置卷积,可以参考我的另一篇blog:SS【1】:转置卷积与膨胀卷积
3.2. Going Deeper with Atrous Convolution
模型中的 block 分别对应 ResNet-101 模型中的一系列残差结构:
- Block 1 -> conv2_101
- Block 2 -> conv3_101
- Block 3 -> conv4_101
- Block 4 ->conv5_101
3.2.1. Cascaded model
以级联方式排列的空洞卷积模块(论文中大篇幅讲述的)
采用串行的 ResNet-101 结构,且 Block 5、Block 5 和 Block 7 均为 Block 4 的复制
- 在没有使用空洞卷积时输出步长为256
- 使用空洞卷积时输出步长为16
需要注意的是:
- Block 1 并未对模型进行下采样(观察上图中的 ResNet 结构可知,conv2_101 中进行下采样的是 pooling 层而不是残差结构),所以对应的 output_stride 与原论文中所给的模型结构有所不同
- 通过 Block 3 之后的 output_stride 在训练过程与验证过程是不相同的
- 在训练 cascaded model 时
output_stride = 16
(即特征层相对输入图片的下采样率),但验证时使用的output_stride = 8
(大概率是将 Block 3 中的下采样取消了)- 在 DeepLabv1 和 DeepLabv2 中,下采样率最高到 8 倍
- 因为
output_stride = 16
时最终得到的特征层 H 和 W 会更小,这意味着可以设置更大的 batch_size 并且能够加快训练速度。但特征层 H 和 W 变小会导致特征层丢失细节信息(文中说变的更“粗糙”),所以在验证时采用的output_stride = 8
- 在训练 cascaded model 时
- 图中标注的
rate
并不是膨胀卷积真正采用的膨胀系数- 真正采用的膨胀系数应该是图中的 rate 乘上 Multi-Grid 参数
- Block4 中 rate = 2,Multi-Grid = (1, 2, 4) 那么真正采用的膨胀系数是 2 x (1, 2, 4) = (2, 4, 8)
3.2.2. ASPP model
加入 ASPP 结构(实际应用中常出现的)
需要注意的是:
- 通过 Block 3 之后的 output_stride 在训练过程与验证过程是不相同的
- 在训练 cascaded model 时
output_stride = 16
(即特征层相对输入图片的下采样率),但验证时使用的output_stride = 8
(大概率是将 Block 3 中的下采样取消了) - 因为
output_stride = 16
时最终得到的特征层 H 和 W 会更小,这意味着可以设置更大的 batch_size 并且能够加快训练速度。但特征层 H 和 W 变小会导致特征层丢失细节信息(文中说变的更“粗糙”),所以在验证时采用的output_stride = 8
- 在训练 cascaded model 时
使用到的 ASPP 结构有5个并行分支:
- 一个 1 × 1 1 \times 1 1×1 的卷积层
- 三个
3
×
3
3 \times 3
3×3 的膨胀卷积层
- 膨胀系数依次为:12、24、36(是上述结构图中,对应膨胀卷积层的膨胀系数的两倍)
- 如果将下采样系数设置为 8,那么对应的膨胀系数需要翻倍
- 一个全局平均池化层(后面还跟有一个
1
×
1
1 \times 1
1×1 的卷积层(调整通道数),然后通过双线性插值的方法还原回输入的 W 和 H)
- 解决 ASPP 的 rate 过大而退化的影响,增加了全局信息
- 通过 Concat 的方式将这 5 个分支的输出进行拼接(沿着 channels 方向),最后再通过一个 1 × 1 1 \times 1 1×1 的卷积层进一步融合信息
ASPP 中不同的空洞率可以有效的捕获不同尺度的信息。但是当空洞率非常大时,有效的卷积权重变得很小。
如下图,将不同 rate 的 3x3 卷积应用在 65x65 大小的特征图。在极端的情况下,rate value 接近特征图大小,那么 3x3 卷积不再获取整张图像信息,而是退化到 1x1 卷积,只有中心的权重是有效的:
3.3. Implementing DeepLabv3 with PyTorch
- 没有使用 Multi-grid
- 多了一个 FCNHead 辅助训练分支
- 可以选择不使用
- 无论是训练还是验证 output_stride 都使用 8
- 显存足够大
- ASPP 中的三个膨胀卷积分支的膨胀系数分别为:12、24、36
- 论文中说当 output_stride = 8 时膨胀系数要翻倍
4. Training model
4.1. Muti-grad
使用变体残差模块,采用了Multi-grid 策略
- 应用不同策略通常比单倍数 ( r 1 , r 2 , r 3 ) = ( 1 , 1 , 1 ) (r_1, r_2, r_3) = (1, 1, 1) (r1,r2,r3)=(1,1,1) 效果要好
- 简单的提升倍数不会有太大效果 ( r 1 , r 2 , r 3 ) = ( 2 , 2 , 2 ) (r_1, r_2, r_3) = (2, 2, 2) (r1,r2,r3)=(2,2,2)
- 增加网络深度,在配合 Multi-grid 可以提升性能
- 下图中最好的模型为:使用到 block7 的 ( r 1 , r 2 , r 3 ) = ( 1 , 2 , 1 ) (r_1, r_2, r_3) = (1, 2, 1) (r1,r2,r3)=(1,2,1)
4.2. Inference strategy on val set
- cascaded model 消融实验
- OS = 16:训练和验证的 output_stride 都设置为16
- OS = 8:将验证的 output_stride 设置为8
- MS:与 DeepLabv2 相同的多尺度输入
- scales = {0.5, 0.75, 1.0, 1.25, 1.5, 1.75}
- Flip:增加一个沿水平方向翻转的输入
- ASPP model 消融实验
- Image Pooling:在 ASPP 中加入的全局平均池化层分支
- OS = 16:训练和验证的 output_stride 都设置为16
- OS = 8:将验证的 output_stride 设置为8
- MS:与 DeepLabv2 相同的多尺度输入
- scales = {0.5, 0.75, 1.0, 1.25, 1.5, 1.75}
- Flip:增加一个沿水平方向翻转的输入
- COCO:在 COCO 数据集上预训练
4.3. Training strategies
- Learning rate policy
- 采用 poly 策略,在初始学习率上乘以
(
1
−
i
t
e
r
m
a
x
_
i
t
e
r
)
p
o
w
e
r
(1 - \frac{iter}{max\_iter})^{power}
(1−max_iteriter)power
- iter:当前训练的“步数”
- max_iter:整个训练过程所需迭代的“步数”
- power:超参数,论文中的值为 0.9
- 采用 poly 策略,在初始学习率上乘以
(
1
−
i
t
e
r
m
a
x
_
i
t
e
r
)
p
o
w
e
r
(1 - \frac{iter}{max\_iter})^{power}
(1−max_iteriter)power
- Crop size
- 利用 crop_size 这种方式可以剪裁中心关注点和边角特征,mirror 可以产生镜像,弥补小数据集的不足
- 在训练过程中增大了训练输入图片的尺寸
- 采用大的膨胀系数时,输入的图像尺寸不能太小,否则 3x3 的膨胀卷积可能退化成 1x1 的普通卷积
- Batch normalization
- 在 ResNet 模块中添加了 BN
- 解决在训练过程中,中间层数据分布发生改变的问题,以防止梯度消失或爆炸、加快训练速度
- 批标准化,和普通的数据标准化类似,是将分散的数据统一的一种做法,也是优化神经网络的一种方法
- 具有统一规格的数据,能让机器学习更容易学习到数据之中的规律
- Upsampling logits
- DeepLabv1 & DeepLabv2
- 将真实标签图像下采用8倍然后和没有进行上采样的预测结果计算损失(当时这么做的目的是为了加快训练)
- DeepLabv3
- 是将预测的结果通过上采样还原回原尺度后(即网络最后的双线性插值上采样8倍)在和真实标签图像计算损失
- DeepLabv1 & DeepLabv2
- Data augmentation
- 训练阶段,随机放缩输入图片(从0.5到2.0)和随机左右翻转