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

目录

Pytorch中Vision functions详解

upsample_nearest

用途

用法

参数

注意事项

示例代码

upsample_bilinear

用途

用法

参数

注意事项

示例代码

grid_sample

用途

用法

参数

注意事项

示例代码

affine_grid

用途

用法

参数

注意事项

示例代码

总结


Pytorch中Vision functions详解

upsample_nearest

torch.nn.functional.upsample_nearest 是 PyTorch 中用于上采样输入张量的函数,它使用最近邻居像素值来实现。然而,需要注意的是,这个函数已经被废弃,并推荐使用 torch.nn.functional.interpolate 函数来替代。upsample_nearest 的功能可以通过 interpolate 函数中设置 mode='nearest' 来实现。

用途

upsample_nearest 主要用于上采样操作,即增加输入张量的空间尺寸。这在图像和视频处理中非常有用,例如放大图像或调整神经网络中特征图的大小。

用法

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

output = torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest')
  • input:输入张量。
  • size:输出的空间尺寸。可以是一个整数或包含几个整数的元组。
  • scale_factor:空间尺寸的乘数,必须是整数。

参数

  • input (Tensor):输入张量。
  • size (int or Tuple[int]):输出的空间尺寸。
  • scale_factor (int):空间尺寸的乘数。

注意事项

  • 当使用 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='nearest')
print(output.size())  # 输出新尺寸

 这段代码将输入张量的空间尺寸通过最近邻插值上采样2倍。这种方法在放大图像时保持了像素的原始值,不涉及像素值之间的平滑过渡。

upsample_bilinear

torch.nn.functional.upsample_bilinear 是 PyTorch 中用于上采样输入张量的函数,它使用双线性插值方法来实现。不过,这个函数已经被废弃,并推荐使用 torch.nn.functional.interpolate 函数来替代。upsample_bilinear 的功能可以通过在 interpolate 函数中设置 mode='bilinear'align_corners=True 来实现。

用途

upsample_bilinear 主要用于上采样操作,通过双线性插值来平滑地增加输入张量的空间尺寸。这种方法在图像放大、视频处理或调整神经网络中特征图的尺寸时非常有用,尤其当需要更平滑的图像质量时。

用法

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

output = torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='bilinear', align_corners=True)
  • input:输入张量。
  • size:输出的空间尺寸。可以是一个整数或包含两个整数的元组。
  • scale_factor:空间尺寸的乘数,可以是一个整数或包含两个整数的元组。

参数

  • input (Tensor):输入张量。
  • size (int or Tuple[int, int]):输出的空间尺寸。
  • scale_factor (int or Tuple[int, int]):空间尺寸的乘数。

注意事项

  • 当使用 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倍。双线性插值在放大图像时考虑了像素间的关系,产生比最近邻插值更平滑的结果。

grid_sample

torch.nn.functional.grid_sample 是 PyTorch 中的一个高级函数,用于根据输入张量和一个流场网格(flow-field grid)计算输出。这个函数主要在构建空间变换网络(Spatial Transformer Networks)时使用。

用途

grid_sample 函数允许你根据提供的网格对输入张量进行采样和空间变换。这在需要进行复杂空间变换的场景中特别有用,比如仿射变换、透视变换或者任何自定义的变换。

用法

output = torch.nn.functional.grid_sample(input, grid, mode='bilinear', padding_mode='zeros', align_corners=None)
  • input:输入张量,可以是4维(空间)或5维(体积)。
  • grid:流场网格,其形状决定了输出的空间尺寸。
  • mode:插值模式('bilinear', 'nearest', 'bicubic')。默认是 'bilinear'。请注意,bicubic 模式仅支持4维输入。
  • padding_mode:用于处理网格外部值的填充模式('zeros', 'border', 'reflection')。默认是 'zeros'。
  • align_corners:决定如何对齐输入和输出张量的角点。

