вступление

Сегодня мы обсудим интересное применение сверточных нейронных сетей (CNN), а именно перенос стиля.

В контексте этой статьи, когда мы говорим о стиле, мы имеем в виду визуальный стиль. Считается нетривиальной задачей определить, что такое визуальный стиль. Тем не менее, можно легко уловить некоторую интуицию о стиле на примере. Представьте себе картину неба. В зависимости от «заданного» стиля этого простого изображения мы можем получить от него диаметрально противоположные впечатления. Если используется веселый стиль, с большим количеством небесно-голубого и, возможно, желтого, мы думаем, что это прекрасный день. В отличие от этого, если тона больше в оттенках серого, можно предположить, что это очень мрачный день, и можно даже чувствовать себя немного подавленным.

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

Разве не было бы забавно, если бы мы могли менять стиль изображения так, как захотим? Например, будучи хорошим мальчиком, мой пес Йой, я бы хотел, чтобы его нарисовал такой великий художник, как Пьер-Огюст Ренуар. К сожалению, это невозможно сделать, так как Ренуар умер, не так ли? Как оказалось, да, «может»! Давайте рассмотрим все возможности алгоритма передачи стиля, который позволяет нам захватывать любое изображение в любом стиле.

Содержание

  • Представление контента
  • Представление стиля
  • Потеря восприятия
  • Представляем сети передачи
  • Мультистилевые сети

Представление контента

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

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

Возрастающая сложность представлений признаков в иерархии CNN также была отмечена Gatys, Ecker & Bethge (Gatys et al., 2015). Поэтому они решили назвать представления функций на более высоких уровнях CNN как представление контента. Основной вывод их статьи заключался в том, что стиль и содержание представления CNN любого данного изображения можно разделить.

Представление стиля

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

Теперь, когда мы научились представлять как содержимое, так и стиль изображения, возникает вопрос: как обучить сеть обучению задаче передачи стиля?

Потеря восприятия

Перенос стиля, а также множество других задач обработки изображения, таких как улучшение разрешения, раскрашивание и т. д., можно рассматривать как задачи преобразования изображения. Один из самых популярных подходов, которые используются для решения таких проблем, — обучение нейронной сети под наблюдением с использованием функции попиксельной потери. Однако, как утверждали Джонсон, Алахи и Фей-Фей в своей работе (Johnson et al. 2016), потеря на пиксель не подходит для захвата воспринимаемых различий между двумя изображениями. В качестве примера они приводят вычисление потерь на пиксель между двумя идентичными изображениями, которые просто смещены друг от друга на один пиксель. Эти два изображения будут восприниматься очень похожими друг на друга, но потери на пиксель могут быть очень разными.

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

В целях обучения представьте, что у нас есть следующая установка:

Тогда потеря содержимого l-го слоя между исходным изображением и сгенерированными представлениями признаков изображения определяется как:

Для потери стиля, как обсуждалось выше, нам нужна статистическая сводка, которая игнорирует позиции признаков. Следовательно, предлагается вычислять корреляции между несколькими слоями карт признаков (Gatys et al., 2015). Матрица Грамма хорошо подходит для этих целей, так как ее i, j-й элемент является скалярным произведением между картой признаков i и j в соответствующем слое.

Потеря стиля l-го слоя задается как среднеквадратичное расстояние между элементами матрицы Грама исходного изображения и матрицей Грама сгенерированного изображения:

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

Общая потеря представлена ​​как сумма взвешенной суммы потерь контента и потери стиля:

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

Ниже приведена реализация вышеупомянутого на Python с использованием TensorFlow. На самом деле код приписан к этой великой статье:

Представляем сети передачи

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

  • Для каждого отдельного изображения мы должны проводить обучение с нуля.

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

Это может раздражать и отнимать много времени, особенно с точки зрения производства.

Поэтому была введена новая модель, состоящая из двух компонентов:

  • Сеть преобразования изображений: остаточная CNN с матрицей весов $W$. Он используется для преобразования обучающих входных изображений $x$ в выходные изображения $\hat{y}$. Сеть обучается путем минимизации взвешенной комбинации функций потерь, где каждая функция потерь вычисляет скалярную разницу между выходным изображением $\hat{y}$ и целевым изображением $y_i$.

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

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

