github: https://github.com/CoinCheung/Deeplab-Large-FOV
原文链接: http://de.arxiv.org/pdf/1412.7062
deeplab结构简介
(1) deeplab v1论文中backbone是VGG,但是现在都是采用ResNet,因为特征提取的效果更好。
(2) skip了VGG的最后两个池化层,直接从更大分辨率的特征图上进行上采样
(3) 使用空洞卷积来保持原来的(5个池化层)感受野
(4) 使用双线性插值上采样8×,得到同原图大小一致的像素分类图
(5) 也是一个全卷积网络(FCN),将最后的全连接层换成1×1的卷积层,输出与原图尺寸一致的特征图,对每个像素进行分类
(6) 使用CRF使最后分割的边缘更加精细(在对一个像素做分类时,不光考虑 DCNN 输出的结果,还要考虑周围像素的意见尤其像素值比较接近的,这样得出的语义分割结果会有更好的边缘)
(7) 多尺寸预测,希望获得更好的边界信息,与FCN skip layer类似,具体实现上,在输入图片与前四个 max pooling 后添加 和 的卷积层,这四个预测结果与最终模型输出拼接(concatenate)到一起,相当于多了128*5=640个channel。虽然效果不如dense CRF,但也有一定提高。最终模型是结合了Desne CRF与Multi-scale Prediction。
为什么要去掉最后两层池化层?
减少空间信息的损失,第五个池化层之后特征图会被降采样到原图的1/32尺寸,空间信息损失较大,直接在该特征图上进行上采样效果不好。
CNN经过池化层之后会扩大感受野,但是会损失空间信息。FCN有多种降采样程度的版本(FCN-8s、FCN-32s等),其中FCN-8s的分割效果最好,deeplab可能是参考了这一结果。所以deeplab v1去掉了VGG的最后两层池化层,直接在1/8原图尺寸的特征图上进行上采样。
最后两个池化层的处理的两种说法及感受野
两种说法
网上看到有的说是去掉最后的两个Pool层;
有的是将最后两个Pool层的stride=1且让padding=1。
感受野
这两者最后得到的特征图的感受野大小是不同的。
将最后两个Pool层去掉,特征图感受野会变小。原来的VGG的特征图在经过最后一个Pool层后,其特征图上的每个元素的感受野为212x212。而将最后两个Pool层去掉或者是令最后两个Pool层的stride=1,最后特征图上的每个元素的感受野分别变成了140x140和156x156。
空洞卷积
为了减少空间信息的损失去掉了两个池化层,但是感受野会变小,这对于提取像素的context不利影响分类精度,同时特征图尺寸不变小会使得后面卷积层的计算量变大。
所以论文提出了空洞卷积。