您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页PyTorch视觉工具箱:图像变换与上采样技术详解(1)

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

来源:意榕旅游网


Pytorch中Vision functions详解

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):用于提高空间分辨率的因子。

数学理式

假设输入张量的形状为

公式表示为:

其中,

  • 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 倍。 

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):用于降低空间分辨率的因子。

数学理式

假设输入张量的形状为 

公式表示为:

示例代码及输出

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

用法

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 元组,可以灵活地控制每个维度的填充大小。

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

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

总结

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务