PyTorch视觉工具箱:图像变换与上采样技术详解(1)

目录

Pytorch中Vision functions详解

pixel_shuffle

用途

用法

使用技巧

注意事项

参数

数学理论公式

示例代码及输出 

pixel_unshuffle

用途

用法

使用技巧

注意事项

参数

数学理论公式

示例代码及输出

pad

用途

用法

使用技巧

注意事项

参数

示例代码

interpolate

用途

用法

使用技巧

注意事项

示例代码

upsample

用途

用法

参数

注意事项

示例代码

总结


Pytorch中Vision functions详解

pixel_shuffle

torch.nn.functional.pixel_shuffle 是 PyTorch 中一个用于调整图像张量分辨率的函数。下面我会详细介绍这个模块的用途、用法、使用技巧、注意事项、参数以及数学理论公式。同时,我会提供一个使用示例代码,并将输出结果作为注释添加在代码中。

用途

pixel_shuffle 主要用于超分辨率图像重建领域,可以将低分辨率图像通过上采样转换为高分辨率图像。这个过程通常在卷积神经网络中进行,网络输出的低分辨率、高通道数的图像通过 pixel_shuffle 重排成高分辨率、低通道数的图像。

用法

output = torch.nn.functional.pixel_shuffle(input, upscale_factor)
  • input:输入张量,其形状应为 (batch_size, channels * upscale_factor^2, height, width)
  • upscale_factor:空间分辨率提升因子

使用技巧

  • 确保 input 张量的通道数是 upscale_factor^2 的倍数,这是因为 pixel_shuffle 需要将这些通道重新排列到空间维度。
  • 用于超分辨率的网络设计时,最后一个卷积层的输出通道数应设置为目标通道数乘以 upscale_factor^2

注意事项

  • input 的形状和 upscale_factor 必须正确匹配,否则会出现错误。
  • upscale_factor 必须是正整数。

参数

  • input (Tensor):输入的张量。
  • upscale_factor (int):用于提高空间分辨率的因子。

数学理论公式

假设输入张量的形状为(*,C\times r^{2},H,W) ,其中C是通道数,H和W是高度和宽度,r是放大因子。pixel_shuffle 会将这个张量重新排列为 (*,C,H\times r,W\times r) 。

公式表示为:

output(n,c,h,w)=input(n,cr^{2}+rh_{mod}+w_{mod},h_{div},w_{div})

其中,

  • n 是批量大小。
  • c 是通道索引。
  • ℎ,w 是高度和宽度索引。
  • ℎ_div=⌊ℎ/r​⌋
  • w_div=⌊w/r​⌋
  • ℎ_mod=ℎ mod r
  • w_mod=w mod r

示例代码及输出 

import torch
import torch.nn.functional as F

# 输入张量
input = torch.randn(1, 9, 4, 4)  # 随机生成一个张量
upscale_factor = 3  # 放大因子

# 使用 pixel_shuffle
output = F.pixel_shuffle(input, upscale_factor)

# 打印输出尺寸
print(output.size())  # 输出:torch.Size([1, 1, 12, 12])

这段代码展示了如何使用 pixel_shuffle 将一个形状为 [1, 9, 4, 4] 的张量重排为 [1, 1, 12, 12]。这里 9 是原始通道数,3 是放大因子(upscale_factor),输出张量的通道数变为 1,而高度和宽度各增加了 3 倍。 

pixel_unshuffle

torch.nn.functional.pixel_unshuffle 是 PyTorch 中用于执行与 pixel_shuffle 相反操作的函数。它通过重新排列元素来降低张量的空间分辨率。下面我将详细介绍这个函数的用途、用法、使用技巧、注意事项、参数及其数学理论公式,并提供一个代码示例。

用途

pixel_unshuffle 主要用于将高分辨率、低通道数的图像转换为低分辨率、高通道数的图像。这在某些图像处理任务中非常有用,比如降采样或特征图的空间压缩。

用法

output = torch.nn.functional.pixel_unshuffle(input, downscale_factor)
  • input:输入张量,其形状应为 (batch_size, channels, height * r, width * r)
  • downscale_factor:空间分辨率降低因子,即 r

使用技巧

  • input 张量的高度和宽度应该是 downscale_factor 的整数倍,以确保正确的降采样。
  • 通常与 pixel_shuffle 成对使用,以进行图像的上采样和下采样。

