论文精读:Rethinking Atrous Convolution for Semantic Image Segmentation

论文地址 https://arxiv.org/pdf/1706.05587v1.pdf

模型结构简单,重点是理解模型设计的动机,并记录一下卷积的通用知识,已经熟知的知识就不再记录了,详细读原文。

Abstract:

1、为了处理分割问题的多尺度物体,串联和并联多种atrous rates的空洞卷积

2、 用图像级特征编码全局上下文进一步探索多尺度卷积特征(说白了把encoding特征pooling 到 1*1)

 

Introduction:

空洞卷积的好处:

通过空洞卷积,能够控制在DCNN中特征响应(特征响应,理解为做卷积操作)的分辨率,无需额外的参数

DenseCRF用来编码成对像素的相似性

Spatial pyramid pooling(空间金字塔池化)通过多种池化或者filter(卷积核)来获得多种感受野,从而捕获多个尺度的对象

本文工作:①Abstract 中的两点②讨论了一个实践问题:使用及其大的rate 3*3空洞卷积,由于图像边缘效应不能捕获长范围信息③详细介绍实现细节并分享经验,包括用于稀疏和精标数据的简单但是有效的bootstrapping方法

 

Related Work:

 Context module:

DenseCRF,Gaussian Conditional Random Filed 等

Spitial pyramid pooling:

有基于lSTM的方法用来整合全局上下文信息,Sptial pyamid pooling 也被用于目标检测。 这篇文章使用空洞卷积作为context module ,级联ResNet最后几个Block,ASPP中加入了图像级别特征,训练中发现,BN挺重要

Astrous convolution:  修改atrous rates 能捕获long-rang 信息,等等...

 

Methods:

在这一部分,重新回顾空洞卷积如何捕获密集的特征

 

Atrous Convolution for Dense Feature Extraction:

output_stride = 32指通过DCNN(比如ResNet)图像分辨率是输入的32分之一,后面的block使用空洞卷积。如果output_stride就是16,将最后一个池化层或者卷积步长减少到1,随后的卷积设置空洞率为2,这样获取更密集的特征无需额外参数。(这部分如果没看懂,看Experimental Evaluation部分)

Going Deeper with Atrous Convolution:

复制ResNet最后一个Block4次,并级联他们,除了最后一个block stride是1,前面3个stride是2,这样的设计动机是stride 在更深层次的block中能更容易的捕获long-rang 信息,比如整张图的信息可以被summary在最后曾非常小分辨率的feature map 中,但连续的stride对于语义分割是有害的,因此使用空洞卷积。

 

Atrous Spatial Pyramid Pooling:

ASPP受Spatial  pyramid pooling的启发,这表明在不同尺度上重新采样特征以准确有效地对任意尺度区域分类是有效的。

ASPP能有效地捕获多尺度信息,但是随着采样率(atrous rate)变大,有效滤波就变小。比如3*3的卷积核,如果astrous rate小,9个权重都是有效权重,都会用于卷积,但如果atrous rate特别大,可能只有卷积核的中间权重进行卷积,这种情况下, 使用1*1卷积核。为了克服这个问题, 使用了图像级特征,使用全局平均池化,并使用1*1卷积256通道,BN,然后双线性插值到想要的空间维度。当output_stride 是16时, rates = (6,12,18) + image-level 特征,这4个特征concatenated 然后经过1*1 卷积。

 

Experimental Evaluation

对于ResNet (input ->4(block1)->8(block2)->16(block3)->32(block4)),rates=[1,2,4]

如果output_stride 是8,则后面的 block3 中stride 都是1, rates =2, blcok stride 也是1,rates= 4

如果output_stride 是16 则后面的 block4中的stride都是1, rates=2.

Training Protocol:

"poly" learning rate:\left ( 1-\frac{iter}{maxiter} \right )^{power}

output_stride= 16要比output_stride = 8 快很多,因为out_stride=8多一个stride=2的block,在这个block分辨率减少了一半,因此快了,但是output_stride = 16牺牲了精度。

论文中结果:output_stride             8         16 

                         mIOU                  75.18    73.88

Upsampling logits:在有的工作中,如果output_stride = 8,则将ground trutj下采样8倍,计算损失。但是保证gt完整非常重要,因此我们上采样最终的logits,因为下采样groundtruth会减少标注结果。

 

Going Deeper with Atrous Convolution:

signal decimation 信息抽取 进行多次多步stride。在output_stride = 256时,mIOU特别低因为进行多次stride为2的操作,损失信息比较多。

 

Multigrid:

Resnet101 output_stride = 16 Multi_Grid=(r1,r2,r3)

实验结果表明:使用Multi_Grid 要比没有使用(1,1,1)好 。简单的偶数的rates(2,2,2)性能不是很好。使用Multi_Grid越深越好

在训练阶段,output_stide = 16,而在测试期间,output_stide = 8, 性能提升1.39%

 

 

论文中还有的一些细节信息每每写,比如4.1部分 Batchnormalization ,4.3 Pretrained on COCO 和 Test set result and an effective bootstrapping method。

总结一下, 框架很简单,重要的是要明白设计框架的动机,这个只能从论文中慢慢体会。

你可能感兴趣的:(语义分割)