Фон

В мире, где NFT продаются за миллионы, следующим прибыльным бизнесом может стать создание уникальных виртуальных сущностей и тех, кто лучше подходит для этой работы, чем искусственный интеллект. На самом деле, задолго до шумихи вокруг NFT, в октябре 2018 года, первый портрет, созданный ИИ, был продан за 432 500 долларов. С тех пор люди использовали свои глубокие познания в области передовых алгоритмов для создания поразительных произведений искусства. Например, Рефик Анадол — художник, использующий искусственный интеллект для создания захватывающих картин. (Я призываю вас проверить некоторые из его работ по этой ссылке). Другой цифровой художник, Петрос Вреллис, в 2012 году создал интерактивную анимацию знаменитой работы Ван Гога Звездная ночь, которая за три месяца набрала более 1,5 миллиона просмотров. Однако творческие возможности ИИ не ограничиваются художественными работами. Люди создают интеллектуальные системы, которые могут писать стихи, песни, сюжеты и, возможно, выполнять другие творческие задачи. Движемся ли мы к миру, в котором все художники будут конкурировать с ИИ? Впрочем, возможно, я не об этом. Моя цель в этом посте — погрузиться в работу элегантного алгоритма Neural Style Transfer, который может помочь таким ужасным художникам, как я, стать виртуозами искусства.

1. Передача нейронного стиля — идея

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

Идея Neural Style Transfer (NST) состоит в том, чтобы взять одно изображение и перекомпоновать его содержимое в стиле другого изображения. В отличие от приведенного выше случая, перенос темы (стиля) из более привлекательных картин, таких как знаменитая картина Ван Гога «Звездная ночь», может привести к увлекательным рекомпозициям.

Давайте подробно обсудим описанное выше преобразование.

2.CNN для передачи стиля

Поскольку мы имеем дело с изображениями, вас не должно удивлять, что сверточные нейронные сети лежат в основе передачи стиля. Кроме того, поскольку множество CNN добились невероятных результатов в задачах обработки изображений, нам не нужно обучать отдельную сеть для NST. Я буду использовать сеть vgg-19 (перенос обучения для передачи стиля), но вы можете использовать любую другую предварительно обученную сеть или обучить свою собственную.

Сеть Vgg-19 имеет следующую архитектуру:

Во-первых, давайте посмотрим, что распознают некоторые из вышеперечисленных слоев. Каждый слой имеет не менее 64 фильтров для изучения особенностей изображения. Для простоты мы будем использовать выходные данные первых десяти фильтров, чтобы увидеть, что изучают эти слои. Если вам нужен код, вы можете использовать любую из следующих ссылок.



https://github.com/shashank14k/MyWork/blob/main/neuralstyletransfer-experiments.ipynb

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

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

Эта разделимость глобальных и локальных составляющих изображения с использованием CNN является движущей силой передачи стиля. Авторы нейронного алгоритма художественного стиля, оригинальной статьи о переносе нейронного стиля (Gatys et al.), сообщают, что, поскольку более глубокие слои хорошо справляются с идентификацией подробных признаков, они используются для захвата содержимого изображения. Точно так же начальные слои, способные создать хороший контур изображения, используются для захвата стиля изображения (тема/глобальные атрибуты).

3. Рекомпозиция изображения

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

3.1 Информация о содержании

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

Рассмотрим приведенное выше шумовое изображение (X). Кроме того, для простоты предположим, что наш выбор CNN для передачи стиля состоит только из двух слоев, A1 и A2. Пропуская целевое изображение (Y) по сети и используя выходы A2, A2(A1(Y)), мы получаем информацию о его содержании. Чтобы узнать/захватить эту информацию, мы пропускаем X через ту же сеть. Поскольку X состоит из случайно расположенных значений пикселей, A2(A1(X)) также является случайным. Затем мы определяем функцию потери контента как:

Здесь (i,j) — обозначения индексов местоположений в массиве изображений. (Размер целевого изображения содержимого и изображения шума должен быть одинаковым). По сути, если результирующие массивы A2(A1(X)) и A2(A1(Y)) имеют форму (m,n), функция потерь вычисляет их разность в каждом месте, возводит их в квадрат, а затем суммирует. При этом мы заставляем X быть изображением, которое при передаче по сети дает ту же информацию о контенте, что и Y. Затем мы можем минимизировать потерю контента, используя обратное распространение, как мы обычно делаем в любой нейронной сети. Однако есть небольшая разница. В этом случае значения массива изображений X вместо сетевых весов являются переменными. Отсюда окончательное уравнение:

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

3.2 Информация о стиле

Захват стиля более сложен, чем захват контента. Это требует понимания грамм-матриц.

