【转载】分割网络总结:FCN,Segnet,RefineNet,
https://blog.csdn.net/caicai2526/article/details/79984950
这篇博客对先前的几个语义分割网络进行一下个人的小结,从2014年FCN网络到2017年的deeplab v3。
现在流行的这几个深度分割网络都是基于传统的CNN网络机构进行变化的,比如说FCN网络是由加州伯克利分校的Long等人提出的全卷积网络(Fully Convolutional Network),其推广了原有的CNN结构,在不带有全连接层的情况进行的密集预测。值得注意的是分割网络的预测是与分类网络预测不同的,分割网络的预测是基于像素点的预测。
除了全连接层结构,在分割问题中很难使用CNN网络的另一个问题是存在池化层。池化层不仅能增大上层卷积核的感受野,而且能聚合背景同时丢弃部分位置信息。然而,语义分割方法需对类别图谱进行精确调整,因此需保留池化层中所舍弃的位置信息。在Deeplab的结构中针对精确度进行采用CRF方法进行对分割结果的优化(Conditional Random Field),在FCN中也提到使用CRF进行优化。在Deeplab中使用的是fully connected CRF。
条件随机场(Conditional Random Field,CRF)方法通常在后期处理中用于改进分割效果。CRF方法是一种基于底层图像像素强度进行“平滑”分割的图模型,在运行时会将像素强度相似的点标记为同一类别。加入条件随机场方法可以提高1~2%的最终评分值。
在解决上述这种问题,研究者提出两种方法:
(1)第一种方法是编码器-解码器(encoder-decoder)结构。其中,编码器使用池化层逐渐缩减输入数据的空间维度,而解码器通过反卷积层等网络层逐步恢复目标的细节和相应的空间维度。从编码器到解码器之间,通常存在直接的信息连接,来帮助解码器更好地恢复目标细节。在这种方法中,一种典型结构为Segnet,U-Net网络。
(2)第二种方法使用了称作空洞卷积(膨胀卷积)的结构,且去除了池化层结构(如下图)。
详细的介绍可以看知乎上面的:点击打开链接
空洞卷积,当比率为1时,即为经典的卷积结构。
先来介绍一下感受野以及其计算(https://www.cnblogs.com/objectDetect/p/5947169.html)
在卷积神经网络中,感受野的定义是 卷积神经网络每一层输出的特征图(feature map)上的像素点在原始图像上映射的区域大小。
感受野计算时有下面的几个情况需要说明:
(1)第一层卷积层的输出特征图像素的感受野的大小等于滤波器的大小
(2)深层卷积层的感受野大小和它之前所有层的滤波器大小和步长有关系
(3)计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小
这里的每一个卷积层还有一个strides的概念,这个strides是之前所有层stride的乘积。
即strides(i) = stride(1) * stride(2) * ...* stride(i-1)
关于感受野大小的计算采用top to down的方式, 即先计算最深层在前一层上的感受野,然后逐渐传递到第一层,使用的公式可以表示如下:
RF(i+1)=RF(i)+(kernel-1)×strides
实现代码:
#!/usr/bin/env python
net_struct = {'alexnet': {'net':[[11,4,0],[3,2,0],[5,1,2],[3,2,0],[3,1,1],[3,1,1],[3,1,1],[3,2,0]],
'name':['conv1','pool1','conv2','pool2','conv3','conv4','conv5','pool5']},
'vgg16': {'net':[[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],
[2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0]],
'name':['conv1_1','conv1_2','pool1','conv2_1','conv2_2','pool2','conv3_1','conv3_2',
'conv3_3', 'pool3','conv4_1','conv4_2','conv4_3','pool4','conv5_1','conv5_2','conv5_3','pool5']},
'zf-5':{'net': [[7,2,3],[3,2,1],[5,2,2],[3,2,1],[3,1,1],[3,1,1],[3,1,1]],
'name': ['conv1','pool1','conv2','pool2','conv3','conv4','conv5']}}
imsize = 224
def outFromIn(isz, net, layernum):
totstride = 1
insize = isz
for layer in range(layernum):
fsize, stride, pad = net[layer]
outsize = (insize - fsize + 2*pad) / stride + 1
insize = outsize
totstride = totstride * stride
return outsize, totstride
def inFromOut(net, layernum):
RF = 1
for layer in reversed(range(layernum)):
fsize, stride, pad = net[layer]
RF = ((RF -1)* stride) + fsize
return RF
if __name__ == '__main__':
print "layer output sizes given image = %dx%d" % (imsize, imsize)
for net in net_struct.keys():
print '************net structrue name is %s**************'% net
for i in range(len(net_struct[net]['net'])):
p = outFromIn(imsize,net_struct[net]['net'], i+1)
rf = inFromOut(net_struct[net]['net'], i+1)
print "Layer Name = %s, Output size = %3d, Stride = % 3d, RF size = %3d" % (net_struct[net]['name'][i], p[0], p[1], rf)
FCN网络
论文:Fully Convolutional Networks for Semantic Segmentation 于2014年11月14日提交到arvix:https://arxiv.org/abs/1411.4038
主要贡献:
将端到端的卷积网络推广到语义分割中;
重新将预训练好的Imagenet网络用于分割问题中;
使用反卷积层进行上采样;
提出了跳跃连接来改善上采样的粗糙程度。
卷积化(Convolutional)卷积化即是将普通的分类网络,比如VGG16,ResNet50/101等网络丢弃全连接层,换上对应的卷积层即可。
上采样(Upsample)有的说叫conv_transpose更为合适。因为普通的池化会缩小图片的尺寸,比如VGG16 五次池化后图片被缩小了32倍。为了得到和原图等大的分割图,我们需要上采样/反卷积。反卷积和卷积类似,都是相乘相加的运算。只不过后者是多对一,前者是一对多。而反卷积的前向和后向传播,只用颠倒卷积的前后向传播即可。图解如下:
跳跃结构(Skip Layer)这个结构的作用就在于优化结果,因为如果将全卷积之后的结果直接上采样得到的结果是很粗糙的,所以作者将不同池化层的结果进行上采样之后来优化输出。具体结构如下:
Segnet网络
论文翻译:https://blog.csdn.net/u014451076/article/details/70741629
https://blog.csdn.net/fate_fjh/article/details/53467948
SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 于2015年11月2日提交到arvix:
https://arxiv.org/abs/1511.00561
segnet采用的是编码-解码的结构,这样的对称结构有种自编码器的感觉在里面,先编码再解码。这样的结构主要使用了反卷积和上池化。即:
反卷积如上。而上池化的实现主要在于池化时记住输出值的位置,在上池化时再将这个值填回原来的位置,其他位置填0即OK。
空洞卷积
Multi-Scale Context Aggregation by Dilated Convolutions于2015年11月23日提交到arvix:https://arxiv.org/abs/1511.07122
使用了空洞卷积,这是一种可用于密集预测的卷积层;提出在多尺度聚集条件下使用空洞卷积的“背景模块”。
池化操作增大了感受野,有助于实现分类网络。但是池化操作在分割过程中也降低了分辨率。
因此,该论文所提出的空洞卷积层是如此工作的:
空洞卷积示意图
空洞卷积层在不降低空间维度的前提下增大了相应的感受野指数。在接下来将提到的DeepLab中,空洞卷积被称为多孔卷积(atrous convolution)。从预训练好的分类网络中(这里指的是VGG网络)移除最后两个池化层,而用空洞卷积取代了随后的卷积层。
特别的是,池化层3和池化层4之间的卷积操作为空洞卷积层2,池化层4之后的卷积操作为空洞卷积层4。这篇文章所提出的背景模型(frontend module)可在不增加参数数量的情况下获得密集预测结果。
这篇文章所提到的背景模块单独训练了前端模块的输出,作为该模型的输入。该模块是由不同扩张程度的空洞卷积层级联而得到的,从而聚集多尺度背景模块并改善前端预测效果。
RefineNet网络
RefineNet: Multi-Path Refinement Networks for High-Resolution Semantic Segmentation 于2016年11月20日提交到Arxiv
https://arxiv.org/abs/1611.06612
带有精心设计解码器模块的编码器-解码器结构;
所有组件遵循残差连接的设计方式。
使用空洞卷积的方法也存在一定的缺点,它的计算成本比较高,同时由于需处理大量高分辨率特征图谱,会占用大量内存,这个问题阻碍了高分辨率预测的计算研究。
DeepLab得到的预测结果只有原始输入的1/8大小。
所以,这篇论文提出了相应的编码器-解码器结构,其中编码器是ResNet-101模块,解码器为能融合编码器高分辨率特征和先前RefineNet模块低分辨率特征的RefineNet模块。
△ RefineNet网络结构
每个RefineNet模块包含一个能通过对较低分辨率特征进行上采样来融合多分辨率特征的组件,以及一个能基于步幅为1及5×5大小的重复池化层来获取背景信息的组件。
这些组件遵循恒等映射的思想,采用了残差连接的设计方式。
Deeplab v1&v2网络
https://blog.csdn.net/c_row/article/details/52161394
CNN的一个特性是invariance(不变性),这个特性使得它在high-level的计算机视觉任务比如classification中,取得很好的效果。但是在semantic segmentation任务中,这个特性反而是个障碍。毕竟语义分割是像素级别的分类,高度抽象的空间特征对如此low-level并不适用。
所以,要用CNN来做分割,就需要考虑两个问题,一个是feature map的尺寸,以及空间不变性。
对于第一个问题feature map变小。因为stride的存在。于是DeepLab就考虑,我直接把stride改成1,feature map不就变大了吗。将stride改小,确实能得到更加dense的feature map这个是毋庸置疑的,可是却也带来了另外一个问题即receptive field(RF)的改变问题。receptive field是直接和stride挂钩的。对于RF的介绍上面已经说了。
在deeplabv1中对于feature map的具体介绍可以看上面的地址中的博客。主要就是采用的是hole算法,随后有采用Fully connected CRF进行优化。这是与FCN采用的不同的方法。
hole算法(空洞卷积):
既想利用已经训练好的模型进行fine-tuning,又想改变网络结构得到更加dense的score map.
https://blog.csdn.net/tangwei2014/article/details/50453334
这个解决办法就是采用Hole算法。如下图(a) (b)所示,在以往的卷积或者pooling中,一个filter中相邻的权重作用在feature map上的位置都是物理上连续的。如下图(c)所示,为了保证感受野不发生变化,某一层的stride由2变为1以后,后面的层需要采用hole算法,具体来讲就是将连续的连接关系是根据hole size大小变成skip连接的(图(c)为了显示方便直接画在本层上了)。不要被(c)中的padding为2吓着了,其实2个padding不会同时和一个filter相连。
pool4的stride由2变为1,则紧接着的conv5_1, conv5_2和conv5_3中hole size为2。接着pool5由2变为1, 则后面的fc6中hole size为4。
DeepLab V2:DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs
v1之后,Liang-Chieh Chen很快又推出了DeepLab的v2版本。这里就简单讲讲改进的地方。
Multi-scale对performance提升很大,而我们知道,receptive field,视野域(或者感受野),是指feature map上一个点能看到的原图的区域,那么如果有多个receptive field,是不是相当于一种Multi-scale?出于这个思路,v2版本在v1的基础上增加了一个多视野域。具体看图可以很直观的理解。
rate也就是hole size
这个结构作者称之为ASPP(atrous spatial pyramid pooling),基于洞的空间金字塔。
此外,DeepLab v2有两个基础网络结构,一个是基于vgg16,另外一个是基于resnet101的。
PSPNet网络
1)通过多尺度 Pooling 的方式得到不同 Scale 的 Feature,Concat 得到判别的多尺度特征;
对于输入图像,首先通过一个ResNet网络提取图像特征(feature map),如图(b);之后将得到的feature map输出到一个全局pool层,再通过一个Pyramid Pooling Module获得多个sub-region的特征表示,之后通过上采样(upsampling),并串联层(concat)所有特征,得到最后的特征表示向量,从而获得图像的局部和全局特征,如图(c)所示,图中从上倒下四个卷积层,卷积核大小分别为.最后将得到的向量输入一个卷积层(卷积,用于减小维度),得到最后的预测结果https://blog.csdn.net/u011961856/article/details/77165427
2)加入额外的深度监督 Loss
除了使用softmax loss,即图4中loss1训练最后的主分类器外,还引入了res4b22 residule模块,构造另一个辅助分类器,损失函数为loss2,并引入一个权重参数来控制loss2的权重,辅助分类器可以帮助优化学习过程.
Deeplab v3网络
Rethinking Atrous Convolution for Semantic Image Segmentation 于2017年6月17日提交到Arxiv:https://arxiv.org/abs/1706.05587
https://blog.csdn.net/zziahgf/article/details/75314719
改进了空间维度上的金字塔空洞池化方法(ASPP),采用全局平均池化;该模块级联了多个空洞卷积结构。与在DeepLab v2网络、空洞卷积中一样,这项研究也用空洞卷积/多空卷积来改善ResNet模型。
这篇论文还提出了三种改善ASPP的方法,涉及了像素级特征的连接、加入1×1的卷积层和三个不同比率下3×3的空洞卷积,还在每个并行卷积层之后加入了批量归一化操作。
级联模块实际上是一个残差网络模块,但其中的空洞卷积层是以不同比率构建的。这个模块与空洞卷积论文中提到的背景模块相似,但直接应用到中间特征图谱中,而不是置信图谱。置信图谱是指其通道数与类别数相同的CNN网络顶层特征图谱。
该论文独立评估了这两个所提出的模型,尝试结合将两者结合起来并没有提高实际性能。两者在验证集上的实际性能相近,带有ASPP结构的模型表现略好一些,且没有加入CRF结构。
这两种模型的性能优于DeepLabv2模型的最优值,文章中还提到性能的提高是由于加入了批量归一化层和使用了更优的方法来编码多尺度背景。
DeepLabv3 ASPP结构
参考地址:http://baijiahao.baidu.com/s?id=1572513028567873&wfr=spider&for=pc
https://blog.csdn.net/yxq5997/article/details/53693869
https://blog.csdn.net/u012759136/article/details/52434826#t9
https://blog.csdn.net/xxiaozr/article/details/78553447
https://blog.csdn.net/fate_fjh/article/details/52882134
---------------------
作者:caicai2526
来源:CSDN
原文:https://blog.csdn.net/caicai2526/article/details/79984950
版权声明:本文为博主原创文章,转载请附上博文链接!