Передача стиля с глубоким обучением

Реализация с Pytorch

Большинство из нас хорошо знакомы с программами для редактирования, такими как Adobe Photoshop, Coral draw и т. Д. Это программное обеспечение отлично справляется с редактированием изображений, особенно с смешиванием различных фонов и одновременной визуализацией изображения. Большая часть тяжелой работы приходится на создание программного обеспечения как такового.

Но что, если бы мы могли сделать то же самое с помощью глубокого обучения?

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

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

Что это?

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

Почему?

По целому ряду причин:

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

Этот подход широко используется в:

  1. Компьютерное зрение
  2. Обработка естественного языка

Моя задача — сделать эту статью максимально простой для вашего понимания.

Получение исследовательской работы

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

Arxiv.org — один из лучших сайтов, где вы можете бесплатно найти научные статьи. Хорошее практическое правило — загрузить и собрать кучу случайных PDF-файлов и просмотреть их все. Ищите статьи, в которых подробно разъясняется тема. Также следует отметить, что можно записывать точки на листе бумаги, копировать и вставлять или даже делать снимки экрана, чтобы сохранить информацию, которую вы считаете ценной.

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

См. также:  Создание гистограмм в SwiftUI

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

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

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

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

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

Передача стиля с глубоким обучением

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

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

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

Так что же такое перенос стиля?

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

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

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

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

Давайте код

Перво-наперво. Убедитесь, что ваша среда готова.

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

См. также:  nodejs и IoT: союз, заключенный на небесах

Импорт

Мы импортируем наши зависимости. Поскольку мы будем использовать pytorch в качестве базовой библиотеки, нам нужно установить torch и torchvision, а затем импортировать их в нашу записную книжку.

Из torchvision.models мы импортируем нашу модель CNN vgg19.

VGG19 разделен на две части:

  • vgg19.features — относится ко всем сверточным и объединяющим слоям.
  • vgg19.classifier — относится к линейным слоям: Плотные и линейные слои.

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

Примечание. Мы не будем оптимизировать какие-либо параметры по причинам, указанным выше.

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

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

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

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

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

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

Далее мы визуализируем изображение.

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

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

Получение контента и особенностей стиля

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

Представление содержания будет синтезировано на «conv4_2», тогда как представление стиля мы будем синтезировать на conv1_1, conv2_1, conv3_1, conv4_1 и conv5_1.

Чтобы найти все слои в нашей модели CNN, мы можем использовать цикл for для перебора слоев или просто распечатать переменную, в которой хранится наш vgg19.

См. также:  Номер (часть 1): Scala

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

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

Матрица Грама

Матрица Грама или матрица грамиана — это набор векторов {v1, v2, v3, v4, vn} во внутреннем пространстве продукта, элементы которого задаются как Gij = ‹vi, vj› .

Это говорит нам, что это квадратная матрица v. т.е. мы можем вычислить v * v.T

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

Лучший способ получить потерю стиля — это измерить матрицу граммов.

Оптимизация и веса

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

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

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

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

 

После того, как мы определили все, что мы можем запустить цикл for, и поместить в него все наши расчеты потерь, включая:

  1. Потеря контента
  2. Потеря стиля
  3. полная потеря

Мы будем использовать норму L2 или среднеквадратичную ошибку, как указано в статье.

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

Ниже приведены некоторые изображения, которые я создал:

 

Заключение

По сути, мы увидели:

  1. Как мы можем прочитать статью и записать важную и ценную информацию.
  2. Поймите концепцию и схему, особенно для интерпретации и отображения нашего процесса.
  3. Пошагово выполняйте функцию вместе с хорошо написанной формулой.
  4. Используйте цикл for для оптимизации модели.
  5. Наконец, нужно запастись терпением.

Чтения

  1. Https://arxiv.org/abs/1703.07511
  2. Передача стиля изображения с помощью сверточных нейронных сетей
  3. Https://arxiv.org/abs/1603.08155
  4. Посмотрите мой код Передача стилей с глубоким обучением в GitHub.
Понравилась статья? Поделиться с друзьями:
IT Шеф
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: