Одним из интересных докладов на NIPS 2017 был такой: Универсальный перенос стиля через преобразование функций [0]. Существует множество методов передачи стилей на основе нейронных сетей, особенно после Нейронного алгоритма художественного стиля [1]. Все существующие методы имели одну из следующих основных проблем:

  1. Неэффективно во время вывода: Примером этого является [1], упомянутый выше.
  2. Сети со специфическим стилем. Примером этого является статья Потери восприятия при передаче стиля в реальном времени и сверхвысоком разрешении [2].
  3. Плохие обобщающие способности с точки зрения качества вывода: Примером этого является статья Перенос произвольных стилей в реальном времени с нормализацией экземпляров [3]

Обсуждаемая статья претендует на решение вышеуказанных проблем. Этот блог представляет собой комментарий к статье. Предполагает некоторое базовое понимание глубокого обучения и линейной алгебры. Репозиторий авторского кода находится здесь.

В местах (рис.9, 10 и 12) я использовал изображения для представления математики. Это в основном из-за дрянной математической поддержки средой. Я использовал https://latexbase.com/ для математических вычислений на латексе, а затем сделал их снимок. (Я знаю, очень больно)

Проблема (в случае, если это еще не ясно из вышеизложенного): дано изображение с определенным содержанием в нем (назовем его Content Image) и другое изображение с определенным стилем, встроенным в него (представьте изображение известная картина. Назовем это Style Image). Цель состоит в том, чтобы создать новое изображение, которое будет иметь содержимое изображения содержимого и стиля изображения стиля. Что-то вроде того, что показано ниже.

Смысл этого документа в том, что он «не требует обучения». Существующие методы, основанные на прямой связи, необходимо будет обучить заранее определенным стилям, а затем точно настроить для новых стилей. Принимая во внимание, что в этой статье представлен метод, который полностью не зависит от стиля на этапе обучения, что делает его подходом «без обучения». Обратите внимание, что [3] по сути более близок к этой статье, но во время обучения опирается на изображения стиля (но может хорошо обобщаться для изображений произвольного стиля).

Проблема передачи стиля в этой статье формулируется как комбинация двух процессов, а именно, реконструкции изображения и преобразования характеристик с использованием отбеливания и преобразования цвета (WCT).

Реконструкция изображения

Классический механизм кодировщика-декодера - это механизм, при котором изображение передается в сеть кодировщика, которая кодирует изображение, формируя представление, и передается в декодер, который пытается восстановить исходное входное изображение. В статье используется небольшая модификация этого для реконструкции изображения.

В качестве первого шага они обучают VGG-19 (далее называемый VGG) задаче классификации изображений Imagenet. Он используется как кодировщик. На следующем этапе кодер фиксируется, а декодер обучается восстанавливать изображение. Выглядит так, как показано ниже:

Некоторая ясность относительно Relu_X_1 и DecoderX, которую вы видите на изображении выше: они обучают более одного декодера для реконструкции. Фактически они тренируют 5 декодеров для реконструкции. Скоро мы увидим причину. Но «X» здесь относится к номеру уровня в сети VGG. X = 1,2,3,4,5 - значения, используемые в статье. Часть кодировщика VGG заканчивается на уровне Relu_X_1, и декодер (DecoderX) построен симметрично этому кодеру. Они используют комбинацию потери восстановления пикселей и потери функций, как показано ниже.

Пиксельная реконструкция - это простая норма L2 восстановленного выходного (I_o) и входного изображения (I_i). Потеря характеристик - это норма L2 для функций Relu_X_1 реконструированного выходного и входного изображения. Здесь Φ представляет собой кодировщик VGG-19, который извлекает функции Relu_X_1. λ - коэффициент взвешивания потерь. Кодировщик и декодер теперь обучены и исправлены. Обратите внимание, что мы никогда не использовали какой-либо образ стиля во всем процессе обучения.

Стилизация

Изображение выше представляет собой стилизацию одного уровня. Это включает изображение содержимого (C) и изображение стиля (S) в качестве входных данных для кодировщика (VGG Relu_X_1). Обратите внимание, что эти входы передаются независимо друг от друга (каждый проходит через VGG независимо). Вывод Encoder отправляется в блок Whitening and Coloring Transform (мы увидим это более подробно в следующем разделе), вывод которого затем передается декодеру (Recons DecoderX) для получения окончательного стилизованного вывода. На изображении ниже показан стилизованный вывод для X = 1, 2, 3, 4 и 5. Нижние слои (1 и т. Д.) Захватывают такие функции, как цвет стиля, тогда как более высокие уровни (скажем, 5) фиксируют структуры стилей.

