Почему roi_align не работает в pytorch? - PullRequest
4 голосов
/ 04 февраля 2020

Я начинающий пиктор. Похоже, что в модуле RoIAlign есть ошибка в pytorch. Код прост, но результат превзошел все мои ожидания.

код:

import torch
from torchvision.ops import RoIAlign

if __name__ == '__main__':
    output_size = (3,3)
    spatial_scale = 1/4 
    sampling_ratio = 2  

    #x.shape:(1,1,6,6)
    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,0.0,0.0,20.0,20.0],
    ])
    channel_num = x.shape[1]
    roi_num = rois.shape[0]

    a = RoIAlign(output_size, spatial_scale=spatial_scale, sampling_ratio=sampling_ratio)
    ya = a(x, rois)
    print(ya)

выход :

tensor([[[[ 6.8333,  8.5000, 10.1667],
          [16.8333, 18.5000, 20.1667],
          [26.8333, 28.5000, 30.1667]]]])

Но в этом случае не следует это будет обычная операция объединения в каждую ячейку 2x2, например :

tensor([[[[ 4.5000,  6.5000, 8.5000],
          [16.5000, 18.5000, 20.5000],
          [28.5000, 30.5000, 32.5000]]]])

Моя версия факела 1.3.0 с python3 .6 и cuda 10.1 на Ubuntu16. Я был обеспокоен в течение двух дней, и я не мог бы ценить это больше, если бы кто-нибудь мог мне помочь.

1 Ответ

6 голосов
/ 04 февраля 2020

Интуитивная интерпретация

Существуют некоторые сложности с координатами изображения. Нам нужно учитывать тот факт, что пиксели на самом деле являются квадратами, а не точками в пространстве. Мы интерпретируем центр пикселя как целочисленные координаты, поэтому, например, (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]. Таким образом, границы окна вывода попадут в эти координаты. Очевидно, это не приведет к хорошим результатам выборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...