Этот пост находится в статье Джастина Джонсона и Фей Фейли Потери восприятия при передаче стиля в реальном времени и сверхвысоком разрешении.
Это более быстрый метод создания стилизованных изображений по сравнению с статьей Леона А. Гэтиса о переносе стилей.

Идея переноса стиля заключается в том, что мы накладываем стиль одного изображения на содержимое другого. Ранее это было сделано Гэтисом и др. путем оптимизации одного изображения содержимого.

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

Эти «некоторые» слои важны, как и функция потерь. Считается, что начальные слои в глубокой нейронной сети учитывают более общие особенности. То есть они больше ориентированы на стиль и не привязаны к конкретным функциям. А более глубокие слои больше способствуют содержанию или специализированным функциям для примера ввода.

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

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

На рисунке показан процесс оптимизации, который работает следующим образом.

  1. Возьмем предварительно обученную глубокую сверточную нейронную сеть (например, VGG16).
  2. Инициализировать белый шум
  3. Передача изображения стиля, изображения содержимого и белого шума по всей сети
  4. Возьмите потерю содержимого активации белого шума на более глубоком уровне (conv4) и возьмите потерю стиля на разных уровнях начального и некоторых верхних уровней.
  5. Добавьте обе потери с некоторым гиперпараметром
  6. НЕ ОПТИМИЗИРУЙТЕ СЕТЕВОЙ ВЕС
  7. Вместо этого оптимизируйте белый шум

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

Потеря контента

Давайте сначала разберемся, что такое потеря контента

Потеря содержимого - это простая среднеквадратическая ошибка между двумя тензорами. Это означает, что нам нужно точное совпадение пикселей между изображением содержимого и белым шумом.

Потеря стиля

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

Потеря стиля - это в точности среднеквадратическая ошибка между выходными данными «матрицы Грама» слоев.

Матрица грамма - это скалярное произведение между выводом слоя и его транспонированием.
Интуитивно она учитывает корреляцию между i и j пикселями между каналами тензора.

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

Реализация приведена в https://github.com/imransalam/style-transfer-tensorflow-2.0.
Но здесь также добавлены потери гистограммы, которых не было в исходной статье. Которая легко снимается.

Fast Style Transfer (Джастин Джонсон)

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

Это архитектура Fast Style Transfer. Вторая часть аналогична Гэтису и др.. Но первая часть другая.

Он включает в себя другую глубокую сверточную нейронную сеть, которая является сетью преобразования. Эта сеть выводит другое изображение. Веса этой сети узнаются в процессе.

Схема всей архитектуры выглядит следующим образом:

  1. Сделайте сеть трансформации (мы скоро подробно рассмотрим эту сеть)
  2. Передайте входное изображение через это преобразованное изображение
  3. Будет создано выходное изображение с именем y_hat.
  4. Предположим, что y_hat - это белый шум в предыдущем случае,
  5. Передайте это y_hat, изображение стиля и изображение содержимого через сеть потерь (предварительно обученный VGG16)
  6. Вычислить потерю стиля на слоях стилей и потерю содержимого на уровне содержимого и добавить их с некоторыми гиперпараметрами.
  7. Используйте эту потерю для оптимизации весов Image Transform Net

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

Сеть преобразования изображений

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

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

Вот ссылка на перевод стиля Джастина Джонсона, написанный на TensorFlow2.0
https://github.com/imransalam/JJ-style-transfer-TensorFlow2.0

Надеюсь, вам понравилось.