2D-свертка по трем ортогоналям (осям) для объемного 3D-изображения

Поскольку 3D-свертка требует слишком больших вычислительных затрат, я предпочитаю использовать 2D-свертку. Моей мотивацией здесь является использование 2D-преобразования для объемных изображений, чтобы снизить эту стоимость.

Я хочу применить 2D-свертку вдоль трех ортогоналей, чтобы получить 3 результата, каждый из которых принадлежит одному из этих ортогоналей. Точнее, предположим, что у меня есть трехмерное объемное изображение. Вместо применения 3D-конв. я хочу использовать 2D-конв. по обеим осям xy, xz, yz. Затем я ожидаю, что 3 разных объемных результата. Каждый результат представляет три разных ортогонала.

Есть ли способ сделать это? Спасибо за помощь.




Ответы (1)


Вы можете переставлять свои изображения. (Некоторые фреймворки, такие как numpy, называют его transpose).

Предположим, мы используем 3 x 3 сверточное ядро.

# A batch of 16 3 channel images (channels first)
a = tensor(shape=[16,3,1920,1080])

# 2D conv will slide over a `1920 x 1080` image, kernel size is `3 x 3 x 3`
a.shape is (16,3,1920,1080)

# 2D conv will slide over a `3 x 1080` image, kernel size is `1920 x 3 x 3`
a.permute(0,2,1,3)
a.shape is (16,1920,3,1080)

# 2D conv will slide over a `1920 x 3` image, kernel size is `1080 x 3 x 3`
a.permute(0,3,2,1)
a.shape is (16,1080,1920,3)
person Naphat Amundsen    schedule 29.05.2021
comment
Что если у меня изначально тензор с 5 элементами (пакет, канал, глубина, высота, ширина)? Скажем, моя начальная форма тензора: [1,1,5,192,192], тогда каковы должны быть входные данные моих параметров 2d conv? Я буду использовать инфраструктуру PyTorch torch.nn.Conv2d(in_channels, out_channels, kernel_size,...) - person vaveila; 29.05.2021
comment
Общая идея та же самая, вам просто нужно приспособиться к другому измерению и переставить четыре раза. Однако в документации PyTorch указано, что Conv2d вводит тензоры формы (N,C,H,W), поэтому я не думаю, что он может изначально обрабатывать ваше дополнительное измерение. - person Naphat Amundsen; 29.05.2021
comment
ваш первоначальный ответ не приятный, спасибо. Но у меня есть путаница с формами. 1) ваша начальная высота-ширина 32x32. Тогда как это становится 1080 и 1920. Чем это вызвано? - person vaveila; 29.05.2021
comment
Ой! это ошибка, мой плохой. Сначала я пробовал с 32 x 32, но изменил его на 1920 x 1080 на полпути, чтобы иметь оси разного размера. Он должен начинаться с a = tensor(shape=[16,3,1920,1080]). Я отредактирую свой пост! - person Naphat Amundsen; 29.05.2021
comment
Хорошо, тогда я постараюсь сообщить вам о своих результатах. Спасибо за ваше время. - person vaveila; 29.05.2021
comment
Я ценю ваш ответ и применил в моей сети. Однако я думаю, что высота и ширина (например, 1080,1920) могут быть слишком большими для размера ядра. Есть ли проблема, если я использую (3x3x3) для каждого ортогонала? благодарю вас - person vaveila; 30.05.2021
comment
Я просто использовал изображения с разрешением 1920 x 1080 в качестве примера, вы можете использовать все, что хотите. Однако функции ядра должны соответствовать функциям образа. Например. Если вы хотите свернуть изображение 123 x 32 x 16, ядро ​​свертки также должно иметь функции 123. В случае ядра 3 x 3 форма ядра будет 123 x 3 x 3. - person Naphat Amundsen; 30.05.2021