基于Tensorflow学习神经网络-FCN

6.CNN缺陷

  • 尺度一致

由于FC层参数限制,输入必须满足相同尺度,针对大尺度图像处理时,切割成相同size进行CNN会有很多重复运算,比如大图像语义分割。为避免重复运算出现了FCN(全卷积网络)

  • 时序性

无法对时间序列上的变化进行建模。然而,样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。为了适应这种需求,就出现了题主所说的另一种神经网络结构——RNN(循环神经网络)




7.FCN- Semantic Segmentation(全卷积网路)

https://www.leiphone.com/news/201705/YbRHBVIjhqVBP0X5.html

http://baijiahao.baidu.com/s?id=1572513028567873&wfr=spider&for=pc

http://blog.csdn.net/u012759136/article/details/59115476

http://blog.csdn.net/amor_tila/article/details/75635283

图像语义分割需要预测一幅图像中所有像素点的类别。CNN感知域比较大,提取特征比较抽象,对于分类而言很有帮助,但缺丢失物体的具体轮廓信息和像素信息,因此做到精确的分割就很有难度。全卷积网络(FCN)就是训练一个端到端、点对点的网络,从抽象的特征中恢复出每个像素所属的类别即从图像级别的分类进一步延伸到像素级别的分类。


  • CNN区别

1卷积化,把CNN最后的全连接层换成卷积层,使FCN可以接受任意尺寸的输入图像。

2采用反卷积层对最后一个卷积层的featuremap进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测,同时保留了原始输入图像中的空间信息,最后在上采样的特征图上进行逐像素分类。最后逐个像素计算softmax分类的损失,相当于每一个像素对应一个训练样本。输出的是一张已经Label好的图片

  • 数据集

VOC2012

NYUDepth Dataset

SiftFlow Dataset

MSCOCO

  • 反卷积权重初始化

Bilinear

http://blog.csdn.net/jiongnima/article/details/78578876

以双线性插值权重进行反卷积网络的权重进行初始化。

  • 卷积化(全连接层=>卷积层)

卷积层和全连接层的区别:卷积层局部区域连接,共享参数每一个Wb有自己的分布范围

目的:让卷积网络在一张更大的输入图片上滑动,得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。如下理解:

假设:原始输入图像224*224,经由5个步长=2的卷积层后输出-177256,把它作为输入进入4096节点的全连接层;

全连接层:全连接层输入转化-17*7*256,取W=7*7*2564096,输出【-14096

转化成卷积层:输入不变,取W=772564096s=1pad=0,输出【-1114096】。

即取卷积层尺度=输入图像尺度,步长=1,忽略边界,即可使输出与全连接层一致。

注意:就上面转化而言,当输入图像大小完全一致时FC层输入7*7*256),仅得到一个评分,以上卷积化和全连接层完全一致

扩大输入图像:假设输入图像384*384,如果用全链接层,需先以步长=325个步长=2的卷积,取整体切割步长2^5= 32)切割成6*6224*224的图像依次输入,得到6*6个评分。

卷积化:显然如上操作卷积有大量重复运算,卷积化后可以一次输入完成以上以上操作,卷积化层输入【-112*12*256】,同样用卷积权重W=772564096】,卷积输出-1664096

注意:卷积化可扩展到CNN网络,对原图不同位置迭代计算,可卷积化单次传播以均值进行评价。

另如上输出是【6*6】评分,而我们想要的是对每个点的预测【384*384】,则还需上采样|反卷积|上池化

以下介绍主要的FCN用于语义分割的网络

  • FCN2014.11

    FullyConvolutional Networks for Semantic Segmentation

https://www.cnblogs.com/gujianhan/p/6030639.html

https://github.com/shelhamer/fcn.berkeleyvision.org代码

