Всем привет!

Сегодня мы рассмотрим одну из интересных задач, которая была решена с помощью нейронных сетей - Передача стилей изображения. Проблема состоит в том, чтобы взять два изображения, извлечь содержимое из одного изображения, стиль (текстуру) из другого и плавно объединить их в одно окончательное изображение, которое выглядит реалистично. Это сообщение в блоге представляет собой объяснение статьи Нейронный алгоритм художественного стиля автора Gatys et. al (https://arxiv.org/abs/1508.06576)

Давайте посмотрим на пример, чтобы прояснить ситуацию.

Интересно, правда? Давайте посмотрим, как ее решить.

Обзор. Позвольте мне кратко рассказать о решении.

  1. Создать случайное входное изображение
  2. Передайте ввод через предварительно обученную архитектуру магистрали, например, VGG, ResNet (обратите внимание, что эта магистраль не будет обучаться во время обратного распространения ошибки).
  3. Вычислите потери и вычислите градиенты по пикселям входного изображения. Следовательно, настраиваются только входные пиксели, тогда как веса остаются постоянными.

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

Эта проблема состоит из двух подзадач: 1. создать контент и 2. создать стиль.

Проблема - 1. Создать контент: Проблема состоит в том, чтобы создать изображение, которое содержит контент, как в изображении контента.

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

Решение. Ответ должен быть довольно простым. Используйте потерю MSE (или любую меру сходства, такую ​​как SSIM, PSNR) между входом и целью. Но какова здесь цель? Что ж, если бы не было ограничений на стиль вывода, тогда было бы достаточно просто MSE между вводом и изображением содержимого. Итак, как получить содержание изображения, не копируя его стиль?

Используйте карты объектов.

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

Таким образом, потеря MSE между функциями входного изображения и функциями изображения содержимого будет работать!

Использование карт характеристик ранних слоев conv гораздо лучше представляет контент, поскольку они ближе ко входу, следовательно, используются функции conv2, conv4 и conv7.

Проблема - 2. Создать стиль: Проблема заключается в создании изображения, которое содержит стиль, как в изображении стиля.

Решение. Чтобы извлечь стиль изображения (или, точнее, вычислить потерю стиля), нам понадобится нечто, называемое матрицей Грама. Подождите, что такое матрица Грама?

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

Точечный продукт:

Точечное произведение двух векторов можно записать как:

or

Скалярное произведение двух векторов - это сумма произведений соответствующих координат.

Говоря словами 3blue1brown, «скалярное произведение можно рассматривать как длину спроецированного вектора a на вектор b, умноженную на длину вектора b».

Или, говоря словами khan academy, «это можно рассматривать как длину вектора a, идущего в том же направлении, что и вектор b, умноженное на длину вектора b».

Член | a | cos θ на рис. (A) (переставляем его как | b || a | cos θ) по существу представляет собой длину соседней стороны (или спроецированный вектор 'a' как в 3blue1brown), следовательно, он сводится к произведению смежной стороны на длину вектора b.

Так что это значит?

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

Но при чем здесь нейронная сеть?

Рассмотрим два вектора (точнее 2 плоских вектора признаков из сверточной карты признаков глубины C), представляющих особенности входного пространства, и их скалярное произведение дает нам информацию о связи между ними. Чем меньше продукт, тем больше различаются изученные функции, и чем больше продукт, тем более коррелированы функции. Другими словами, чем меньше продукт, чем меньше две функции совпадают и чем он больше, тем чаще они встречаются вместе. Это в некотором смысле дает информацию о стиле (текстуре) изображения и нулевую информацию о его пространственной структуре, поскольку мы уже сглаживаем элемент и выполняем скалярное произведение поверх него.

Теперь возьмите все векторы признаков C (сглаженные) из сверточной карты признаков глубины C и вычислите скалярное произведение с каждым из них (включая сам вектор признаков). Результатом является матрица грамма (размером CxC).

Вот так!

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

Всегда лучше рассматривать карты характеристик из нескольких сверточных слоев (при экспериментировании) для извлечения информации о стилях. В приведенном выше коде используются сверточные слои 2, 4, 7, 10 и 13.

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

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

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

Некоторые из результатов моей реализации:

Ознакомьтесь с моим репозиторием на github https://github.com/mailcorahul/deep_learning/tree/master/papers/neural_style_transfer для реализации pytorch статьи Передача стилей изображения с помощью сверточных нейронных сетей Gatys et. al.

Ваше здоровье -:)