Pixel-Shuffle(unshuffle)原理和算法流程

Pixel Shuffle(像素重组)是一种经典的上采样方法,最初用于图像超分辨率,其核心思想是将卷积产生的多通道低分辨率特征图重新排列成高分辨率图像,从而实现分辨率的增加。

具体原理和算法流程如下:

  1. 输入特征图形状
    假设输入特征图尺寸为 [H,W,C×r2][H,W,C×r2],其中:
    • H,WH,W 是空间高度和宽度
    • CC 是目标通道数
    • rr 是上采样倍数(如2,4等)
    • 将这 r2r2 组像素“解开”,放展成空间维度,变成高分辨率的 [H×r,W×r,C][H×r,W×r,C] 图像
  2. 步骤细节
    • 首先reshape输入张量,将通道维拆分为 (C,r,r)(C,r,r)
    • 然后将这三个维度重排,使得这 r×rr×r 个子像素平铺在空间维度
    • 最终reshape成高分辨率图像大小
  3. 效果
    • 空间尺寸变为原来的 rr 倍,通道数降为原来的 1r2r21
    • 通过这种方式,上采样过程无需插值,避免了模糊和棋盘格效应
    • 保留了特征图的空间和通道结构,实现高效且质量较好的上采样
  4. 数学表达及常用实现(以PyTorch为例)
    • 输入大小:[N,C×r2,H,W][N,C×r2,H,W]
    • 输出大小:[N,C,H×r,W×r][N,C,H×r,W×r]
    • PyTorch内置API:torch.nn.PixelShuffle(upscale_factor=r)
  5. Pixel Unshuffle(逆过程)
    是Pixel Shuffle的反向操作,作用是将高分辨率图像分块压缩成低分辨率,通道数增加。实现过程是将空间维度根据 rr 折叠进通道维。

通道分组与重排列
将输入的多通道 (C×r2)(C×r2) 按 r×rr×r 分组,理解为每个低分辨率位置携带了 r2r2 

个子像素的信息。通过重新排列:

总结,Pixel Shuffle通过重新排列通道内子像素信息空间分布进行高效的上采样,避免了传统反卷积带来的棋盘格伪影,在超分辨率和视觉模型中应用广泛。它的逆过程Pixel Unshuffle用于下采样。

以上内容基于对Pixel Shuffle的算法原理和实现的综合解读。

Pixel Shuffle(像素重组)和 Pixel Unshuffle(像素反重组)是深度学习中用于图像上采样和下采样的两种操作,它们在图像超分辨率、特征压缩等任务中广泛应用。以下将详细解释这两种操作的原理和算法流程。

Pixel Shuffle 的原理与算法流程

原理
Pixel Shuffle 是一种高效的上采样方法,通过将通道维度的信息重新排列到空间维度,从而实现图像分辨率的提升。其核心思想是通过重新排列特征图的通道和空间维度,将低分辨率的特征图转换为高分辨率的特征图。这种方法避免了传统插值或反卷积方法的计算开销,同时保持了图像质量。

算法流程

  1. 输入张量:假设输入张量的形状为 (N, C×r², H, W),其中 N 是批量大小,C 是通道数,H 和 W 是高度和宽度,r 是上采样因子。
  2. 分解通道数:将输入张量的通道数 C×r² 分解为 C 个通道,每个通道的大小为 r×r
  3. 重排特征图:将输入张量的通道和空间维度重新排列,使其形状变为 (N, C, r×H, r×W)。这个过程相当于将每个通道中的像素块分配到更大的空间位置,从而实现高效的上采样操作。

代码示例
在 PyTorch 中,可以使用 torch.nn.PixelShuffle 实现 Pixel Shuffle 操作。以下是一个简单的示例:

import torch import torch.nn as nn # 创建一个示例张量 x = torch.randn(1, 4, 2, 2) # 输入形状 (batch, channels, height, width) # Pixel Shuffle 操作,使用上采样因子 2 pixel_shuffle = nn.PixelShuffle(2) y = pixel_shuffle(x) print(f"输入形状: {x.shape}, 输出形状: {y.shape}") # 输入形状: torch.Size([1, 4, 2, 2]), 输出形状: torch.Size([1, 1, 4, 4]) 