注意事项

  • 输入张量的形状和 downscale_factor 必须匹配,以避免尺寸不一致的错误。
  • downscale_factor 应该是一个正整数。

参数

  • input (Tensor):输入的张量。
  • downscale_factor (int):用于降低空间分辨率的因子。

数学理论公式

假设输入张量的形状为 (*,C,H\times r,W\times r) 其中 C 是通道数,H 和 W 是高度和宽度,r 是降采样因子。pixel_unshuffle 将这个张量重新排列为 (*,C\times r^{2},H,W)

公式表示为:

output(n,cr^{2}+rh_{mod}+w_{mod},h_{div},w_{div})=input(n,c,h,w)

示例代码及输出

import torch
import torch.nn.functional as F

# 输入张量
input = torch.randn(1, 1, 12, 12)  # 随机生成一个张量
downscale_factor = 3  # 降采样因子

# 使用 pixel_unshuffle
output = F.pixel_unshuffle(input, downscale_factor)

# 打印输出尺寸
print(output.size())  # 输出:torch.Size([1, 9, 4, 4])

这段代码展示了如何使用 pixel_unshuffle 将一个形状为 [1, 1, 12, 12] 的张量重排为 [1, 9, 4, 4]。这里的 1 是原始通道数,3 是降采样因子(downscale_factor),输出张量的通道数变为 9,而高度和宽度各减少了 3 倍。 

pad

据给定的参数在张量的不同维度上添加填充。下面是关于这个函数的详细说明,包括用途、用法、使用技巧、注意事项、参数以及代码示例。

用途

pad 函数主要用于在张量的边缘添加填充。这在图像处理、信号处理、序列建模等领域常见,用于调整数据的形状或尺寸,或为卷积操作预处理数据。

用法

output = torch.nn.functional.pad(input, pad, mode='constant', value=0)
  • input:N维的输入张量。
  • pad:一个长度为m的元组,指定每个维度的填充大小。m的值必须是2的倍数,且不超过输入张量的维数的两倍。
  • mode:指定填充模式,可以是 'constant'(常数填充)、'reflect'(反射填充)、'replicate'(复制填充)或 'circular'(循环填充)。默认为 'constant'
  • value:在 constant 模式下的填充值。默认为0。

使用技巧

  • 选择合适的 pad 元组大小,确保填充操作符合预期。
  • 在使用 'reflect''replicate''circular' 模式时,了解不同模式的具体行为,选择最适合应用场景的填充方式。

注意事项

  • 当使用 CUDA 后端时,这个操作在其反向传播中可能会产生不确定行为,这可能会影响结果的可重现性。

参数

  • input (Tensor):N维输入张量。
  • pad (tuple):m元素元组,其中 m/2 <=  输入维度且m为偶数。
  • mode:填充模式,可选 'constant''reflect''replicate''circular'。默认为 'constant'
  • value:在 'constant' 模式下的填充值。默认为0。

示例代码

import torch
import torch.nn.functional as F

# 示例张量
t4d = torch.empty(3, 3, 4, 2)

# 示例1:只填充最后一个维度
p1d = (1, 1)  # 每边填充1
out = F.pad(t4d, p1d, "constant", 0)  # 常数填充
print(out.size())  # 输出:torch.Size([3, 3, 4, 4])

# 示例2:填充最后两个维度
p2d = (1, 1, 2, 2)  # 最后一个维度每边填充1,倒数第二个维度每边填充2
out = F.pad(t4d, p2d, "constant", 0)
print(out.size())  # 输出:torch.Size([3, 3, 8, 4])

# 示例3:填充最后三个维度
p3d = (0, 1, 2, 1, 3, 3)  # 分别填充 (0, 1), (2, 1), (3, 3)
out = F.pad(t4d, p3d, "constant", 0)
print(out.size())  # 输出:torch.Size([3, 9, 7, 3])

这些代码示例展示了如何使用不同的 pad 参数来在不同的维度上添加填充。通过调整 pad 元组,可以灵活地控制每个维度的填充大小。

interpolate

torch.nn.functional.interpolate 是 PyTorch 中用于对张量进行上采样或下采样的函数。它能够改变输入张量的大小,通过指定的大小或缩放因子。下面是这个函数的详细说明,包括用途、用法、使用技巧、注意事项和参数。

用途

