当前位置: 首页 > news >正文

深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器

在深度学习的计算机视觉任务中,提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作,能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理,并结合PyTorch实现可视化展示,希望能帮助大家更好地理解他们的用途与效果。

为什么需要Pixel Shuffle和Pixel Unshuffle

Pixel Shuffle是一种从特征图中提取空间信息的方法,主要应用于图像超分辨率等任务。超分辨率(Super-Resolution,SR)指的是通过机器学习算法生成比输入分辨率更好的图像。Pixel Shuffle操作可以帮助模型通过减少通道数、扩大空间分辨率来重建出更精细的图像。这不仅有效提升了模型的效果,还在一定程度上降低了计算成本。

相对应地,Pixel Unshuffle是Pixel Shuffle的逆操作,将空间维度重新映射回通道维度,这在特征压缩和编码解码任务中非常有用。

Pixel Shuffle和Pixel Unshuffle的原理解释及代码示例

Pixel Shuffle的工作原理

Pixel Shuffle是一种将通道维度转换为空间维度的操作,用于将特征图从较低的空间分辨率上采样到较高的分辨率。它的基本工作过程如下:

假设输入特征图的维度是 C × H × W C×H×W C×H×W,我们希望将其上采样到更高的空间分辨率 r H × r W rH×rW rH×rW,其中 r r r是放大倍率。Pixel Shuffle的操作步骤如下:

  1. 分解通道数:将特征图通道 C C C分解为 C ′ = C r 2 C'=\frac{C}{r^2} C=r2C,其中 C ′ C' C是新的通道数。
  2. 增加空间维度:将输入特征图的维度从 C × H × W C×H×W C×H×W变为 C ′ × r × r × H × W C'×r×r×H×W C×r×r×H×W,其中 r × r r×r r×r是每个通道中的小块大小。
  3. 重排特征图:将 r × r r×r r×r的小块移动到空间维度上,形成一个大小为 C ′ × r H × r W C'×rH×rW C×rH×rW的特征图。

通过上述过程,Pixel Shuffle可以将特征图的空间分辨率从 H × W H×W H×W放大到 r H × r W rH×rW rH×rW,同时减少通道数。

示例

假设输入特征图的维度是 4 × 2 × 2 4×2×2 4×2×2,我们希望放大2倍,即将分辨率换成 4 × 4 4×4 4×4。Pixel Shuffle操作过程如下:

  • 原始特征图 4 × 2 × 2 4×2×2 4×2×2
  • 分解通道数 4 4 4通道分解为 1 1 1通道的小块,即 1 × 2 × 2 × 2 × 2 1×2×2×2×2 1×2×2×2×2
  • 重排特征图:重排为 1 × 4 × 4 1×4×4 1×4×4的特征图。

这个过程相当于将每个通道中的像素块分配到更大的空间位置,从而实现高效的上采样操作。

代码示例

在PyTorch中,我们可以使用torch.nn.PixelShuffle来实现。以下是一个代码示例,展示如何在PyTorch中应用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)的张量。这里的(2)是上采样因子,代表输出空间维度扩大2倍,而通道数被缩小为 2 2 2^2 22倍,即将4个通道转换为更大的空间维度,使得高分辨率图像生成称为可能。通过这种方式,网络可以利用更多的控价信息,生成更高质量的图像。

Pixel Unshuffle的工作原理

Pixel Unshuffle 是 Pixel Shuffle 的逆操作,用于将特征图从较高的空间分辨率下采样到较低的分辨率,将空间维度的高频信息重新映射回通道中。这种操作在编码解码模型(将高分辨率图像重新映射回多通道低分辨率特征图)、图像压缩等任务中非常实用。

假设输入特征图的维度是 C ′ × r H × r W C'×rH×rW C×rH×rW,我们希望将其下采样至 C × H × W C×H×W C×H×W的特征图。Pixel Unshuffle 的具体操作步骤如下:

  1. 分解空间维度:将输入特征图的空间维度 r H × r W rH×rW rH×rW 分解为 H × W H×W H×W 和每个位置的小块大小 r × r r×r r×r
  2. 增加通道数:将特征图的维度从 C ′ × r H × r W C'×rH×rW C×rH×rW 变为 C × H × W C×H×W C×H×W,其中 C = C ′ × r 2 C=C'×r^2 C=C×r2,即原始通道数。
  3. 重排通道:将空间维度的 r × r r×r r×r 小块重新映射到通道维度中,从而实现特征的压缩。

