Нейроалгоритм художественного стиля: резюме и реализация

Перенос стилей с помощью Pytorch

Neural-style, или Neural-Transfer, позволяет воспроизвести заданное изображение в новом художественном стиле. Здесь я представляю алгоритм нейронного стиля, предложенный Леоном А. Гэтисом, Александром С. Эккером и Матиасом Бетге. Алгоритм получает изображение стиля, изображение содержимого и входное изображение, которое может быть либо пустым белым изображением, либо копией изображения содержимого. Таким образом, он изменяет входное изображение, чтобы оно напоминало содержимое последнего и стиль первого. Прежде чем начать, хочу поблагодарить Alexis Jacq за его статью.

Принцип

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

Подробности

Как было упомянуто выше, алгоритм ожидает три изображения, и цель состоит в том, чтобы сгенерировать изображение, которое имеет минимальное расстояние между изображениями содержимого и стиля. Чтобы добиться этого, авторы используют предварительно обученную сеть VGG-19 и вычисляют расстояние между картами характеристик входного изображения и целевых изображений (изображения содержимого и стиля). Таким образом, они вычисляют потери контента и стиля на определенных уровнях CNN.

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

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

Потеря стиля

Для расчета потери стиля авторы используют матрицы Грама. Итак, мы берем все векторы признаков C, сглаживая входные данные в форме [N, C, W, H], в результате чего он имеет форму [N x C, W x H]. Наконец, мы умножаем эту матрицу на само транспонирование, чтобы получить матрицу Грама, которая дает нам корреляции характеристик. Наконец, потеря стиля определяется потерями в квадрате ошибки между матрицами стиля и входными граммами.

Общая потеря

Общий убыток выражается как взвешенная сумма двух убытков. Авторы отмечают, что соотношение по умолчанию α / β было либо 1 × 10 ^ −3, либо 1 × 10 ^ −4.

Модель и нормализация

Мы будем импортировать предварительно обученную сеть VGG-19, поэтому нам также необходимо нормализовать наши изображения путем вычитания среднего и деления на стандартное отклонение.

Наконец, мы будем вычислять наши потери на определенных глубинных слоях VGG-19. Кроме того, авторы отмечают, что замена слоев Max pooling на средний приводит к более гладким изображениям. Следовательно, нам нужен новый модуль Sequential, который будет содержать все это.

Сведения о тренировке

В отличие от обучения сети, мы хотим оптимизировать входное изображение. Поэтому мы используем алгоритм L-BFGS для запуска нашего градиентного спуска и передачи ему нашего изображения в качестве тензора для оптимизации. Отношение α / β равно 1 × 10 ^ −6.

Результаты

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

Напоследок хочу показать еще пару картинок, которые мне понравились :).

Несколько последних слов

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

Бумага

Нейроалгоритм художественного стиля

Статьи по Теме