DeepLab v2
文章首先提出目前使用深层卷积网络进行语义分割的三点挑战
1、特征分辨率的减少
文章指出这种问题的出现是因为网络中重复的下采样也就是maxpooling的操作,这种操作虽然在分类问题上表现突出,但是语义分割问题会导致特征分辨率下降
为了解决这个问题,本文移除了最后几层maxpooling,使用空洞卷积(atrous convolution为提出的新术语/upsample the filters)来取代,使用空洞卷积来达到maxpool的扩大感受野的效果,并且对于原始尺寸的特征响应使用简单的双线性插值(bilinear interpolation),文章中指出这种方式是对于deconv(反卷积)更有效的替代方法,对于之前使用加大卷积核尺寸的方法,空洞卷积可以在不增加参数和计算量的情况下,提高卷积的感受野
空洞卷积通过在卷积核元素之间增加r-1个0来扩大卷积核,新卷积核尺寸K*K如下计算
K=k+(k-1)(r-1)
其中k为原卷积核大小,r为rate
如原来ksize为5*5,rate=10
K=5+(5-1)*(10-1)=41
该空洞卷积核size为41*41
2、多尺度对象的存在
对于这种问题,之前使用的都是对于多尺度特征的融合或者使用score maps(分数图)进行解决,文章说使用这种方法会导致计算量的增加,本文借鉴了SPP(spatial pyramid pooling)的思想,本文提出了一种有效的在特征层进行多rate采样只会再进行卷积,这样可以给原图像在多filter时有足够有效的感受野,能够更有效的在多尺度捕捉上下文。并不是对于特征进行重采样,我们使用多个不同的采样rate在多个平行卷积层进行,把这种方法称为ASPP(atrous spatial pyramid pooling”)
作者把pool5层的结果,使用rate=6、12、18、24四种不同尺度的空洞卷积核得到不同野的特征图,随后将这四个特征图fuse在一起,在进行双线性插值恢复到输入图像的尺寸大小
3、因为深层卷积网络不变性导致的局部准确率降低
之前为了解决这种问题,使用的多是skip-layers。本文使用了一种更效率的方式,为了增强局部细节使用了全连接条件随机场(fully-connected Conditional Random Field),使用了这篇文章fcCRFs的方法
其中能量函数为
其中,为之前神经网络输出的score map
当时,,否则为0
表示各个像素之间的距离,表示每个像素的RGB像素值
、、为超参数
DeepLab V2 基于VGG16源码分析
假设输入图像大小为3*128*128 三通道128*128分辨率图像
conv1_1、conv1_2:num_output: 64 pad: 1 kernel_size: 3 输出为64*128*128
maxpool1:kernel_size: 3 stride: 2 pad: 1 输出为64*64*64
conv2_1、conv2_2:num_output: 128 pad: 1 kernel_size: 3 输出为128*64*64
maxpool2:kernel_size: 3 stride: 2 pad: 1 输出为128*32*32
conv3_1、conv3_2、conv3_3:num_output: 256 pad: 1 kernel_size: 3 输出为256*32*32
maxpool3:kernel_size: 3 stride: 2 pad: 1 输出为256*16*16
conv4_1、conv4_2、conv4_3:num_output: 512 pad: 1 kernel_size: 3 输出为512*16*16
maxpool4:kernel_size: 3 pad: 1 stride: 1输出为512*16*16
conv5_1、conv5_2、conv5_3:(这三层均为空洞卷积层)num_output: 512 pad: 2 kernel_size: 3 dilation: 2 输出为512*16*16
maxpool5:kernel_size: 3 stride: 1 pad: 1 输出为512*16*16
-----------------------------------
#hole=6
输入为maxpool5
fc6_1:(此层为空洞卷积层)num_output: 1024 pad: 6 kernel_size: 3 dilation: 6 输出为1024*16*16
fc7_1:(卷积层)num_output: 1024 kernel_size: 1 输出为1024*16*16
fc8_1:(卷积层)num_output: ${NUM_LABELS} kernel_size: 1 输出为NUM_LABELS*16*16
-----------------------------------
-----------------------------------
#hole=12
输入为maxpool5
fc6_2:(此层为空洞卷积层)num_output: 1024 pad: 12 kernel_size: 3 dilation: 12 输出为1024*16*16
fc7_2:(卷积层)num_output: 1024 kernel_size: 1 输出为1024*16*16
fc8_2:(卷积层)num_output: ${NUM_LABELS} kernel_size: 1 输出为NUM_LABELS*16*16
-----------------------------------
-----------------------------------
#hole=18
输入为maxpool5
fc6_3:(此层为空洞卷积层)num_output: 1024 pad: 18 kernel_size: 3 dilation: 18 输出为1024*16*16
fc7_3:(卷积层)num_output: 1024 kernel_size: 1 输出为1024*16*16
fc8_3:(卷积层)num_output: ${NUM_LABELS} kernel_size: 1 输出为NUM_LABELS*16*16
-----------------------------------
-----------------------------------
#hole=24
输入为maxpool5
fc6_4:(此层为空洞卷积层)num_output: 1024 pad: 24 kernel_size: 3 dilation: 24 输出为1024*16*16
fc7_4:(卷积层)num_output: 1024 kernel_size: 1 输出为1024*16*16
fc8_4:(卷积层)num_output: ${NUM_LABELS} kernel_size: 1 输出为NUM_LABELS*16*16
-----------------------------------
fc8_${EXP}:(此为Eltwise层)operation: SUM 输入为fc8_1、fc8_2、fc8_3、fc8_4,将这四个特征图相加得来最终特征图
输出为NUM_LABELS*16*16
-----------------------------------
label_shrink:type: "Interp" 输入为fc8_${EXP},进行8倍双线性差值,得到与输入图像相同尺寸的分割图 输出为NUM_LABELS*128*128