非整数缩放因子下区域插值降采样的异常现象及原理疑问
非整数缩放因子下区域插值降采样的异常现象及原理疑问
最近在研究PyTorch中F.interpolate的area插值降采样,结果发现当使用非整数缩放因子时,实际输出和我对区域插值的理解完全对不上,想跟大家聊聊这个问题。
首先说下我对区域插值的理解:按定义,区域插值是基于像素面积加权的。比如如果缩放因子是1.5,输出像素(0,0)应该包含输入(0,0)的完整像素面积、(0,1)和(1,0)各一半的面积,以及(1,1)的1/4面积,最终的权重是输入像素的对应面积除以(1.5)²。
但实际测试下来却不是这么回事,我写了一段测试代码:
import torch import torch.nn.functional as F x = torch.tensor( [[3, 106, 107, 40, 148, 112, 254, 151], [62, 173, 91, 93, 33, 111, 139, 25], [99, 137, 80, 231, 101, 204, 74, 219], [240, 173, 85, 14, 40, 230, 160, 152], [230, 200, 177, 149, 173, 239, 103, 74], [19, 50, 209, 82, 241, 103, 3, 87], [252, 191, 55, 154, 171, 107, 6, 123], [7, 101, 168, 85, 115, 103, 32, 11]], dtype=torch.float).unsqueeze(0).unsqueeze(0) print(x.shape, x.sum()) for scale in [8/6, 2]: pixel_area = scale**2 y = F.interpolate(x, scale_factor=1/scale, mode="area") print(y.shape, y, y.sum()*pixel_area) print((3 + 106*(scale-1) + 62*(scale-1) + 173*(scale-1)**2)/pixel_area) print((11 + 123*(scale-1) + 32*(scale-1) + 6*(scale-1)**2)/pixel_area)
这段代码的运行输出是:
torch.Size([1, 1, 8, 8]) tensor(7707.) torch.Size([1, 1, 6, 6]) tensor([[[[ 86.0000, 119.2500, 82.7500, 101.0000, 154.0000, 142.2500], [117.7500, 120.2500, 123.7500, 112.2500, 132.0000, 114.2500], [162.2500, 118.7500, 102.5000, 143.7500, 167.0000, 151.2500], [124.7500, 159.0000, 154.2500, 189.0000, 112.0000, 66.7500], [128.0000, 126.2500, 125.0000, 155.5000, 54.7500, 54.7500], [137.7500, 128.7500, 115.5000, 124.0000, 62.0000, 43.0000]]]]) tensor(7665.7778) 43.99999999999999 35.62499999999999 torch.Size([1, 1, 4, 4]) tensor([[[[ 86.0000, 82.7500, 101.0000, 142.2500], [162.2500, 102.5000, 143.7500, 151.2500], [124.7500, 154.2500, 189.0000, 66.7500], [137.7500, 115.5000, 124.0000, 43.0000]]]]) tensor(7707.) 86.0 43.0
从输出里我发现了几个很奇怪的点:
- 当
scale=8/6时,y.sum()*pixel_area的结果是7665.7778,和原张量的总和7707不相等;但scale=2的时候两者是完全相等的。 - 我手动计算了
scale=8/6时输出(0,0)的预期值,结果是43.999...(约44),但实际输出却是86。 - 更离谱的是,不同缩放因子下,输出的(0,0)像素值居然都是86,这完全不符合预期啊。
后来我仔细对比了输出和输入的关系,发现一个更惊讶的点:当scale=8/6时,实际的计算逻辑像是用了2x2的滑动窗口平均,步长1x1,这和我理解的区域插值定义完全不符啊?
有没有大佬能解释下这是为什么?PyTorch的area插值在非整数缩放因子下的实际逻辑到底是什么?
备注:内容来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

