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

总结

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

你可能感兴趣的:(pytorch,python,深度学习,人工智能,深度学习,机器学习,pytorch,python)