автор:Adrian Rosebrock
Скомпилировать:Bing
В 2015 году Gatsys et al.A Neural Algorithm of Artistic StyleОригинальный алгоритм передачи нейронного стиля был предложен в . В 2016 году Джонсон и др. опубликовалиPerceptual Losses for Real-Time Style Transfer and Super-ResolutioinВ этой статье перенос нейронной сети как основа для решения проблем сверхвысокого разрешения с потерями восприятия. Результаты показывают, что алгоритм работает в три раза быстрее, чем метод Gatys et al. Далее я опишу, как применить нейронную передачу стиля к моим собственным изображениям и видеопотокам.
Передача нейронного стиля с OpenCV
Первое, на что следует обратить внимание, это то, что обсуждаемый сегодня метод может достигать эффектов, близких к реальному времени, на ЦП, и может достигать эффектов в реальном времени полностью на графическом процессоре.
Сначала мы кратко опишем, что такое нейронный перенос стиля и как он работает. После этого мы приступим к работе с OpenCV и Python.
Что такое передача нейронного стиля?
Существует два основных процесса передачи нейронного стиля:
- Извлечь стиль изображения
- Применить этот стиль к другому изображению
Вышеприведенная картина представляет собой применение стиля знаменитой картины Ван Гога "Звездная ночь" к обычным жизненным фотографиям. Мы сохранили все содержание гор, фигур и пива на исходной фотографии, но заменили их стилем живописи Ван Гога маслом.
Вопрос в том, как нам определить нейронную сеть, которая выполняет передачу нейронного стиля?
Как работает передача нейронного стиля?
В первой статье, представленной Gatys et al., алгоритм передачи нейронного стиля не требует новой архитектуры. Вместо этого мы можем использовать предварительно обученную сеть (обычно предварительно обученную в ImageNet), определить функцию потерь, которая позволяет нам достичь цели передачи стиля, а затем непрерывно оптимизировать функцию потерь.
Так что здесь вопрос не в том, «какую нейросеть использовать», а в том, «какую функцию потерь использовать».
Ответы включают:Потеря контента,потеря стиляиОбщие потери от вариаций. Каждая часть вычисляется отдельно, а затем объединяется в функцию метапотери. Минимизируя функцию мета-потери, мы, в свою очередь, оптимизируем потери контента, стиля и общей дисперсии.
Хотя метод Gatys и др. дает достойные результаты передачи нейронного стиля, он очень медленный. В 2016 году новый алгоритм, предложенный Джонсоном и др. на основе Gatys, в три раза быстрее, но и у него есть недостатки, а именноПользователь не может случайным образом выбрать изображение стиля, которое он хочет применить.. Сначала пользователь должен обучить сеть генерировать нужный стиль. После того, как сеть обучена, вы можете применить ее к произвольным изображениям контента.
Однако в 2017 г. Ульянов и соавт.Instance Normalization: The Missing Ingredient for Fast StylizationВ одной статье они сказали, что замена пакетной нормализации на нормализацию экземпляра (а затем применение нормализации экземпляра во время обучения и тестирования) может привести к более быстрым результатам и лучшим художественным результатам.
Структура проекта
Прежде чем приступить к сегодняшнему руководству, загрузите предоставленную мной информацию (щелкните исходный адрес в конце статьи, чтобы получить информацию). Как только ваши сценарии, модели и изображения будут готовы, вы можете использоватьtree
Директива проверяет структуру проекта:
Если вы загрузили файл .zip отсюда, вам не нужно выходить в Интернет, чтобы найти другие материалы. Я предоставляю много изображений и моделей для тестирования в нем. Есть также три скрипта Python.
Начало работы с переносом нейронного стиля
Далее давайте попрактикуемся в передаче нейронного стиля с помощью OpenCV и Python.
первый открытыйneural_style_transfer.py
файл, вставьте следующий код:
Импортируем необходимые пакеты и разбираем аргументы командной строки.
Импортные:
- imutils: к этому пакету можно получить доступ через
pip install --upgrade imutils
Установить. Недавно я разместилimutils==0.5.1
, так что не забудьте обновить! - OpenCV: вам нужен OpenCV 3.4 или выше.
Для этого скрипта требуются две командные строки:
-
--model
: Путь модели для передачи нейронного стиля. В раздел "Загрузки" я добавил 11 обученных и обученных моделей. -
--image
: Изображение (входное изображение), для которого необходимо передать стиль. В него я поместил четыре картинки.
Вам не нужно менять код командной строки, параметры обрабатываются во время выполнения. Если вы не знакомы с этим процессом, можете прочитать другую мою статью:www.pyimagese arch.com/2018/03/12/python-argparse-command-line-arguments/
Следующая часть более интересна, мы загружаем изображение и модель, а затем вычисляем передачу нейронного стиля:
В этой части кода мы делаем:
- Вызовите загруженную предварительно обученную модель передачи нейронного стиля как
net
(строка 17); - Загрузите исходное изображение и измените его размер (строки 21 и 22);
- Создано с вычитанием среднего
blob
(строки 27 и 28); - воплощать в жизнь
forward
,Получатьoutput
изображение (строка 31).
Далее важно выполнить постобработку выходного изображения:
Последним шагом является отображение выходного изображения на экране:
Результаты переноса нейронного стиля
После загрузки файла откройте терминал и выполните следующую команду:
Теперь внесите простое изменение в параметры командной строки и используйте скриншот из Jurassic Park в качестве изображения содержимого для передачи стиля:
другой пример:
Это мой любимый чехол, и мне кажется, что его можно использовать как декоративную картину для бара.
Передача нейронного стиля в реальном времени
Выше мы говорили о том, как применить перенос стиля к одному изображению, теперь мы собираемся применить этот процесс к видео.
Общий процесс аналогичен обработке изображения, в этом скрипте мы будем:
- Используя специальный итератор Python, он позволяет нам циклически перебирать все доступные модели передачи нейронных стилей в пути к модели.
- Запустите поток веб-камеры, и мы будем обрабатывать кадры камеры (почти) в режиме реального времени. Для некоторых более крупных моделей система может работать медленнее.
- Примените передачу стиля к каждому кадру, выполните постобработку вывода и отобразите результат на экране.
- Если пользователь нажмет клавишу «n», мы зациклим итератор на следующую модель передачи нейронного стиля без перезапуска скрипта.
Во-первых, откройтеneural_style_transfer_video.py
файл, вставьте следующий код:
После этого создайте итератор пути модели:
Как только мы начнемwhile
Фреймы обрабатываются в цикле, и клавиша «n» загрузит в итератор «следующую» модель.
Чтобы создать итератор модели, мы:
- Соберите и классифицируйте все модели переноса нейронного стиля (строки 18 и 19).
- Назначьте идентификатор каждой модели (строка 23)
- использовать
itertools
иcycle
Создайте итератор (строка 27).
Приступим к загрузке первой модели и обработке видео:
В строке 32 мы читаем путь, используемый первой моделью. По строкам 36 и 37 запускается видео, захватывая кадры с камеры.
Затем цикл от кадра к кадру:
Затем выполните постобработку и отобразите выходное изображение:
Обращение с ключами:
Два разных нажатия клавиш по-разному влияют на выполнение скрипта:
- «n»: возьмите путь и идентификатор следующей модели и загрузите ее. Если мы получили предыдущую модель, итератор повторяется с самого начала.
- "q": нажмите q, чтобы выйти
while
цикл.
Результаты передачи живого стиля
Выполните следующую команду, чтобы применить передачу стиля к видео:
Как видите, переключаться легко, просто нажимая кнопку. Вот демонстрационное видео, которое я сделал сам:
Передача стиля изображения и видео с использованием только OpenCV и Python без графического процессора