Передача стиля изображения/видео с помощью OpenCV и Python без графического процессора

Python Нейронные сети OpenCV

автор: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 без графического процессора