5

computer vision笔记:上采样和下采样

 2 years ago
source link: https://gsy00517.github.io/computer-vision20200202133216/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

computer vision笔记:上采样和下采样

发表于 2020-02-02 | 更新于: 2020-02-07 | 分类于 人工智能 | 2 | 阅读次数:
字数统计: 1.4k字 | 阅读时长 ≈ 4分钟

总是看到对图像进行上采样、对图像进行下采样,感觉好像懂了又不知道具体作了什么,这里就来搞搞懂。
本文针对的是图像处理中的上采样和下采样。

References

电子文献:
https://www.cnblogs.com/tectal/p/10138432.html
https://buptldy.github.io/2016/10/29/2016-10-29-deconv/


下采样即缩小图像,主要有两个目的:使得图像符合需要的大小;生成对应图像的缩略图。
下采样的原理很简单,比如对于一幅尺寸为MxN的图像,对其进行s倍下采样,即得到(M/s)x(N/s)尺寸的图像。这可以通过把原始图像划成sxs的窗口,使每个窗口内的图像变成一个像素,这个像素点的值可以是窗口内所有像素的均值或者最大值等等。另外我认为高斯滤波等卷积方式本身也是一种下采样。


上采样与下采样相反,其目的是放大图像。注意,它并不能带来更多关于该图像的信息,因此图像的质量会受到影响。
上采样的实现主要有两种思路。一种是内插值的方法,另一种是采用反卷积(也称转置卷积)的方法。

注:还有一种现在已经比较少用的方法也就是反池化,想了解的话可以看一下computer-vision笔记:反池化


  1. 最邻近元法

    这种方法最简单,不需要计算,即在待求像素的四个邻像素中,选取距离待求像素最近的邻像素的灰度值赋给待求像素。 如上图所示,新增在A区内的像素就用左上角的像素点来赋值,其余三个区域同理。
    虽然最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能会出现明显的锯齿状。
  2. 双线性插值法

    这种方法也很好理解,就是把原本四个像素点围成的新的区域中的灰度值变化视作线性的,然后根据插入点的位置,按照比例计算两次,得到最终要赋的值。 这也是一种比较常用的插值方法。
  3. 三次内插法

    该方法是理论上最优的sinc函数(辛格函数)逼近,其数学表达式为:Sinc(x)=sin(x)xSinc(x)=sin(x)x
    待求像素的灰度值由其周围16个灰度值加权内插得到,如下图所示。 待求像素的灰度计算式如下:
    f(x,y)=f(i+u,j+v)=ABCf(x,y)=f(i+u,j+v)=ABC
    其中ABCABC的含义分别如下所示。 三次内插法计算量比较大,但插值后的图像效果最好。

反卷积通常用于如下几个方面:在CNN可视化处理中,可以通过反卷积将卷积得到的feature map还原到像素空间,来观察feature map对哪些pattern相应最大,即可视化哪些特征是卷积操作提取出来的;在FCN全卷积网络中,由于要对图像进行像素级的分割,需要将图像尺寸还原到原来的大小,类似upsampling的操作,所以需要采用反卷积;在GAN对抗式生成网络中,由于需要从输入图像到生成图像,自然需要将提取的特征图还原到和原图同样尺寸的大小,即也需要反卷积操作。
为了方便理解和比较,我们将卷积和反卷积对照着看。
我们先来看卷积时使用3x3卷积核,且没有padding,strides为1时的情况。


可以看到,由于卷积使用了no padding,那么对应的反卷积就要添加padding,反卷积的padding值可用padding = kernel_size - stride来计算。在上面的情况中,反卷积的padding就是3减1等于2。
前面说到反卷积也称转置卷积,这里说一下原因。
对于上面3x3卷积核的计算,我们可以通过这样一个4x16的稀疏矩阵来把卷积变成矩阵相乘Y=CXY=CX。

注意到这里每一行有9个数值和7个0,也就是说在上面4x4的输入特征中,对每一个输出特征,有9个输入特征参与了计算。
如此,卷积的前向操作可以表示为输入和稀疏矩阵CC相乘。类似的,卷积的反向传播就是输出和CC的转置相乘。

注意:熟悉线性代数的读者应该会发现,要实现上面的运算,不应该是求矩阵的逆吗。信息论告诉我们,卷积是不可逆的,因此要注意,上面的两个CC指的并不是同一个,即用来进行反卷积的权重矩阵不一定来自于原卷积矩阵,但该权重矩阵的形状和转置后的原卷积矩阵完全相同。
此外,在一些深度学习的开源框架中,并不是通过这种转换方法来计算卷积的,因为这个转换会存在很多无用的0乘操作。

还有一个要注意的是,当卷积的stride为2时,要对输入矩阵中间补零才能完成反卷积,其实相当于进行了两次padding,一次内插补零,一次在外圈补零。


碰到底线咯 后面没有啦

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK