Передача видео в нейронном стиле в реальном времени

Авторы Джеффри Рэйни и Арчи де Беркер

Mur.AI - установка для стилизованного видео в реальном времени. Для обработки требуется изображение в эталонном стиле, например картина, и видеопоток. Затем видеопоток обрабатывается так, чтобы он имел стиль эталонного изображения. Стилизация выполняется в реальном времени, создавая стилизованный видеопоток.

В предыдущем посте мы описали технику стабилизации передачи стилей, чтобы она хорошо работала для видео. Впоследствии мы применили эти методы для создания системы, которую мы демонстрировали на различных конференциях, включая C2, Art Basel и NIPS. Вы можете проверить некоторые из полученных селфи в Твиттере.

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

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

Перенос стиля - это приложение художественного стиля одного изображения к другому изображению:

Впервые эта техника была представлена ​​в статье Нейронный алгоритм художественного стиля Леона А. Гэтиса, Александра С. Эккера и Матиаса Бетге. С тех пор мы стали свидетелями повсеместного применения переноса стилей и множества улучшений исходного алгоритма. В частности, в нашей реализации мы основываемся на работе Джастина Джонсона, Александра Алахи и Фей-Фей Ли Потери восприятия для переноса стиля в реальном времени и сверхвысокого разрешения, которая обеспечивает более быстрое решение для переноса стиля, которое легче применимо к видео.

Как это работает?

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

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

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

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

Классификационная сеть

Классификационная CNN берет изображение и пытается определить, что оно содержит. Например, если у вас есть фотографии кошек и собак, вы можете обучить классификационный CNN определить, какие из них какие. В классификаторе CNN, который мы используем, задача состоит в том, чтобы классифицировать небольшие изображения в одну из 1000 категорий, чрезвычайно популярная задача под названием ImageNet.

Сеть классификаторов выполняет несколько сверток изображения, чтобы получить функции, полезные для классификации. По мере прохождения изображения по сети оно становится все меньше и меньше по размеру (в пикселях), но также увеличивается с точки зрения компонентов на пиксель. Из входа RGB (3 компонента) при полном разрешении он итеративно сжимает изображение до одного пикселя, но со многими компонентами: вероятностью изображения, представляющего каждую из многих категорий.

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

Представьте, что вы подаете в сеть свою фотографию в пижаме. После первых слоев информация, обрабатываемая сетью, будет отображена на локальные объекты («тонкие вертикальные синие полосы»), тогда как последние слои сети будут фиксировать объекты, которые описывают изображение в целом («кто-то стоит»). Таким образом, ранние слои отражают стиль изображения, в то время как функции, усвоенные последними слоями, захватывают содержимое.

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

Сеть стилизации

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

Для этого берем большой набор изображений для обучения и повторяем следующие шаги:

  1. Мы загружаем в классификатор CNN изображение Style, Source изображение и стилизованное изображение из текущей стилизации CNN.
  2. Мы извлекаем представления стиля и содержимого из сети классификаторов.
  3. Мы настраиваем стилизацию CNN так, чтобы стилизованное изображение имело стиль, который больше напоминал стиль изображения, и содержание, которое напоминало исходное изображение.

В псевдопитон-коде:

И наглядно:

Захват стиля заключается в сохранении мелкомасштабных функций изображения Style при сохранении крупномасштабных функций изображения Source. Вкратце, мы ищем стилизацию CNN, которая поддерживает «синие и коричневые закрученные цвета» стиля, сохраняя при этом «двух программистов, столбец и несколько рабочих столов» source .

Чтобы зафиксировать это, мы вычисляем разницу между Style и Stylized в начале сети и Source и Stylized позже в сеть. Наша функция потерь - то, что мы пытаемся минимизировать, изменяя параметры нашей сети стилизации, - представляет собой сумму этих двух членов. Фактически, как подробно описано в нашем предыдущем посте, мы включили дополнительный термин потери стабильности, который помог обеспечить стабильную передачу стиля от кадра к кадру. Вы можете найти код нашей обновленной реализации здесь.

В общем, наша реализация теперь обучает новый стиль из изображения 512 x 512 пикселей за ~ 6 часов с использованием 4 графических процессоров.

Развертывание нашей системы

Мы столкнулись с несколькими проблемами при развертывании демоверсии для работы в режиме реального времени. Основными проблемами были пропускная способность и задержка: как мы могли бы взять видео, пропустить его через нашу модель, а затем снова отрендерить его почти в реальном времени?

Декодирование H264 на графическом процессоре

Используемая нами камера (Logitech C920) выводит предварительно сжатое видео в формате H264. Наивным подходом было бы декодировать это видео с помощью FFmpeg на графическом процессоре, чтобы вернуть пиксели RGB в ЦП и снова загрузить их в качестве входных данных для CNN.

Однако оказалось, что передача CPU-GPU приводит к значительному увеличению задержки, заставляя точки синхронизации между CPU и GPU при копировании. Решение заключалось в декодировании видео H264 непосредственно с помощью встроенного движка NVDEC (аппаратного ускоренного декодера, включенного в Zotac EN1070). Это позволяло передавать декодированные кадры непосредственно в качестве входных данных в нашу CNN, позволяя GPU и CPU работать полностью асинхронно.

Рендеринг OpenGL с помощью графического процессора

Декодировав наше видео и запустив нашу сеть на GPU, мы столкнулись с аналогичным узким местом при передаче результирующей матрицы обратно в CPU для обычного рендеринга. Опять же, решение было вычислением на GPU. Используя CUDA / OpenGL Interop API, мы можем отображать выходные данные на экран прямо из графического процессора, избегая дальнейших узких мест ввода-вывода.

Интеграция с Twitter

Демонстрационная кабина объединяет функции для публикации стилизованных изображений в Twitter. Ленту можно увидеть на @ElementAIArt.

Используемые стили

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

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

Благодарности

Эту работу выполнили Джеффри Рейни, Эрик Роберт, Жан Раби и Филипп Матье при поддержке команды Element AI. Спасибо Ксавье Снелгроув за комментарии к публикации.

Он основан на кодовой базе с открытым исходным кодом Faster Neural Style Transfer by Yusuketomoto, которая представляет собой реализацию Perceptual Loses for Real-Time Transfer and Super-Resolution Justin Johnson, Alexandre Alahi и Ли Фэй-Фэй .