3.2.1 Матрицы граммов

Если вы обратитесь к архитектуре vgg-19 (раздел 2), вы увидите, что вывод block_1_conv_1 имеет форму (m,n,64). Для простоты предположим, что m,n = 3,2 и количество фильтров также равно 2 вместо 64.

Как вы знаете, фильтры CNN учатся идентифицировать различные атрибуты — пространственные особенности, такие как края/линии, интенсивность цвета и т. д. Допустим, приведенные выше фильтры распознают оттенки красного и синего в разных местах. Следовательно, значение пикселя (в диапазоне 0–1) для каждого индекса на выходе фильтра 1 представляет интенсивность красного цвета в этом месте. Фильтр 2 дает ту же информацию о синем цвете. Теперь сложите два выходных массива и возьмите скалярное произведение результирующего массива с его транспонированием. Что мы получаем?

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

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

3.2.2 Стиль и комбинированные потери

Предположим, мы хотим перенести стиль с изображения выше. Обратите внимание на наличие множественных полос (вертикальных и горизонтальных линий) светло-голубого (склонного к белому) цвета. Матрица Грамма двух фильтров, определяющих линии и светло-голубой цвет, вернет высокую корреляцию между этими функциями. Следовательно, алгоритм гарантирует, что эти функции появятся вместе в рекомпонованном изображении, и хорошо справится с передачей стиля. На самом деле каждый слой CNN имеет множество фильтров, что приводит к громоздким грамматическим матрицам, но идея остается в силе. Например, матрица грамм выходных данных block_1_conv_1 в vgg-19 будет корреляционной матрицей из 64 функций.

Далее нам нужно установить функцию потери стиля. Предположим, что после прохождения изображения целевого стиля через block_1_conv_1 мы получаем матрицу граммов G. Мы вводим наше изображение шума X через тот же слой и вычисляем его матрицу граммов (P). Затем потеря стиля рассчитывается как:

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

Следует также отметить, что в отличие от потери контента, которая рассчитывается для одного слоя, потеря стиля рассчитывается для нескольких слоев. Gatys et и др. использовали для этой цели пять слоев. Следовательно, окончательная потеря стиля:

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

Комбинированная функция потерь представляет собой сумму потери стиля и содержания. Опять же, каждая отдельная функция имеет вес. Больший вес для стиля гарантирует, что перекомпонованное изображение передает больше стиля, и наоборот.

4. Изменение гиперпараметров

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

  1. Путь изображения содержимого
  2. Список путей образов стилей
  3. Содержание потери веса
  4. Стиль похудения
  5. Количество итераций (обратное распространение)
  6. Список весов для изображений стиля. Если вы хотите перенести стиль из нескольких изображений, вам необходимо указать вес для каждого целевого изображения стиля.
  7. Список весов для слоев стиля — веса, присвоенные каждому слою, участвующему в функции потери стиля.

Мы будем использовать следующие изображения для проведения экспериментов:

4.1 5 слоев стилей с равными коэффициентами потерь, 1 слой содержимого

Мы будем использовать это изображение для сравнения результата изменения гиперпараметров.

4.2 Увеличение веса функции потери стиля с 0,005 до 0,1

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

4.3 Использование одного слоя для стиля

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

4.4. Использование другого уровня для защиты от потери контента

Использование block1_conv1 для информации о содержимом заставляет сеть захватывать глобальные функции из целевого изображения содержимого. Это, вероятно, мешает глобальным функциям изображения стиля, и в итоге мы получаем ужасающую передачу стиля. Я считаю, что результат демонстрирует, почему рекомендуется использовать более глубокие уровни для NST. Они сосредоточены исключительно на локальных деталях заметных объектов на изображении контента, что позволяет плавно воспроизводить тему стиля изображения.

4.5. Назначение веса слоям стилей вручную [0.4, 0.3, 0.2, 0.05, 0.05]

Хотя особой разницы между 4.1 и текущей перекомпозицией нет, мне кажется, последняя имеет общий светлый оттенок. Это может быть связано с более высоким весом, присвоенным block1_conv_1, который согласно 4.3 генерирует белый тон из картины Звездная ночь.

4.6 Назначение веса слоям стилей вручную [0.05,0.05,0.2,0.3,0.4]

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

4.7. Использование нескольких изображений для передачи стиля

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

Однако общая потеря стиля:

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

5. Замечания

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

Использованная литература:

Нейронный алгоритм художественного стиля — Gatys et al.

https://arxiv.org/abs/1508.06576

Ссылки на блокноты:

1.Kaggle:



2. Гитхаб

https://github.com/shashank14k/MyWork/blob/main/neuralstyletransfer-experiments.ipynb