深度学习中的插值算法
本次的学习属于学习深度学习中的基础知识,插值算法。主要包括了三种常用的插值算法,最邻近插值算法,双线性插值算法,双三次插值算法。
插值的作用是什么呢?为什么要插值?什么是插值
插值(Interpolation)
,有时也称为"重置样本",是在不生成像素的情况下增加图像像素大小的一种方法 ,在周围像素色彩的基础上用数学公式计算丢失像素的色彩 。简单地点,插值是根据中心像素点的颜色参数模拟出周边像素值的方法,是数码相机特有的放大数码照片的软件手段。
我们在深度学习中也很常见的就是插值算法来扩大分辨率或者说进行上采样的操作。(也可以下采样)
最邻近插值算法
最邻近插值:将每个目标像素找到距离它最近的原图像素点 ,然后将该像素的值直接赋值给目标像素。
- 优点:实现简单,计算速度快
- 缺点:插值结果缺乏连续性,可能会产生锯齿状的边缘,对于图像质量的影响较大。因此,当处理精度要求较高的图像时,通常会采用更加精细的插值算法,如双线性插值、双三次插值等。
使用插值算法将3x3的图像上采样为5x5的图像,我们使用最邻近插值算法。
- 我们先把目标图像缩放到和原图像一样的尺度范围。也就是把5x5的图像缩放到3x3的大小。就是我们的第一步操作。
- 这里要通过坐标尺度迭代处每个像素在3x3图像中的一个坐标位置。
- 坐标位置除缩放尺度
-
在看在该尺度范围下目标函数的像素值,离原图像的哪一个像素的位置最近。
-
把离它最近像素的像素值取出来作为该处的一个像素值即可。
我们这里距离最近是通过两个图像重合之后求相交的面积取最大值即可完成选取。
- 代码中是通过四舍五入来确定距离最近的坐标位置的。
最后的显示效果会有明显的锯齿状信息。
使用场景
最邻近插值算法有自己的使用场景,我们用语义分割的例子来举一个例子。
对于一张用于语义分割的图像,我们进行缩放操作的时候,同时也需要将它的标注的图像同时的进行一个缩放的操作。
此时我们的标注图像就不能使用其他的插值算法,而是只能使用的是最邻近的插值算法。
原因是因为背景部分的像素值我们是处理为0的而将边缘部分的像素值我们处理为255。但是我们飞机的像素值对应的是我们的类别索引。
也就是不能够去取中间值来进行。
双线性插值算法
在该算法中我们看待像素的方式为将每一个像素看作是一个正方形区域边长为1的区域。红色是像素的中心点区域坐标为(0.5,0.5) .
我们在学习该算法的时候学习的是两种主要的方式角对齐,和边对齐的方式
-
也是将我们5x5的图像缩放到和原来的3x3的图像一样的尺寸大小。
-
但是我们的对齐的方式不同就会存在不同的缩放比例
- 角对齐:将缩放后的目标图像的四个角点的位置和原图像的四个角点的位置进行对齐(重合)显然这种角对齐的方式缩放的比例是大的。
- 边对齐:将缩放后的目标图像和原图像的四个边进行对齐。就和之前的最邻近插值是一样的了。
综上就可对其中的两种方式进行一个整体的概括了。(第一种为角对齐,第二种为边对其的方式)下面的图更为直观一些。
TORCH.NN.FUNCTIONAL.INTERPOLATE
角对齐和边对齐的计算方式
在角对齐的哪一个方式中,红色颜色框选的点在我们的原图像中是存在的不需要进行线性的插值。其他的蓝色的点是需要我们进行计算的点。
-
我们先要找在原图像中和其邻近的四个点的坐标。(边对齐的方式也是采用同样的方式进行)
-
对于角对齐我们的分布更加的均匀,所以我们的点离周围的四个点的位置是相同的,在计算的时候的权重值是一样的
-
而边对齐的方式和周围的四个点的距离是保持不同的,因此会使用不同的权重值来进行计算。
我们的对齐方式虽然存在一定的区别但是计算的方式总结起来都是采用相同的思想进行实现的。
-
先在水平的方向上进行一个插值。(两次)结合距离的比例作为权重来进行计算
-
在得到的两个水平方向的插值点上根据两个水平点的距离权重计算垂直方向的插值。
-
最后我们就得到了最后的需要计算的插值点p的值。
-
边界的部分需要进行特殊的处理操作。
这就是我们在深度学习的代码中常见的一个操作------线性插值代码部分
双三次插值算法
双三次插值算法:首先我们对这个算法的名字进行一定的解读。双代表的其实就是x y两个方向。三次代表的是我们在计算的时候使用了一个三次式来进行计算的。
- 缩放到相同的尺度上:
- 找缩放后的图像的像素点在原图像中的像素点所在的位置。
- 先不考虑边缘的部分,我们在计算中心部分的时候需要的是找的周围最近的16个像素点的值。像素点的距离不同我们的权重也不同。
上面代表的是一维的像素点的插值,后面的两个表示的是二维像素点的邻近插值。最后的是使用三次项的插值的示意图。(周围的16个点的像素值)
我们给出权重的计算公式:
W ( x ) = { ( a + 2 ) ∣ x ∣ 3 − ( a + 3 ) ∣ x ∣ 2 + 1 for ∣ x ∣ ≤ 1 x : 目标像素点距离某邻近像素点的距离 a ∣ x ∣ 3 − 5 a ∣ x ∣ 2 + 8 a ∣ x ∣ − 4 a for 1 ≤ ∣ x ∣ ≤ 2 a = − 0.5 0 others W(x)=\left\{\begin{array}{lll} (a+2)|x|^{3}-(a+3)|x|^{2}+1 & \text { for }|x| \leq 1 & x: \text { 目标像素点距离某邻近像素点的距离 } \\ a|x|^{3}-5 a|x|^{2}+8 a|x|-4 a & \text { for } 1 \leq|x| \leq 2 & a=-0.5 \\ 0 \quad \text { others } & \end{array}\right. W(x)=⎩ ⎨ ⎧(a+2)∣x∣3−(a+3)∣x∣2+1a∣x∣3−5a∣x∣2+8a∣x∣−4a0 others for ∣x∣≤1 for 1≤∣x∣≤2x: 目标像素点距离某邻近像素点的距离 a=−0.5