Сатья Кришнан Суреш, Шунмупаприя П.

В этой статье мы обсудим интересную тему под названием Передача нейронного стиля, которая представляет собой метод, который можно использовать для создания новых изображений, стиль и содержание которых исходят из двух отдельных изображений. Эта статья основана на Нейронном алгоритме художественного стиля, написанном Леоном А. Гатисом и др., где автор дает подробное объяснение создания нового изображения с использованием слои сверточной нейронной сети (CNN). Код, представленный в этой статье, можно найти здесь. Он был адаптирован с веб-сайта tensorflow.

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

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

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

Стиль и уровни контента.
Каждое изображение имеет контент и стиль. Например, рассмотрим следующее изображение собаки. Содержание изображения — это собака, а стиль изображения — текстура изображения, цвет изображения, способ организации изображения и положение собаки на изображении.

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

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

В этой статье мы будем использовать архитектуру VGG19, победившую в ILSVRC. Авторы статьи определили 5 слоев модели, которые хорошо представляют стиль модели, и 1 слой, который представляет содержание модели. Слои модели показаны на следующем рисунке, а слои, выбранные в качестве слоев стиля и содержимого, упомянуты внизу.

Матрица грамматики.
И последнее, что нужно понять, прежде чем мы начнем смешивать изображения, — это то, как стиль захватывается из нескольких карт объектов слоя. Оказывается, стиль изображения может быть представлен средствами и корреляциями нескольких карт признаков слоя. Вот почему используется матрица граммов. Матрица Грамма рассчитывается по следующей формуле:

Здесь F представляет карту объектов, «jc» и «jd» представляют размеры карты объектов, которые будут одинаковыми для карт объектов одного и того же слоя, а «i» представляет, какая карта объектов слоя «l» умножается. . Каждая концепция, необходимая для понимания того, что мы собираемся делать, была обсуждена. Теперь давайте начнем смешивать изображения.

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

На приведенном выше рисунке мы сначала загружаем модель VGG19, исключая верхние слои. Мы передаем имена слоев, выходные данные которых нам нужны, в качестве аргументов, а затем создаем пользовательскую модель, которая передает свои входные данные модели VGG19 и возвращает нам полученные ими выходные данные. Функция возвращает модель.

В качестве стилевого образа, с которым мы будем сочетать образ лабрадора, выбрана картина Кандинского.

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

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

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

Наконец, две важные функции, которые будут смешивать изображения, показаны ниже. Функция run_gradient отслеживает выходные данные и переменные потерь и запускает градиентный спуск на слоях стиля и содержимого. Функция микширования используется для определения того, сколько стиля изображения Кандинского мы хотим в изображении нашего лабрадора.

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

Заключение:
В этой статье мы увидели увлекательную концепцию переноса стиля. Следующие статьи будут посвящены бустингу и ансамблю. Если вам понравилась статья, хлопайте, подписывайтесь и комментируйте.