Как работает интерполяция области для понижения разрешения, если масштабный коэффициент не является целым числом?Python

Программы на Python
Ответить
Anonymous
 Как работает интерполяция области для понижения разрешения, если масштабный коэффициент не является целым числом?

Сообщение Anonymous »

по определению интерполяция области просто взвешивается по площади пикселя.
Поэтому я предполагаю, что если масштабный коэффициент равен 1,5, то выходной пиксель 00 содержит полный пиксель 00, половину 01 и 10, 1/4 от 11. вес будет in_pixel_area/(1.5)^2
Однако это не так:

Код: Выделить всё

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

Подробнее здесь: https://stackoverflow.com/questions/792 ... actor-is-n
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»