上采样(Upsampling

http://blog.csdn.net/jiongnima/article/details/78549326

卷积过程中图像大小缩小(上述为32倍),我们需要得到的是原图每个点的评分,FCN通过上采样到原图的尺寸。

插值上采样:通过插值的方式还原原始图像,直接计算无需训练。

反卷积:即转置卷积,初始化权重后,训练优化权重。

一种理解来自https://www.zhihu.com/question/43609045/answer/120266511

3*3权重矩阵W,排列成如下矩阵C416】,如下:


按下图简单理解,卷积操作输入k4*4featuremap展开成列向量组成矩阵x16k】,,【4,1】,再转成2*2的图像。反卷积操作输入k2*2featuremap展开成列向量组成矩阵x4k】,,【16,1】,再转成4*4featuremap


另一种理解来自https://www.zhihu.com/question/63890195反卷积操作就是把[W,H]大小的featuremapF_{W,H}扩大为F[n×W,n×H]。如何填充F的值?在扩大的F上每隔n个位置填补原F中对应位置的值,剩余的位置补0在进行卷积操作,即Deconv= 扩大+0+conv

虽然转置卷积层和卷积层一样,也是可以train参数的,但是实际实验过程中Fully_Convolutional_Networks作者发现,让转置卷积层可学习,并没有带来效果的提升,所以实验中的转置卷积层的学习率全部被置零了。反卷积参数初始化用的双线性插值(如下),相当于只做了插值。

#双线性初始化,caffe中的实现,于FCN中略有所差异

def_test_Bilinear(size):

""" 

    Make a 2D bilinear kernel suitable for upsampling of the given (h, w) size. 

    """

factor= (size+1)//2.;

center= (2 * factor - 1 - factor % 2) / (2. * factor);

og= np.ogrid[:size,:size]

bilinear= (1-abs(og[0]/factor-center))*(1-abs(og[1]/factor-center))

printbilinear

returnbilinear

直接将全卷积后的结果上采样后得到的结果通常是很粗糙的,所以结合较高层的结果进行优化。

跳跃结构(SkipArchitecture)

不同池化层的结果进行上采样,然后融合(crop& wise这些结果来优化输出,具体结构如下(据作者描述,融合至pool3时效果最好…:





缺点

  • 池化操作增大了感受野,有助于实现分类网络,但是池化操作丢失部分信息,上采样操作也会产生粗糙的分割图,使得到的结果比较模糊和平滑,不够精细,对图像中的细节不敏感

  • 对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatialregularization)步骤,缺乏空间一致性。

  • 上采样参数初始化于双线性插值有所差别,也不训练,如何确定好坏?融合到哪一层??

  • U-Net2015.5

ConvolutionalNetworks for Biomedical Image Segmentation2015.5

http://blog.csdn.net/hduxiejun/article/details/71107285


U-Net基于FCN,是一种针对医学图像的分割方法(二分类问题)。结构成U状。

FCN的差别:去掉了全连接层(FCN是卷积化),反卷积网络(训练),融合思想与FCN一致(还原每一层结果都进行融合);较浅的高分辨率层用来解决像素定位的问题,较深的层用来解决像素分类的问题。

可关注图像扭曲做样本增强。

输入(572*572)大于输出(388*388),对处理图像边缘()做镜像操作,解决卷积过程中的像素丢失问题,如下图。






  • RefineNet(2016.11)

Multi-PathRefinement Networks for High-Resolution Semantic Segmentation

代码,原作基于matlab,该代码基于tensorflow修改,收敛不好但可工作

RefineNet类似与U-Net,也是一个编码-解码结构,编码用的ResNet,主要在于解码部分RefineNet






RefineNet结构如下:



将不同分辨率的特征图卷积(可参考Resnet中的DBA结构)、多尺度融合(卷积使多尺度维度与最小特征图相同通道,再上采样到与最大图同一尺度,进行加权、链式池化(不明白干嘛的)

个人认为主要改进应该在于可卷积视为加和的权重,可训练

  • DeconvNet/SegNet(2015)

LearningDeconvolution Network for Semantic Segmentation2015.5

ADeep Convolutional Encoder-Decoder Architecture for ImageSegmentation (2015.11)

http://blog.csdn.net/fate_fjh/article/details/53467948

http://blog.csdn.net/zhangjunhit/article/details/72528610

http://blog.csdn.net/yang9649/article/details/74691192

DeconvNet/SegNet卷积部分与FCN一致,主要针对上采样部分进行改进DeconvNet/SegNet这两个网络区别不大,细节上的改动。




DeconvNet


SegNet

上池化(upPooling)-两种网络相同

卷积层池化时记录最大池化返回值的位置反卷积时将值先放回对应位置(其它位置填0,再进行上采样|反卷积操作。注不再与高分辨率特征融合(与FCN主要差异)




SegNet改进(+BN -FC+置信度)

  • SegNetRelu前增加BN

  • SegNet去掉了全连接层

  • 输出置信度

    DropOut层多次采样,用Mean作为输出Lable,方差为其置信度。


第一行为输入图像,第二行为groundtruth,第三行为BayesianSegNet语义分割输出,第四行为不确定灰度图

可以看出对于分类的边界和相互重叠位置,不确定性较大,即其置信度较低。

  • DilatedConvolutions(空洞卷积 2015.11)

Multi-ScaleContext Aggregation by Dilated Convolutions

池化操作能够减少计算量,同时也能防止计算结果过拟合,那么单纯取消池化操作又会使单层网络的感受域缩小使用“疏松的卷积核”来处理卷积,可以达到在不增加计算量的情况下增加感受域,弥补不进行池化处理后的精度问题。该网络对FCN的卷积层做了改进,移除最后两个池化层,用空洞卷积取代了随后的卷积层


红点表示卷积核的元素,绿色表示感受域,黑线框表示输入图像

该方法保留了较多的细节信息,对图像还原后的精度有明显的提升。

DilatedConvolution的最大价值是可以不改变featuremap的大小而增大感受野。而之前的FCN使用pooling下采样来增大感受野,但随后又不得不通过Deconvolution或者upsampling来增大featuremap大小,这样的一小一大总会损失很多信息。

  • DeepLabV1:2014.12V22016.6

DeepLab:Semantic Image Segmentation with Deep Convolutional Nets, AtrousConvolution, and Fully Connected CRFs

使用了空洞卷积+编码器-解码器结构(RefineNet+CRF

  • PSPNet(金字塔场景解析网络2016.12

PyramidScene Parsing Network

http://blog.csdn.net/yxq5997/article/details/53695779?utm_source=itdadao&utm_medium=referral

http://blog.csdn.net/u011961856/article/details/77165427


主要改进:

  • 增加金字塔池化模块PyramidPoolingModule),增加金字塔池化特征,个人理解用来与正常特征上采样后通过卷积融合,类似与RefineNet,卷积作为加和的权重,区别在于RefineNet逐层卷积加权,而PSPNet是全部特征upsample到相同尺度后一次卷积加权,且多使用了池化特征

  • 增加辅助loss,个人理解类似与GooleNet中的辅助softmax,防止网络较深时梯度丢失问题,辅助训练优化学习过程。(不明白干嘛的?


其它

  • 图片输入的CNNResNet,使用了dilatedconvolution

  • 上采样采用双线性插值

  • CRF于语义分割(深度学习+概率图模型(GPM))

深度学习+概率图模型(GPM)是一种趋势。DL进行特征提取,GPM能够从数学理论很好的解释事物本质间的联系。

CRFasRNN2016.3DenseCRF(全连接条件随机场)真正结合进了FCN,将其描述成一层类似卷积的计算这样即可结合进神经网络中,并且前后向传播也不存在问题。作者还将它进行了迭代,不同次数的迭代得到的结果优化程度也不同(一般取10以内的迭代次数),二元势函数的输入来自于一元以及迭代,而且这里的二元势函数被强制考虑为局部平滑度CRFas RNN

DeepParsing Network中使用的是MRF,平均场构造成了CNN联合训练并且可以one-passinference,而不用迭代

高斯条件随机场G-CRF使用CNN分别来学习一元势函数和二元势函数。



你可能感兴趣的:(深度学习)