语义分割论文阅读:Deeplab v2

DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs

论文链接:https://arxiv.org/abs/1606.00915
代码链接:https://bitbucket.org/aquariusjay/deeplab-public-ver2
这个月博客更的不是很勤,主要是笔者虽然也看了deeplab v1和v2,但是最近写代码多一些。趁着学习pytorch的机会,尝试一行一行敲了个Deeplab v2。本周的博客就来讲讲这篇分割领域非常经典的deeplab文章。官方的代码是caffe且在bitbucket上,如果对Pytorch更有兴趣的可以关注下笔者的实现。在这里我也厚颜无耻地给自己刚写的github项目求个star,也欢迎大家前来挑刺和拍砖~由于deeplab v1版本没有特别特殊的地方,因此直接介绍v2。

1. Background

相信看完FCN的同学会觉得这样直接把分类的网络拿来改改做分割,除了一个信息融合外没有更进一步修改的方式太过粗糙了,似乎没有太过针对分割问题,deeplab就在这个基础上进行了一些分析:

  1. 分类问题更关注大范围内的信息,因此有很多max-pooling和downsampling,这些层的出现会导致stride非常大、减少了图像分辨率,也对语义分割这种定位上很精细的问题很不利
  2. 分割问题也会处理大小不同的物体,换句话说,同样会遭遇检测问题中非常常见的尺度问题
  3. FCN使用上采样将缩小的feature map还原到输入图像的大小,一方面这些层需要进一步学习参数,另一方面,还原出的feature map整体上仍然比较粗糙

针对前两者,作者提出了了移除部分下采样层并添加孔洞卷积来弥补感受野缺失的思路,而在尺度的考虑上,作者则设计了一个ASPP的方案,也就是我们在之前的RFB Net提到过的,多个rate不同的孔洞卷积并行、从而感受不同大小的物体。
特别要说明的是最后一点,作者设计的思路是DNN直接输出stride为8的缩小后的特征图。然后,直接用简单的插值法还原到原来的大小,随后使用denseCRF(全连接条件随机场)进行后续的处理。关于denseCRF,笔者之后会专门写一篇博客来介绍它。本周我们的思路主要是在DNN网络这一部分。

2. Network

基础网络

以ResNet为例,我们知道,一般的ResNet如下图所示,stride为32:
在这里插入图片描述
deeplab的思路就是保留conv1和conv2_x、conv3_x的下采样层,而删去conv4_x和conv5_x的下采样层(可以直接将stride=2的层变为stride=1即可实现)。为了弥补下采样消失引发的感受野不足的问题,conv4和conv5中的卷积变更为孔洞卷积。其中,conv4的rate=2,而conv5由于层数加深则使用了rate=4的设置。最终,网络的stride=8。

分类网络

分类网络的示意图如下:
在这里插入图片描述
其中,左面是作者最早提出的采用rate=12的超大孔洞卷积来提升效果的方案。而右面的ASPP是作者提出的效果最好的分类网络,其核心就是在前面基础网络的输出pool5上添加多个不同rate的孔洞卷积分支,来达到对不同尺度的适应效果。根据RFB Net中的图,这种设计可能和人类视觉的感受系统有某种雷同的地方。
在这里插入图片描述

技巧部分

  1. 多尺度输入与损失函数: Deeplab的采用多尺度的输入,具体来说,会把图像按照[0.5,0.75,1]的比例放缩成三个尺度分别输入网络,得到三个feature map,我们不妨用f05、f75和f1来表示,而前两者会被放大到f1的大小做一个融合,得到额外的特征f……因此网络最后有四个输出特征f05、f75、f1和f,也就有四个部分的loss。其中,后三者会和缩小8倍的label计算loss(f75使用的是放大到f1大小后的),而f05则会和缩小了16倍的label计算loss。语义分割问题本质上是点的分类问题,因此计算所有点的交叉熵损失函数即可。
  2. 初始化: 使用在COCO上预训练好的模型初始化,以提高在VOC上的效果
  3. 数据增广:输入图像会随机在[0.5,1.5]的一个尺度上进行缩放,然后再采用1的多尺度策略,注意要区分两者不是一回事。
  4. 学习率设置:这里有两点要注意,第一,最后的ASPP也就是分类网络的学习率是前面基础网络的10倍。其次,作者采用了’poly’学习率的策略。具体来说,不是像传统那样,训练到一定次数给学习率乘以0.1,而是每次迭代按照:原始学习率 * (1 - 当前迭代次数/最大迭代次数)的0.9次方,这一公式计算每一步新的学习率,实测该策略确实可以有效提升结果。

3. Experiment

这里要指出的一点就是,fcn和deeplab使用的评价策略并不是笔者在fcn里提到的交集点比上并集点,而是另一种策略,tensorflow的评价指标文档里有比较简单的介绍。不够清晰的话还可以去FCN的论文里查看。
特别值得注意的是,PASCAL VOC拓展后的数据集中的边界点(也就是值为255的)应该是没有计入评价标准里的,否则结果会有一定的影响。
最后,deeplab在VOC 2012 val集上的误差如下图所示:
在这里插入图片描述
整体效果还是挺不错的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值