interpolate 函数主要用于改变张量的空间尺寸。它在图像和视频处理中非常有用,例如改变图像的分辨率或调整网络中特征图的大小。

用法

output = torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False)
  • input:输入张量。
  • size:输出的空间尺寸。可以是一个整数或包含几个整数的元组。
  • scale_factor:空间尺寸的乘数。如果是元组,其长度必须与空间维度数匹配;input.dim() - 2
  • mode:用于上采样的算法,可选项包括 'nearest', 'linear', 'bilinear', 'bicubic', 'trilinear', 'area', 'nearest-exact'。
  • align_corners:当使用 'linear', 'bilinear', 'bicubic', 'trilinear' 时,此参数决定了输入和输出张量如何对齐。
  • recompute_scale_factor:是否重新计算用于插值计算的缩放因子。
  • antialias:是否应用抗锯齿。适用于 'bilinear', 'bicubic' 模式。

使用技巧

  • 选择合适的 mode 来获得所需的插值效果。
  • 当使用 'linear', 'bilinear', 'bicubic', 'trilinear' 时,合理设置 align_corners 参数。
  • 如果需要精确控制输出尺寸,使用 size 参数;如果希望基于输入尺寸的相对变化,使用 scale_factor

注意事项

  • 使用 bicubic 模式时,可能会出现超调现象,即生成的值超出了图像数据的正常范围。
  • nearest-exact 模式与 Scikit-Image 和 PIL 的最近邻插值算法匹配,而 nearest 模式与 OpenCV 的 INTER_NEAREST 插值算法匹配。
  • 对于 float16 类型的张量,在使用 CUDA 时,interpolate 操作的梯度可能不准确,特别是在使用 ['linear', 'bilinear', 'bicubic', 'trilinear', 'area'] 模式时。
  • 在 CUDA 设备上,该操作可能会产生不确定的梯度。

示例代码

import torch
import torch.nn.functional as F

# 示例张量
input_tensor = torch.randn(1, 3, 24, 24)  # 假设这是一个图像批次

# 上采样示例
output = F.interpolate(input_tensor, scale_factor=2, mode='bilinear', align_corners=True)
print(output.size())  # 输出新尺寸

这段代码将输入张量的空间尺寸通过双线性插值上采样2倍。注意,由于 align_corners=True,输入和输出张量在角点对齐。 

upsample

torch.nn.functional.upsample 是 PyTorch 中用于对输入张量进行上采样的函数。不过,需要注意的是,这个函数已经被废弃,推荐使用 torch.nn.functional.interpolate 来替代。upsample 函数和 interpolate 函数在功能上是等效的。以下是关于 upsample 函数的详细说明,包括用途、用法、参数以及注意事项。

用途

upsample 用于上采样输入张量,即增加其空间维度的大小。这在图像处理、视频处理以及神经网络中改变特征图的尺寸等场景中非常有用。

用法

由于 upsample 已被废弃,以下用法适用于 interpolate 函数,它们在功能上是相同的:

output = torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None)

  • input:输入张量。
  • size:输出的空间尺寸。可以是一个整数或包含几个整数的元组。
  • scale_factor:空间尺寸的乘数。如果是元组,其长度必须与空间维度数匹配;input.dim() - 2
  • mode:用于上采样的算法,可选项包括 'nearest', 'linear', 'bilinear', 'bicubic', 'trilinear'。
  • align_corners:决定输入和输出张量如何对齐的布尔值。

参数

  • input (Tensor):输入张量。
  • size (int or Tuple[int]):输出的空间尺寸。
  • scale_factor (float or Tuple[float]):空间尺寸的乘数。
  • mode (str):用于上采样的算法。
  • align_corners (bool, optional):是否对齐输入和输出张量的角点。

注意事项

  • 使用 bicubic 模式时,可能会出现超调现象,即生成的值超出了图像数据的正常范围。
  • align_corners=True 时,线性插值模式(如 'linear', 'bilinear', 'trilinear')可能不会按比例对齐输入和输出像素,因此输出值可能依赖于输入尺寸。
  • 在 CUDA 设备上,这个操作可能会产生不确定的梯度。

示例代码

import torch
import torch.nn.functional as F

# 示例张量
input_tensor = torch.randn(1, 3, 24, 24)  # 假设这是一个图像批次

