上采样、下采样到底是个啥

最近在看yolo、ssd算法的时候总是接触到一个词叫做上采样.

一直没太搞懂到底什么是上采样,今天正好查了下,然后来记录下来

上采样

简单的理解就是把图片进行放大了。在算法中,在我们做图像识别过程中,需要对图像进行像素级别的分类,因此在卷积提取特征后需要通过上采样将feature map 还原到原图中。

在算法中常见的上采样方法有双线性插值以及转置卷积、上采样(unsampling)和上池化(unpooling).

常用的就是双线性插值以及转置卷积

双线性插值

双线性插值,又称为双线性内插。在数学上,双线性插值是对线性插值在二维直角网格上的扩展,用于对双变量函数(例如 xy)进行插值。其核心思想是在两个方向分别进行一次线性插值。

假设我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。

首先在 x 方向进行线性插值,得到:

x方向上的插值

然后在 y 方向进行线性插值,得到 f(x, y):


y方向上的插值

转置卷积

转置卷积和线性插值不同的是需要一个学习参数

想明白转置卷积就必须先明白什么是卷积操作

我们从一个小例子中直观的感受下什么是卷积操作,假设我们有个44的矩阵,我们在这个矩阵上去做33的卷积操作,在stride=1的时候,而且不添加padding的情况下。就可以输出一个2*2 的矩阵

卷积步骤

一个卷积操作就是一个多对一的映射关系

反过来操作

现在,假设我们想要反过来操作。我们想要将输入矩阵中的一个值映射到输出矩阵的9个值,这将是一个一对多(one-to-many)的映射关系。这个就像是卷积操作的反操作,其核心观点就是用转置卷积。

转置卷积

卷积矩阵

卷积矩阵

我们对这个卷积矩阵进行重新排列得到4*16的矩阵

4*16的卷积矩阵

每一个卷积矩阵的行都是经过重新排列的,每行之间用0进行填充。

重排矩阵

为了方便乘法我们将输入的矩阵进行向量变化,从4 * 4变为16 * 1的形状

输入矩阵变换

通过矩阵乘法我们得到一个输出向量

矩阵乘法

通过变换得到2*2 的矩阵

得到输出矩阵

从图中我们发现,我们可以实现矩阵的从16到4 其实也就是

下采样就是图像的缩小的过程。

我们掌握了从16到4的过程,相同的原理我们也就知道了从4到16

转置卷积矩阵

我们想要从4到16,因此我们要使用一个16 * 4的矩阵

假设我们转置这个卷积矩阵变成了 然后做一个列向量的 进行矩阵的乘法,从而生成一个 的输出矩阵

转置卷积的过程

这样就输出了一个 的矩阵

需要注意的是:这里的转置卷积矩阵的参数,不一定从原始的卷积矩阵中简单转置得到的,转置这个操作只是提供了转置卷积矩阵的形状而已。

unsampling和unpooling

unsampling

其中右侧为unsampling,可以看出unsampling就是将输入feature map中的某个值映射填充到输出上采样的feature map的某片对应区域中,而且是全部填充的一样的值。

unpooling

unpooling的操作与unsampling类似,区别是unpooling记录了原来pooling是取样的位置,在unpooling的时候将输入feature map中的值填充到原来记录的位置上,而其他位置则以0来进行填充。

你可能感兴趣的:(上采样、下采样到底是个啥)