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

news2024/9/24 13:14:21

目录

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.coloradmin.cn/o/1397610.html

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

相关文章

Verilog基础:强度建模(二)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 三、拥有单个强度和确定值的net型信号的线与组合&#xff08;线网多驱动&#xff09; 首先来说明一下什么叫信号拥有单个强度和确定值&#xff0c;其实如果一个ne…

使用KTO进行更好、更便宜、更快速的LLM对齐

KTO全称为Kahneman-Tversky Optimisation&#xff0c;这种对齐方法使在我们的数据上对大型语言模型&#xff08;LLM&#xff09;进行对齐变得前所未有地容易和便宜&#xff0c;而且不会损害性能。大型语言模型的成功在很大程度上得益于与人类反馈的对齐。如果ChatGPT曾经拒绝回…

禅道使用教程

禅道的使用 一.禅道的使用1.添加部门和批量添加用户2.以产品经理的身份登录进行使用和操作2.1创建产品2.2创建模块2.3添加产品计划2.4添加产品需求2.5创建项目2.6设置团队 3.项目经理使用禅道3.1关联需求3.2批量分解,给人员分配任务3.3假设项目完成开发,项目经理创建版本 4.测试…

《数字图像处理-OpenCV/Python》连载:傅里叶变换与频域滤波

《数字图像处理-OpenCV/Python》连载&#xff1a;空间滤波之高斯滤波器 本书京东 优惠购书链接 https://item.jd.com/14098452.html 本书CSDN 独家连载专栏 https://blog.csdn.net/youcans/category_12418787.html 第 11 章 傅里叶变换与频域滤波 空间图像滤波是图像与滤波器核…

根据基因名批量查找它的Uniprot编号

背景&#xff1a; 前几天老师交给我一个任务&#xff0c;给我一个基因列表&#xff0c;让我查找它们所编码的蛋白质的蛋白质序列。我上了一下uniprot数据库&#xff0c;发现这个任务可以分成两步&#xff1a; 找到这个基因在Uniprot数据库中所对应的蛋白质编码根据蛋白质编码…

街机模拟游戏逆向工程(HACKROM)教程:[12]68K汇编-程序流控制

在之前的文章中&#xff0c;我们测试过一些简短的一小段程序&#xff0c;这些程序都有一个共同的程序运行流程&#xff0c;就是一句一句地向下执行&#xff0c;比如&#xff1a; movea.l #$325, a0 * ↓move.b #$01, (a0) * ↓move.b #$02, $01(a…

【软件测试常见Bug清单】

软件测试中&#xff0c;bug的类型有很多种&#xff0c;比如&#xff1a;代码错误、界面优化、设计缺陷、需求补充和用户体验等&#xff1b; 一般情况下&#xff0c;需求补充和设计缺陷比较好区分&#xff0c;但是代码错误、界面优化和用户体验区分不是很明显&#xff1b; 下面…

主动轮廓——计算机视觉中的图像分割方法

​ 一、说明 简单来说&#xff0c;计算机视觉就是为计算机提供类似人类的视觉。作为人类&#xff0c;我们很容易识别任何物体。我们可以很容易地识别山丘、树木、土地、动物等&#xff0c;但计算机没有眼睛&#xff0c;也没有大脑&#xff0c;因此它很难识别任何图像。计算机只…

PostgreSQL 的对象层次

所有的数据库离开数据量来谈性能都是耍流氓。 就你那几万条的数据库&#xff0c;用啥都行&#xff0c;典型的就是怎么方便怎么来。 不过 PostgreSQL 上手确实比 MySQL 概念更多。 PostgreSQL 比 MySQL 多了一层。 PostgreSQL 是从PostgreSQL 是从 Database&#xff0c;到 S…

RK3568平台 LT9211转接芯片调试笔记

一.简介 龙讯LT9211是一个高性能转换器&#xff0c;支持MIPI LVDS TTL两两之间转换。 使用此款芯片大部分为MIPI与LVDS进行互相转换。 下图为LT9211的典型应用图&#xff1a; 二.LT9211原理图 三.车载显示器和摄像头系统 四.调试LT9211输出 MIPI数据 &#xff08;1&#xf…

