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

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

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

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

Рассмотрим методы обратного повышения пространственного разрешения (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.

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

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

Для этого

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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