在这个示例中,输入张量的形状为 (1, 4, 2, 2),经过 Pixel Shuffle 操作后,输出张量的形状为 (1, 1, 4, 4)。这表明通道数从 4 减少到 1,而空间维度从 2×2 增加到 4×4

Pixel Unshuffle 的原理与算法流程

原理
Pixel Unshuffle 是 Pixel Shuffle 的逆操作,用于将空间维度重新映射回通道维度,从而实现特征的压缩。这种操作在编码解码模型、图像压缩等任务中非常有用。通过将高分辨率的特征图转换为低分辨率的特征图,Pixel Unshuffle 可以减少计算成本,同时保留重要的特征信息。

算法流程

  1. 输入张量:假设输入张量的形状为 (N, C′, r×H, r×W),其中 C′ 是新的通道数,r 是下采样因子。
  2. 分解空间维度:将输入张量的空间维度 r×H × r×W 分解为 H × W 和每个位置的小块大小 r×r
  3. 增加通道数:将输入张量的通道数从 C′ 增加到 C = C′×r²
  4. 重排通道:将空间维度的 r×r 小块重新映射到通道维度中,从而实现特征的压缩。

代码示例
在 PyTorch 中,可以使用 torch.nn.functional.pixel_unshuffle 实现 Pixel Unshuffle 操作。以下是一个简单的示例:

import torch import torch.nn.functional as F # 假设 y (1,1,4,4)是 Pixel Shuffle 的输出 x_reconstructed = F.pixel_unshuffle(y, 2) print(f"重新构建后的形状: {x_reconstructed.shape}") # 重新构建后的形状: torch.Size([1, 4, 2, 2]) 

在这个示例中,输入张量的形状为 (1, 1, 4, 4),经过 Pixel Unshuffle 操作后,输出张量的形状为 (1, 4, 2, 2)。这表明通道数从 1 增加到 4,而空间维度从 4×4 减少到 2×2

总结

  • Pixel Shuffle:用于上采样,将通道维度转换为空间维度,提升图像分辨率。
  • Pixel Unshuffle:用于下采样,将空间维度转换为通道维度,降低图像分辨率进行特征压缩。

这两种操作通过在通道维度和空间维度之间进行信息重排,使得模型在不引入额外插值误差的情况下,实现高效的上采样和下采样操作。它们在图像超分辨率、特征压缩等任务中具有广泛的应用前景。

Pixel-Shuffle(unshuffle)原理和算法流程

ChatGPT 说:

已思考 37 秒

在 CNN/ViT 中常见的 Pixel-Shuffle 与 Pixel-Unshuffle 本质是一对可逆的「张量重排」运算:它们不做卷积,也不改变数值,只在 通道维 ↔ 空间维 之间搬运元素,从而在 显存几乎不变 的前提下完成上采样或下采样。Pixel-Shuffle 把 深度里累积的 r² 个子像素 摆成 r×r 的空间网格,用于放大分辨率;Pixel-Unshuffle 刚好反过来,把高分辨率特征“折叠”回通道维,常用来快速降低序列长度(InternVL 2 就靠它把 1024 个 patch token 压到 256 个)。这一思想最早由 ESPCN 超分辨率网络提出,如今既是超分模型的标配,也成为高分辨率 ViT 的“省 token 利器”。arXivcv-foundation.orginternvl.readthedocs.io


1 概念回顾