通过上述步骤,Pixel Unshuffle 将空间信息压缩回通道中,实现了图像特征的有效下采样。

示例

假设输入特征图的维度是 1 × 4 × 4 1×4×4 1×4×4,希望将其下采样到 4 4 4 通道,尺寸为 2 × 2 2×2 2×2。Pixel Unshuffle 的操作过程如下:

  • 原始特征图 1 × 4 × 4 1×4×4 1×4×4
  • 分解空间维度:将空间维度 4 × 4 4×4 4×4 分解为 2 × 2 2×2 2×2 2 × 2 2×2 2×2的小块
  • 增加通道数:将特征图的维度变为 4 × 2 × 2 4×2×2 4×2×2

这个过程相当于将空间中的信息“压缩”到通道中,从而获得较低分辨率但信息密集的特征图。

代码示例

以下代码展示了如何用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])

在这个示例中,pixel_unshuffle将分辨率降回Pixel Shuffle之前的形状,将空间维度信息重映射回通道中,从而实现特征图的压缩。

可视化展示

为了能够更直观地展示Pixel Shuffle的效果,我们可以通过一张实际图片来演示。以下代码将读取一张图片,通过Pixel Shuffle操作后进行对比可视化,方便理解其在上采样中的效果。假设我们读取的图片为
DOG

import torch.nn as nn
import torchvision.transforms as transforms
from PIL import Image
import matplotlib.pyplot as plt# 1. 读取图片并预处理
img_path = 'your_image_path.jpg'  # 替换为你的图片路径
image = Image.open(img_path).convert('RGB')# 2. 图像转换为张量,并调整形状以适应 Pixel Shuffle
transform = transforms.Compose([transforms.Resize((8, 8)),  # 调整为较小尺寸以便观察transforms.ToTensor()
])img_tensor = transform(image).unsqueeze(0)  # 增加 batch 维度# 3. 增加通道以便演示 Pixel Shuffle(例如转为 4 通道)
img_tensor = img_tensor.repeat(1, 4, 1, 1)  # 这里将通道数扩展到4# 4. 执行 Pixel Shuffle 操作
pixel_shuffle = nn.PixelShuffle(2)
img_shuffled = pixel_shuffle(img_tensor)# 5. 可视化原图与 Pixel Shuffle 后的图像
fig, axs = plt.subplots(1, 2, figsize=(10, 5))# 原图
axs[0].imshow(transforms.ToPILImage()(img_tensor.squeeze(0)[:3, :, :]))  # 只取前3个通道
axs[0].set_title("Original")# Pixel Shuffle 后的图
axs[1].imshow(transforms.ToPILImage()(img_shuffled.squeeze(0)[:3, :, :]))  # 只取前3个通道
axs[1].set_title("Pixel Shuffle")plt.show()

在这段代码中,我们读取一张图片并将其转换为张量格式,扩展通道数以符合 Pixel Shuffle 的输入要求。通过 Pixel Shuffle 操作,图像的空间分辨率增加,而通道数减少。经过代码处理后的结果为image-20241114093549088

可视化后可以清晰看到,Pixel Shuffle 操作有效地上采样了图片,使其更加细化并且包含更丰富的细节信息。

Pixel Shuffle 与 Pixel Unshuffle 的实际应用

在实际应用中,Pixel Shuffle 常用于超分辨率任务,例如在著名的 EDSR(Enhanced Deep Residual Networks for Single Image Super-Resolution)或 SRGAN(Super-Resolution Generative Adversarial Network)模型中,Pixel Shuffle 是提升图像质量的关键组件之一。Pixel Unshuffle 则适用于特征图压缩和编码场景,帮助模型更高效地处理高维特征。

总结

Pixel Shuffle:用于上采样,将通道维度转换为空间维度,提升图像分辨率。

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

Pixel Shuffle 和 Pixel Unshuffle 通过在通道维度和空间维度之间进行信息重排,使得模型在不引入额外插值误差的情况下,实现高效的上采样和下采样操作。

