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,输入和输出张量在角点对齐。

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能机器人与旋量代数(9)

Chapt 3. 螺旋运动与旋量代数 3.1 螺旋运动 螺旋运动是关于一条空间直线的一个旋转运动&#xff0c;并伴随沿此直线的一个平移。是一种刚体绕空间轴 s s s旋转 θ \theta θ角&#xff0c;再沿该轴平移距离 d d d的复合运动&#xff0c;类似螺母沿螺纹做进给运动的情形。 一…

2024年【焊工(初级)】考试内容及焊工(初级)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;考试内容参考答案及焊工&#xff08;初级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及焊工&#xff08;初级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

docker 使用 vcs/2018 Verdi等 eda 软件

好不容易在ubuntu 安装好了eda软件&#xff0c;转眼就发现了自己的无知。 有博主几年前就搞定了docker上的EDA工具。而且更全&#xff0c;更简单。只恨自己太无知啊。 Synopsys EDA Tools docker image - EDA资源使用讨论 - EETOP 创芯网论坛 (原名&#xff1a;电子顶级开发网…

python解决从有序数组中寻找中位数

如果给定两个长度分别是m和n的有序数组array1和array2&#xff0c;需要对这两个有序数组找出其中的中位数&#xff0c;需要保证时间复杂度是O(long(min(m,n))&#xff0c;空间复杂度是O(1)。如下例子&#xff1a; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#…

【教程】混淆Dart 代码

什么是代码混淆&#xff1f; 代码混淆是一种将应用程序二进制文件转换为功能上等价&#xff0c;但人类难于阅读和理解的行为。在编译 Dart 代码时&#xff0c;混淆会隐藏函数和类的名称&#xff0c;并用其他符号替代每个符号&#xff0c;从而使攻击者难以进行逆向工程。 Flut…

ChatGPT和文心一言哪个更好用?

目录 一、ChatGPT和文心一言大模型的对比分析 1.1 二者训练的数据情况分析 1.2 训练大模型数据规模和参数对比 1.3 二者3.5版本大模型对比总结 二、ChatGPT和文心一言功能对比分析 2.1 二者产品提供的功能情况分析 2.2 测试一下各种功能的特性 2.2.1 文本创作能力 2.2…

电脑提示“No Boot Device”怎么办?

在Windows 11/10/8/7启动时遇到错误如“No Boot Device Found”和“未找到引导设备硬盘3F0”时&#xff0c;会导致电脑无法正常开机。那么&#xff0c;No Boot Device错误该怎么修复呢&#xff1f;下面我们就来了解一下。 修复 1. 检查启动顺序并将BIOS的设置重置为默认值 为…

非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例)

Title: 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (II, Python 简单实例) 姊妹博文 非线性最小二乘问题的数值方法 —— 狗腿法 Powell‘s Dog Leg Method (I - 原理与算法) 0.前言 本篇博文作为对前述 “非线性最小二乘问题的数值方法 —— 狗腿法…

【mars3d】内置的右键测量菜单单击关闭按钮无法关闭测量结果说明

1.【mars3d】内置的右键测量菜单单击关闭按钮无法关闭测量结果说明 2.内置的右击地图查看此处坐标&#xff0c;出现的弹框按钮同样无法关闭的解决方案。 解决说明&#xff1a; 1.这个问题和mars3d没有关系&#xff0c;是and那边的问题&#xff0c;需要尝试固定下vue版本3.3.0或…

测试 yolov8 分割模型 边缘检测

发现 cfg/default.yaml 参数 mask_ratio 等于4 直接训练如下边缘分割标签,推理时mask 稀疏&#xff0c;训练时分数偏低,mask_ratio 改为1训练时打印的mask 的 P指标一直为0,将imgsz原图size 训练分数也不高 标注用的是labelme多边形 阅读源码发现可能是因为mask缩放导致 且出现…

springboot配置项动态刷新