操作张量形状变化目的
Pixel-Shuffle(B, C × r², H, W) → (B, C, H × r, W × r)上采样(分辨率 ↑ r,通道 ↓ r²PyTorch
Pixel-Unshuffle(B, C, H × r, W × r) → (B, C × r², H, W)下采样(分辨率 ↓ r,通道 ↑ r²) PyTorch

可逆性:两步连续执行可完全恢复原张量,只要 H,W 能被 r 整除。nico-curti.github.io

2 Pixel-Shuffle 数学原理

  1. reshape:把通道维 C×r² 拆成 (C, r, r);张量变为
    (B, C, r, r, H, W)
  2. permute:将两个 r 维度移动到空间维之后 → (B, C, H, r, W, r)
  3. contiguous-view:重新 view 成 (B, C, H × r, W × r) 完成上采样。
    这一过程零计算量,仅指针重排。MediumPyImageSearch

伪代码 (PyTorch)

python

复制编辑

def pixel_shuffle(x, r): B, Cr2, H, W = x.shape C = Cr2 // (r * r) x = x.reshape(B, C, r, r, H, W) # step 1 x = x.permute(0, 1, 4, 2, 5, 3) # step 2 return x.reshape(B, C, H * r, W * r) # step 3


3 Pixel-Unshuffle 算法流程

Pixel-Unshuffle 反向执行上述三步:

  1. 将高分辨率特征 reshape 为 (B, C, H, r, W, r)
  2. permute 把两条 r 维移入通道;
  3. view 得到 (B, C×r², H÷r, W÷r)。PyTorch 已内置 nn.PixelUnshuffle(r) 实现。PyTorch

4 复杂度与数值特性

  • FLOPs = 0:纯索引重排,对梯度友好。AI Mind
  • 内存占用:与输入张量一致,无额外缓冲区。
  • 通道可分性:要求 in_channels % r² == 0;超分网络最后一层通常把卷积核数设为 C×r² 以满足该条件。jmis.org

5 典型应用场景

5.1 超分辨率(ESPCN、SRGAN 等)

ESPCN 将卷积放在低分辨率域完成特征提取,最后用 Pixel-Shuffle 一步生成高分辨率输出,使 1080p 视频实时超分成为可能。cv-foundation.orgMedium

5.2 高分辨率 ViT / MLLM Token 压缩

InternVL 1.5/2 在动态 448 px tile 预处理后用 Pixel-Unshuffle 把每块 32×32 patch token 压缩为 16×16,token 数降 75%,从而支持 4K 输入而显存近似 ViT-B/224。

5.3 Efficient ViT 与 Hybrid CNN-ViT

HIRI-ViT 等高分 ViT 亦采用类似的深度↔空间重排组件,在早期 stage 减少计算量同时保持特征完整性。arXiv


6 实现细节与踩坑

  • 推理加速:Pixel-Shuffle 可融合到 ONNX / TensorRT 的 reshape+transpose,无须自定义 kernel。nico-curti.github.io
  • 量化兼容:因不含算子计算,可在 INT8 pipeline 中直接使用。
  • 自动求导:梯度通过 view/permute 自动回传,无需额外实现。PyImageSearch
  • Debug 技巧:可对比 torch.nn.functional.pixel_shuffle() 与手写版输出,确保维度与 r² 配置一致。PyTorch

7 延伸阅读

  1. Shi et al., “Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel CNN” (ESPCN) — Pixel-Shuffle 首发论文。arXiv
  2. PyTorch PixelShuffle / PixelUnshuffle 官方文档与示例代码。
  3. InternVL 1.5 技术报告:动态分辨率 + Pixel-Shuffle 缩 token。internvl.readthedocs.io
  4. Medium & PyImageSearch 博客对 Pixel-Shuffle 直观动画与实现教学。
  5. NumPyNet 与 JMIS 的像素重排实现说明,可对比不同深度学习框架。

通过理解“深度 ↔ 空间”的重排本质,你可以在任何需要 高效分辨率变换 的场景(超分、视频处理、ViT token 压缩、轻量解码器等)里灵活使用 Pixel-Shuffle / Unshuffle,享受零计算开销带来的性能红利。

Read more

Python热度下滑、AI能取代搜索引擎?TIOBE最新榜单揭晓!

Python热度下滑、AI能取代搜索引擎?TIOBE最新榜单揭晓!

整理 | 屠敏 出品 | ZEEKLOG(ID:ZEEKLOGnews) 日前,TIOBE 发布了最新的 3 月编程语言榜单。整体来看,本月排名变化不算大,但榜单中仍然出现了一些值得关注的小波动。  AI 工具能帮大家秒懂最新编程语言趋势? 由于 2 月天数较少,3 月的榜单整体变化有限。借着这次发布,TIOBE CEO Paul Jansen 也回应了一个最近被频繁讨论的问题:为什么 TIOBE 指数仍然依赖搜索引擎统计结果?在大语言模型流行的今天,直接询问 AI 哪些编程语言最流行,是不是更简单? 对此,Jansen 的回答是否定的。 他解释称,TIOBE 指数本质上统计的是互联网上关于某种编程语言的网页数量。而大语言模型的训练数据同样来自这些网页内容,因此从信息来源来看,两者并没有本质区别。换句话说,LLM 的判断,本质上也是建立在这些网页数据之上的。 Python 活跃度仍在下降

By Ne0inhk
“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

“裸奔龙虾”数量已达27万只,业内人士警告;AI浪潮下,中传“砍掉”翻译等16个专业;薪资谈判破裂,三星电子8.9万人要罢工 | 极客头条

「极客头条」—— 技术人员的新闻圈! ZEEKLOG 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:[email protected]) 整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 一分钟速览新闻点! * “裸奔龙虾”已高达27万只!业内人士警告:一旦黑客入侵,敏感信息一秒搬空 * 阿里云 CTO 周靖人代管千问模型一号位,刘大一恒管理更多团队 * 中国传媒大学砍掉翻译、摄影等 16 个本科专业,直言教育要面向人机分工时代 * 雷军放话:小米将很快推出 L3、L4 的驾驶 * 消息称原理想汽车智驾一号位郎咸朋具身智能赛道创业 * vivo 前产品经理宋紫薇创业,瞄准 AI 时尚Agent,获亿元融资 * MiniMax 发布龙虾新技能,股价暴涨超 23% * 薪资谈判破裂,三星电子