【Linux install】Ubuntu和win双系统安装及可能遇到的所有问题

文章目录 1.前期准备1.1关闭快速启动和安全启动1.1.1 shell命令行进入BIOS1.1.2 windows设置中高级启动1.1.3 在开机时狂按某个键进入BIOS1.1.4 关闭Fast boot和Secure boot 1.2 制作启动盘1.3 划分磁盘空间1.3.1 查看目前的虚拟内存大小 2.开始安装2.1 使用启动盘启动2.1.1 法…

洛谷NOIP2002 普及组 选数 +NOIP1999普及组 回文数

两道日常的练习题&#xff0c;废话不多说&#xff0c;直接上题上代码&#xff1a; 这道题目的难点在于怎样去根据一个不同的k值&#xff0c;通过代码来实现将所有符合题目要求的数字相加并且不重复的功能。下面请看代码&#xff0c;会有详细的讲解&#xff1a; #include<io…

又聊代码重构

今天有幸和一位朋友聊了一下代码的重构。回来之后感觉不够尽兴&#xff0c;所以决定再来输出一篇。 代码来至于今天下午的提交。 重构是对代码的觉知和业务的逻辑的进一步归纳总结 只有开发者对代码的不断觉察和理解&#xff0c;才会产生重构代码的念头。因此&#xff0c;驱动…

GO 中如何防止 goroutine 泄露

文章目录 概述如何监控泄露一个简单的例子泄露情况分类chanel 引起的泄露发送不接收接收不发送nil channel真实的场景 传统同步机制MutexWaitGroup 总结参考资料 今天来简单谈谈&#xff0c;Go 如何防止 goroutine 泄露。 概述 Go 的并发模型与其他语言不同&#xff0c;虽说它…

小白水平理解面试经典题目LeetCode 121 Best Time to Buy and Sell Stock

121 Best Time to Buy and Sell Stock (买卖股票的最佳时机) 你好&#xff0c;2024年的第一个月&#xff0c;又是秋风萧瑟天气凉&#xff0c;草木摇落露为霜。.。。在这个特殊的时代&#xff0c;作为我们普通的一个打工人&#xff0c;我们用这道题&#xff0c;开启对这个不符合…

菜鸟关于做前、后端的整理(html、js),以及疑问

涉及到后端的接口py&#xff0c;前端html和js 这三部分就按照如下格式放到server项目主路径下&#xff0c;这样后端机可以作为一个前端server main.pystaticmain.jsmain.htmlhtml 首先是html要设定网页的显示 <!DOCTYPE html> <html> <head><title>…

小米,我请你不要将卖手机那套话术带进汽车圈

文 | AUTO芯球 ​作者 | 雷歌 当你们用卖手机时那一套营销话术玩汽车&#xff0c;整个汽车圈都被你们逗乐了。 这不&#xff0c;在被用户问到“贵公司汽车有哪些驾驶模式”时&#xff0c;你们声称自己有16.8亿种驾驶模式。 你小米说这话的逻辑&#xff0c;不就是将加速、转…

网络安全最大的威胁:洞察数字时代的风险之巅

在数字化时代&#xff0c;网络安全问题越发突显&#xff0c;企业和个人都面临着来自多方面的威胁。究竟网络安全领域的最大威胁是什么&#xff1f;本文将深入探讨这一问题&#xff0c;揭示数字空间中最为严重的威胁。 1. 恶意软件的肆虐&#xff1a; 恶意软件一直是网络安全的…

29、WEB攻防——通用漏洞SQL注入增删改查盲注延迟布尔报错

文章目录 盲注增删改查 盲注 概念&#xff1a;在注入过程中&#xff0c;获取的数据不能回显至前端页面&#xff0c;此时我们需要利用一些方法进行判断或尝试&#xff0c;这个过程被称为盲注。 解决&#xff1a;常规的联合查询注入不行的情况。 分类&#xff1a; 基于布尔的SQ…

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…