# 上采样示例
output = F.interpolate(input_tensor, scale_factor=2, mode='bilinear', align_corners=True)
print(output.size())  # 输出新尺寸

 这段代码将输入张量的空间尺寸通过双线性插值上采样2倍。由于 align_corners=True,输入和输出张量在角点对齐。

总结

这些函数的使用依赖于精确的参数设置和对应用场景的理解。每个函数都有其独特的应用范围和参数要求,如填充大小、缩放因子、插值模式等。在使用这些函数时,重要的是要注意它们在不同模式和参数下的行为,以及它们如何影响最终的输出结果。这些视觉函数为处理图像和视频数据提供了灵活而强大的手段,从基本的像素操作到复杂的空间变换,都是现代计算机视觉和深度学习应用不可或缺的部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/334735.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SMT回流焊工艺之回流温度曲线

引言 在SMT生产流程中&#xff0c;如何控制回焊炉的温度是非常重要的一环&#xff0c;好的炉温曲线图意味着可以形成良好的焊点。 上一期分享&#xff08;SMT回流焊温度解析之锡膏焊接特性&#xff09;中&#xff0c;我们着重介绍了SMT回流工艺中的锡膏焊接部分。本期内容主要…

Leetcode2957. 消除相邻近似相等字符

Every day a Leetcode 题目来源&#xff1a;2957. 消除相邻近似相等字符 解法1&#xff1a;遍历 分类讨论 遍历字符串 word&#xff0c;比较相邻的 3 个元素 word[i - 1]、word[i] 和 word[i 1]&#xff0c;记 left_distance abs(mid - left)&#xff0c;right_distance…

大模型背景下计算机视觉年终思考小结(二)

1. 引言 尽管在过去的一年里大模型在计算机视觉领域取得了令人瞩目的快速发展&#xff0c;但是考虑到大模型的训练成本和对算力的依赖&#xff0c;更多切实的思考是如果在我们特定的小规模落地场景下的来辅助我们提升开发和落地效率。本文从相关数据集构造&#xff0c;预刷和生…

rust使用protobuf

前言 c,java,go 等直接是用 &#xff0c;具体就不说了&#xff0c;这章主要讲述rust 使用protobuf 这章主要讲述2种 1 > protoc protoc-gen-rust plugin 2> protoc prost-build 1&#xff1a;环境 win10 rustrover64 25-2 下载地址 https://github.com/protocolbu…

《WebKit 技术内幕》之四(3): 资源加载和网络栈

3. 网络栈 3.1 WebKit的网络设施 WebKit的资源加载其实是交由各个移植来实现的&#xff0c;所以WebCore其实并没有什么特别的基础设施&#xff0c;每个移植的网络实现是非常不一样的。 从WebKit的代码结构中可以看出&#xff0c;网络部分代码的确比较少的&#xff0c;它们都在…

2.4 网络层03

2.4 网络层03 2.4.7 路由表 1、什么是路由&#xff1f; 路由就是报文从源端到目的端的路径。当报文从路由器到目的网段有多条路由可达时&#xff0c;路由器可以根据路由表中最佳路由进行转发。 2、什么是路由表&#xff1f; 在计算机网络中&#xff0c;路由表&#xff08…

鸿蒙原生应用/元服务实战-AGC中几个菜单栏的关系

大家是否清楚AGC这几个菜单栏的相互关系&#xff1f; 我的元服务&#xff1a;点击后跳转到“我的应用”列表中的“HarmonyOS”页签&#xff0c;并且过滤出元服务。开发者可以在此模块中管理和运营元服务&#xff0c;例如创建元服务、发布元服务等。 我的应用&#xff1a;开发者…

2024最新Java高频面试题总结(附答案PDF)春招面试必备!

《Java面试全解析》1000道 面试题大全详解 本人是 2009 年参加编程工作的&#xff0c;一路上在技术公司摸爬滚打&#xff0c;前几年一直在上海&#xff0c;待过的公司有 360 和游久游戏&#xff0c;因为自己家庭的原因&#xff0c;放弃了阿里钉钉团队的 offer 回到了西安。 从…

Qt事件过滤

1.相关说明 监控鼠标进入组件、出组件、点击组件、双击组件的事件&#xff0c;需要重写eventFilter函数 2.相关界面 3.相关代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui-&…

解决国内Linux服务器无法使用Github的方法

