«Стиль — это то, что уже есть у каждого из нас, все, что нам нужно сделать, это найти его». — Диана фон Фюрстенберг

Чтобы классифицировать изображения с помощью CNN, нам нужно сначала извлечь функции, и эти функции будут загружены в наш классификатор. Эти функции полезны не только для целей классификации, но и для реконструкции изображений и являются основой для Style Transfer и Deep Dream. Алгоритм компьютерного зрения, основанный на достижениях нейронной сети глубокой свертки, дал возможность извлекать текстуры, края, цвет и другие характеристики более высокого уровня изображения и смешивать эти функции с другим изображением. Этот процесс мы называем передачей стиля.

Страница Tensorflow определяет передачу стиля следующим образом: Передача нейронного стиля — это метод оптимизации, используемый для получения двух изображений — изображения контента и изображения эталона стиля (например, произведения искусства). известным художником) — и смешать их вместе, чтобы выходное изображение выглядело как изображение содержимого, но «нарисовано в стиле эталонного изображения стиля».

Каково содержание и стили в контексте CNN и изображений?

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

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

Как мы изолируем содержимое и стили?

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

При внимательном рассмотрении приведенной выше сети видно, что она состоит из 5 стеков по 2 или 4 слоя свертки, разделенных максимальным объединяющим слоем. Глубина слоев в каждом стеке является стандартным значением, но глубина увеличивается стек за стеком с 64 до 512. Сеть обычно принимает цветное изображение. В нашем случае цветными изображениями будут изображение содержимого, изображение стиля и целевое изображение. В документе используется ответ объекта из слоя conv4_2. Можно было бы использовать любой из более глубоких слоев и все же получить хорошие результаты. Одна из целей алгоритма — минимизировать разницу между представлением контента и реальным новым художественным образом, который мы хотим создать. То есть новое стилизованное изображение (целевое представление) и исходное изображение контента будут максимально близки друг к другу, и сеть будет считать их практически одним и тем же изображением. Потеря представлена ​​​​как средняя разница представления контента и целевого представления.

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

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

Представление стиля находится путем вычисления корреляции (подобия) на каждом уровне? Корреляция на каждом уровне задается матрицей Грамма. Давайте вспомним, что работа слоя с максимальным объединением состоит в том, чтобы отбрасывать стили на каждом последующем слое. Таким образом, мы берем карту объектов непосредственно перед тем, как происходит отбрасывание.

Как найти матрицу Грама

Возьмем для примера, что у нас есть изображение 8 * 8, свернутое с 20 картами функций или ядрами. Результатом будет 20*8*8. Это означает, что у нас есть 20 карт признаков, и мы хотим найти корреляцию между ними. Чтобы найти эту корреляцию, нам сначала нужно векторизовать значения на этой карте признаков (более или менее изменить форму 20 * 8 * 8 трех измерений на 2 измерения). Поскольку у нас есть 20 векторов 8*8, мы выравниваем измерения x и y изображения 8*8, чтобы получить длину 1*64, которая теперь представляет собой карту объектов. Сложение 20 строк карты объектов 1 * 64 даст нам карту объектов 20 * 64. Матрица граммов теперь задается путем умножения карты признаков 20*64 на ее транспонирование, чтобы получить матрицу 20*20, которая представляет собой нелокализованную информацию нашей карты признаков, не связанную в ортогональном пространстве. Из вышеизложенного мы видим, что размерность матрицы Грама представляет собой просто квадратную матрицу с размерностью числа карт признаков и не зависит от размерности входного изображения.

Строка x и столбец y матрицы Грамма просто представляют корреляцию между картами объектов xth и yth в слое. Исходя из этого, диагональ матрицы граммов будет просто иметь значение корреляции, равное 1, поскольку в этом случае мы находим сходство между картой объектов и самой собой.

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

Вес w в каждом слое — это значения, которые дают некоторое предпочтение (больше или меньше веса в зависимости от слоя).

Функция общих потерь приведена выше как сумма веса потери стиля и потери контента. Однако эти две потери рассчитываются по-разному и имеют разную величину. Таким образом, существует вероятность того, что потеря контента больше повлияет на наше целевое изображение, и мы хотели бы убедиться, что две потери почти одинаково влияют на конечное целевое изображение. Альфа и бета введены в оригинальной статье как веса, используемые для того, чтобы общий вес показал баланс между потерей содержания и потерей стиля. Бета на практике всегда имеет большую величину, чем альфа. Чем ниже соотношение альфа-бета, тем более стилистическим будет наше окончательное целевое изображение, поскольку это означает, что бета в таком случае имеет гораздо более высокую величину. Таким образом, альфа и бета — это гиперпараметры, которые мы настраиваем и выбираем в зависимости от типа изображения, которое у нас есть, и от того, насколько стилизованным мы хотим, чтобы наш конечный результат был.

Для примера, приведенного в этой работе, альфа выбрана равной 1, а бета равна 0,00001.

Инициализация целевого образа

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

Некоторые результаты

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

Окончательное стилизованное изображение показано ниже:

Код, используемый для этой работы, можно найти здесь

Заключительное замечание: Применение передачи стиля

  • Редактирование фото и видео: я фактически использовал несколько мобильных приложений, чтобы применить стили к моему изображению, и на самом деле здесь пригодится принцип глубокого обучения, который позволяет нам понять, что, возможно, происходит на заднем плане.
  • Коммерческое искусство: Здесь — еще одна полезная статья под названием Перенос стиля рисования для портретов головы с использованием сверточных нейронных сетей.
  • Игры: вам может показаться интересным это видео, где видеоигра выглядит как другая с переносом стиля. Вот еще одно увлекательное видео и его статья.
  • Виртуальная реальность: вот ссылка на отчет, показывающий, как она применяется в виртуальной реальности.

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

  1. Гатис, Леон А., Александр С. Экер и Матиас Бетге. «Передача стиля изображения с использованием сверточных нейронных сетей». Материалы конференции IEEE по компьютерному зрению и распознаванию образов. 2016.
  2. Документация Tensorflow по передаче стилей: https://www.tensorflow.org/hub/tutorials/tf2_arbitrary_image_stylization
  3. Чжэн, Юфэн, Клиффорд Ян и Алекс Меркулов. «Скрининг рака молочной железы с использованием сверточной нейронной сети и последующей цифровой маммографии». Компьютерная визуализация III. Том. 10669. Международное общество оптики и фотоники, 2018.
  4. Сделайте Minecraft похожим на другие игры с помощью нейросетевого переноса: https://www.youtube.com/watch?v=K4610QkRCnI
  5. Виртуальная реальность EE267, перенос стиля для виртуальной реальности, весна 2018 г.: http://stanford.edu/class/ee267/Spring2018/report_lei_castillo.pdf
  6. Google Stadia — демонстрация Style Transfer ML: https://www.youtube.com/watch?v=yF1bZiH-wJQ
  7. Посмотрите впечатляющие демо-ролики Google Stadia в действии; Запуск состоится в 2019 году: https://twinfinite.net/2019/03/google-stadia-action-demo-videos/
  8. Передача стиля рисования для головных портретов с помощью сверточных нейронных сетей: https://dl.acm.org/doi/abs/10.1145/2897824.2925968