一般图像分割的时候,需要对图像进行像素级别的分类,因此在卷积提取到抽象特征后需要通过上采样将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

在这里插入图片描述
在这里插入图片描述

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