最近在看yolo、ssd算法的时候总是接触到一个词叫做上采样.
一直没太搞懂到底什么是上采样,今天正好查了下,然后来记录下来
上采样
简单的理解就是把图片进行放大了。在算法中,在我们做图像识别过程中,需要对图像进行像素级别的分类,因此在卷积提取特征后需要通过上采样将feature map 还原到原图中。
在算法中常见的上采样方法有双线性插值以及转置卷积、上采样(unsampling)和上池化(unpooling).
常用的就是双线性插值
以及转置卷积
双线性插值
双线性插值,又称为双线性内插。在数学上,双线性插值是对线性插值在二维直角网格上的扩展,用于对双变量函数(例如 x 和 y)进行插值。其核心思想是在两个方向分别进行一次线性插值。
假设我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。
首先在 x 方向进行线性插值,得到:
然后在 y 方向进行线性插值,得到 f(x, y):
转置卷积
转置卷积和线性插值不同的是需要一个学习参数
想明白转置卷积就必须先明白什么是卷积操作
我们从一个小例子中直观的感受下什么是卷积操作,假设我们有个44的矩阵,我们在这个矩阵上去做33的卷积操作,在stride=1的时候,而且不添加padding的情况下。就可以输出一个2*2 的矩阵
一个卷积操作就是一个多对一的映射关系。
反过来操作
现在,假设我们想要反过来操作。我们想要将输入矩阵中的一个值映射到输出矩阵的9个值,这将是一个一对多(one-to-many)的映射关系。这个就像是卷积操作的反操作,其核心观点就是用转置卷积。
卷积矩阵
我们对这个卷积矩阵进行重新排列得到4*16的矩阵
每一个卷积矩阵的行都是经过重新排列的,每行之间用0进行填充。
为了方便乘法我们将输入的矩阵进行向量变化,从4 * 4变为16 * 1的形状
通过矩阵乘法我们得到一个输出向量
通过变换得到2*2 的矩阵
从图中我们发现,我们可以实现矩阵的从16到4 其实也就是
下采样就是图像的缩小的过程。
我们掌握了从16到4的过程,相同的原理我们也就知道了从4到16
转置卷积矩阵
我们想要从4到16,因此我们要使用一个16 * 4的矩阵
假设我们转置这个卷积矩阵变成了 然后做一个列向量的 进行矩阵的乘法,从而生成一个 的输出矩阵
这样就输出了一个 的矩阵
需要注意的是:这里的转置卷积矩阵的参数,不一定从原始的卷积矩阵中简单转置得到的,转置这个操作只是提供了转置卷积矩阵的形状而已。
unsampling和unpooling
其中右侧为unsampling,可以看出unsampling就是将输入feature map中的某个值映射填充到输出上采样的feature map的某片对应区域中,而且是全部填充的一样的值。
unpooling的操作与unsampling类似,区别是unpooling记录了原来pooling是取样的位置,在unpooling的时候将输入feature map中的值填充到原来记录的位置上,而其他位置则以0来进行填充。