参数

  • input (Tensor):输入张量,形状为 (N, C, H_in, W_in)(N, C, D_in, H_in, W_in)
  • grid (Tensor):流场网格,形状为 (N, H_out, W_out, 2)(N, D_out, H_out, W_out, 3)
  • mode (str):插值模式。
  • padding_mode (str):填充模式。
  • align_corners (bool, 可选):角点对齐方式。

注意事项

  • align_corners=True 时,网格位置依赖于相对于输入图像大小的像素大小,因此在不同分辨率的输入下,grid_sample() 的采样位置会有所不同。
  • mode='bicubic' 使用 -0.75 作为立方卷积算法的常数。不同软件包可能使用不同的常数值。
  • 在 CUDA 设备上,这个操作可能会产生不确定的梯度。

示例代码

import torch
import torch.nn.functional as F

# 示例输入和网格
input_tensor = torch.randn(1, 3, 24, 24)
grid = torch.randn(1, 8, 8, 2)

# 使用 grid_sample
output = F.grid_sample(input_tensor, grid)
print(output.size())  # 输出新尺寸

这段代码展示了如何使用 grid_sample 对输入张量进行空间变换。输入张量和流场网格的具体形状将决定输出张量的尺寸。 

affine_grid

torch.nn.functional.affine_grid 是 PyTorch 中用于生成2D或3D流场(采样网格)的函数,这是在给定一批仿射变换矩阵 theta 的情况下完成的。它通常与 grid_sample() 函数一起用于构建空间变换网络(Spatial Transformer Networks)。

用途

affine_grid 函数主要用于生成用于空间变换的采样网格。它根据提供的仿射变换矩阵,创建一个网格,该网格可用于之后的图像或特征图的空间变换。

用法

output = torch.nn.functional.affine_grid(theta, size, align_corners=None)
  • theta:仿射变换矩阵的批次,形状为 (N×2×3) 用于2D变换或 (N×3×4) 用于3D变换。
  • size:目标输出图像尺寸,形状为 (N, C, H, W) 用于2D或 (N, C, D, H, W) 用于3D。
  • align_corners:决定如何对齐角点。

参数

  • theta (Tensor):仿射变换矩阵的批次。
  • size (torch.Size):目标输出图像尺寸。
  • align_corners (bool, 可选):角点对齐方式。

注意事项

  • align_corners=True 时,网格位置依赖于相对于输入图像大小的像素大小,因此在不同分辨率的输入下,grid_sample() 的采样位置会有所不同。
  • 在版本1.2.0之前,align_corners 的默认行为是 True。自那时起,其默认行为已更改为 False,以使其与 interpolate() 的默认行为一致。
  • align_corners=True 时,对于1D数据的2D仿射变换和2D数据的3D仿射变换(即当其中一个空间维度为单位大小时)是未定义的。

示例代码

import torch
import torch.nn.functional as F

# 示例仿射变换矩阵
theta = torch.tensor([[[1, 0, 0], [0, 1, 0]]], dtype=torch.float)
size = torch.Size((1, 3, 24, 24))

# 生成仿射网格
grid = F.affine_grid(theta, size)
print(grid.size())  # 输出网格尺寸

 这段代码示范了如何使用 affine_grid 生成一个2D采样网格,该网格可以随后用于 grid_sample() 函数来应用空间变换。在这个例子中,theta 表示一个恒等变换,因此生成的网格将不会改变输入数据的空间布局。

总结

在这篇博客中,我们探讨了PyTorch中几个关键的视觉函数,它们在进行图像和视频处理时扮演着重要的角色。这些功能包括:upsample_nearestupsample_bilinear 用于上采样操作,通过最近邻和双线性插值方法来增加输入张量的空间尺寸;grid_sample 用于更复杂的空间变换,允许根据提供的网格对输入张量进行采样和变换;affine_grid 生成用于空间变换的采样网格,通常与 grid_sample 结合使用来构建空间变换网络。所有这些函数都支持多种插值和填充模式,提供了对图像的高级操作能力。

你可能感兴趣的:(pytorch,python,深度学习,pytorch,人工智能,python,深度学习,神经网络)