由于FC层参数限制,输入必须满足相同尺度,针对大尺度图像处理时,切割成相同size进行CNN会有很多重复运算,比如大图像语义分割。为避免重复运算出现了FCN(全卷积网络)。
无法对时间序列上的变化进行建模。然而,样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。为了适应这种需求,就出现了题主所说的另一种神经网络结构——RNN(循环神经网络)。
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)就是训练一个端到端、点对点的网络,从抽象的特征中恢复出每个像素所属的类别,即从图像级别的分类进一步延伸到像素级别的分类。
1、卷积化,把CNN最后的全连接层换成卷积层,使FCN可以接受任意尺寸的输入图像。
2、采用反卷积层对最后一个卷积层的featuremap进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每个像素都产生了一个预测,同时保留了原始输入图像中的空间信息,最后在上采样的特征图上进行逐像素分类。最后逐个像素计算softmax分类的损失,相当于每一个像素对应一个训练样本。输出的是一张已经Label好的图片。
VOC2012
NYUDepth Dataset
SiftFlow Dataset
MSCOCO
http://blog.csdn.net/jiongnima/article/details/78578876
以双线性插值权重进行反卷积网络的权重进行初始化。
卷积层和全连接层的区别:卷积层局部区域连接,共享参数,每一个W、b有自己的分布范围。
目的:让卷积网络在一张更大的输入图片上滑动,得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。如下理解:
假设:原始输入图像224*224,经由5个步长=2的卷积层后输出【-1,7,7,256】,把它作为输入进入4096节点的全连接层;
全连接层:全连接层输入转化【-1,7*7*256】,取W=【7*7*256,4096】,输出【-1,4096】;
转化成卷积层:输入不变,取W=【7,7,256,4096】,s=1,pad=0,输出【-1,1,1,4096】。
即取卷积层尺度=输入图像尺度,步长=1,忽略边界,即可使输出与全连接层一致。
注意:就上面转化而言,当输入图像大小完全一致时(FC层输入7*7*256),仅得到一个评分,以上卷积化和全连接层完全一致。
扩大输入图像:假设输入图像384*384,如果用全链接层,需先以步长=32(5个步长=2的卷积,取整体切割步长2^5= 32)切割成6*6个224*224的图像依次输入,得到6*6个评分。
卷积化:显然如上操作卷积有大量重复运算,卷积化后可以一次输入完成以上以上操作,卷积化层输入【-1,12*12*256】,同样用卷积权重W=【7,7,256,4096】,卷积输出【-1,6,6,4096】。
注意:卷积化可扩展到CNN网络,对原图不同位置迭代计算,可卷积化单次传播以均值进行评价。
另如上输出是【6*6】评分,而我们想要的是对每个点的预测【384*384】,则还需上采样|反卷积|上池化。
以下介绍主要的FCN用于语义分割的网络:
https://www.cnblogs.com/gujianhan/p/6030639.html
https://github.com/shelhamer/fcn.berkeleyvision.org代码
http://blog.csdn.net/jiongnima/article/details/78549326
卷积过程中图像大小缩小(上述为32倍),我们需要得到的是原图每个点的评分,FCN通过上采样到原图的尺寸。
插值上采样:通过插值的方式还原原始图像,直接计算无需训练。
反卷积:即转置卷积,初始化权重后,训练优化权重。
一种理解来自https://www.zhihu.com/question/43609045/answer/120266511:
3*3权重矩阵W,排列成如下矩阵C【4,16】,如下:
按下图简单理解,卷积操作输入k张4*4的featuremap展开成列向量组成矩阵x【16,k】,,【4,1】,再转成2*2的图像。反卷积操作输入k张2*2的featuremap展开成列向量组成矩阵x【4,k】,,【16,1】,再转成4*4的featuremap。
另一种理解来自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
直接将全卷积后的结果上采样后得到的结果通常是很粗糙的,所以结合较高层的结果进行优化。
将不同池化层的结果进行上采样,然后融合(crop& wise)这些结果来优化输出,具体结构如下(据作者描述,融合至pool3时效果最好…):
池化操作增大了感受野,有助于实现分类网络,但是池化操作丢失部分信息,上采样操作也会产生粗糙的分割图,使得到的结果比较模糊和平滑,不够精细,对图像中的细节不敏感。
对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatialregularization)步骤,缺乏空间一致性。
上采样参数初始化于双线性插值有所差别,也不训练,如何确定好坏?融合到哪一层??
ConvolutionalNetworks for Biomedical Image Segmentation(2015.5)
http://blog.csdn.net/hduxiejun/article/details/71107285
U-Net基于FCN,是一种针对医学图像的分割方法(二分类问题)。结构成U状。
与FCN的差别:去掉了全连接层(FCN是卷积化),反卷积网络(训练),融合思想与FCN一致(还原每一层结果都进行融合);较浅的高分辨率层用来解决像素定位的问题,较深的层用来解决像素分类的问题。
可关注图像扭曲做样本增强。
输入(572*572)大于输出(388*388),对处理图像边缘()做镜像操作,解决卷积过程中的像素丢失问题,如下图。
Refine
Net(
201
6.11
)
Multi-PathRefinement Networks for High-Resolution Semantic Segmentation
代码,原作基于matlab,该代码基于tensorflow修改,收敛不好但可工作
RefineNet类似与U-Net,也是一个编码-解码结构,编码用的ResNet,主要在于解码部分RefineNet。
RefineNet结构如下:
将不同分辨率的特征图卷积(可参考Resnet中的DBA结构)、多尺度融合(卷积使多尺度维度与最小特征图相同通道,再上采样到与最大图同一尺度,进行加权)、链式池化(不明白干嘛的)。
个人认为主要改进应该在于可将卷积视为加和的权重,可训练。
DeconvNet
/
SegNet(
201
5)
LearningDeconvolution Network for Semantic Segmentation(2015.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
卷积层池化时记录最大池化返回值的位置,反卷积时将值先放回对应位置(其它位置填0),再进行上采样|反卷积操作。注:不再与高分辨率特征融合(与FCN主要差异)。
SegNet在Relu前增加BN层
SegNet去掉了全连接层
输出置信度
DropOut层多次采样,用Mean作为输出Lable,方差为其置信度。
第一行为输入图像,第二行为groundtruth,第三行为BayesianSegNet语义分割输出,第四行为不确定灰度图
可以看出对于分类的边界和相互重叠位置,不确定性较大,即其置信度较低。
Multi-ScaleContext Aggregation by Dilated Convolutions
池化操作能够减少计算量,同时也能防止计算结果过拟合,那么单纯取消池化操作又会使单层网络的感受域缩小。使用“疏松的卷积核”来处理卷积,可以达到在不增加计算量的情况下增加感受域,弥补不进行池化处理后的精度问题。该网络对FCN的卷积层做了改进,移除最后两个池化层,用空洞卷积取代了随后的卷积层。
红点表示卷积核的元素,绿色表示感受域,黑线框表示输入图像
该方法保留了较多的细节信息,对图像还原后的精度有明显的提升。
DilatedConvolution的最大价值是可以不改变featuremap的大小而增大感受野。而之前的FCN使用pooling下采样来增大感受野,但随后又不得不通过Deconvolution或者upsampling来增大featuremap大小,这样的一小一大总会损失很多信息。
DeepLab:Semantic Image Segmentation with Deep Convolutional Nets, AtrousConvolution, and Fully Connected CRFs
使用了空洞卷积+编码器-解码器结构(RefineNet)+CRF
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,防止网络较深时梯度丢失问题,辅助训练优化学习过程。(不明白干嘛的?)
其它
图片输入的CNN是ResNet,使用了dilatedconvolution
上采样采用双线性插值
深度学习
+
概率图模型(
GPM
)是一种趋势。
DL
进行特征提取,
GPM
能够从数学理论很好的解释事物本质间的联系。
CRFasRNN
(
2016.3
)
将
DenseCRF
(全连接条件随机场)
真正结合进了
FCN
中
,将其
描述成一层类似卷积的计算
,
这样即可结合进神经网络中,并且前后向传播也不存在问题。作者还将它进行了迭代,不同次数的迭代得到的结果优化程度也不同(一般取
10
以内的迭代次数)
,二元势函数的输入来自于一元以及迭代,而且这里的二元势函数被强制考虑为局部平滑度
。
即
CRF
as RNN
。
DeepParsing Network
中使用的是
MRF
,平均场构造成了
CNN
联合训练并且可以
one-passinference
,而不用迭代
。
高斯条件随机场
(
G-CRF
)
使用
CNN
分别来学习一元势函数和二元势函数。