【语义分割系列:六】DeepLab v3 / v3+ 论文阅读翻译笔记
2015 ICLR
Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs
Abstract
DeepLab 是结合了深度卷积神经网络(DCNNs)和概率图模型(DenseCRFs)的方法
signal down-sampling
spatial “insensitivity”(invariance)
High-Level & Low-level vision task
CNN适合于Hight-Level Vision Task(如图像分类),不太适合于Low-Level Vision Task(如图像分割、姿态估计)。
包括边缘检测,角点检测,颜色之类的对细节敏感、抽象度比较低的任务。
CRF
to combine class scores computed by multi-way classifiers with the low-level information captured by the local interactions of pixels and edges or superpixels.
(将多路分类器计算的类得分 与 像素和边缘或超像素的局部交互捕获的低层信息结合起来)
我们的方法将每个像素看做CRF节点,利用长期依赖关系,并使用CRF推理直接优化 DCNN-driven cost
function。我们注意到传统的图像分割/边缘检测任务,对于完全连接的CRF,推理可以非常有效,特别是在语义分割的上下文中。
空洞卷积 hole Atrous 原理+图解析+应用
(Both large feature map & receptive field)
hole algorithm:up-sample the original filter by a factor of the strides(rate=2)
efficient dense sliding window feature extraction
RF and stride
按照公式,stride变小,要想保持receptive field不变,那么,就应该增大kernel size。于是就有了接下来的hole算法。
Example:
pooling layer stride = 2,convolution layer kernel size = 2,convolution layer第一个点的receptive field是{1,2,3,4},size为4.
为了得到更加dense的feature map,将pooling layer stride改为1,如果这个时候保持convolution layer的kernel size不变的话,可以看到,虽然是更dense了,可是感受野RF变小了 = {1,2,3}, size为3.
采用hole算法,在kernel里面增加“hole”,kernel size变大,相当于卷积的时候跨过stride减小额外带来的像素,就可以得到我们想要的RF.
卷积核直观上可以以通过对原卷积核填充0得到,不过在具体实现上填0会带来额外的计算量,所以实际上是通过 im2col函数(caffe)调整像素的位置实现的。
这样通过hole算法,我们就得到了一个8s(stride)的feature map,比起FCN的32s已经dense很多了,并且RF不变。
**conclusion:**感受野要在一个合理的区间,在语义与位置信息中谋求平衡,并辅之以dilated conv,扩大感受野、保持大的feature map的同时减少参数。
训练信息
把最后的全连接层FC6、7、8改造成卷积层
pool4的stride由2变为1,则紧接着的conv5_1, conv5_2和conv5_3中hole size为2。
接着pool5由2变为1, 则后面的fc6中hole size为4。
fc7,8为标准卷积
由于Hole算法让feature map更加dense,所以网络直接用差值升采样就能获得很好的结果,而不用去学习升采样的参数了(FCN中采用了de-convolution)
localization challenge
DCNN的预测物体的位置是粗略的,没有确切的轮廓。
图像输入CNN是一个被逐步抽象的过程,原来的位置信息会随着深度而减少甚至消失。
Example:FCN-based model因为经过层层下采样和上采样(参数多,感受野大且重合),而丢失大量位置信息,最后的分类结果如下图所示,十分smooth(平滑),但我们需要的是sharp segmentation。
解决问题方向:
CRFs for accurate localization
使用dilated conv,还避开了层层上采样,直接用bilinear interpolation(双线性插值)恢复到原状,然后进行fully-connected conditional random fields 通过邻域之间的锐化,得到最终分割结果。
CRF 计算公式
测试细节:
item | set |
---|---|
数据集 | PASCAL VOC 2012 segmentation benchmark |
DCNN模型 | 权重采用预训练的VGG16 |
DCNN损失函数 | 交叉熵 |
训练器 | SGD,batch=20 |
学习率 | 初始为0.001,最后的分类层是0.01。每2000次迭代乘0.1 |
权重 | 0.9的动量, 0.0005的衰减 |
DeepLab系列
[Paper Reading] DeepLab v1 & v2
论文阅读笔记:图像分割方法deeplab以及Hole算法解析
精读深度学习论文(20) DeepLab V1
Conditional Random Fields as Recurrent Neural Networks
网络结构
2016 CVPR
DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
❤ kazuto1011/deeplab-pytorch :PyTorch implementation of DeepLab v2 on COCO-Stuff / PASCAL VOC
isht7/pytorch-deeplab-resnet :DeepLab resnet v2 model in pytorch
DeepLabv1 在三个方向努力解决,但是问题依然存在:
特征分辨率的降低、物体存在多尺度,DCNN 的平移不变性。
特点:
atrous convolution
ASPP ( atrous spatial pyramid pooling) 用多尺度获得更好的分割效果
合并深度卷积网络和概率图模型方法,增强对物体边界的定位。
基础层由VGG16转为ResNet
和v1不同:
(a)sparse feature extraction
采用标准卷积的稀疏特征提取。
input feature 是由 stride=2 的 maxpooling 产生的,分辨率低
(b)Dense feature extradction
input feature 是由 stride=1 的 maxpooling 产生的,和标准卷积比,感受野小。为了和标准卷积感受野一样大,使用空洞卷积来增加kernal size来增加感受野
计算:
1-D input signal x[i]
filter w[k] of length K
速率参数 r 对应于采样输入信号的步长(标准卷积是速率r = 1的特例,上图空洞卷积 r=2)
FCN等网络重复使用max-pooling和striding会显著降低生成的feature map的空间分辨率(32倍),他们的解决措施是上采样以及反卷积,但这需要额外的内存和时间。
下采样 - 卷积 - 上采样
即本文提倡的无采样卷积
- 第一种是插入空洞(零元素)或者对输入特征地图同等稀疏地采样,来对滤波器进行上采样。
- 第二种方法,通过一个等于atrous convolution rate r的因子对输入特征图进行子采样,对每个 r×r 可能的偏移,消除隔行扫描生成一个 ![title](https://leanote.com/api/file/getImage?fileId=5ccfe5f1ab6441430c006312) 降低的分辨率图。
接下来对这些中间特征图使用标准卷积,隔行扫描生成原始图像分辨率。
使用多个不同采样率上的多个并行多孔卷积层。每个采样率上提取的特征再用单独的分支处理,融合生成最后的结果。
多孔空间金字塔池化(ASPP)。为了分类中间像素(橙色),ASPP用不同采样率的多个并行滤波器开发了多尺度特征。视野有效区用不同的颜色表示。
(a)DeepLab-LargeFOV 使用 rate=12的空洞卷积
(b)DeepLab-ASPP 使用 不同 rate 的多个 filter 在 multiple scales 获得物体和内容,有不小的提升。
全连接条件随机场 用于精确边界恢复
DeepLab v2 翻译 好!