Upscaler VS Frame Interpolator
Denis Malimonov
Казалось бы, эти два алгоритма решают разные задачи и сравнению не подлежат, но сегодня мы попытаемся разобраться с тем, как закручивать шурупы молотком и забивать гвозди отверткой, но сперва немного теории. Первое, что нужно выяснить:
Что такое видео?
По своей сути это секвенция (набор) кадров, сменяющихся с течением времени с определенной скоростью. Иногда это происходит под какую-нибудь веселую музыку, но сейчас не об этом. Представим, что каждый кадр, который имеет свою высоту (H) и ширину (W) мы поочередно расставляем в ряд, под условным названием "временной" (T):

Представим, что кадры делались с высокой частотой и в итоге мы получаем захват состояний объекта на фотографии в разные моменты времени. Если эту стопку кадров мы будем быстро перелистывать, например, со скоростью 25 кадров в секунду, то мы получим видео. Например, такое:
Второе с чем мы разберемся:
Какие манипуляции можно проводить с тремя имеющимися пространственными величинами (H, W, T)?
На самом деле вариантов много (сжатие, расширение, отражение и т.д.), но сегодня мы разберем самое интересное: вращение.

На изображении выше показано вращение по оси H, которая обозначает высоту. В трехмерном пространстве эта ось обозначается Z, но у нас ситуация немного иная, поэтому дальше продолжу объяснять на своих условных обозначениях. В общем, сделав такое вращение мы получаем новую репрезентацию нашего видео, а именно мы видим состояние всех вертикальных столбцов пикселей за весь период времени. Речь идет о стоп-кадре, но как будет меняться изображение на экране, если мы запустим видео? По-сути мы увидим процесс сканирования по бывшей горизонтальной оси W, которая обозначала ширину, а теперь она стала временем. Визуально ДО и ПОСЛЕ будет выглядеть так:
Не стоит это видео ставить на паузу и пытаться понять, как левая часть соотносится с правой, так как у них нет общей привязки ко времени.
Сейчас можно быстро переместиться в самое начало статьи и в первой картинке увидеть левую и правую грань куба, которые я и попытался изобразить в этом видео. Лучше всего, если вы все еще не поняли о чем я говорю, посмотрите это видео: https://www.youtube.com/watch?v=n4tbdFD18vs
Подытожу: проще говоря мы поменяли местами пространство и время, но что же нам это дает? Теперь мы смотрим на видео под другим углом, а значит привычные алгоритмы апскейла и интерполяции кадров будут работать не так, как мы привыкли. И сразу встает вопрос: "А как?". Давайте вместе в этом разберемся!
Upscale
Frame upscaling (увеличение разрешения кадров) - прикладная задача в машинном обучении. Мы получаем низкокачественное видео и хотим кратно увеличить стороны (H, W) каждого его кадра. В качестве эксперимента мы берем алгоритм (RIFE) по интерполяции кадров (frame interpolator, далее F.I.) и будем использовать его не по назначению, но сперва расскажу как он работает. Его основная задача - предположить, какое изображение было между двумя соседними кадрами (то есть их промежуточное состояние). Сделав подобное для каждой пары соседних кадров мы получаем видео с исходным разрешением, но самих кадров станет больше, а значит наша стопка изображений (представленная как куб) вытянется по оси времени T:

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

И вот наше видео стало шире, но чтобы это проверить нам стоит совершить еще одно вращение так, чтобы оси вернулись в первоначальное положение:

В итоге мы воспользовались алгоритмом F.I., но длительность и скорость видео не изменились, а картинка стала шире в несколько раз:
Для полноценного апскейла нам необходимо повторить подобные действия и для высоты H. Теперь мы будем вращать видео по оси W так, чтобы бывшая высота H заменила собой время T:

Как можно заметить из изображения выше, после вращения мы опять применили алгоритм F.I. и вытянули сторону H, тем самым почти завершив апскeйл. Остается только произвести вращение видео в начальное состояние:

По итогу мы сгенерировали видео с повышенным разрешением, которое мы получили с помощью инструмента по увеличению количества кадров. Прошу заметить, количества кадров, а не их размера! Магия? Нет, математика.
Тем не менее в заголовке статьи заявлялось сравнение, поэтому результат всех наших манипуляций я решил сравнить с результатом нейросети, которая была заточена под решение задач апскейла, а именно Real-ESRGAN.
Так как F.I. пытается сгладить два соседних кадра, чтобы получить их промежуточное состояние, то и на видео выше (в левой части) мы видим сглаженные контуры, отсутствие мелких деталей, размытость однородных текстур. Все это говорит о том, что данный алгоритм плохо справился с поставленной задачей.
Плохо, но всеж нам удалось вкрутить шуруп молотком.
Frame Interpolation
Далее у нас идет задача по увеличению количества кадров на видео. Для этого нам необходимо не меняя разрешение (H, W) увеличить количество информации по оси времени T. Другими словами добавить больше кадров. В очередной раз для эксперимента мы возьмем алгоритм (Real-ESRGAN), который предназначен для других целей, а именно для апскейла (upscale, далее Up). Как я и писал ранее, этот алгоритм получает низкокачественное видео и расширяет обе стороны кадра в несколько раз:

Иными словами в нашем распоряжении алгоритм, который увеличивает количество информации в двух направлениях (в то время как нам нужно в одном).
Чтож, начнем с привычного нам вращения по оси высоты H. Теперь внутри каждого кадра присутствует информация, относящаяся к временной шкале T. Если мы применим алгоритм Up, то вместе со временем T мы увеличим и высоту H:

Благо это можно исправить не прибегая к нейронным сетям, а просто уменьшив (downscale, далее Down) сторону H до исходного состояния:

И вот мы уже почти получили необходимый результат. Остается только произвести обратное вращение по оси H:

Готово. Мы только что увеличили количество кадров инструментом по увеличению их разрешения. В качестве сравнения с нашим результатом я приведу в пример результат работы нейросети RIFE:
Кадров стало больше, а скорость я решил оставить исходную, чтобы было удобнее сравнивать плавность движений. Так как алгоритм Up предназначен для увеличения кадра, а так же деталей внутри него, в итоге мы получаем (в левой части) дерганые движения, а так же эффект лесенки на краях объектов. Результат неудовлетворительный.
Неудовлетворительный, но всеж нам удалось забить гвоздь отверткой.
Итоги
До продового качества не тянет, само собой, но хотя бы лучше обычного бикубического апскейла и простого 50% наложения соседних кадров. Вероятно, в этом направлении еще можно копнуть, что я, возможно, сделаю позже, но пока стоит акцентировать внимание на том, что эти алгоритмы не заточены выполнять задачи друг друга. Было просто интересно погонять их по тем плоскостям, на которые они еще не ступали.
Post Scriptum
Обычно подобными вещами приличные люди не занимаются, но я решил, что и такие эксперименты имеют право на существование. К тому же всегда полезно развивать в себе умение "смотреть на вещи под другим углом". Если у вас возникнет желание самостоятельно покопаться во всем этом, то я собрал для вас Колаб, в котором можно удобно (на сколько это возможно) повторить все то, что я описал в этой статье. С прочим интересным можно ознакомиться в моем телеграм-канале MLArt.