一般图像分割的时候,需要对图像进行像素级别的分类,因此在卷积提取到抽象特征后需要通过上采样将feature map还原到原图大小,在FCN和U-net等网络中都提到了上采样的操作,这里会一些上采样的方法进行总结。

1、最近邻插值(Nearest neighbor interpolation)

最简单的图像缩放算法就是最近邻插值,也称作零阶插值,就是令变换后像素的灰度值等于距它最近的输入像素的灰度值。算法优点在与简单、速度快。
先假设一个2X2像素的图片采用最近邻插值法需要放大到4X4像素的图片,下图左边为原图,右边为要缩放的图片,我们首先将缩放完成的图片生成一个空白图,然后在依次向其填值。
在这里插入图片描述
那么右边的?号需要填充的值用到了下面的公式:
srcX = dstX (srcWidth/dstWidth) *
srcY = dstY (srcHeight/dstHeight) *

scrX、scrY:目标图像(也就是上图右边的图像)某个点的横纵坐标
srcWidth:原图像(也就是上图左边的图像)的宽度
srcHeight:原图像(也就是上图左边的图像)的高度
dstWidth:目标图像(也就是上图左边的图像)的宽度
dstHeight:目标图像(也就是上图左边的图像)的高度

我们一般是以左上角的那个像素点坐标为(1,1),即如下图的x-y坐标系,一个像素点的大小为1
在这里插入图片描述
上图右边?号的值为:
srcX=3*(2/4)=1.5,
srcY=2*(2/4)=1;
故?处的像素应该为原图像中的(1.5,1)像素的值,但是像素坐标没有小数,一般采用四舍五入取最邻,所以最终的结果为(2,1),对应原图像的橙色。

2、双线性插值法(bilinear interpolation)

在讲双线性插值法之前先讲一下线性插值,线性插值就像我们平常说的线性关系。如图所示现在已知y=f(x)的两个点坐标分别是(x0,y0),(x1,y1),现在在区间(x0,x1)内给定任意x,如何求y,线性插值法采用图中红点的y值代替f(x)的y值。其实也就是把(x0,y0),(x1,y1),两点看成一条直线,我们认为我们要求的点在这条直线上。 假设x处的直线上的红点坐标为(x,Y),那么Y约等于y。也就是(x0,y0)到(x,Y)和(x,Y)到(x1,y1)的斜率一样,根据图可以得到公式:
在这里插入图片描述
一般转换为非隐函数可以近似为
在这里插入图片描述
在这里插入图片描述

双线性插值法

现在我们就可以讲双线性插值法了
双线性插值法也叫双线性内插,根据前面讲的就很容易想到是在两个方向分别进行一次线性插值 。
如坐标图所示,用横纵坐标代表图像像素的位置,f(x,y)代表该像素点(x,y)的彩色值或灰度值
在这里插入图片描述
现在假设目标图像的像素点(x’,y’)映射到原图像中是(x,y),也就是图中的P点。设Q11 = (x1, y1)、Q12 = (x1, y2)、Q21 = (x2, y1) 、 Q22 = (x2, y2),图中Q11,Q12,Q21,Q22分别为距离P点的最近的四个点。分别在X方向进行两次插值,最后在y方向进行插值即可得到目标图像的像素值。公式如下:
先计算X方向(也可以先计算Y方向,再计算X方向)的线性插值:
在这里插入图片描述
再在y方向进行线性插值得到f§:
在这里插入图片描述
经过公式的进一步化简可以得到:
在这里插入图片描述
由于是最近的点,所以Q的四个点的坐标之间相差1,故进一步化简为:
在这里插入图片描述

3、反池化

反池化是池化的逆操作,是无法通过池化的结果还原出全部的原始数据。因为池化的过程就只保留了主要信息,舍去部分信息。如果想从池化后的这些主要信息恢复出全部信息,则存在信息缺失,这时只能通过补位来实现最大程度的信息完整。
池化有两种:最大池化和平均池化,其反池化也需要与其对应。

平均池化和反平均池化

首先还原成原来的大小,然后将池化结果中的每个值都填入其对应原始数据区域中相应位置即可。
在这里插入图片描述

最大池化和反最大池化

要求在池化过程中记录最大激活值的坐标位置,然后在反池化时,只把池化过程中最大激活值所在位置坐标值激活,其他的值设置为0.当然,这个过程只是一种近似。因为在池化过程中,除了最大值的位置,其他的值也是不为0的。
在这里插入图片描述

