Реализация с Pytorch
Большинство из нас хорошо знакомы с программами для редактирования, такими как Adobe Photoshop, Coral draw и т. Д. Это программное обеспечение отлично справляется с редактированием изображений, особенно с смешиванием различных фонов и одновременной визуализацией изображения. Большая часть тяжелой работы приходится на создание программного обеспечения как такового.
Но что, если бы мы могли сделать то же самое с помощью глубокого обучения?
Ответ на вопрос — да! Мы можем сделать это. Все, что нам нужно, это стабильный опыт программирования, что-то вроде среднего и базового понимания линейной алгебры, а также несколько исследовательских работ, которые помогут вам в достижении вашей цели. .
Техника глубокого обучения, которую мы будем использовать, известна как трансферное обучение.
Что это?
Что ж, трансферное обучение — это своего рода метод машинного обучения, в котором мы используем существующую обученную модель для удовлетворения требований наших потребностей. Это все равно, что брать напрокат машину у друзей, чтобы выполнить свою работу.
Почему?
По целому ряду причин:
- Если мы не сможем создать хорошую модель для наших конкретных требований после множества проб и ошибок.
- Мы хотим разработать быструю модель, которая будет соответствовать нашим требованиям.
- Что, если модель наших конкретных требований уже существует, все, что нам нужно сделать, это получить требуемые данные и обучить модель с ними. Мы не хотим снова изобретать колесо.
Этот подход широко используется в:
- Компьютерное зрение
- Обработка естественного языка
Моя задача — сделать эту статью максимально простой для вашего понимания.
Получение исследовательской работы
Нашим первым требованием будет найти исследовательскую работу. Теперь поиск исследовательской работы — утомительная работа, и нам нужно проявить очень много терпения, чтобы ее получить. Убедитесь, что вы вводите точные ключевые слова в свою поисковую систему и просматриваете отображаемые вам результаты.
Arxiv.org — один из лучших сайтов, где вы можете бесплатно найти научные статьи. Хорошее практическое правило — загрузить и собрать кучу случайных PDF-файлов и просмотреть их все. Ищите статьи, в которых подробно разъясняется тема. Также следует отметить, что можно записывать точки на листе бумаги, копировать и вставлять или даже делать снимки экрана, чтобы сохранить информацию, которую вы считаете ценной.
Следует отметить, что исследовательские работы всегда будут побуждать вас искать ключевые слова, с которыми вы сталкиваетесь впервые. Итак, один совет — иметь разделенный экран, который поможет вам легко перемещаться по разным окнам.
Исследовательская статья, которую я буду использовать, будет называться Передача стилей изображения с помощью сверточных нейронных сетей. Вы можете нажать на ссылку, чтобы скачать для себя. Это открытый исходный код.
Затем прочтите Аннотация, а затем Заключение. Я знаю, это звучит странно, но именно так это делается. Вы не хотите тратить свое время на бумагу, которая не предлагает вам конкретных деталей — или ответов на каждое слово — по теме, которую вы ищете.
Как только вы закончите с одним и тем же беглым просмотром всей статьи, выделите заметные ключевые слова и формулы, с которыми вы столкнулись.
Не беспокойтесь об информации, которую вы не смогли обработать. Как только вы начнете работать над кодом, вы практически увидите и заметите мелкие детали, которые вы пропустили, просматривая.
После этого мы можем приступить к написанию кода. Но перед этим мы должны узнать, что такое Передача стиля с помощью глубокого обучения.
Передача стиля с глубоким обучением
Метод переноса стиля, изложенный в статье, о которой я уже упоминал выше.
Я постараюсь разбить каждый шаг, чтобы получить более интуитивное знание. Я покажу вам, как можно разбить статью на основные составляющие.
Что ж, наш подход будет заключаться в изменении архитектуры CNN.
Так что же такое перенос стиля?
Перенос стиля — это метод изменения изображения путем переноса стиля из другого изображения. Мы уже используем эту технику в программах, таких как фотошоп, кораллы и т. Д.
Идея и вдохновение, лежащее в основе этого проекта, заключается в использовании нейронных сетей для захвата некоторых второстепенных деталей из образа стиля и их развертывания на исходном изображении.
Для этого мы используем сверточные нейронные сети. Почему? Потому что CNN содержит слои, и каждый из этих слоев действует как фильтр, который позволяет нам извлекать функции, необходимые для окончательных результатов или рендеринга.
Я буду использовать предварительно обученную сеть VGG19 для извлечения функций содержимого или стиля из переданного изображения. Затем формализуйте идею содержания и стиля потерь и буду использовать их для итеративного обновления нашего целевого изображения, пока мы не получим результат, который мы хотим.
Давайте код
Перво-наперво. Убедитесь, что ваша среда готова.
Я буду использовать Google Colab для редактирования кода, потому что он дает мне вариант с графическим процессором, который быстрее отображает код.
Импорт
Мы импортируем наши зависимости. Поскольку мы будем использовать 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.
Как только мы получим результат, мы сможем создавать функции для представления контента и стиля, которые будут синтезировать для нас изображение.
Задача функции функции состоит в том, чтобы передать изображение на специально выбранный слой CNN, оставив остальное нетронутым.
Матрица Грама
Матрица Грама или матрица грамиана — это набор векторов {v1, v2, v3, v4, vn} во внутреннем пространстве продукта, элементы которого задаются как Gij = ‹vi, vj› .
Это говорит нам, что это квадратная матрица v. т.е. мы можем вычислить v * v.T
Важным применением грамиана является вычисление линейной независимости: набор векторов линейно независим тогда и только тогда, когда определитель Грама (определитель матрицы Грама) отличен от нуля. Другими словами, грамматика помогает найти корреляцию между различными фильтрами в CNN.
Лучший способ получить потерю стиля — это измерить матрицу граммов.
Оптимизация и веса
Оптимизация — это улучшение модели за счет уменьшения ошибки и повышения точности. Подробную версию оптимизации читайте в недавно написанной мною статье Что такое градиентный спуск.
Мы также инициализировали случайные веса для каждого выбранного нами слоя стилей, которые будут преобразованы в среднеквадратичную ошибку целевой и матрицы грамматики характеристик.
После того, как мы завершили все необходимое кодирование, мы можем перейти к последней части, т.е. оптимизация с использованием цикла for.
Но прежде чем мы поместим все в цикл, мы должны инициализировать оптимизатор, который мы будем использовать, в нашем случае Адам и мы будем оптимизировать целевое изображение или пустой холст.
После того, как мы определили все, что мы можем запустить цикл for, и поместить в него все наши расчеты потерь, включая:
- Потеря контента
- Потеря стиля
- полная потеря
Мы будем использовать норму L2 или среднеквадратичную ошибку, как указано в статье.
Полная потеря будет содержать значения альфа и бета, которые мы определили вместе с весами. Эти альфа и бета являются весовыми коэффициентами, которые определяют сочетание содержимого и стиля изображений для получения выходного изображения.
Ниже приведены некоторые изображения, которые я создал:
Заключение
По сути, мы увидели:
- Как мы можем прочитать статью и записать важную и ценную информацию.
- Поймите концепцию и схему, особенно для интерпретации и отображения нашего процесса.
- Пошагово выполняйте функцию вместе с хорошо написанной формулой.
- Используйте цикл for для оптимизации модели.
- Наконец, нужно запастись терпением.