参考文献

  1. Shi, Wenzhe, et al. “Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (2016): 1874-1883.
  2. Yu, Jiahui, et al. “Wide Activation for Efficient and Accurate Image Super-Resolution.” arXiv preprint arXiv:1808.08718 (2018).
    (2016): 1874-1883.
  3. Yu, Jiahui, et al. “Wide Activation for Efficient and Accurate Image Super-Resolution.” arXiv preprint arXiv:1808.08718 (2018).
  4. Lim, Bee, et al. “Enhanced Deep Residual Networks for Single Image Super-Resolution.” Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition Workshops (2017): 136-144.

相关文章:

深度学习中的Pixel Shuffle和Pixel Unshuffle:图像超分辨率的秘密武器

在深度学习的计算机视觉任务中,提升图像分辨率和压缩特征图是重要需求。Pixel Shuffle和Pixel Unshuffle是在超分辨率、图像生成等任务中常用的操作,能够通过转换空间维度和通道维度来优化图像特征表示。本篇文章将深入介绍这两种操作的原理,…...

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台

AntFlow 0.11.0版发布,增加springboot starter模块,一款设计上借鉴钉钉工作流的免费企业级审批流平台 传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大,也被企业广泛采用,然后也存着在诸如学习曲线陡峭,上手难度大&#x…...

golang操作mysql基础驱动github.com/go-sql-driver/mysql使用

golang中类似java操作mysql的jdbc一样,github.com/go-sql-driver/mysql也为go提供了基础接口,在开发中往往需要写更多的代码来满足自己的定制需求,java在驱动基础上有了扩展,orm框架诞生,mybatis、jpa等都是好用的扩展…...

正则表达式完全指南,总结全面通俗易懂

目录 元字符 连接符 限定符 定位符 修饰符(标记) 运算符优先级 普通字符集及其替换 零宽断言 正向先行断言 负向先行断言 正向后发断言 负向后发断言 捕获组 普通捕获组 命名捕获组 PS:非捕获组 正则表达式在线测试: 正则在线测试工具 …...

运维面试题.云计算面试题之三ELK

1.ELK是什么? ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写 Elasticsearch:负责日志检索和储存 Logstash:负责日志的收集和分析、处理 Kibana:负责日志的可视化 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,…...

C# DataTable使用Linq查询详解

前奏- C# 对DataTable进行查询 C# 可以对 DataTable 进行查询。在 .NET 框架中,DataTable 类提供了几种方法来查询数据,包括 Select 方法和 AsEnumerable 扩展方法(在 System.Data.DataSetExtensions 命名空间中)。 使用 Select…...

【企业级分布式系统】ELK优化

