Одним из интересных докладов на NIPS 2017 был такой: Универсальный перенос стиля через преобразование функций [0]. Существует множество методов передачи стилей на основе нейронных сетей, особенно после Нейронного алгоритма художественного стиля [1]. Все существующие методы имели одну из следующих основных проблем:
- Неэффективно во время вывода: Примером этого является [1], упомянутый выше.
- Сети со специфическим стилем. Примером этого является статья Потери восприятия при передаче стиля в реальном времени и сверхвысоком разрешении [2].
- Плохие обобщающие способности с точки зрения качества вывода: Примером этого является статья Перенос произвольных стилей в реальном времени с нормализацией экземпляров [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