【PyTorch】torch.nn.functional.interpolate——采样操作

1. 函数语法格式

官方手册链接

torch.nn.functional.interpolate(
	input, 
	size=None, 
	scale_factor=None, 
	mode='nearest', 
	align_corners=None, 
	recompute_scale_factor=None, 
	antialias=False
)

利用插值方法,对输入的张量数组进行上\下采样操作,就是科学合理地改变数组的尺寸大小,尽量保持数据完整。

在计算机视觉中,interpolate 函数常用于图像的放大(即上采样操作)。比如在细粒度识别领域中,注意力图有时候会对特征图进行裁剪操作,将有用的部分裁剪出来,裁剪后的图像往往尺寸小于原始特征图,这时候如果强制转换成原始图像大小,往往是无效的,会丢掉部分有用的信息。所以这时候就需要用到 interpolate 函数对其进行上采样操作,在保证图像信息不丢失的情况下,放大图像,从而放大图像的细节,有利于进一步的特征提取工作

2. 参数解释

  • input (Tensor):需要进行采样处理的数组

  • size (int or Tuple):输出空间的大小

  • scale_factor (float or Tuple):空间大小的乘数

  • mode (str):采样算法,‘nearest’ | ‘linear’ | ‘bilinear’ | ‘bicubic’ | ‘trilinear’ | ‘area’ | ‘nearest-exact’. 默认: ‘nearest’

  • align_corners (bool):在几何上,我们将输入和输出的像素视为正方形而不是点。如果设置为 True,则输入和输出张量按其角像素的中心点对齐,保留角像素处的值。如果设置为 False,则输入和输出张量通过其角像素的角点对齐,并且插值使用边缘值填充用于边界外值,使此操作在保持不变时独立于输入大小 scale_factor。

  • recompute_scale_facto (bool):重新计算用于插值计算的 scale_factor。当 scale_factor 作为参数传递时,它用于计算 output_size。如果 recompute_scale_factor 的 False 或没有指定,传入的 scale_factor 将在插值计算中使用。否则,将根据用于插值计算的输出和输入大小计算新的 scale_factor(即,如果计算的 output_size 显式传入,则计算将相同 )。注意当 scale_factor 是浮点数,由于舍入和精度问题,重新计算的 scale_factor 可能与传入的不同。

注意

  • sizescale_factor 两个参数只能定义一个,即两种采样模式只能用一个。要么让数组放大成特定大小、要么给定特定系数,来等比放大数组。
  • 如果 size 或者 scale_factor 输入序列,则必须匹配输入的大小。如果输入四维,则它们的序列长度必须是 2,如果输入是五维,则它们的序列长度必须是 3。

align_corners

align_corners=True 与 False 的区别,从 4×4 上采样成 8×8。一个是按四角的像素点中心对齐,另一个是按四角的像素角点对齐。
在这里插入图片描述

3. 实验测试

使用 size 上采样

原图像从 [2,3] 放大为 [4,4]

import torch.nn.functional as F
import torch

a = torch.arange(12, dtype=torch.float32).reshape(1, 2, 2, 3)
b = F.interpolate(a, size=(4, 4), mode='bilinear')
# 这里的(4,4)指的是将后两个维度放缩成4*4的大小
print(a)
print(b)
print('原数组尺寸:', a.shape)
print('size采样尺寸:', b.shape)

输出

tensor([[[[ 0.,  1.,  2.],
          [ 3.,  4.,  5.]],

         [[ 6.,  7.,  8.],
          [ 9., 10., 11.]]]])
tensor([[[[ 0.0000,  0.6250,  1.3750,  2.0000],
          [ 0.7500,  1.3750,  2.1250,  2.7500],
          [ 2.2500,  2.8750,  3.6250,  4.2500],
          [ 3.0000,  3.6250,  4.3750,  5.0000]],

         [[ 6.0000,  6.6250,  7.3750,  8.0000],
          [ 6.7500,  7.3750,  8.1250,  8.7500],
          [ 8.2500,  8.8750,  9.6250, 10.2500],
          [ 9.0000,  9.6250, 10.3750, 11.0000]]]])
原数组尺寸: torch.Size([1, 2, 2, 3])
size采样尺寸: torch.Size([1, 2, 4, 4])

使用 scale_factor 上采样

scale_factor=(2, 2) 表示图像的长和宽都放大 2 倍

import torch.nn.functional as F
import torch

a = torch.arange(12, dtype=torch.float32).reshape(1, 2, 2, 3)
b = F.interpolate(a, scale_factor=(2, 2), mode='bilinear')
# 这里的(4,4)指的是将后两个维度放缩成4*4的大小
print(a)
print(b)
print('原数组尺寸:', a.shape)
print('size采样尺寸:', b.shape)

输出

tensor([[[[ 0.,  1.,  2.],
          [ 3.,  4.,  5.]],

         [[ 6.,  7.,  8.],
          [ 9., 10., 11.]]]])
tensor([[[[ 0.0000,  0.2500,  0.7500,  1.2500,  1.7500,  2.0000],
          [ 0.7500,  1.0000,  1.5000,  2.0000,  2.5000,  2.7500],
          [ 2.2500,  2.5000,  3.0000,  3.5000,  4.0000,  4.2500],
          [ 3.0000,  3.2500,  3.7500,  4.2500,  4.7500,  5.0000]],

         [[ 6.0000,  6.2500,  6.7500,  7.2500,  7.7500,  8.0000],
          [ 6.7500,  7.0000,  7.5000,  8.0000,  8.5000,  8.7500],
          [ 8.2500,  8.5000,  9.0000,  9.5000, 10.0000, 10.2500],
          [ 9.0000,  9.2500,  9.7500, 10.2500, 10.7500, 11.0000]]]])
原数组尺寸: torch.Size([1, 2, 2, 3])
size采样尺寸: torch.Size([1, 2, 4, 6])

猜你喜欢

转载自blog.csdn.net/See_Star/article/details/127560852