Увеличиваем FPS в аниме с помощью нейросети и GPU Tesla T4
Привет, Хабр! Я Кирилл, работаю в техподдержке Selectel. Как-то я решил посмотреть легендарное аниме 1995 года «Призрак в доспехах» и не смог сдержать слез. В первую очередь оттого, что частота кадров в этом аниме — убийственные для моего зрения 23 кадра в секунду. В силу особенностей жанра аниме частота кадров на некоторых отрезках видео может достигать до 12 в секунду.
Страдать я не хотел, поэтому начал гуглить, какое решение может предложить мне мир IT. В итоге наткнулся на крайне интересную технологию — интерполяцию, которая используется почти везде, но мы о ней очень мало знаем. Под катом рассказываю, как она, нейросеть RIFE и сервер с GPU помогли мне посмотреть «Призрака» без головной боли.
Немного теории
Начнем с самого главного — с понятия, вокруг которого построена статья.
Интерполяция кадров видео, или Video Frame Interpolation (VFI), — это обобщенное название целого ряда различных подходов, ориентированных на то, чтобы выполнить одну единственную цель — улучшить качество видеоконтента путем добавления промежуточных кадров в видеоряд. Суть подхода в том, чтобы взять два ключевых кадра и создать на их основе промежуточный. Так, в перспективе, их общее число увеличивается в несколько раз.
Стандартный метод интерполяции
Стандартная интерполяция использует метод преобразования видеопотока. Сама по себе технология довольно старая и уходит корнями в 90-е годы. Главным недостатком метода является то, что стандартные алгоритмы интерполяции состоят только из математической модели и не подразумевают анализ содержимого кадра, его глубину и движение объектов внутри него. Это зачастую приводит к неприятным артефактам в обработанном видео. Лучше всего иллюстрируют пример таких артефактов видео с котиками.
У такого подхода есть и плюсы: стандартная межкадровая интерполяция не требует больших мощностей для эффективной работы, что делает ее очень распространенной в различных видеокодеках.
Еще технология повсеместно используется в современных телевизорах и проекторах: различие между герцовкой экрана и скоростью видеопотока, по словам производителей, вызывает ощущение рваной картинки, поэтому телевизоры автоматически интерполируют кадры, чтобы этот эффект нивелировать.
Однако это может нарушить планы некоторых режиссеров. В особенности это раздражает создателей боевиков, специально снимающих свои фильмы с 30 FPS. Дело в том, что во многих современных телевизорах опция интерполяции кадров включена по умолчанию. Картинка становится слишком плавной, из-за чего фильм выглядит совсем не так, как он был изначально задуман, а зритель перестает верить в происходящее.
В 2018 году Том Круз высказывался в пользу отключения данной функции перед просмотром полнометражного кино. Картинка действительно выглядит странно и неестественно, будто снята на цифровую камеру, а не на пленку. У этого явления даже появилось название — «Эффект мыльной оперы». Я не удержался и сделал на эту тему мем.
Современный метод интерполяции
Современные методы интерполяции основаны на слаженной работе сразу нескольких алгоритмов, включающих в себя стандартный анализ видеопотока и связки различных нейросетей.
Этот метод решает часть недостатков стандартной интерполяции — например, неприятные артефакты, появляющиеся на фоне кадра, когда на экране происходит движение.
Но как? Давайте разберемся.
Современные алгоритмы представляют из себя своеобразный многослойный пирог из программных решений. На каждом слое происходит обработка кадра с помощью нейросетей и сложных математических моделей. Этот подход дает ряд преимуществ перед стандартным методом:
- Картинка становится намного плавнее и выглядит естественнее.
- На выходе алгоритм выдает меньше артефактов за счет более глубокого анализа.
- Такой подход дает нам возможность увеличивать количество кадров неограниченное количество раз. То есть с помощью этих алгоритмов можно сделать slow motion 5 000 кадров в секунду из двухсекундного видео.
Окей, звучит очень складно. А недостатки у этого метода есть? Да, и они серьезно ограничивают массовое применение этих технологий в устройствах:
- Самым главным недостатком метода является его прожорливость к ресурсам. Чтобы качественно обработать видео в высоком разрешении с помощью нейросетей, понадобится либо очень мощный графический ускоритель, либо значительное количество времени.
- Из первого минуса выходит следующий — высокая стоимость обработки одного кадра.
- Современные алгоритмы еще не научились суперкачественно достраивать кадры, на которых движение каких-либо объектов происходит слишком быстро. Так, например, при интерполяции видео игры в теннис на части кадров мяча не будет видно. Нейросеть просто не дорисует его как незначительный элемент кадра.
Современные методы интерполяции практически не имеют массового применения из-за высокой требовательности к ресурсам. На данный момент в большинстве случаев ее алгоритмы используются для экспериментов.
Но есть исключения. Компания NVIDIA научилась использовать методы, применяемые при анализе кадров, для улучшения картинки в играх. Так появилась технология DLSS, которая одновременно убивает двух зайцев: улучшает картинку в игре и увеличивает частоту кадров в секунду почти в два раза.
Помимо крупных компаний вроде NVIDIA, методы интерполяции с помощью нейросетей используют небольшие стартапы, такие как neural.love. Это проект нашего соотечественника, который применяет современные нейросети для решения целого ряда различных задач — от апскейлинга видео в 4К и интерполяции в 60 FPS до восстановления старинных фотографий. Выглядит как магия.
Этот текст — не ВКР по нейросетям, но чтобы чуть лучше разобраться, на каких нейросетях работает современный метод интерполяции, давайте познакомимся с популярной «исследовательской» нейросетью.
DAIN — самая известная VFI-нейросеть
Эта нейросеть не является готовым продуктом, это исследовательский алгоритм, разработанный с целью пересмотреть подход к интерполяции и сделать ее «произведением искусства». Модель получает на вход видео и проходится по нему несколько раз, применяя к кадрам разные методы. На выходе мы получаем максимально качественно обработанный контент.
DAIN состоит из следующих «слоев»:
Алгоритм преобразования оптического потока
На этом этапе происходит хорошо знакомая нам межкадровая интерполяция «старым» стандартным методом, ничего особенного. Идем дальше.
Построение карты глубины
На этом этапе включается вспомогательная нейросеть, которая берет кадр и выстраивает его карту глубины. Как раз эта особенность алгоритма помогает сделать более качественную картинку на выходе.
Анализ контекста
Алгоритм как правило берет все кадры предоставленного ему видео и интерполирует сразу все. Как правило, это приводит к ситуациям, когда на стыке двух планов (например, герой в анфас → герой со спины) нейросеть выдает кашу из двух сцен, на которой ничего не понятно. При единичном увеличении количества кадров в два раза это практически незаметно. Но при многократном увеличении фреймрейта видео просто невозможно смотреть, так как оно состоит сплошь из мешанины.
Для нивелирования этого эффекта в работу включается вторая нейросеть, которая сравнивает кадры в поисках сильных различий в контексте. Если кадры значительно отличаются, они войдут в разные сцены, а значит, на выходе видео будет смотрибельным.
Интерполяция нейросетью
На этом этапе включается нейросеть, которая берет два соседних изображения, сопоставляет их с картой глубины и анализом оптического потока (их мы получили на предыдущем этапе). Затем генерирует кадры с промежуточным изображением.
Сборка видео
На последнем этапе остается только взять все кадры, предоставленные нейросетью, соединить их с кадрами, которые были в видео изначально, и подобрать правильный фреймрейт. После этого на видео можно со спокойной душой накладывать звук и получать удовольствие от плавной картинки.
Более наглядно это в реализации. Например, вот мое любимое видео, интерполированное с помощью DAIN.
Технологии интерполяции видео развиваются очень быстро, поэтому по меркам искусственного интеллекта DAIN считается устаревшей. В 2020 году группа исследователей из Китая пересмотрела работу ряда похожих алгоритмов — в результате получился RIFE.
Какую нейронную сеть использовал я
Для своей благой цели и сохранения зрения я решил использовать более новый трансформер, занимающийся интерполяцией, — RIFE. Сама по себе нейросеть использует подход, при котором не применяется метод анализа оптического потока (первый слой DAIN).
Разработчики написали собственный алгоритм, который был обучен на двух гигантских датасетах из видео в высоком качестве. Этот алгоритм так же, как в классических нейросетях для интерполяции, строит карту глубины и выделяет на ней отдельные объекты. Но дорисовывает только те части кадров, на которых происходит движение объектов.
Благодаря пересмотру стандартного подхода разработчикам удалось добиться головокружительного успеха: по их слова, RIFE работает в 4 раза (а в некоторых случаях — до 27 раз) быстрее предшественников.
Интерполяция своими руками
Итак, что нам понадобится, чтобы сделать интерполяцию с помощью RIFE самостоятельно?
Первым делом нам нужны достаточные вычислительные мощности. В качестве стенда я выбрал облачный сервер с видеокартой NVIDIA Tesla T4.
После этого переходим в официальный GitHub репозиторий авторов нейросети RIFE и клонируем его себе на сервер:
git clone git@github.com:megvii-research/ECCV2022-RIFE.git && cd ECCV2022-RIFE
Далее для корректной работы нейросети нам понадобится установить необходимые зависимости. Они лежат в файле requirements.txt. Выполняем команду:
pip3 install -r requirements.txt
Для работы алгоритма также необходима обученная модель. Можно обучить самостоятельно или воспользоваться моделью, которую любезно натренировали за нас разработчики RIFE. Скачать модель можно тут.
Скачанную модель необходимо переместить в каталог train_log/
Дальше все очень просто. Загружаем на сервер необходимое нам видео. После окончания загрузки можно приступать к магии.
Для создания видео с удвоенной частотой кадров запускаем команду:
python3 inference_video.py --exp=1 --video=video.mp4
Процесс пошел! Можно отойти попить чаю или включить очередную серию любимого сериала, если видео длинное: интерполяция с помощью нейросетей — довольно долгий процесс. Например, на полный прогон «Призрака в доспехах» мне понадобилось два с половиной часа.
Когда алгоритм закончит обрабатывать видео, в каталоге, который мы скачали с GitHub, появится готовое видео с увеличенным количеством кадров. Посмотрим на итоги нашей работы:
Слева находится оригинальная запись, в то время как видео справа — результат работы RIFE. Ровно половина кадров этого видео создана нейросетью на основе полученных на входе кадров.
И еще чуть-чуть.
Изображение стало более плавным — все благодаря интерполяции.
Вот так желание смотреть аниме без дискомфорта подтолкнуло меня разобраться в механизмах интерполяции и увеличить FPS аниме с помощью нейросети на облачном сервере с GPU. Пишите в комментариях, знакомы ли с этой технологией и страдаете ли вы при просмотре аниме.