Перейти к основному содержимому

Повышение разрешения

Как мы видели, базовая архитектура сегментационной сети представляет собой кодировщик, постепенно снижающий пространственное разрешение, и декодировщик, возвращающий разрешение к исходному (источник):

Для уменьшения разрешения (downsampling) в кодировщике можно использовать свёртки с шагом (stride) больше единицы, а также операции пулинга.

Рассмотрим методы повышения пространственного разрешения (upsampling, unpooling, upscaling) в декодировщике.

Задачей повышения разрешения является перевод внутреннего представления изображения из низкого разрешения в высокое. Т.е. мы знаем значения активаций на грубой сетке значений, и нам нужно по ним восстановить недостающие значения на более мелкой сетке, как показано ниже:

Для этого нам нужно воспользоваться тем или иным методом интерполяции промежуточных значений по опорным значениям грубой сетки, выполняемой для каждого канала независимо. Поскольку интерполяция будет неточной, часто после интерполяции ставят обучаемую свёртку, которая настраивается немного уточнять результаты интерполяции.

Рассмотрим популярные методы повышения разрешения.

Bed of nails

Метод bed of nails просто заполняет детальную сетку значений нулями, а потом подставляет значения грубой сетки в соответствующие пространственные позиции (после перемасштабирования). Вот как выглядит результат работы при переводе сетки 2x2 в сетку 5x5:

(abcd)(000000a0b0000000c0d000000)\left(\begin{array}{cc} \mathbf{a} & \mathbf{b}\\ \mathbf{c} & \mathbf{d} \end{array}\right)\longrightarrow\left(\begin{array}{ccccc} 0 & 0 & 0 & 0 & 0\\ 0 & \mathbf{a} & 0 & \mathbf{b} & 0\\ 0 & 0 & 0 & 0 & 0\\ 0 & \mathbf{c} & 0 & \mathbf{d} & 0\\ 0 & 0 & 0 & 0 & 0 \end{array}\right)

В случае, если после перемасштабирования обновлённые координаты элементов грубой сетки не идеально соответствуют координатам в мелкой сетке, применяется округление координат, чтобы они всегда были целыми числами.

Интерполяция ближайшим соседом

В интерполяция ближайшим соседом (nearest neighbor interpolation) координаты элементов грубой сетки перемасштабируются под размер мелкой сетки, а элементы мелкой сетки заполняются значениями ближайших к ним элементов грубой сетки, как показано в примере ниже:

(abcd)(aabbaabbccddccdd)\left(\begin{array}{cc} \mathbf{a} & \mathbf{b}\\ \mathbf{c} & \mathbf{d} \end{array}\right)\longrightarrow\left(\begin{array}{cccc} \mathbf{a} & \mathbf{a} & \mathbf{b} & \mathbf{b}\\ \mathbf{a} & \mathbf{a} & \mathbf{b} & \mathbf{b}\\ \mathbf{c} & \mathbf{c} & \mathbf{d} & \mathbf{d}\\ \mathbf{c} & \mathbf{c} & \mathbf{d} & \mathbf{d} \end{array}\right)

Например, координаты элемента aa были (1,1), а стали (1.5,1.5). В результате четыре ближайших элемента в мелкой сетке оказались к этой позиции ближайшими и тоже заполнились значением aa.

Билинейная интерполяция

Интерполяция ближайшим соседом приводит к резким перепадам значений. Билинейная интерполяция (bilinear interpolation) заставляет значения изменяться более плавно (по линейному закону) при приближении к тому или иному опорному значению грубой сетки.

Для этого

  1. целевая точка проецируется на грубую сетку вверх и вниз вдоль оси Y;

  2. линейной интерполяцией находится значение для обеих проекций;

  3. значение целевой точки находится линейной интерполяцией между значениями для проекций.

Этот процесс проиллюстрирован ниже (источник):

Бикубическая интерполяция

В бикубической интерполяции (bicubic interpolation) промежуточные значения на мелкой сетке находятся с помощью локальной полиномиальной аппроксимации, полученной по опорным элементам грубой стеки, а также из условий, чтобы соседние полиномы образовывали непрерывную поверхность с непрерывными производными на краях.

Визуально различные виды интерполяции показаны ниже (источник):

Транспонированная свёртка

Базовый вариант

Транспонированная свёртка (transposed convolution, fractionally-strided convolution, deconvolution) - альтернативный вариант повышения пространственного разрешения. От ранее перечисленных методов его отличает то, что этот метод имеет настраиваемые параметры (смещение и ядро свёртки), а также традиционные гиперпараметры для свёртки (padding, stride, dilation).

Транспонированная свёртка была придумана, как некоторый нестрогий аналог операции, обратной к свёртке, применяемой к одному каналу.

Зададимся вопросом, как понять, насколько высокая была входная активация в определённой позиции по выходным значениям свёртки? Эта активация была высокой, если оказались высокими выходные активации с поправкой на коэффициенты самой свёртки в соответствующих позициях.

Чтобы представить работу транспонированной свёртки, нужно представить распространение градиента обычной свёртки в режиме обратного прохода (backward pass) в методе обратного распространения ошибки. В этом режиме входной слой свёртки является выходным для транспонированной свёртки, а выходной слой, наоборот, является входным.

Если представить ядро транспонированной свёртки, как печать или штамп, в котором больше чернил в тех местах, где элементы ядра свёртки больше, то действие транспонированной свёртки можно представить как проставление этого штампа на выходной карте признаков с силой надавливания, равной соответствующим элементам входной карты признаков.

Иными словами, ядро свёртки ставится на каждую позицию выходной карты признаков, домноженное на входную активацию в центре постановки ядра. В позициях, где ядра пересекаются, осуществляется суммирование результатов.

Это продемонстрировано на рисунке ниже:

Многоканальный вариант

В случае нескольких выходных каналов транспонированная свёртка ставит уже трехмерные "штампы" с силой нажатия, равной активации входного канала.

Если входных каналов несколько, то результаты применения этих "штампов" суммируются для каждого входного канала.

Влияние смещения, шага и сдвига

Обучаемый параметр смещения (bias) оказывает то же влияние, что и в обычной свёртке - увеличивает значения всех выходов на величину смещения.

Гиперпараметр шага (stide) управляет тем, с каким смещением ядро свёртки ставится на выходную карту признаков. Ниже показана работа транспонированной свёртки с шагом 2:

Гиперпараметр сдвига (dilation) будет распылять значения "печати" (ядра свёртки), заполняя пропуски нулями, делая её более рассредоточенной.

Динамическую визуализацию работы обычной и транспонированной свёртки можно посмотреть здесь.

Недостатки

При применении транспонированной свёртки на некоторые выходные позиции ядро ("штамп") ставится один раз, а на некоторые - несколько. На практике это приводит к тому, что выходные значения в каких-то местах в среднем больше, чем в других, что известно как артефакты шахматной доски (checkerboard artifacts), показанные ниже для случая 2-D (а,c) и 1-D (b) (источник):

Для избежания подобных артефактов необходимо использовать другие методы повышения разрешения, такие как интерполяция ближайшим соседом (d на рисунке), билинейная и бикубическая интерполяция. Либо использовать транспонированную свёртку, но

  • задавать stride=kernel size

  • либо нормировать каждый элемент выхода на число раз, сколько ядро транспонированной свёртки было на него проставлено.

Также можно применять после транспонированной свёртки обычную, настроенную на разглаживание выходов транспонированной свёртки.