4、转置卷积

转置卷积最大的特点就是可以进行学习的,这样就可以学出一种最优的上采样方法
我们都知道卷积操作就是输出的一个值对应着输入n个值的关系,这个n的大小和卷积核的大小一样。那么反卷积就是要找到这输出一个值对应原来输入n个值的关系,就很像卷积的逆操作,也叫反卷积。
在这里插入图片描述
这个图的上面的常规的卷积,input是5×5,kernel是3×3,stride是2,最后的output为2×2。
下图就是转置卷积,input为2×2,每一元素与反卷积核相乘映射到output相应的位置,那么这些映射会用重叠的地方,重叠的地方直接相加(这也就是转置卷积出现棋盘化的原因)。
下面这个图也能解释转置卷积:
这是没有填充的,也就是pading=0
在这里插入图片描述

这是有填充的,这里的pading=1

在这里插入图片描述
这个图说明了该方法的棋盘化原因,该作者也说了建议使用通过上采样(插值)然后在正则卷积来避免棋盘化。
在这里插入图片描述

Three kinds of upsampling: 1. Transposed convolution (i.e. previous deconvolution) 2. Interpolation 3. De-pooling 代码(code): import torch.nn as nn import cv2 from torch.utils.data import DataLoader from torchvision impor 上采样 双线性插值 上采样 的定义 上采样 的类型:一、 双线性插值 :二、 转置 卷积 :三、 上采样 (unsampling)四、上 池化 (unpooling) 上采样 的定义 ** 上采样 实际上是一个统称 **。在下采样的过程中,我们把一张图片的特征提取出来,实际上是把图片的关键部分提取出来的,图片的分辨率就降低了,实际上图片缩小了;在 上采样 过程中,要恢复图片的大小,提高图片的分辨率,就要用到一些方 ,任何可以让图... 如下图max-pooling操作中黄色窗口中(左图)的0.8为最大值,网络会记住该值得索引位置,如右边的4×4网格中的标记所示,这样在进行 池化 时,就可以将值放到对应的最大值索引的位置,其余位置补0,如下图uppooling操作黄色窗口(右图)中将1.3放到了之前记录的最大索引的位置,其余位置补0。设i+u,j+v(i,j为正整数,u,v为大于零小于1的小数,下同)为待求像素坐标,则待求像素灰度的值f(i+u,j+v)得出的(0,0)就为原图坐标,则待求点的值就用求出的相对应原图位置的值来代替。... 深度学习 100问Author:louwillMachine Learning Lab 大家都知道目前主流的语义分割模型都是编码-解码框架的。通过编码器不断将输入不断进行... 双线性插值 是非学习类算 ,但是在 深度学习 中也常常被使用到。本身来说 双线性插值 并不是个复杂的算 ,但是能把具体细节说明白的博文比较少,所以记录一下,希望能给大家帮助 而在实际生成的图像中,该部分却是由深深浅浅的近黑方块组成的,很像棋盘的网络。这个效应在深度 卷积 神经网络 中的影响是很大的。就是在 卷积 过程中,当 卷积 核大小不能被步长整除时, 卷积 就会出现重叠问题,插零的时候,输出结果会出现一些数值效应,就像棋盘一样。并且, 卷积 只能恢复尺寸,并不能恢复数值,因此经常用在 神经网络 中作为提供恢复的尺寸,具体的数值往往通过训练得到。普通的 上采样 采用的临近像素填充算 ,主要考虑空间因素,没有考虑channel因素, 上采样 的特征图人为修改痕迹明显,图像分割与GAN生成图像中效果不好。 设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v)。 如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。 最邻近元 计算量较小,但可能会造成 插值 生成的图像灰度上的不连续,在灰度变化 池化 (pooling)主要是在用于图像处理的 卷积 神经网络 中,但随着深层 神经网络 的发展, 池化 相关技术在其他领域,其他结构的 神经网络 中也越来越受关注。 池化 操作可以看做只取用某一个区域的关键特征,忽略其他特征。 池化 的作用 1、pooling的结果是使得特征减少,参数减少,但pooling的目的并不仅在于此。 2、pooling目的是为了保持某种不变性(旋转、平移、伸缩等)。 池化 的概念 根据相关...