Недавно я переехал в новую квартиру и у меня не было декора, и я не хотел просто использовать случайные постеры с Amazon, я хотел создать что-то сам. Единственная проблема в том, что я не самый артистичный человек.

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

Принцип:

Глубокое обучение Neural Style Transfer состоит в захвате содержимого одного изображения и объединении его со стилем другого изображения.

Но как работает Neural Style Transfer? В этом посте мы рассмотрим основной механизм Neural Style Transfer (NST).

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

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

Различные уровни сверточной нейронной сети

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

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

Сеть VGG19 используется для передачи нейронного стиля. VGG-19 — это сверточная нейронная сеть, обученная на более чем миллионе изображений из базы данных ImageNet. Сеть состоит из 19 слоев и обучена на миллионах изображений. Благодаря этому он может обнаруживать высокоуровневые функции на изображении.
Теперь эта «кодирующая природа» CNN является ключом в Neural Style Transfer. Во-первых, мы инициализируем зашумленное изображение, которое будет нашим выходным изображением (G). Затем мы вычисляем, насколько это изображение похоже на содержимое и стиль изображения на определенном уровне сети (сети VGG). Поскольку мы хотим, чтобы наше выходное изображение (G) имело содержимое изображения содержимого (C) и стиль изображения стиля (S), мы вычисляем потери сгенерированного изображения (G) по отношению к соответствующему содержимому (C) и стилю ( S) изображение.
Имея вышеописанную интуицию, давайте определим потери контента и потери стиля для случайно сгенерированного зашумленного изображения.

Модель:

Чтобы получить доступ к промежуточным слоям, соответствующим нашим картам функций стиля и контента, мы получаем соответствующие выходные данные, используя Функциональный API Keras для определения нашей модели с желаемыми выходными активациями.

С помощью функционального API определение модели просто включает в себя определение ввода и вывода: model = Model(inputs, outputs).

функции потерь:

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

Вычисление потери контента означает, насколько случайно сгенерированное зашумленное изображение (G) похоже на изображение контента (C). Чтобы рассчитать потерю контента:

Предположим, что мы выбрали скрытый слой (L) в предварительно обученной сети (сети VGG) для вычисления потерь. Поэтому пусть P и F будут исходным изображением и сгенерированным изображением. И, F[l] и P [l] быть представлением признаков соответствующих изображений в слое L. Теперь потеря контента определяется следующим образом:

Потеря стиля:

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

Вычисление потерь и градиентов

Если вы не знакомы с градиентным спуском/обратным распространением или вам нужно освежить знания, вам обязательно стоит ознакомиться с этим потрясающим ресурсом.

Для вычисления градиента мы используем tf.GradientTape. Он записывает операции во время прямого прохода, а затем может вычислить градиент нашей функции потерь по отношению к нашему входному изображению для обратного прохода. Затем легко вычислить градиенты:

Основная функция :

И вуаля !

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

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

Довольно впечатляюще, да?

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

Вот окончательный результат:

Дальнейшее чтение :