前言
因为毕设需要针对遥感影像进行语义分割,在这里记录一下自己学习的心路历程。
提示:以下是本篇文章正文内容,下面案例可供参考
一、卷积和核(Convolution and Kernels)
1.什么是卷积
??卷积和加法、乘法一样,只是一种数学运算,选择不同的内核,如“锐化”、“边缘检测”、“滤波”等,通过内核与原图像进行卷积,便能实现相应的功能。 ??例如,让我们找下图A的轮廓(边缘)。
A
??给出一个内核如下:
查找垂直方向(Finds verticals)
??卷积运算如下:将核所覆盖的像素值与相应的核值相乘,乘积相加后作为新图像中与核中心相对应的点的值。具体如下图:
卷积第一步
??之后,蓝色区域(核)开始移动,根据不同的步幅(stride)能得到不同尺寸的结果图像,当stride=1时,蓝色区域每次移动一个格子,从左往右从上往下,直到遍历完原始图像:
卷积运算完整过程
??观察上图,发现原图像大小为5×5,卷积后的图像大小为3×3,这是由于卷积运算后的求和值只放置在内核中心点导致的,如果你想得到尺寸与原始图像相同的结果图像,可以使用填充(padding)操作,下图用0像素将原始图像padding为7×7,经过卷积后,得到结果图像为5×5。
使用0填充,结果图像与填充前的原始图像有同样大小
??现在回到图A(上面的安卓标志),采用Vertical Sobel(核)卷积后的结果如下:
Vertical Sobel
2.什么是核
??感谢前人的大量研究,我们有了很多功能明确的核,例如上文的Vertical Sobel,可以提取图像的垂直信息,但是我们应该思考两个问题: ??①我们并不知道需要用到怎样的核; ??②假设你知道需要怎样功能的核,但并不是所有我们需要的核都被明确的开发出来了 ??因此,核中的值应该是被当做参数,通过误差反向传播、优化“学”出来的。就和简单的神经网络一样。 ??具体怎么理解呢? ??首先,我们应该有这么一个认识:一个8×8的图像,一共有64个像素点,每个像素点的值都是它的一个特征,也就是输入的一个节点,通过卷积,结果会被放入到另一些节点,即隐藏节点,而核中的每个值对应着输入节点与隐藏节点的联系,即权重。这些权重以与普通神经网络完全相同的方式学习:首先随机初始化核值,将卷积后的结果与实际输出进行比较(然后对其进行误差反向传播和优化),最终迭代出新的核值。如果输入图像是二维的(即单通道),那么针对某一个功能的核(例如下图的绿色核)也是二维的,当你想提取四类特征时候,就应该采用4个二维核:
输入为单通道图像
??当输入图像为多通道时(如正常的RGB三通道图像),不同功能核的尺寸也应该变成三维(核的不同颜色代表不同功能,如边缘、锐化、或其他不知名特征类),针对某一个功能核(如绿色核)对应通道分别卷积,再最终求和(三个通道对应位置相加),得到的最终结果依旧是单通道的,
这个单通道结果矩阵的每一个值,代表的是输入图像的某个像素或某些像素在绿色核所代表的高维特征中的情况。下图最终会输出四个单通道结果(绿、黄、蓝、粉),表示的是原图像在不同高维特征中的情况。
输入为三通道图像
??
在pytorch构建卷积层时,in_channels代表输入图像通道数,out_channels代表卷积产生的通道数,即高维特征数,在上图中分别为:in_channels=3,out_channels=4. `torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)`
二、卷积层与全连接层的共同点
??在一个识别X与O的任务中,我们输入一张图像,经过一系列卷积层、池化层后,得到了3×2×2的特征图:
得到3×2×2的特征图
1.全连接层(Fully-connection)
??全连接层所扮演的角色是主要建构单元,当我们向这个单元输入图片时,它会将所有像素的值当成一个一维清单,而不是前面的二维矩阵,清单里的每个值都可以决定图片中的符号是O还是X,不过这场选举并不全然民主。由于某些值可以更好地判别叉,有些则更适合用来判断圈,这些值可以投的票数会比其他值还多。所有值对不同选项所投下的票数,将会以权重(weight)的方式来表示。下图连接线的不同粗细代表权重的高低。
全连接层
2.卷积层1×1
?? 全连接层的结果是输入图像归属某类的强度,但很多时候我们需要得到的是输入图像中各个像素归属某类的强度,此时可以用1×1的卷积层来等价代替全连接层。 ??下图展示了1×1卷积核的计算,输出中的每个元素来自输入中在高和宽上相同位置的元素在不同通道间的按权重累加,这与上文的卷积运算相同。假设我们将通道维当作特征维,每个像素位置当成一个数据样本,那么一个样本是1×3,共有9个样本,输入为9×3。于是下图实际上是9个全连接层的组合,每组样本与核的卷积输出就相当于一个全连接层输出,下图的两个通道维对应着两个输出类别。
1×1卷积层
三、U-Net
1.反卷积
?? 经过上面的学习我们知道,卷积会导致尺寸变小,为了使得输入输出图像有相同的尺寸,我们会填充原图像(padding)。
原图(蓝)填充后再卷积输出同尺寸结果(绿)
??如果将原图继续往外扩大,结果图像比原图尺寸更大,这就是反卷积,也称为
上采样。
2.U-Net结构
U-Net: Convolutional Networks for Biomedical Image Segmentation
U-net结构(以最低分辨率的32x32像素为例)。每个蓝盒对应于一个多通道的特征图。通道的数量表示在盒子的顶部。X-Y尺寸在盒子的左下角提供。白框代表复制的特征图。箭头表示不同的操作。
??U形的结构非常简洁优雅,
灰色的箭头是Skip Connection,是将不同深度的下采样层的输出裁剪后与同深度的上采样层的输入叠加,叠加结果为通道数加倍,目的在于保留下采样中部分损失的特征信息。
绿色的箭头是反卷积,产生的结果是通道数减半但尺寸加倍。
最后一层采用了1×1卷积层,目的是二分类。
??为什么最终输出图片尺寸与输入图片尺寸不同呢?原论文中首先对数据进行了镜像填充,可以减少有效数据的损失。此外,有些图像尺寸较大(如遥感影像),需要分块输入,之后再拼接结果,这样做还可以避免拼接过程中边缘部分不连接问题。
无缝分割策略
??
为什么卷积核数量是64、128、...、1024?这是根据实验结果好坏人为设置的,卷积核越多特征提取越充分,但计算量也会越大,也可能产生冗余信息。
为什么会翻倍增长呢?因为下采样时图像高宽缩小一倍,将卷积核增多一倍也是为了保留更多信息。
??为什么是四层深网络,而不是五层、六层,网络越深精度会越高吗?针对不同的训练数据,会有不同的最佳网络深度,网络过深会出现“退化”现象,即随着网络层数变多,训练误差反而降低了。
强烈推荐阅读:退化解释
参考链接
How do Convolutional Neural Networks work? Dive into Pytorch Convolutional Neural Networks - Basics
|