解决思路&#xff1a;修改Host https://www.ipaddress.com/ 利用上面的网站查询github.com和raw.githubusercontent.com的DNS解析的IP地址 最后&#xff0c;修改服务器的/etc/hosts 添加如下两行&#xff1a; 140.82.112.3 github.com 185.199.108.133 raw.githubuserconte…

04 MyBatisPlus之逻辑删除+锁+防全表更新/删除+代码生成插件

1 逻辑删除 1. 1 什么是逻辑删除 , 以及逻辑删除和物理删除的区别? 逻辑删除&#xff0c;可以方便地实现对数据库记录的逻辑删除而不是物理删除。逻辑删除是指通过更改记录的状态或添加标记字段来模拟删除操作&#xff0c;从而保留了删除前的数据&#xff0c;便于后续的数据…

flink operator 拉取阿里云私有镜像(其他私有类似)

创建 k8s secret kubectl --namespace flink create secret docker-registry aliyun-docker-registry --docker-serverregistry.cn-shenzhen.aliyuncs.com --docker-usernameops_acr1060896234 --docker-passwordpasswd --docker-emailDOCKER_EMAIL注意命名空间指定你使用的 我…

MeterSphere本地化部署实践

项目结构 搭建本地环境 安装JDK11&#xff0c;配置好JDK环境&#xff0c;系统同时支持JDK8和JDK11安装IEAD&#xff0c;配置JDK环境配置maven环境,IDEA配置(解压可以直接使用)无限重置IDEA试用期配置redis环境(解压可以直接使用) 配置kafka环境 安装mysql-5.7环境&#xff…

Java并发基础:一文讲清util.concurrent包的作用

java.util.concurrent包是 Java 中用于并发编程的重要工具集&#xff0c;提供了线程池、原子变量、并发集合、同步工具类、阻塞队列等一系列高级并发工具类&#xff0c;使用这些工具类可以极大地简化并发编程的难度&#xff0c;减少出错的可能性&#xff0c;提高程序的效率和可…

街机模拟游戏逆向工程(HACKROM)教程:[13]68K汇编-jmp指令

在68K汇编中&#xff0c;有多个可以改变PC寄存器的指令&#xff1a; jmp 该指令在之前的章节已经介绍&#xff0c;该指令可以把目的操作数传递到PC寄存器&#xff0c;实现程序的流程控制。 bra 该指令的作用与jmp几乎相同&#xff0c;同样可以把目的操作数传递到PC寄存器&a…

【论文阅读】ControlNet、文章作者 github 上的 discussions

文章目录 IntroductionMethodControlNetControlNet for Text-to-Image DiffusionTrainingInference Experiments消融实验定量分析 在作者 github 上的一些讨论消融实验更进一步的探索Precomputed ControlNet 加快模型推理迁移控制能力到其他 SD1.X 模型上其他 Introduction 提…

贪心算法 ——硬币兑换、区间调度、

硬币兑换&#xff1a; from book&#xff1a;挑战程序设计竞赛 思路&#xff1a;优先使用大面额兑换即可 package mainimport "fmt"func main() {results : []int{}//记录每一种数额的张数A : 620B : A//备份cnts : 0 //记录至少需要多少张nums : []int{1, 5, 10, 5…

idea中使用git提交代码报 Nothing To commit No changes detected

问题描述 在idea中右键&#xff0c;开始将变更的代码进行提交的时候&#xff0c;【Commit Directory】点击提交的时候 报 Nothing To commit No changes detected解决方案 在这里点击Test 看看是不是能下面显示git版本&#xff0c;不行的话 会显示一个 fix的字样&#xff0c;行…

专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信

今年专业课810信号与系统130&#xff0c;总分380顺利考上哈尔滨工程大学&#xff0c;一年的努力终于换来最后的录取&#xff0c;期中复习有得有失&#xff0c;以下总结一下自己的复习经历&#xff0c;希望对大家有帮助&#xff0c;天道酬勤&#xff0c;加油&#xff01;专业课&…

SSE[Server-Sent Events]实现页面流式数据输出(模拟ChatGPT流式输出)

文章目录 前言SSE 简介应用场景区分浏览器支撑性 实现过程Web VUE核心解析数据代码实例demo参考 前言 服务端向客户端推送消息&#xff0c;除了用WebSocket可实现&#xff0c;还有一种服务器发送事件(Server-Sent Events)简称 SSE&#xff0c;这是一种服务器端到客户端(浏览器)…