Построение модели переноса стиля

В первой части этого руководства мы обсудим следующее:

  1. Построение модели переноса стилей вместе с кодом.
  2. Рисование дудла с использованием Tkinter, пакета графического интерфейса Python.

Во второй части мы узнаем, как интегрировать их в веб-сайт на основе Django:



Разве вас не всегда завораживали смелые мазки, цвета и контуры, нарисованные художниками со всего мира? Ну, конечно, был. Будь то волнистые оттенки Звездной ночи Кан Гога или более абстрактное искусство Пикассо, эти картины соблазняют всех нас создать собственные моменты и воспоминания в этих стилях.

Что ж, нейронные сети спешат на помощь! Просто когда вы подумали, что они не могут быть круче, верно?

Что такое перенос стиля?

Перенос стиля - это метод перекомпоновки изображений, называемых изображениями содержимого, в стиле других изображений, также известных как изображения стиля. Все началось, когда Гэтис и др. опубликовал удивительную статью о том, как перенести художественный стиль с одной картины на другую с помощью сверточных нейронных сетей (CNN).

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

Предварительные требования

  1. Знакомство с нейронными сетями.
  2. Основы Django (необязательно, если вы хотите следовать руководству по созданию веб-сайта).

Понимание передачи стилей с помощью сверточных нейронных сетей

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

Детали установки

  1. Версия Keras == 2.2.4
  2. TensorFlow == 1.8.0
  3. Блокнот Jupyter
  4. Matplotlib и другие служебные библиотеки, такие как NumPy, Pandas.
  5. Python == 3.5.7

Погружение в перенос стиля

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

Использование предварительно обученного VGG-16

Если мы возьмем сверточную нейронную сеть, которая уже была обучена распознавать объекты на изображениях, например Модель VGG-16, обученная на Вызове ImageNet, то эта сеть разработает некоторые внутренние независимые представления контента и стиля, содержащихся внутри данное изображение.

Если вас не устраивает архитектура VGG-16, прочтите эту статью.

Почему VGG предпочтительнее других предварительно обученных моделей?

Чтобы ответить на вопрос, почему стоит выбрать VGG-16 или VGG-19 по сравнению с другими:

  1. Он вычислительно легче, чем Inception-Net. Лучшая производительность VGG обусловлена ​​тем, что не слишком агрессивно понижает дискретизацию, и делает это только после двух сверток с последующим максимальным объединением. В этой интерпретации GoogLeNet не работает, потому что он выполняет субдискретизацию на первом уровне.
  2. ResNets - это развернутые итерационные / мелкие ансамбли: функции действительно существуют, но они слишком разбросаны, чтобы их можно было легко извлечь, а уровни абстракции все смешаны - вместо того, чтобы получить хороший баланс функций снизу и сверху , они сильно разбросаны между слоями. Сами по себе остаточные соединения каким-то образом портят процедуру оптимизации, влияя на такие свойства, как независимость функций.

Убытки

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

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

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

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

Код

Потеря стиля

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

Для этого вычисляем матрицу Грама. Матрица Грама - это, по сути, просто матрица скалярных произведений векторов активации функций слоя стиля.

Если запись в матрице Грама имеет значение, близкое к нулю, это означает, что две функции в данном слое не активируются одновременно для данного стиля-изображения. И наоборот, если запись в матрице Грама имеет большое значение, это означает, что две функции действительно активируются одновременно для данного изображения стиля.

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

Код

Потеря шумоподавления (необязательно)

Мы также можем удалить смешанное изображение. Алгоритм называется Total Variation Denoising, и, по сути, просто сдвигает изображение на один пиксель по осям x и y, вычисляет разницу с исходным изображением, принимает абсолютное значение, чтобы гарантировать Разница - положительное число, суммируемое по всем пикселям изображения. Это помогает уменьшить шум на изображении.

Общий убыток должен быть минимизирован

Какие слои выбрать для потери контента и стиля?

Уловка выбора слоев для содержимого и потери стиля заключается в следующем:

Выберите начальные слои для потери содержимого и выберите последующие сверточные слои для потери стиля.

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

Алгоритм оптимизации

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

  1. Заморозьте веса предварительно обученных слоев VGG-16, потому что мы не хотим тренировать VGG-16.

2. Получите представление о стиле и содержании (из указанных промежуточных слоев).