文章目录 一&#xff0c;序言二&#xff0c;准备工作1. pom.xml引入组件2. 配置文件示例 三&#xff0c;自定义配置项动态刷新编码实现1. 定义自定义配置项对象2. 添加注解实现启动时自动注入3. 实现yml文件监听以及文件变化处理 四&#xff0c;yaml文件转换为java对象1. 无法使…

IPv4 开始收费!新的 IT 灾难?

对于想要继续使用公共IPv4地址的用户而言&#xff0c;他们主要靠回收和未使用地址段的释放才能用上IPv4&#xff0c;其中这些地址要么来自倒闭的组织&#xff0c;要么来自于那些已经迁移到IPv6时不再需要的地址。 不难想象&#xff0c;获取日益稀缺的IPv4中间过程变得复杂&…

接口测试之webservice

什么是Webservice Web service是一个平台独立的&#xff0c;低耦合的&#xff0c;自包含的、基于可编程的web的应用程序&#xff0c;可使用开放的XML&#xff08;标准通用标记语言下的一个子集&#xff09;标准来描述、发布、发现、协调和配置这些应用程序&#xff0c;用于开发…

STL之map【有序哈希表】使用方法

这里写目录标题 map【有序哈希表】使用方法1.头文件:2.创建map:3.添加键值对:4.查找键值对&#xff1a;5.遍历键-值对&#xff1a;5.综合示例&#xff1a;班级学生 map【有序哈希表】使用方法 话不多说&#xff0c;接着讲map用法&#xff1a; map&#xff1a;映射&#xff0c…

spyder 对 lambda 函数的调试

如何进入lambda匿名函数进行调试&#xff1a; import pandas as pddef func(a, b):return a bseries pd.Series([1,2,3,4]) a series.apply(lambda x: func(x, 2)) print(a) 在调用匿名函数的地方打上断点&#xff0c;也就是这一行&#xff1a; a series.apply(lambda x…

总结Symbol、Set、WeakSet、Map、WeakMap

前言 这几个es6新增的数据结构和变量类型&#xff0c;不经常用&#xff0c;好容易忘记啊。在此记录一下&#xff0c;方便复习。 Symbol Symbol是es6新增的基本数据类型&#xff0c;用于生成独一无二的值。 基本使用 1、创建两个描述相同的值&#xff0c;也不会相等。 let s1 …

R303 指纹识别模块功能实现流程

1 基本通信流程 1.1 UART 命令包的处理过程 1.2 UART 数据包的发送过程 UART 传输数据包前&#xff0c;首先要接收到传输数据包的指令包&#xff0c;做好传输准备后发送成功应答包&#xff0c;最后才开始传输数据包。数据包主要包括&#xff1a;包头、设备地址、包标识、包长…

基于jQuery与Spring MVC实现用户密码异步修改的实战演示

文章目录 一、实战概述二、实战步骤&#xff08;一&#xff09;创建表单1、表单界面2、表单代码3、脚本代码 &#xff08;二&#xff09;后端控制器&#xff08;三&#xff09;测试代码&#xff0c;查看效果1、弹出更改密码表单2、演示更改密码操作 三、实战总结 一、实战概述 …

【MySQL】最左匹配原则

最左匹配原则 0x1 简单说下什么是最左匹配原则 顾名思义&#xff1a;最左优先&#xff0c;以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like&#xff09;就会停止匹配。 例如&#xff1a;b 2 如果建立(a&#xff0c;b&#xff09;顺序…

苏州渭塘镇应用无人机“智慧执法”

苏州渭塘镇应用无人机“智慧执法” 在今年以来&#xff0c;渭塘镇综合行政执法局采用了“空中地面”的立体监督模式&#xff0c;以实现对“互联网执法”工作的深入推进。在这一模式下&#xff0c;无人机巡查作为技术手段得到广泛应用&#xff0c;而安全生产监管信息系统和综合…