低分辨率feature maps的上采样方法:pixelshuffle

pixelshuffle是一种对低分辨率特征图上采样的新思路,假设我们打算将H × \times ×W × \times ×C的特征图在长和宽的维度扩大 r r r倍变成 r r rH × \times × r r rW × \times ×C,pixelshuffle的做法是通过深度为 r 2 r^{2} r2C的卷积对H × \times ×W × \times ×C的特征图进行卷积操作得到H × \times ×W × \times × r 2 r^{2} r2C的特征图,然后通过“周期洗牌”的方式将H × \times ×W × \times × r 2 r^{2} r2C的特征图编排为 r r rH × \times × r r rW × \times ×C,该操作是pixelshuffle的关键,即下图的sub-pixel convolution layer的过程。
首先我们先看周期洗牌的过程中像素位置和通道是如何计算的:
在这里插入图片描述
正如上式所描述的,其中 x x x y y y c c c 指的是通过pixelshuffle上采样得到的输出特征图中像素点的位置和其所在通道,那么三个变量映射到原图中对应的像素点位置和所在的通道即为 ⌊ \lfloor x x x/ r r r ⌋ \rfloor ⌊ \lfloor y y y/ r r r ⌋ \rfloor C C C ⋅ \cdot r r r ⋅ \cdot m o d mod mod( y y y, r r r)+ C C C ⋅ \cdot m o d mod mod( x x x, r r r)+ c c c,其中 m o d mod mod是取模操作,这个式子从表面来看很不好理解,可以通过在下图中设置相应像素点位置来推断。
低分辨率feature maps的上采样方法:pixelshuffle_第1张图片
观察上图,我们发现输入特征图的尺寸为 7 7 7 × \times × 7 7 7,通道为9,输出特征图的尺寸为 21 21 21 × \times × 21 21 21,即 r r r= 3 3 3,所以根据 r 2 r^2 r2 ⋅ \cdot C C C= 9 9 9可得 C C C= 1 1 1,我们将输出特征图所有像素位置处进行坐标编码得到如下(这里只展示一小部分):
低分辨率feature maps的上采样方法:pixelshuffle_第2张图片
通过上图我们计算一下 ,首先位置( 0 0 0, 0 0 0)映射到原图为( ⌊ \lfloor 0 0 0/ 3 3 3 ⌋ \rfloor , ⌊ \lfloor 0 0 0/ 3 3 3 ⌋ \rfloor , C C C ⋅ \cdot 3 3 3 ⋅ \cdot 0 0 0+ C C C ⋅ \cdot 0 0 0+ c c c)=( 0 0 0, 0 0 0, c c c)即第一个通道中第一行第一列的像素点,位置( 1 1 1, 0 0 0)映射到原图中( ⌊ \lfloor 1 1 1/ 3 3 3 ⌋ \rfloor , ⌊ \lfloor 0 0 0/ 3 3 3 ⌋ \rfloor , C C C ⋅ \cdot 3 3 3 ⋅ \cdot 0 0 0+ C C C ⋅ \cdot 1 1 1+ c c c)=( 0 0 0, 0 0 0, c c c+ 1 1 1)即第二个通道中第一行第一列的像素点,其余以此类推,这里就不再一一列举。

pytorch的内置方法:

torch.nn.PixelShuffle(upscale_factor)

upscale_factor是上采样因子,即 r r r,pixelshuffle在使用之前必须加入卷积层,且深度为 r 2 r^2 r2 C C C C C C为该卷积层输入特征图的通道数。

你可能感兴趣的:(深度学习,深度学习,计算机视觉,pixelshuffle)