官方手册链接
torch.nn.functional.interpolate(
input,
size=None,
scale_factor=None,
mode='nearest',
align_corners=None,
recompute_scale_factor=None,
antialias=False
)
利用插值方法,对输入的张量数组进行上\下采样操作,就是科学合理地改变数组的尺寸大小,尽量保持数据完整。
在计算机视觉中,interpolate 函数常用于图像的放大(即上采样操作)。比如在细粒度识别领域中,注意力图有时候会对特征图进行裁剪操作,将有用的部分裁剪出来,裁剪后的图像往往尺寸小于原始特征图,这时候如果强制转换成原始图像大小,往往是无效的,会丢掉部分有用的信息。所以这时候就需要用到 interpolate 函数对其进行上采样操作,在保证图像信息不丢失的情况下,放大图像,从而放大图像的细节,有利于进一步的特征提取工作
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 可能与传入的不同。
⭐ 注意
size
与 scale_factor
两个参数只能定义一个,即两种采样模式只能用一个。要么让数组放大成特定大小、要么给定特定系数,来等比放大数组。size
或者 scale_factor
输入序列,则必须匹配输入的大小。如果输入四维,则它们的序列长度必须是 2,如果输入是五维,则它们的序列长度必须是 3。⭐ align_corners
align_corners=True 与 False 的区别,从 4×4 上采样成 8×8。一个是按四角的像素点中心对齐,另一个是按四角的像素角点对齐。
⭐ 使用 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])