по определению интерполяция области просто взвешивается по площади пикселя.
Поэтому я предполагаю, что если масштабный коэффициент равен 1,5, то выходной пиксель 00 содержит полный пиксель 00, половину 01 и 10, 1/4 от 11. вес будет in_pixel_area/(1.5)^2
Однако это не так:
мы видим, что если масштаб = 2, то все работает нормально.
Но когда масштаб = 8/6, это выдает странный результат.
Во-первых, y.sum()*pixel_area не равна x.sum()
2-й, я пытаюсь напрямую вычислить значение пикселя через вес, который он выдает 44 вместо 86.
3-е я бы ожидайте, что выходной пиксель 00 будет иметь другой результат, если масштаб другой, но, очевидно, 00 все еще равно 86. Почему? обновить
при более внимательном рассмотрении Кажется, когда масштаб = 8/6, он просто усредняет ядро 2x2 с шагом 1x1. Но не противоречит ли это определению интерполяции площади?
по определению интерполяция области просто взвешивается по площади пикселя. Поэтому я предполагаю, что если масштабный коэффициент равен 1,5, то выходной пиксель 00 содержит полный пиксель 00, половину 01 и 10, 1/4 от 11. вес будет in_pixel_area/(1.5)^2 Однако это не так: [code]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) [/code] выход: [code]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 [/code] мы видим, что если масштаб = 2, то все работает нормально. Но когда масштаб = 8/6, это выдает странный результат. Во-первых, y.sum()*pixel_area не равна x.sum() 2-й, я пытаюсь напрямую вычислить значение пикселя через вес, который он выдает 44 вместо 86. 3-е я бы ожидайте, что выходной пиксель 00 будет иметь другой результат, если масштаб другой, но, очевидно, 00 все еще равно 86. Почему? [b]обновить[/b] при более внимательном рассмотрении Кажется, когда масштаб = 8/6, он просто усредняет ядро 2x2 с шагом 1x1. Но не противоречит ли это определению интерполяции площади?