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

Передача нейронного стиля была впервые опубликована в статье Нейронный алгоритм художественного стиля Гэтиса и др., Первоначально выпущенной для arXiv в 2015 году, и в этой сессии мы реализуем эту статью с использованием Tensorflow 2.0.

Сверточная нейронная сеть, которую мы будем использовать, — это модель VGG19. VGG19 — это сверточная нейронная сеть, обученная на более чем миллионе изображений из базы данных ImageNet. Сеть состоит из 19 слоев и может классифицировать изображения по 1000 категориям объектов, таким как клавиатура, мышь, карандаш и многие животные.

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

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

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

Некоторые важные моменты

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

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

· Сгенерированное изображение = изображение, которое сеть будет генерировать или выводить.

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

Функция потерь для минимизации передачи нейронного стиля определяется выражением

Шаги для решения

· Инициализировать сгенерированное изображение (G) со случайными значениями.

· Используйте градиентный спуск или его вариант для минимизации J(G)

· Обновите сгенерированные значения изображения, применив градиент, рассчитанный на предыдущем шаге.

Функция стоимости контента

· Пусть L будет скрытым слоем для расчета стоимости контента

· Пусть a[L][C] и a[L][G] — активация слоя L для изображения.

· Если оба изображения a[L][C] и a[L][G] похожи, оба изображения имеют одинаковое содержание.

Функция стоимости стиля

· Пусть мы используем активацию слоя L для измерения стиля.

· Определить стиль как корреляцию между активацией по каналам

· Пусть a[l]ijk = активация в точке (i,j,k), где i=высота, j=ширина, k=канал

· Затем мы определяем матрицу стиля (матрицу грамм), обозначающую корреляцию между каналом K и K'

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

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

Выполнение

Откройте https://colab.research.google.com или любой блокнот Ipython и начните.

Пожалуйста, рассмотрите возможность открытия



or



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

Установка Tensorflow 2.0

Импорт зависимостей

Вспомогательные функции

Определение слоев, из которых мы будем получать активации

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

Создание нашей модели с использованием функционального API Keras

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

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

Модель VGG принимает изображения в формате BGR, а не в формате RGB, поэтому ее необходимо сначала предварительно обработать.

Функции потерь для передачи нейронного стиля

Оптимизация потерь

Функция оптимизации оптимизирует значения сгенерированного изображения на основе функции минимизации общих потерь.

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

Больше результатов

Полный код