torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None)
size
或scale_factor
参数对输入图像进行上/下采样操作。mode
参数指定的算法。mini-batch * channels * width
。mini-batch * channels * height * width
。mini-batch * channels * depth * height * width
。mode
为:
size
是互斥参数,只能指定一个。nearest
linear
bilinear
bicubic
trilinear
和area
。默认是nearest
。True
,输入和输出的张量在角像素中心对齐,这样可以保留边界像素的值。如果设置为False
,输入和输出张量由它们的角点的角像素值对齐(具体说明见下面图片),边界部分使用边界值的插值填充,边界的像素值可能会丢失。受影响的mode
有linear
bilinear
bicubic
和trilinear
。默认为False
。如果mode
使用bicubic
时,可能生成的图像有大于255或小于0的值,可以使用tensor.clamp(min=0, max=255)
做截断。
0.3.1
版本之前默认值是True
,之后默认值为False
,使用别人的源码时要注意一下这个问题。
参考 立夏之光的知乎文章。
左边为False,右边为True。
两种方式在中间像素的插值上区别不大,主要差别还是边界像素。一般的任务中边界的值不那么重要,但是会影响语义分割的mIoU
指标,使用True
能更好的保留边界。
具体改动见我的pull request。
CPU模式下,如果scale_factor
为1时,使用bicubic
插值方式,本来预计的处理结果是把原图复制一下,不做任何处理。但是处理的时候忘了乘mini-batch
了,导致复制的时候只复制了n==1
的图,其它的图均为初始值0
。