TL;dr https://github.com/Batman9698/Style-Transfer

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

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

Процедура создания изображения, подобного изображению справа, с точки зрения непрофессионала, будет заключаться в следующем: «получить все, что есть на первом изображении (т. е. ребенка), и повторно визуализировать его так, чтобы его текстура была похожа на текстуру в середине ».

Звучит достаточно просто, и это именно то, что делается в Алгоритме передачи нейронного стиля.

Прежде чем мы начнем процесс, всем, кто участвует в процессе, назначаются некоторые стандартные термины.

Изображение контента: изображение с основным интересующим объектом или «контентом», который мы хотели бы иметь в конечном изображении.

Изображение стиля:изображение с необходимой текстурой или «стилем», которое мы хотели бы иметь в конечном изображении.

Целевое изображение: финальное сгенерированное изображение с контентом из изображения контента и стилем из изображения стиля.

Когда все это настроено, процесс передачи стиля выглядит примерно так:

1) получить содержимое из изображения содержимого.

2) получить стиль из образа стиля.

3) создать целевое изображение с записанным содержимым и стилем.

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

5) максимизировать это сходство.

Звучит просто, но нам по-прежнему нужен способ «видеть» содержание и стиль, и именно здесь на сцену выходит сверточная нейронная сеть (CNN).

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

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

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

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

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

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

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

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