作者:蜀南竹海的天空 | 来源:互联网 | 2023-08-18 11:52
一、Deeplabv2对应论文是DeepLab:SemanticImageSegmentiationwithDeepConvolutionalNets,Atrou
一.深度实验室v2
对应论文为deep lab : semanticimagesegmentiationwithdeepconvolutionalnets、Atrous Convolution、and Fully Connected CRFs
深度实验室是谷歌基于FCN制作的。 为了获得更dense的score map,FCN将500x500的输入图像添加到第一个卷积层,将100填充添加到conv1_1,最终在fc7层终于获得了16x16的score map。 深度实验室使用一种非常优雅的方法,将VGG网络的pool4和pool5层的stride从原来的2更改为1,然后添加1填充。 这种改变导致vgg网络的总stride从原始的32变为8,并且在输入图像为514x514的情况下,fc7能够获得67x67的score map,其数量确实远远多于FCN。 这样会将大小缩小8倍,但这样会改变之后节点的感受。
1、感受野
感觉野计算公式:
RF=() RF-1 ) *stride ) fsize
体感野需要向后推层。 也就是说,“当前该层的节点在前面能看到多少前一层的节点”。 公式中假设当前层的RF=1,其中stride为在前一层的步骤,fsize为过滤器的大小,填充不影响感知范围的大小。 这是递归公式。 要详细说明这个问题,请参阅下图
最左边的图是VGG的原始结构,最下面的层面向前,可以看到4个最上面的层节点。 标签从左到右分别为{1、2、3、4}、{3、4、5、6}、{5、6、7、8},右边是将轮询的stride设为1后的标签。为了解决这个问题,作者选择了Hole算法
2 .霍尔算法
为避免体感野发生变化,某层stride从2变为1后,后一层需要采用hole算法。 具体地说,使连续的连接关系根据hole size大小为skip连接(注意!是将kernel也就是filter加0,而不是featuremap)。 如果pool4的stride从2变为1,则紧接其后的conv5_1,conv5_2和conv5_3的hole size为2。 接下来,如果pool5从2变为1,则在后面的fc6中hole size为4。 另外,由于Hole算法使feature map更dense,所以网络在差分上采样中可以得到很好的结果,不需要学习上采样的参数(FCN中采用了de-convolution ) 作者采用了将缩小8倍的featuremap用线性插值的方法恢复到与原图相同的尺寸的方法。
单击“打开链接”
单击“打开链接”
2、多孔金字塔池化(ASPP )。
为了解决多尺度图像中物体状态不同的问题,作者在SPP的启发下,采用多孔金字塔池化方法。 (有关spp的详细信息,请参阅另一篇博文。)
以vgg16网络为例,ASPP的处理方式如下图所示。 pool5输出的featuremap (处理前的featuremap的大小为28*28*512 ),进行4种rate的不同卷积处理,concate种处理后的结果(方式与spp相同)。
3、全连接条件随机场(CRF )。
弱分类器生成的分割图往往很粗糙,通常使用CRF平滑地去除噪声。 深度学习网络生成的分割图是平滑连续的。 在这种情况下,必须使用短范围CRFs恢复局部结构详细信息,而不是使其更加平滑。 但该方法还不能恢复结构中的细节,作者还采用全连接条件随机场恢复细节,效果较好。
二.深度实验室v3
对应论文是rethinkingatrousconvolutionforsemanticimagesegmentation
深度lab v3的部分采用了resnet网络,网络结构如图所示
基于深度实验室,对以下几点进行了优化。
1、延长esnet网络,即添加bloc
k5,block6,block7 ,都是由block4复制而来。在block4到block7的内部都是三个卷积层,设Muliti_Grid=(r1,r2,r3)为这三个卷积的unit rate,最终的atrous rate = unit rate * corresponding rate。 如output_stride = 16,Muliti_Grid =(1,2,4)时,block4 中的rate=2*(1,2,4) = (2,4,8),block5中的rate=4*(1,2,4)=(1,8,16)。
2、发现使用多孔卷积存在的问题:随着rate的增加,有效特征区域减小,如图所示。
为了解决这一问题,deeplab v3中提出的新的结构。改进的ASPP由一个1*1的卷积和3个3*3,rate=(6,12,18)的卷积组成(如果output_stride为8,则rate是两倍),将这四部分的特征图与gloabal average pooling得到的结果concat,经过一层1*1的卷积后,再送入最终的1*1卷积得到logits。
注:output_stride = input_image_size/output_feature_size
补充知识点:global average pooling (GAP)是将特征图进行整张图的均值池化,形成一个特征点,将这些特征点组成最后的向量。示意图如下:
GAP的真正意义是:对整个网路在结构上做正则化防止过拟合。其直接剔除了全连接层中黑箱的特征,直接赋予了每个channel实际的内别意义。实践证明其效果还是比较可观的,同时GAP可以实现任意图像大小的输入。但是值得我们注意的是,使用gap可能会造成收敛速度减慢。
Global Average Pooling
相对应的代码为:
image_level_features = tf.reduce_mean(net, [1, 2], name=’image_level_global_pool’, keep_dims=True)
image_level_features = slim.conv2d(image_level_features, depth, [1, 1], scope=”image_level_conv_1x1″, activation_fn=None)
image_level_features = tf.image.resize_bilinear(image_level_features, (feature_map_size[1], feature_map_size[2]))
3、修改的训练时小trick有:
(1)batch normalization:在增加的每个module上都运用了batch normalization,因为训练batch normalization的参数需要batch size较大,这里采用了output_stride=16,并在batch size=16的条件下计算batch normalization statistics。
(2)上采样logits:在之前的工作中,都采用将groundtruth下采样8倍后的结果与生成的featuremap做logits,但他们研究发现这种方式会因为细节部分没有反向传播而造成好的标注被剔除。在这篇文章中,作者将生成的featuremap上采样8倍,groundtruth保持不变的方式进行训练。
(3)在训练过程中,采用output_stride = 16, 在inference过程中,采用output_stride = 8
(4)数据增强,变换图片大小(0.5-2倍),翻转
三、Deeplab v3+ 对应论文 Encoder-Decoder with atrous separable convolution for semantic image segmentation
新引入了decoder和Xception来提高网络表现能力并降低计算复杂度
(1)Decoder
在Deeplabv3中,特征图被直接双线性插值上采样16倍变为与输入图像相同大小的图像,这种方法无法获得分割目标的细节。因此本文提出了一种简单有效的decoder如下图。encoder features来自于Deeplabv3(output_stride=16)。encoder features首先双线性插值上采样4倍,然后与网络中产生的空间分辨率相同的低层特征concate。在concate之前,先让低层特征通过一个1*1的卷积核以将channel减少到256,。concate之后,通过几个3*3卷积来重新定义特征,紧接着双线性插值上采样4倍。
(2)Xception
关于Xception介绍请见另一篇博客。
作者修改了Xception模型以适应图像分割任务。作者修改内容如下:层数更多;将所有的最大池化操作换成depthwise separable convolutions with striding;每3个depthwise separable convolutions 后加一个batch normalizaiton和Relu。
但在作者提出的这个网络中,只在ASPP(带孔卷积模块)和decoder模块采用depthwise separable convolution,以加快计算速度。
点击打开链接