Перенос стиля изображения - очень интересное и художественное приложение глубокого обучения, в котором вы можете переносить стиль одного изображения на другое. Стиль здесь проявляется в таких деталях, как мазки кисти, края, узоры и пятна и другие мелкие элементы. Так же, как у некоторых произведений искусства есть свой фирменный стиль, например, Крик Эдварда Мунка или Звездная ночь Винсента Ван Гога. С помощью Image Style Transfer мы можем получить забавные результаты, скрещивая стили и работы разных мастеров.

Благодаря новаторским результатам, полученным с помощью сверточных нейронных сетей, он широко использовался почти во всех приложениях компьютерного зрения. Однако скрытые слои ConvNets рассматривались как черный ящик, и то, что я считаю важным прорывом в устранении этого тумана черного ящика, было достигнуто Гэтисом и др. . в их публикации. С помощью экспериментов они продемонстрировали, что карты признаков в более глубоких скрытых слоях содержат обширную информацию о содержании изображения. Также было установлено, что информацию стиля, содержащуюся в изображении, можно извлечь из корреляции карт характеристик первых сверточных слоев в различных свертках, присутствующих в сети.

Я воспользуюсь схемой, чтобы лучше это объяснить. Глядя на архитектуру, стеки называются "conv1", "conv2", и т. Д., И их соответствующие уровни упоминаются соответствующими позициями, например, первый слой третьего стека будет называться conv3_1.

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

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

Теперь, из-за слоев объединения, высота и ширина карт объектов продолжают уменьшаться по мере того, как мы углубляемся в сеть. Это приводит к постепенному устранению неважных данных или, я бы сказал, накоплению только содержания, т.е. e. информация о сложных функциях в плотных слоях, лежащих глубоко в сети. Таким образом, чтобы сохранить информацию о содержимом (поскольку из другого изображения передается только стиль), в качестве целей берутся карты функций глубоко в архитектуре. Мы принимаем среднеквадратичную разность за функцию потерь,

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

Итак, потеря контента отсортирована! Переходим к потере стиля. Это немного сложно, но подождите.

Потеря стиля

Чтобы перенести стиль из изображения стиля, мы берем первый сверточный слой каждого стека, который имеет размеры, скажем, d * w * h, где d = глубина карты объектов, w = ширина и h = высота элементов и сгладить ее в виде двумерной матрицы, которая имеет d строк и w * h столбцов.

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

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

Заключительный этап

Теперь, на последнем этапе, мы создаем функцию потерь из линейной комбинации потерь контента и стиля, а затем распространяем ее обратно через нашу нейронную сеть. Соотношение коэффициентов потери стиля и потери контента обычно составляет порядка 10000. Поскольку желаемый объем передачи стиля зависит от нашего выбора, количество эпох / продолжительность обучения является произвольным.

По сути, чтобы суммировать весь поток, мы взяли контент и изображение стиля, а также клон изображения контента (цель). Мы сделали такую ​​функцию потерь, которая сохраняет контент из контента, но из-за высокого коэффициента умножения потери стиля он преобладает над изображением стиля. Это приводит к созданию интересного шедевра из вашего собственного кода.

Вы можете найти код здесь.

Все изображения взяты с курса Udacity’s.