3. Установите начальное изображение и создайте наш оптимизатор.

4. После расчета потерь примените градиентный спуск на итерациях.

5. Сохраните изображение и модель с помощью Подушечки и Рассола.

Полученные результаты

Количество итераций и слои, используемые для потери содержимого и стиля, можно настроить в соответствии с вашими требованиями. Вы можете увидеть результаты нашей модели ниже:

Нарисуйте дудл с помощью Tkinter

Для веб-сайта, предоставляющего интерфейс для переноса стилей, Tkinter предлагает удобную утилиту для рисования каракулей вручную, а затем рисования их в разных стилях. В наших целях мы используем встроенный пакет Python для разработки графического пользовательского интерфейса (GUI).

Краткая информация о Ткинтер

Python в сочетании с Tkinter обеспечивает быстрый и простой способ создания приложений с графическим интерфейсом. Tkinter (Tk) предоставляет мощный объектно-ориентированный интерфейс для набора инструментов GUI.

Чтобы создать tkinter:

  1. Импорт модуля - tkinter
  2. Создать главное окно (контейнер)
  3. Добавляйте любое количество виджетов в главное окно
  4. Примените событие Trigger к виджетам.

Пример:-

import tkinter 
m = tkinter.Tk() 
''' 
widgets are added here 
'''
m.mainloop()

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

1. Tk(screenName=None, baseName=None, className=’Tk’, useTk=1) : Для создания главного окна tkinter предлагает метод Tk(screenName=None, baseName=None, className=’Tk’, useTk=1). Чтобы изменить название окна, вы можете изменить className на любое другое. Основной код, используемый для создания главного окна приложения:

m=tkinter.Tk() where m is the name of the main window object

2. mainloop(): есть метод под названием mainloop(), который используется, когда вы готовы к запуску приложения. mainloop() - это бесконечный цикл, используемый для запуска приложения: ожидание возникновения события и обработка события до тех пор, пока окно не закроется.

m.mainloop()

Виджеты

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

  1. Button: Для добавления кнопки в ваше приложение используется этот виджет:
w=Button(master, option=value)

master - это параметр, используемый для представления родительского окна. Некоторые параметры могут быть переданы как параметры, разделенные запятыми. Некоторые из них перечислены ниже:

  • activebackground: для установки цвета фона, когда кнопка находится под курсором.
  • activeforeground: установить цвет переднего плана, когда кнопка находится под курсором.
  • bg: установить нормальный цвет фона.
  • command: для вызова функции.
  • font: для установки шрифта на метке кнопки.
  • image: установить изображение на кнопку.
  • width: установить ширину кнопки.
  • height: установить высоту кнопки.

2. Canvas: Используется для рисования изображений и других сложных макетов, таких как графика, текст и виджеты.

w = Canvas(master, option=value)
master is the parameter used to represent the parent window.

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

  • bd: установить ширину границы в пикселях.
  • bg: для установки обычного цвета фона.
  • cursor: для установки курсора, используемого на холсте.
  • highlightcolor: для установки цвета выделения фокуса.
  • width: установить ширину виджета.
  • height: установить высоту виджета.

Чтобы узнать больше об этих виджетах, отметьте this.

Код для простого рисованного интерфейса

  1. Определите класс и создайте конструктор для инициализации объекта tkinter и Canvas

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

Полученные результаты

Ниже показано набросанное изображение вашего собственного интерфейса, похожего на MS Paint. Посмотри!

Заключение

Можно сказать, что мы создали большую часть того, что необходимо для нашего веб-сайта. Следующая часть (скоро будет) будет посвящена их интеграции в веб-сайт на основе Django. Вы можете пропустить часть вторую, если хотите, чтобы они были реализованы с использованием другой веб-платформы. На данный момент мы создали и сохранили модель переноса стилей и графический интерфейс пользователя.

Ого! Это много?

Репозиторий

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



Щелкните здесь только для получения кода переноса стиля.

Щелкните здесь только для просмотра кода графического интерфейса пользователя Tkinter Doodle.

Источники

  1. Https://docs.python.org/2/library/tkinter.html
  2. Https://medium.com/data-science-group-iitr/artistic-style-transfer-with-convolutional-neural-network-7ce2476039fd
  3. Https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/15_Style_Transfer.ipynb

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

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

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

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить лучшие модели машинного обучения.