PixelShuffle上采样原理讲解及程序实现

1 PixelShuffle简介

PixelShuffle(Sub-Pixel Convolutional Neural Network,像素重组)是一种经典的上采样方法,由《Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network》在处理图像超分辨率的问题上提出,可以对缩小后的特征图进行有效的放大操作。
PixelShuffle现已广泛应用在如图像分割等计算机视觉问题上,和反卷积一起成为了神经网络中最常用的两种上采样技术。相比之下PixelShuffle克服了反卷积的易产生棋盘格的问题,可以说PixelShuffle是目前通用上采样upsample技术中性能最好的

2 PixelShuffle原理讲解

下图为原论文中关于使用PixelShuffle实现图像超分辨的示意图(增加了一些标注)。

  • 超分辨率图像生成过程:首先对一个大小为 [ H , W , C ] [H,W,C] [H,W,C]的低分辨率图像(Input)进行 l − 1 l-1 l1次卷积,获得一个特征图 [ H , W , C ⋅ r 2 ] [H,W,C·r^2] [H,W,Cr2],这里的r为设置的期望上采样倍数。然后对特征图做shuffle变换获得一张大小为 [ H ⋅ r , W ⋅ r , C ] [H·r,W·r,C] [Hr,Wr,C]超分辨率图像(output)
  • PixelShuffle的功能:对特征图进行shape变换: [ H , W , C ⋅ r 2 ] [H,W,C·r^2] [H,W,Cr2]>>> [ H ⋅ r , W ⋅ r , C ] [H·r,W·r,C] [Hr,Wr,C]
  • PixelShuffle理解:将一个低分辨率像素划分为 [ r × r ] [r \times r] [r×r]份,默认是由特征图对应像素位置的 r 2 r^2 r2个特征像素组成一个低分辨率像素。在组成的过程中通过不断优化每组组合的权重来达到最好的上采样效果。

3 PixelShuffle程序实现

作为一种优秀的特征上采样方法,pytorch和tensorflow等深度学习平台已提供了相应的API接口,下面分享基于numpy,pytorch实现的PixelShuffle程序。

3.1 基于numpy实现PixelShuffle

#基于numpy实现PixelShuffle
#以[4,3,3]->[1,3*2,3*2]为例
#注:在实际程序中,通常习惯把通道C放在前面表示
import numpy as np
a = np.arange(36).reshape([4, 3, 3])
b = a.reshape([2, 2, 3, 3])
c = b.transpose([2, 0, 3, 1])
d = c.reshape([6, 6])

3.2 torch.nn.PixelShuffle()

pytorch中集成了PixelShuffle方法:torch.nn.PixelShuffle()
具体的使用方法为:
PixelShuffle上采样原理讲解及程序实现_第1张图片

import torch
ps = torch.nn.PixelShuffle(3)
a = torch.Tensor(1, 9, 4, 4)
b = ps(a)
print(a.size())
"""
输出结果:
torch.Size([1, 9, 4, 4])
"""

你可能感兴趣的:(神经网络,深度学习,python,pytorch,神经网络)