By Ne0inhk
一天开13个会、一个Bug要修200天!前亚马逊L7爆料:这轮大裁员,AI只是“背锅侠”

一天开13个会、一个Bug要修200天!前亚马逊L7爆料:这轮大裁员,AI只是“背锅侠”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 过去一年,大型科技公司的裁员消息几乎从未停过。但当公司对外给出的理由越来越统一,“AI 让组织更高效”,也有越来越多内部员工开始提出另一种质疑:事情或许没那么简单。 最近,一段来自前亚马逊员工 Becky 的 YouTube 视频在开发者社区流传开来。她曾在亚马逊工作 7 年,其中 5 年担任 L7 级别的技术管理者,负责过团队年度规划(OP1)等核心管理工作——可去年,她主动离开了亚马逊。 就在最近,她的三位前同事接连被裁,其中两人还是 H-1B 签证员工,都背着房贷压力。其中一位同事忍不住给 Becky 发消息:“你去年离开的时候,是不是已经预料到会发生这些?” 对此,Becky 的回答很坦诚:她不知道具体什么时候会裁员,但她早就感觉情况不对劲了。 在她看来,这轮裁员被归因为

By Ne0inhk
用 10% GPU 跑通万亿参数 RL!马骁腾拆解万亿参数大模型的后训练实战

用 10% GPU 跑通万亿参数 RL!马骁腾拆解万亿参数大模型的后训练实战

整理 | 梦依丹 出品 | ZEEKLOG(ID:ZEEKLOGnews) 左手是提示词的工程化约束,右手是 Context Learning 的自我进化。 在 OpenAI 新发布的《Prompt guidance for GPT-5.4》中,反复提到了 Prompt Contracts(提示词合约)。要求开发者像编写代码一样,严谨地定义 Agent 的输入边界、输出格式与工具调用逻辑,进而换取 AI 行为的确定性。 但在现实操作中,谁又能日复一日地去维护那些冗长、脆弱的“提示词代码”? 真正的 Agent,不应只靠阅读 Context Engineering,更应该具备 Context Learning 的能力。 为此,在 4 月 17-18

By Ne0inhk