Index
- Introduction
- Analysis
- FC layer -> Convolutional layer
- Fine tune
- Up-Sampling
- Skip-layer
Introduction
CVPR2015最佳论文<Fully Convolutional Networks for Semantic Segmentation>介绍了FCN网络用于语义分割。该论文提出了端对端的FCN(全卷积网络),使用了pixel级别的预测以及有监督学习预训练。此外,论文中的网络可以接受任意大小的图片输入。
通常的CNN网络包含以下结构: [INPUT - CONV - RELU - POOL - FC].
- 卷积层 convolution
- ReLu
- 池化层 pooling
- 全连接层 fully connected
在论文中,FCN将全连接层替换为卷积层和转置卷积层,端对端得生成语义分割图像。如下图:
FCNAnalysis
FC layer -> Convolutional layer
卷积层与全连接层的区别在于,卷积层是局部感知并且共享权值的。也就是说,卷积层在某个时刻只作用于某个局部区域,通过移动filter,来达到不同的局部区域共享权值。而在全连接层中,比如32个神经元连接到64个神经元时候,有[32x64]个权值,即每一个输入层都与每一个输出层连接,并有自己的权值。
实际上,由于全连接层与卷积层与输入的计算方式都为点乘,因此可以实现全连接层与卷积层的相互转换:
- 对于每一个卷积层conv,都有全连接层fc与其表示相同的forward function。此时fc中大多数区域都为0,只存在某些块有值(由于局部连接)。而这些块的值相同(由于共享权值)。
- 同样的,对于每一个fc,都有conv与其表示相同的forward function。例如,当输入为[7x7x512]时,假设fc输出层size为4096,则有7x7x512x4096个weights. 此时用conv层代替fc,则filter为[7x7x512], strides=1, padding=0, 输出size为[1x1x4096]。
Fine-tune
文章采用了fine-tune的方法,采用了在ImagenNet训练好的VGG,AlexNet,GoogLeNet。具体来讲,文章对训练好的模型全连接层进行fine-tune,将训练好模型最后的全连接层变为卷积层以及Up-sampling层,再对其进行训练。
Fine-tune一般分为下面几种情况:
(1)新数据集小而且与原数据集相似。由于数据集小,容易出现过拟合的问题,此时不应该对ConvNet进行fine-tune,而是将训练好的模型作为特征提取模型,然后再对提取的特征训练一个线性分类器如(SVM,Softmax分类器等)。
(2)新数据集很大并且与原数据集相似。此时由于有更多的数据,我们不需要担心过拟合问题,因此可以对整个网络进行fine-tune。
(3)新数据集很小但是与原数据集很不相同。由于数据集很小,我们同样只训练一个线性分类器。但是此时数据集和原数据集差别较大,我们使用训练好的网络浅层提取的特征来训练线性分类器,而非使用深层特征。CNN深层卷积核通常会提取更高维的特征。这些高维特征与数据集是相对应的,如AlexNet中,可能存在能够提取狗胡子特征的卷积核,而我们的新数据是关于车辆识别时,就不应该使用高维特征。
(4)新数据集很大而且与原数据集相差较大。此时我们可以从头训练一个CNN网络,将大数据集训练好的CNN网络参数用于初始化新模型参数。
更多关于Fine-tune的内容可以等待正在写的一篇关于迁移学习的文章。(此处应有链接)
Up-Sampling
Up-Sampling(升采样)是Deconvolution的应用之一。在FCN中,池化造成了图像尺寸成倍缩小,要端对端得生成分割图像,则需要升采样,在这里的语义下,也就是Deconvolution(逆卷积)。
Deconvolution(逆卷积)还有一个叫法为转置卷积(在tensorflow中)。转置卷积是卷积做相反的正向和反向传播操作。
卷积操作时,令y = Cx,其中C为weights矩阵。则反向传播时候:
在Deconvolution的情况下,正向传播y‘=C_Tx', 反向传播为C乘偏导。
Deconvolution还可以应用在无监督学习以及卷积可视化中
Skip-layer
实验发现,直接对训练好的VGG16进行fine-tune并在最后进行up-sampling的效果并不好,如下图:
FCN resultsFCN-32s即为FCN-VGG16,其中32s代表其strides=32。CNN低维提取的信息包含更多局部信息如location,而高维信息则包含了全局的信息如该物体是什么。文章中添加了skips,将浅层的特征与最后结果相加,得到最终图像。其结构如下:
Structure
举例来说,对于FCN-16s,pool4得到的特征图的尺寸为原图像的1/2^4 (经历了四次池化),而conv7得到的特征图尺寸为原图像的1/2^5 (经历了五次池化),此时,将conv7通过一个2x的up-sampling层,得到1/2^4的特征图,再与pool4特征图相加,然后用一个16x的up-sampling,得到与原图同样大小的输出,进行pixel级训练。
有时间会讲解FCN的tensorflow或者torch代码。
系列文章包括:
- 生物医学图像语义分割(一)FCN
- 生物医学图像语义分割(二)U-Net
- 生物医学图像语义分割(三)CVPR2017-Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally
网友评论