PixelShuffle方法

PixelShuffle是一种高效的上采样技术,用于图像超分辨率任务。它通过卷积和多通道重组,将低分辨率特征图转换为高分辨率特征图。在PyTorch、MXNet和TensorFlow等框架中均有实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:https://blog.youkuaiyun.com/u014636245/article/details/98071626

PixelShuffle是一种上采样方法,可以对缩小后的特征图进行有效的放大。可以替代插值或解卷积的方法实现upscale

PixelShuffle

PixelShuffle(像素重组)的主要功能是将低分辨的特征图,通过卷积和多通道间的重组得到高分辨率的特征图。这一方法最初是为了解决图像超分辨率问题而提出的,这种称为Sub-Pixel Convolutional Neural Network的方法成为了上采样的有效手段。
在这里插入图片描述
要把一张低分辨输入转变为高分辨输出,论文ESPCN中提出用基于特征抽取和亚像素卷积的方法来扩大特征图,将特征图从低分辨空间转换到高分辨空间中去.上图中左侧第一部分是用于对图像的特征进行抽取。而后在倒数第二层生成 r 2 r 2 r 2 r2r2 r^2 r2r2r2wr,hr的上采样结果。具体来说,就是将原来一个低分辨的像素划分为rr各更小的格子,利用rr个特征图对应位置的值按照一定的规则来填充这些小格子。按照同样的规则将每个低分辨像素划分出的小格子填满就完成了重组过程。在这一过程中模型可以调整r*r个shuffle通道权重不断优化生成的结果。
主要实现了这样的功能:N*(C*r*r)*W*H---->>N*C*(H*r)*(W*r)

实现

在pytorch,mxnet和tensorflow都用相应的pixelshuffle实现。

pytorch 中主要使用nn.PixelShuffle函数:

    #官方文档的实例可以参考::

        >>> ps = nn.PixelShuffle(3)
        >>> input = autograd.Variable(torch.Tensor(1, 9, 4, 4))
        >>> output = ps(input)
        >>> print(output.size())
        torch.Size([1, 1, 12, 12])

在mxnet中gluon前端有针对不同的维度有三个apiPixelShuffle1D, PixelShuffle2D, PixelShuffle3D

#官方文档使用例子可以参考:
pxshuf = PixelShuffle1D(2)
x = mx.nd.zeros((1, 8, 3))
pxshuf(x).shape
#-----#
pxshuf = PixelShuffle2D((2, 3))
x = mx.nd.zeros((1, 12, 3, 5))
pxshuf(x).shape
#-----#
pxshuf = PixelShuffle3D((2, 3, 4))
x = mx.nd.zeros((1, 48, 3, 5, 7))
pxshuf(x).shape

tensorflow中也有人对pixelshuffle进行了实现:

#numpy
def PS(I, r):
  assert len(I.shape) == 3
  assert r>0
  r = int(r)
  O = np.zeros((I.shape[0]*r, I.shape[1]*r, I.shape[2]/(r*2)))
  for x in range(O.shape[0]):
    for y in range(O.shape[1]):
      for c in range(O.shape[2]):
        c += 1
        a = np.floor(x/r).astype("int")
        b = np.floor(y/r).astype("int")
        d = c*r*(y%r) + c*(x%r)
        print a, b, d
        O[x, y, c-1] = I[a, b, d]
  return O

#------#
#Tensorflow
def _phase_shift(I, r):
# Helper function with main phase shift operation
bsize, a, b, c = I.get_shape().as_list()
X = tf.reshape(I, (bsize, a, b, r, r))
X = tf.transpose(X, (0, 1, 2, 4, 3)) # bsize, a, b, 1, 1
X = tf.split(1, a, X) # a, [bsize, b, r, r]
X = tf.concat(2, [tf.squeeze(x) for x in X]) # bsize, b, ar, r
X = tf.split(1, b, X) # b, [bsize, ar, r]
X = tf.concat(2, [tf.squeeze(x) for x in X]) #
bsize, ar, br
return tf.reshape(X, (bsize, ar, br, 1))

def PS(X, r, color=False):
# Main OP that you can arbitrarily use in you tensorflow code
if color:
Xc = tf.split(3, 3, X)
X = tf.concat(3, [_phase_shift(x, r) for x in Xc])
else:
X = _phase_shift(X, r)
return X

### 解决方案 当在命令行中遇到 `unrecognized arguments` 错误时,通常是因为传递给脚本或工具的参数未被识别或支持。以下是可能的原因以及解决方案: #### 1. 参数名称拼写错误 如果命令中的某些参数名存在拼写错误,则可能导致该问题。建议仔细检查输入的参数是否完全匹配目标程序所接受的标准。 例如,在 Python 脚本中使用 argparse 库定义了特定的选项列表[^3]。如果尝试传入一个不存在于这些预设选项内的额外参数,就会触发此类警告消息。 ```bash python script.py --unknown-option value ``` 上述例子会因为 `--unknown-option` 并未在解析器里声明而报错。 #### 2. 额外不需要的参数 有时用户无意间附加了一些多余的标志到实际需求之外的地方也会引发同样的状况。比如下面这个场景展示了如何由于多加了一个无意义的关键字而导致失败的情况: 假设有一个简单的 python 文件只接收两个必需的位置参数 x 和 y 来计算它们相乘的结果, 如果我们在调用它的时候除了必要的两项还加上别的东西就有可能得到类似的反馈. ```python import argparse parser = argparse.ArgumentParser() parser.add_argument('x', type=int, help='the base') parser.add_argument('y', type=int, help='the exponent') args = parser.parse_args() print(f'{args.x}^{args.y} == {args.x**args.y}') ``` 执行如下指令将会成功: ```bash $ python prog.py 2 3 2^3 == 8 ``` 但是如果我们不小心加入了其他无关紧要的东西进去的话: ```bash $ python prog.py foo bar baz usage: prog.py [-h] x y prog.py: error: unrecognized arguments: baz ``` 因此务必确认所提供的每一个开关都是真正需要而且有效的才行哦! #### 3. 版本兼容性问题 不同版本间的变更也可能引起这种现象发生; 新版软件可能会移除旧版中存在的功能或者改变其默认行为模式等等因素都可能是诱因之一. 所以最好查看官方文档了解当前正在使用的那一款具体有哪些可用的选择项可供选用最为稳妥可靠的办法啦! --- ### 修改 Makefile.config 的方法 (针对 caffe 安装环境) 对于提到修改 `Makefile.config` 添加路径 `/usr/include/hdf5/serial` 及 `/usr/lib/x86_64-linux-gnu/hdf5/serial`, 这主要是为了确保 HDF5 相关库能够正确链接上从而避免后续编译过程中可能出现的相关依赖缺失类的问题.[^2] 不过需要注意的是如果你的操作系统架构并非标准 X86 架构而是 ARM 等特殊平台则需相应调整最后那段 lib 路径部分以适配实际情况即可完成设置工作咯~ 另外记得保存更改后的配置文件后再重新运行 make clean & make all 命令来构建整个项目工程哟~ --- ### 总结 综上所述,解决 `unrecognized arguments` 错误的方法主要包括以下几个方面: - 检查是否有参数拼写错误; - 移除非必要且不被支持的多余参数; - 查阅最新版本的应用说明文档核实是否存在版本差异带来的影响; 同时按照指示编辑好对应的 build configuration files 如这里提及到的 `Makefile.config`, 就可以有效减少这类常见麻烦事的发生几率啦! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值