1 deeplabv3+ 概述
deeplabv3的缺点:
- 预测的feature map 直接双线性上采样16倍,到期望的尺寸,这样会 细节信息不够
deeplabv3+的特点:
- 使用了 【encoder-decoder】(高层特征提供语义,decoder逐步回复边界信息):提升了分割效果的同时,关注了边界的信息
- encoder结构中:采用了 【Xception】 做为 DCNN、使用【ASPP】, 并将【深度可分离卷积(depthwise deparable conv)】应用在了ASPP 和 encoder 模块中,使网络更快。
- decoder结构:采用一个简单的模块,用于回复目标边界细节
deeplabv3+的贡献:
- 提出了新的 encoder-decoder 结构,采用 deeplabv3 作为 encoder 模块,以及一个简单有效的decoder模块
- 在网络结构中,可以通过空洞卷积任意控制 encoder 模块特征图的分辨率,并充分考虑的速度和精度,这是现有的 encoder-decoder模块没有的
- 采用了 Xception模块用于分割任务,并将深度可分离卷积(depthwise separable convolution)应用到ASPP 和 decoder 模块中
- 模型获得了很高的分割精度,并详细分析了模型设计原则和模型变体
- 开源了代码和模型
deeplabv3+的效果:
- 在PASCAL VOC 2012 和 Cityscaps 数据集上获得 89.0% 和 82.1% 的分割效果,没有添加任何的后处理。
结构的进化: deeplabv3 + encoder-decoder --> deeplabv3+
2 deeplabv3+
2.1 网络结构
encoder:
- 使用 deeplabv3 作为编码器。网络中的空洞卷积提取特征,获取多尺度的上下文信息,同时替代了下采样,使输出的 feature map 的 output_stride=16。
- ASPP 模块使用了多个平行的空洞卷积,配合了图像级特征(即全局平均池化)
decoder
- 【 F a F_a Fa】:encoder 输出的特征图的output_stride=16,经过双线性上采样4倍得到 F a F_a Fa。 F a F_a Fa的output_stride=4
- 【 F b F_b Fb】:取 encoder 的中间层(具有相同分辨率,output_stride=4),
经过 1x1 卷积降通道(原因:要和 F a F_a Fa 保持相同的 channels,保持相同占比,利于模型学习),此时输出的特征图记为 F b F_b Fb。- 【 F a + F b F_a+F_b Fa+Fb】:将 F a F_a Fa 和 F b F_b Fb 做 concat,在经过一个 3x3 卷积细化 feature,最终再双线性上采样4倍得到预测的结果
output_stride=16,是精度和速度的最好的平衡;当output_stride=8 时,需要付出额外的计算代价。
对于网络结构内容,要了解如下:
- 1 深度可分离卷积
- 2 output_stride的影响
- 3 修改后的 Xception
2.2 深度可分离卷积
深度可分离卷积,极大的降低了计算的复杂度。 【depthwise separable conv】 = 【depthwise conv】+【point conv】
空洞分离卷积【Atrous separable conv】=【depthwise conv】+【atrous conv】
- 【depthwise conv】是在每个通道上独自的进行空间卷积
- 【pointwise conv】是利用 1x1 卷积核 对【depthwise conv】进行组合,从而得到特征
- 【atrous conv】空洞卷积
2.3 output_stride的影响
这里的 output_stride 表示为 输入图与输出图的比值。对于图像分类任务,通常 output_stride=32;对于语义分割,可以采用output_stride=16 or 8 提密集特征图,以及要修改最后的一个或者两个模块的滑动值(比如stride从2修改为1。当output_stride=8时,最后两个模块的空洞值分别为rate=2,4)。
DeeplabV3 使用空洞卷积提取任意分辨率的特征。Deeplabv3 采用 ASPP 模块,可以通过设置不同的 rate 来提取不同尺寸的卷积特征,以及采用 image-level feature;将Deeplabv3 最后一层的特征图作为本文的 encoder 的输出(包含256通道的特征图),并包含丰富的语义特征。
2.4 Modified Aligned Xception
DCNN模块的发展:【Xception 】–> 【Aligned Xception】 --> 【Modifiled Aligned Xception】
- 1 Xception 模型已经在图像分类上取得了快速的计算
- 2 MSRA提出的改进版本的Aligned Xception 在目标检测中实现了快速计算
- 3 这里,基于Aligned Xception 进行了修改得到了 Modifiled Aligned Xception。改进内容为:
- 使用相同 Xception,保持 Xception的 entry flow network 的结构,为了更快的计算和提高内存效率
- 使用 Depthwise separable conv 来替换所有的 max-pooling 操作
- 在每个 3x3 depthwise conv 后,添加BN
deeplabv3 中的DCNN 使用的是 ResNet-101的特征提取网络
deeplabv3+ 中的DCNN使用的是 Modified Aligned Xception
3 实验
- 使用 ImageNet-1K 上预训练的ResNet-101 和 Modified Aligned Xception,通过空洞卷积提取稠密特征图
- 使用的数据集为 PASCAL VOC 2012,包含20个前景目标类和一个背景类
- 使用 ploy 学习策略,初始学习率为 0.007,crop size=513x513(训练图片裁剪)。
- output_stride=16,随机裁剪翻转数据增强
3.1 解码器的设计
对于 f 个滤波器,kernel大小为 kxk 的卷积操作记为 【k*k, f】
【encoder】
用Deeplabv3 作为 encoder,基于ResNet-101 的Deeplabv3 是在输出结果上继续双线性上采样16倍得到的预测结果,这在PASCAL VOC 2012 验证集上达到了 77.21%.
【decoder】
在此基础上,Deeplabv3+ 提出了改进的decoder模块,最终选择了:
采用最简单的解码模型,Deeplabv3 最终的特征图和conv2的特征图进行concat,然后经过2组 [3*3,256]
的卷积。
使用 1*1 卷积来减少low feature 的通道数
1*1 卷积示意图:
为了评估 1*1卷积在 decoder阶段的影响,在encoder中取了 conv2 尺寸 [3x3,256]作为 encoder的一个输出,从下表中可以看到减少通道数在 48 到 32 之间性能最佳。最终采用 [1*1,48]使用 3*3卷积逐步获取分割的结果
3*3卷积 示意图
(1) 发现使用2组 [3*3,256] 的滤波器比使用 1组、3组 更有效;
(2) 将滤波器的个数 256 改为 128,或将卷积核大小从 3*3改为 1*1 都会降低性能在 decoder 阶段使用那部分的 low-leve feature map
在 conv2 和 conv3 串联起来作为特征图,conv2 上采样2倍后,与 conv3结合,再上采样2倍,效果没有提升。
3.2 ResNet-101 as Network BackBone
用 ResNet作为 Deeplabv3的 encoder模型,进行了实验:
- Baseline:下表中的第一组。都没有使用 decoder,测试了不同的output_stride,多尺度输入,左右翻转
- Adding decoder:下表中的第二组。采用decoder,平均多增加了20B 的计算消耗,性能从 【77.21%/ 78.85%】到 【78.51% / 79.35%】
- Coarser Feature maps:下表中的第三组。粗糙的特征图,测试了使用output_stride=32,使用decoder,计算两只有74.2B,这样计算速度更快。但相对于 output_stride=16 准确率下降了 1-1.5% 左右
结论:- 在 training 或 evaluation时,使用output_stride=16 or 8
- 使用多尺度 MS 计算量增加一个数量级,使用左右翻转计算量翻倍
3.3 Xception as Network BackBone
预训练:Xception 网络使用 ImageNet-1K 进行预训练,配置如下:
选项 配置 优化器 Nesterov momentum optimizer,momentum=0.9 学习率 初始学习率 0.05, 2个 epoch 衰减 0.94 weight_decay 4.0 e-5 硬件 同步使用50GPUs batch size 32*50 (每个GPU取32个图片) Image size 299*299
从上表中可以看出 Modified Xception 性能更好一些。以 Modified Xception 作为 Deeplabv3+ 作为 Deeplabv3+ 的encoder模型,进行了试验:
- Baseline:不使用decoder。当 train-output_stride = eval-output_stride = 16 时,使用 Modified Xception 比 ResNet-101 性能提升了 2%;使用 output_stride=8、MS、Flip 性能都有所提升。
- Adding decoder:添加了decoder,当 eval-output_stride=16时,比没有decoder 时 提升了8%
- Using depthwise separable conv:在ASPP 和 decoder 中使用深度分离卷积。计算量下降了30-40%
- pretraining on COCO:在 MS-COCO 数据集上训练,性能提升了 2%
- pretraining in JFT:在 ImageNet-K 和 JFT-300M 上预训练,性能提升 0.8%-1%
- 与其他先进模型在VOC12 的测试集上对比:
- 质量评估:下图是预测可视化的结果,模型在没有任何后处理的情况下分割效果很好。但第三行出现的情况分割不好:(1) 沙发和椅子;(2) 严重遮挡的物体;(3) 视野罕见的物体上分割效果不是很好
3.4 在目标边界上的优化
使用trimap实验测量模型在分割边界的准确度。计算边界周围扩展带(称为 trimap)内的 mIoU。实验结果如下:
- 与双线性上采样相比,使用decoder的有明显的提升。 trimap 越小效果越明显。
4 conclusion
论文提出了Deeplabv3+ 是 encoder-decoder的架构,其中encoder 架构采用Deeplabv3,decoder采用一个简单的模块用于恢复目标边界细节。并可使用 atrous convolution 在指定计算资源下控制特征的分辨率。