文章目录 Elasticsearch作为日志存储时的优化优化ES索引设置优化线程池配置锁定内存,不让JVM使用Swap减少分片数、副本数 Elasticsearch作为日志存储时的优化 linux内核优化、JVM优化、ES配置优化、架构优化(filebeat/fluentd代替logstash、加入kafka做…...

51单片机基础05 定时器

目录 一、为什么要定时器 二、定时器中断 1、定时器中断参数 2、定时器中断程序 3、定时器计数 一、为什么要定时器 前文提到,比如进行流水灯等操作,都是直接写了delay_ms这类操作。 但是在51单片机中,其一般就是靠双for进行的循环时延&…...

tdengine学习笔记实战-jdbc连接tdengine数据库

先上代码,里面有两种获取连接的方式,一个单例,一个连接池 package com.tdengine.utils;import com.alibaba.druid.pool.DruidDataSource;import java.sql.*; import java.util.Properties;public class TDConnectUtils {// 单例对象private …...

vue3项目执行npm install下载依赖报错问题排查方法

1、检查当前node与npm的版本 nodejs 和 npm 的版本是有适配的,具体可以看官网:nodejs 和 npm 的版本是有适配的 若是版本不兼容,修改node或者npm的版本即可,建议使用nvm版本管理工具,切换方便; 2、清除缓…...

【vue】项目迭代部署后 自动清除浏览器缓存

前言&#xff1a; vue项目打包部署上线后&#xff0c;因浏览器缓存问题&#xff0c;导致用户访问的依旧是上个迭代批次的旧资源&#xff0c;需要用户手动清除缓存才能更新至最新版本&#xff0c;影响用户体验。 解决方法&#xff1a; html根文件添加以下标签 <meta http-eq…...

Leetcode(滑动窗口习题思路总结,持续更新。。。)

讲解题目&#xff1a;长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target &#xff0c;找出该数组中满足其和 ≥ target 的长度最小的连续子数组。如果不存在符合条件的连续子数组&#xff0c;返回 0。示例: 输入: target 7, nums [2,3,1,2,4,3] 输出: 2 解…...

【UNIAPP】uniapp版图片压缩工具

二次封装的uniapp版本图片压缩、上传工具&#xff0c;支持全端&#xff08;H5、小程序、APP&#xff09; 新建文件&#xff1a;file-util.js class FileUtil {/*** [文件上传]* param {[object]} fileObj [图片地址]* param {[object]} formData [参数]* param {[str…...

PaddlePaddle 开源产业级文档印章识别PaddleX-Pipeline “seal_recognition”模型 开箱即用篇(一)

AI时代到来&#xff0c;各行各业都在追求细分领域垂直类深度学习模型&#xff0c;今天给大家介绍一个PaddlePaddle旗下&#xff0c;基于PaddleX Pipeline 来完成印章识别的模型“seal_recognition”。 官方地址&#xff1a;https://github.com/PaddlePaddle/PaddleX/blob/relea…...

Vue3 + Vite 项目引入 Typescript

文章目录 一、TypeScript简介二、TypeScript 开发环境搭建三、编译方式1. 自动编译单个文件2. 自动编译整个项目 四、配置文件1. compilerOptions基本选项严格模式相关选项&#xff08;启用 strict 后自动包含这些&#xff09;模块与导入相关选项 2. include 和 excludeinclude…...

微信小程序实战篇-分类页面制作

一、项目背景与目标 在微信小程序开发中&#xff0c;分类页面是一个常见且重要的功能模块。它能够帮助用户快速定位和浏览不同类别的商品或信息&#xff0c;提升用户体验和操作效率。今天&#xff0c;我们将深入探讨如何制作一个实用的微信小程序分类页面&#xff0c;先来看一下…...

第三十七章 如何清理docker 日志

如何清理docker 日志 目标 掌握docker 日志设置掌握docker日志的清理办法背景 在现代软件开发和部署环境中,Docker 容器技术因其轻量级、可移植性和高效资源利用的特点,已成为许多企业和开发团队的首选。Docker 容器在运行过程中会产生大量的日志信息,这些日志对于监控容器…...

二刷代码随想录第七天

454. 四数相加 II 先用map记录前两个数的和num1 num2的值出现了多少次再在后两个数组里找0 - (num1 num2),找到后就累加map中的次数 class Solution { public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3…...

1.tree of thought (使用LangChain解决4x4数独问题)

本教程将介绍如何使用LangChain库和chatglm API来解决一个4x4的数独问题。我们将通过以下步骤实现这一目标&#xff1a; 初始化chatglm 的聊天模型。定义数独问题和解决方案。创建一个自定义的检查器来验证每一步的思考。使用ToTChain来运行整个思考过程。 1. 初始化chatglm4…...

网络基础(4)IP协议

经过之前的学习对传输协议的学习&#xff0c;对于传输协议从系统底层到应用层对于socket套接字的学习已经有了一套完整的理论。 对于网络的层状结构&#xff0c;现在已经学习到了应用层和传输层: 在之前的学习中&#xff0c;通信的双方都只考虑了双方的传输层的东西&#xff0…...

124. 二叉树中的最大路径和【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 124. 二叉树中的最大路径和 一、题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径…...

echarts:简单实现默认显示两柱子折线,点击按钮后显示新的柱子

问&#xff1a; 用echarts实现&#xff1a;默认显示两柱子折线&#xff0c;点击“税率”按钮&#xff0c;显示税率柱子&#xff0c;之前的两柱子折线消失 回答&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8…...

视频里的音频怎么提取出来成单独文件?音频提取照着这些方法做

在数字时代&#xff0c;视频与音频的分离与重组已成为日常需求之一。无论是出于制作背景音乐、保存讲座内容&#xff0c;还是编辑播客素材&#xff0c;提取视频中的音频并将其保存为单独文件都显得尤为重要。视频里的音频怎么提取出来成单独文件&#xff1f;本文将详细介绍几种…...

Excel——宏教程(精简版)

一、宏的简介 1、什么是宏&#xff1f; Excel宏是一种自动化工具&#xff0c;它允许用户录制一系列操作并将其转换为VBA(Visual Basic for Applications)代码。这样&#xff0c;用户可以在需要时执行这些操作&#xff0c;以自动化Excel任务。 2、宏的优点 我们可以利用宏来…...

C++中的std::tuple和std::pair

在C标准库中&#xff0c;std::tuple和std::pair是两种极具实用性的数据结构&#xff0c;它们都具备存储多个元素的功能&#xff0c;但各自有其独特的适用环境和特性。本文旨在深入探讨这两者之间的区别&#xff0c;并阐述在不同应用场景下应如何合理选择使用。 一、基本概念 s…...

引力搜索算法

引力搜索算法过程&#xff0c;包括了初始化、适应度评估、质量计算、加速度计算、更新速度和位置的一些步骤。 import numpy as np import random as rd from math import exp, sqrt import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotli…...

【时间之外】IT人求职和创业应知【35】-RTE三进宫

目录 新闻一&#xff1a;京东工业发布11.11战报&#xff0c;多项倍增数据体现工业经济信心提升 新闻二&#xff1a;阿里云100万核算力支撑天猫双11&#xff0c;弹性计算规模刷新纪录 新闻三&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 认知…...

Linux的目录结构

/ ├── bin # Binary - 存放用户可以直接使用的基本二进制可执行文件 ├── sbin # System Binaries - 存放系统管理员专用的二进制可执行文件 ├── usr # Unix System Resources - 存放用户使用的软件和库文件 │ ├── bin # Binary - 用户级应用程序…...

python: generator IDAL and DAL using sql server 2019

其它数据库也是一样的思维方式 create IDAL # encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : P…...

命令执行简单

前言&#xff1a;小迪安全2022第一节反弹shell&#xff0c;小迪用的是两台都是云服务器&#xff0c;没有服务器可以在自己的主机上搭建也是可以的&#xff0c;主机上搭两个网站 思路&#xff1a;生成一个木马文件&#xff0c;下载到本机&#xff0c;然后利用本机上传到目标主机…...

wap网站的好处/网站设计师

目录 从登录接口获取到token,保存在sessionstory中 请求拦截器&#xff0c;保存到config 封装其他请求 请求拦截器的作用 请求等待中的页面效果 拦截器引入&#xff0c;变为插件的形式 使用插件 从登录接口获取到token,保存在sessionstory中 请求拦截器中 如果存在token&…...

html个人网站完整代码/seo服务 收费

由于之前在函数中插入了浮点运算,导致程序异常,最后查阅相关资料得知S3C6410的浮点协处理器VFP需要初始化,但是我现在也不知道如何使用汇编进行初始化,因此我选择了软件处理浮点运算,但是依然不成功,最后发现问题所在,将内核选择成ARM1176JZF-S后,就算选择了SOFTVFP,软件浮点运…...

北京给公司做网站多少钱/优化合作平台

人的一生应该这样度过人最宝贵的东西是生命,生命属于人只有一次.一个人的一生应该是这样度过的&#xff1a;当他回首往事的时候&#xff0c;他不会因为虚度年华而悔恨&#xff0c;也不会因为碌碌无为而羞耻&#xff1b;这样&#xff0c;在临死的时候&#xff0c;他就能够说&…...

帝国网站7.2 pc wap 跳转/百度指数大数据分享平台

你是否想知道企业大规模系统是如何设计的? 在软件开发开始之前&#xff0c;我们必须选择一个合适的架构&#xff0c;能提供所需的功能和质量特性。因此&#xff0c;在将架构应用到我们的设计之前&#xff0c;我们应该了解各种不同架构的特点。 01、什么是架构模式 根据维基百…...

给网站做优化刷活跃要收费吗/微信引流的十个方法

在这一篇文章里&#xff0c;我们关注反射及其相关话题。 反射可以帮助我们查看指定类型中的信息、创建类型的实例&#xff0c;调用类型的方法。我们平时使用框架&#xff0c;例如Spring、EJB、Hibernate等都大量的使用了反射技术。 反射简单示例 下面来演示反射相关的基本操作 …...

成都模板网站建设/站长之家官网登录入口

写在前面 项目开发中&#xff0c;记录错误日志有以下好处&#xff1a; 方便调试 便于发现系统运行过程中的错误 存储业务数据&#xff0c;便于后期分析 在java中&#xff0c;记录日志有很多种方式&#xff1a; 自己实现&#xff1a;自己写类&#xff0c;将日志数据&#xf…...