Интуитивная интерпретация
Существуют некоторые сложности с координатами изображения. Нам нужно учитывать тот факт, что пиксели на самом деле являются квадратами, а не точками в пространстве. Мы интерпретируем центр пикселя как целочисленные координаты, поэтому, например, (0,0) относится к центру первого пикселя, в то время как (-0,5, -0,5) относится к верхнему левому углу первого пикселя. По сути, именно поэтому вы не получаете ожидаемых результатов. Roi, который идет от (0,0) до (5,5), фактически прорезает границу пикселей, что приводит к выборке между пикселями при выполнении выравнивания roi. Если вместо этого мы определим наши roi от (-0.5, -0.5) до (5.5, 5.5), то получим ожидаемый результат. С учетом масштабного коэффициента это переводится в roi из (-2, -2) в (22, 22).
import torch
from torchvision.ops import RoIAlign
output_size = (3, 3)
spatial_scale = 1 / 4
sampling_ratio = 2
x = torch.FloatTensor([[
[[1, 2, 3, 4, 5, 6 ],
[7, 8, 9, 10, 11, 12],
[13, 14, 15, 16, 17, 18],
[19, 20, 21, 22, 23, 24],
[25, 26, 27, 28, 29, 30],
[31, 32, 33, 34, 35, 36]]
]])
rois = torch.tensor([
[0, -2.0, -2.0, 22.0, 22.0],
])
a = RoIAlign(output_size, spatial_scale=spatial_scale, sampling_ratio=sampling_ratio)
ya = a(x, rois)
print(ya)
, что приводит к
tensor([[[[ 4.5000, 6.5000, 8.5000],
[16.5000, 18.5000, 20.5000],
[28.5000, 30.5000, 32.5000]]]])
Альтернативная интерпретация
Разделение интервала [0, 5] на 3 интервала одинаковой длины дает [0, 1.67], [1.67, 3.33], [3.33, 5]. Таким образом, границы окна вывода попадут в эти координаты. Очевидно, это не приведет к хорошим результатам выборки.