Авторы продолжили использовать функцию со всех слоев вместо того, чтобы придерживаться только одного. В результате получается архитектура, показанная ниже.

Мы начинаем с подачи изображений содержимого и стиля в VGG, а функция Relu_5_1 извлекается и отправляется в WCT, а затем в Decoder5. Вывод Decoder5 подается в VGG вместе с изображением стиля, и Relu_4_1 извлекается, и процесс продолжается до тех пор, пока мы не получим вывод от Decoder1. На изображении ниже показаны результаты такого многоуровневого вывода. I_5 - это фактически вывод первого уровня (на изображении выше), а I_1 - вывод Decoder1 (окончательный вывод). Однозначно смотрится лучше одноуровневой стилизации.

Отбеливание и преобразование цвета (WCT)

В предыдущем разделе мы рассматривали WCT как черный ящик. Давайте немного углубимся в это, чтобы понять, что именно он делает. Помните, что мы никогда не использовали какое-либо изображение стиля во время обучения модели. Наш кодировщик - это VGG, обученный Imagenet, а декодеры обучены для реконструкции на различных уровнях функций кодировщика (Relu_ X _1). WCT выполняет классную математику, которая играет центральную роль в переносе характеристик стиля из образа стиля при сохранении содержимого.

Давайте посмотрим на WCT как на процесс отделения текущего стиля входного изображения и связывания стиля изображения стиля с входным изображением. Первый шаг - отбеливание.

Мы знаем, что входом в блок WCT является выход блока Encoder (Relu_X_1). Relu_X_1 имеет форму C x H x W, где C - количество каналов, H - высота и W - ширина карты объектов. Это предполагает одно входное изображение. Мы векторизуем эти карты функций так, чтобы у нас было C векторов длиной H x W. Пусть f_c будет векторизованной картой объектов формы [C, (H_c x W_c)], где H_c и W_c являются соответственно высотой и шириной карт функций в определенном Relu_X_1 из-за изображения содержимого. Аналогично, пусть f_s будет векторизованной картой объектов формы [C, (H_s x W_s)], где H_s и W_s - это соответственно высота и ширина карт функций в определенном Relu_X_1 из-за стиля изображения.

Превращение в отбеливание:

Наша цель - найти преобразование f_c, назовем его f_ct так, чтобы ковариационная матрица f_ct была матрицей идентичности, т. е. f_ct x (f_ct.transpose) = I. Это гарантирует, что карты функций не имеют корреляции. Более формально

f_ct = W x f_c, где W - матрица преобразования. Очень распространенный выбор W - это обратный квадратный корень из Y, где Y - ковариационная матрица f_c x (f_c.transpose). В лучшем представлении:

Небольшое примечание: исходя из определения матрицы ковариации, чтобы иметь Y = f_c x (f_c.transpose), нам потребуется, чтобы среднее значение m_c (на канал среднее) вычитается из f_c. f_c выше фактически представляет значение после вычитания.

Вы можете видеть, что Y - симметричная матрица с действительными значениями. Таким образом, мы можем иметь собственное разложение этой матрицы, и окончательный результат f_ct будет выглядеть следующим образом:

Легко проверить, что ковариационная матрица нового f_ct является матрицей идентичности (некоррелированные функции). Можете рассматривать это как упражнение :)

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

Преобразование цвета:

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

Наша цель - найти преобразование f_ct, назовем его f_cst так, чтобы ковариационная матрица f_cst была равна co -вариационная матрица f_s. Помните, что f_s - это векторизованная карта объектов из-за стиля изображения. Еще раз небольшое примечание, среднее значение m_s вычитается из f_s (по той же причине, что упоминалась выше). Более формально:

Легко проверить (2) со значением f_cst, как указано выше (опять же, упражнение :))

Я попытался кратко объяснить суть статьи. Если вам интересно, прочтите статью [0]. В документе гораздо больше деталей об обучении и других функциях, таких как пользовательский контроль и синтез текстур. Вы также можете попробовать код здесь: [6]

Если вам понравилась статья, возьмитесь за руки и дайте :)

Ссылки:

[0]: Универсальный перенос стиля через преобразование функций

[1]: Нейроалгоритм художественного стиля

[2]: Потери восприятия для передачи стиля в реальном времени и сверхвысокого разрешения

[3]: Передача произвольного стиля в реальном времени с нормализацией экземпляра

[4]: https://research.googleblog.com/2016/02/exploring-intersection-of-art-and.html

[5]: https://nsarafianos.github.io/icip16

[6]: https://github.com/Yijunmaverick/UniversalStyleTransfer