Код ниже — это реализация этих идей на питоне с использованием TensorFlow. Модель можно обучить на Наборе обучающих изображений COCO 2014. При разработке кода меня вдохновляла эта замечательная реализация PyTorch:

Мультистилевые сети

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

  • Для каждого нового стиля модель следует обучать с нуля.

Дюмулен, Шленс и Кудлур показали в своей работе (Dumoulin et al. 2017), что все, что нужно для изучения нескольких стилей, — это небольшая модификация модели Transfer Network. Основная идея этой модели — ввести единую сеть условной передачи стилей для N стилей. Авторы обнаружили, что кондиционирование может быть выполнено путем специализации параметров масштабирования и сдвига для каждого конкретного стиля после нормализации. Таким образом, все сверточные веса могут быть разделены между многими стилями, что также делает модель эффективной.

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

В результате этой процедуры активация слоя x преобразуется в нормализованную активацию определенного стиля следующим образом:

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

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

  1. Мы должны получить представления функций всех наших изображений стиля из модели VGG19.
  2. Вычислите матрицы Грама для всех из них.
  3. Во время обучения для вычисления потери стиля мы должны накапливать все потери между матрицами Грама функции изображения стиля и матрицей Грама характеристик стиля выходной сети передачи.

Заключение

В статье рассмотрены основные идеи, вдохновившие людей на разработку моделей трансформации стиля. Затем мы углубимся в три основные модели передачи, отслеживая их логическую оценку. Более того, мы попытались прояснить и/или обосновать использование некоторых специфических функций, таких как использование функций потери восприятия или матриц Грама. В практической конечной точке мы представили реализацию всех трех моделей на основе Python.

Если вам понравилась статья, пожалуйста, не стесняйтесь хлопать в ладоши и ознакомьтесь с другими моими постами из моей серии «Демистификация».

Ссылки:

М. Цейлер, Р. Фергус. Визуализация и понимание сверточных сетей. arXiv:1311.2901v3 [cs.CV], 28 ноября 2013 г. архив: 1311.2901.

К. Хе, С. Чжан, С. Рен и Дж. Сун. Глубокое остаточное обучение для распознавания изображений. arXiv: 1512.03385 [cs], 10 декабря 2015 г. архив: 1512.03385.

В. Дюмулен, Дж. Шленс и М. Кудлур. Ученое представление художественного стиля. arXiv: 1610.07629 [cs.CV], 9 февраля 2017 г. arXiv 1610.07629.

Дж. Джонсон, А. Алахи и Л. Фей-Фей Потери восприятия для передачи стиля в реальном времени и сверхразрешения. arXiv: 1603.08155v1 [cs.CV], 27 марта 2016 г. архив: 1603.08155

Л. Гатис, А. Эккер и М. Бетге. Нейронный алгоритм художественного стиля. arXiv: 1508.06576v2 [cs.CV] 2 сентября 2015 г. архив: 1508.06576.

Перенос нейронного стиля | Ядро TensorFlow. (н.д.). ТензорФлоу. Получено 13 сентября 2022 г. с https://www.tensorflow.org/tutorials/generative/style_transfer.

К. (н.д.). GitHub — kewellcjj/pytorch-multiple-style-transfer: облегченная повторная реализация pytorch статьи Обученное представление художественного стиля. GitHub. Получено 20 сентября 2022 г. с https://github.com/kewellcjj/pytorch-multiple-style-transfer.

П. (н.д.-б). examples/fast_neural_style на главной · pytorch/examples. Гитхаб. Получено 20 сентября 2022 г. с https://github.com/pytorch/examples/tree/main/fast_neural_style.

Одена, А. (2016, 17 октября). Артефакты деконволюции и шахматной доски. Перегонка. Получено 20 сентября 2022 г. с https://distill.pub/2016/deconv-checkerboard/

Джа, С. (31 октября 2019 г.). Краткое введение в Neural Style Transfer — Towards Data Science. Середина. Получено 20 сентября 2022 г. с https://towardsdatascience.com/a-brief-introduction-to-neural-style-transfer-d05d0403901d.

Руководство по переносу стиля | Фриц А.И.. (н.д.). Получено 20 сентября 2022 г. с https://www.fritz.ai/style-transfer/.

Бахети, П. (2022, 19 июля). Neural Style Transfer: все, что вам нужно знать [руководство]. V7. Получено 20 сентября 2022 г. с https://www.v7labs.com/blog/neural-style-transfer.