目录
一、CNN & FCN
CNN
FCN
1 . FCN上采样理论讲解
2. FCN具体实现过程
二、卷积
卷积分类
padding & stride
多通道
一、CNN & FCN
CNN
卷积神经网络 : 卷积层conv、池化层pool、全连接层fc 交叉堆叠而成的前馈神经网络。
三个结构: 局部连接、权重共享、池化。
有平移、缩放、旋转不变性。和前馈神经网络比,参数更少。
CNN: 在传统的CNN网络中,在最后的卷积层之后会连接上若干个全连接层,将卷积层产生的特征图(feature map)映射成为一个固定长度的特征向量。一般的CNN结构适用于图像级别的分类和回归任务,因为它们最后都期望得到输入图像的分类的概率,如ALexNet网络最后输出一个1000维的向量表示输入图像属于每一类的概率。如下图所示:
在CNN中, 猫的图片输入到AlexNet, 得到一个长为1000的输出向量, 表示输入图像属于每一类的概率, 其中在“tabby cat”这一类统计概率最高, 用来做分类任务。
nn.Conv2d(in_channels = 3,out_channels = 32,kernel_size = 3 , stride = 1,padding=0,dilation=1)
in_channels代表的是输入为3个维度rgb。
out_channels=32代表32个3*3的卷积核K,分别卷积得到的结果。其中每个卷积核(类似每个神经元)的参数都会得到不同的更新。
dilation是空洞卷积的dilation_size。
FCN
FCN: FCN是对图像进行像素级的分类(也就是每个像素点都进行分类),从而解决了语义级别的图像分割问题。与上面介绍的经典CNN在卷积层使用全连接层得到固定长度的特征向量进行分类不同,FCN可以接受任意尺寸的输入图像,采用反卷积层对最后一个卷基层的特征图(feature map)进行上采样,使它恢复到输入图像相同的尺寸,从而可以对每一个像素都产生一个预测,同时保留了原始输入图像中的空间信息,最后奇偶在上采样的特征图进行像素的分类。如下图所示:
简单的说,FCN与CNN的区别在于FCN把CNN最后的全连接层换成卷积层,其输出的是一张已经标记好的图,而不是一个概率值。
1 . FCN上采样理论讲解
FCN网络一般是用来对图像进行语义分割的,于是就需要对图像上的各个像素进行分类,这就需要一个上采样将最后得到的输出上采样到原图的大小。上采样对于低分辨率的特征图,常常采用上采样的方式将它还原高分辨率,这里陈述上采样的三种方法。
🍇 2.1、双线性插值上采样
🍇 反卷积上采样
怎样上采样: 普通的卷积操作,会使得分辨率降低,如下图33的卷积核去卷积44得到2*2的输出。
对得到的2*2输出, 进行上采样。
上采样的过程也是卷积,那么怎么会得到分辨率提高呢?之前我们看卷积时有个保持输出与输入同分辨率的方法就是周围补0。
其实上面这种补0的方法事有问题的,你想一下,只在四周补0会导致最边上的信息不太好,那我们把这个信息平均下,在每个像素与像素之间补0,如下图所示:
🍇 反池化上采样
反池化可以用下图来理解,再池化时需要 记录下池化的位置 ,反池化时把池化的位置直接还原,其他位置填0。
上面三种方法各有优缺,
双线性插值方法实现简单,无需训练;
反卷积上采样需要训练,但能更好的还原特征图;
2. FCN具体实现过程
FCN与CNN的核心区别就是FCN将CNN末尾的全连接层FC层转化成了卷积层:
以Alexnet为例,输入是2272273的图像,前5层是卷积层,第5层的输出是256个特征图,大小是6*6,即25666,第6、7、8层分别是长度是4096、4096、1000的一维向量。如下图所示:
在FCN中第6、7、8层都是通过卷积得到的,卷积核的大小全部是1 * 1,第6层的输出是4096 * 7 * 7,第7层的输出是4096 * 7 * 7,第8层的输出是1000 * 7 * 7(7是输入图像大小的1/32),即1000个大小是7*7的特征图(称为heatmap),如下图所示:
经过多次卷积后,图像的分辨率越来越低,为了从低分辨率的热图heatmap恢复到原图大小,以便对原图上每一个像素点进行分类预测,需要对热图heatmap进行反卷积,也就是上采样。论文中首先进行了一个上池化操作,再进行反卷积(上述所提到的上池化操作和反卷积操作,其实可以理解为上卷积操作),使得图像分辨率提高到原图大小。如下图所示:
跳级(strip)结构:对第5层的输出执行32倍的反卷积得到原图,得到的结果不是很精确,论文中同时执行了第4层和第3层输出的反卷积操作(分别需要16倍和8倍的上采样),再把这3个反卷积的结果图像融合,提升了结果的精确度:
最后像素的分类按照该点在1000张上采样得到的图上的最大的概率来定。FCN可以接受任意大小的输入图像,但是FCN的分类结果还是不够精细,对细节不太敏感,再者没有考虑到像素与像素之间的关联关系,丢失了部分空间信息。
3. FCN模型实现过程
🍇 模型训练
• 用AlexNet,VGG16或者GoogleNet训练好的模型做初始化,在这个基础上做fine-tuning,只需在末尾加上upsampling,参数的学习还是利用CNN本身的反向传播原理。
• 采用全图做训练,不进行局部抽样。实验证明直接用全图已经很高效。
FCN例子: 输入可为任意尺寸图像彩色图像;输出与输入尺寸相同,深度为:20类目标+背景=21,模型基于AlexNet。
• 蓝色:卷积层。
• 绿色:Max Pooling层。
• 黄色: 求和运算, 使用逐数据相加,把三个不同深度的预测结果进行融合:较浅的结果更为精细,较深的结果更为鲁棒。
• 灰色: 裁剪, 在融合之前,使用裁剪层统一两者大小, 最后裁剪成和输入相同尺寸输出。
• 对于不同尺寸的输入图像,各层数据的尺寸(height,width)相应变化,深度(channel)不变。
• 全卷积层部分进行特征提取, 提取卷积层(3个蓝色层)的输出来作为预测21个类别的特征。
• 图中虚线内是反卷积层的运算, 反卷积层(3个橙色层)可以把输入数据尺寸放大。和卷积层一样,升采样的具体参数经过训练确定。
🍉 1、 以经典的AlexNet分类网络为初始化。最后两级是全连接(红色),参数弃去不用。
🍉 2、 反卷积(橙色)的步长为32,这个网络称为FCN-32s
🍉 3、第二次反卷积步长为16,这个网络称为FCN-16s
升采样分为两次完成(橙色×2), 在第二次升采样前,把第4个pooling层(绿色)的预测结果(蓝色)融合进来。使用跳级结构提升精确性。
🍉 4.第三次反卷积步长为8,记为FCN-8s。
升采样分为三次完成(橙色×3), 进一步融合了第3个pooling层的预测结果。
其他参数:
• minibatch:20张图片
• learning rate:0.001
• 初始化:分类网络之外的卷积层参数初始化为0
• 反卷积参数初始化为bilinear插值。最后一层反卷积固定位bilinear插值不做学习
总体来说,本文的逻辑如下:
• 想要精确预测每个像素的分割结果
• 必须经历从大到小,再从小到大的两个过程
• 在升采样过程中,分阶段增大比一步到位效果更好
• 在升采样的每个阶段,使用降采样对应层的特征进行辅助
缺点:
得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。
对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。
二、卷积
从数学定义中的连续卷积推导至离散时,需要对逆时针旋转180度。中间的卷积核,其实是已经 逆时针旋转过180度的。
但在计算中,我们只要求卷积参数即可,并不需要逆时针旋转(旋转与否无所谓),因为只是求参数。
为什么卷积可以提取特征
为什么卷积核可以提取特征——从特征向量和特征值的角度分析 - 知乎对图像使用卷积核提取特征就相当于为图像矩阵A寻找最合适的特征向量集,神经网络就是通过反向传播来不断拟合这么一个非常逼近的特征向量,也就是我们的卷积核的值(这里求解的应该也就是参数矩阵)。有了这个权重值,让它与原始图像矩阵相乘,就能得到我们想要的特征了。为什么卷积核可以提取特征——从特征向量和特征值的角度分析 - 知乎
卷积核的值是如何确定的
卷积核里面数就是所谓的 权重
所以卷积核里面的参数最终是训练得到的。但最开始时是需要给这些参数提供初始值才能使网络运行,可以简略分三种:
一种就是你提的那种 取偏差很小的高斯分布随机取值
第二种是 Xavier初始化方法
第三种是He kai ming初始化方法
其中第二、三种这两位大佬有专门发的一篇论文解释的。
卷积分类
窄卷积 :步长T=1 ,两端不补0 :P=0 ,卷积输出后长度 M- F + 1
宽卷积 :步长T=1,两端补0 :P=F-1,卷积后输出长度 M + F -1
等宽卷积 :步长T=1,两端补0 :P=(F-1)/2, 卷积后输出长度 M
F为滤波器(卷积)的大小。
早期文献中,卷积一般默认为 窄卷积。
目前文献中,卷积一般默认为等宽卷积。
padding & stride
多通道
三、池化
max-pooling
average-pooling
mean-pooling