Добавлен , опубликован
Увеличение (Upscale) видео с помощью нейросетевых моделей и FFmpeg
Сегодня всё чаще возникает необходимость улучшить качество старых записей, аниме, фильмов или видеофайлов, снятых на устройства с невысоким разрешением. Один из популярных способов — использовать нейросетевые модели (к примеру, Real-ESRGAN), которые занимаются апскейлом (увеличением разрешения) изображений и кадров видео. Ниже описан пошаговый процесс, как можно повысить качество аниме-видео, а затем сохранить и аудио в итоговом файле.

1. Нарезка видео на кадры через FFmpeg

Для начала необходимо «разбить» исходное видео на отдельные изображения (кадры). Это удобно делать с помощью FFmpeg:
ffmpeg -i "путь_к_исходному_видео" -qscale:v 2 "./out_frame/frame_%08d.png"
  • -i "путь_к_исходному_видео" — входной видеофайл;
  • -qscale:v 2 — устанавливает качество выводимых кадров (для JPEG/PNG это может варьироваться, но в целом чем ниже число, тем выше качество для формата JPEG; для PNG параметр может отличаться);
  • ".//frame_%08d.png" — шаблон вывода, где %08d означает нумерацию кадров в формате 00000001, 00000002 и т. д.
*(В примере автора использовался формат WebP, но обычно можно выбирать PNG, JPEG или другой подходящий формат.)*

2. Апскейл кадров с помощью модели Real-ESRGAN

Следующим шагом выполняется апскейл полученных изображений (кадров) нейросетевой моделью Real-ESRGAN. Эта модель особенно хорошо работает с аниме и иллюстрированным контентом.
Пример использования:
  1. Установить необходимые зависимости (Python, PyTorch, Git LFS и т.д., если это не сделано ранее).
  2. Клонировать репозиторий Real-ESRGAN или скачать готовые бинарные файлы (в зависимости от платформы).
  3. Запустить скрипт командой вида:
   python inference_realesrgan.py \
       -i "путь_к_папке_с_кадрами" \
       -o "путь_к_папке_вывода" \
       --model_path "путь_к_модели_RRDB_ESRGAN_x4.pth" \
       --netscale 4 \
       --outscale 4
  • -i — папка со входными кадрами;
  • -o — папка, куда сохраняются увеличенные изображения;
  • --model_path — путь к файлу с обученной моделью (для аниме существует специальная модель, указанная в документации);
  • --outscale — коэффициент увеличения размера (x4, к примеру).
В результате в выбранную папку сохраняются изображения с более высоким разрешением.

3. Склейка видео из обработанных кадров

Когда все кадры апскейлены, их необходимо снова «склеить» в видеофайл. Снова используем FFmpeg:
ffmpeg -y -start_number 0 -i ".\out_frame\frame_%08d.webp" -c:v libx264 -r 25 -pix_fmt yuv420p ./output.mp4
  • -y — позволяем FFmpeg автоматически перезаписывать выходной файл при необходимости;
  • -start_number 0 — говорит FFmpeg, что счётчик кадров начинается с 0 (важно, если нумерация кадров начинается именно с 0);
  • -i ".\out_frame\frame_%08d.webp" — путь к обработанным апскейл-кадрам (в данном случае в формате WebP);
  • -c:v libx264 — выбираем кодек H.264 для сжатия;
  • -r 25 — частота кадров (FPS), задайте ту же частоту, что и в исходном видео, если важно соответствие времени/длительности;
  • -pix_fmt yuv420p — формат пикселей, обеспечивающий совместимость с большинством медиапроигрывателей;
  • ./output.mp4 — выходной видеофайл без звука.

4. Импорт аудио из исходного видео

Поскольку после склейки кадров мы имеем «немое» видео, необходимо добавить к нему звук из оригинала. Для этого в FFmpeg существует параметр -map, позволяющий «пробросить» аудио из одного файла, а видео — из другого. Пример команды:
ffmpeg -i ".\output.mp4" -i ".\01. Istoriya nachinaetsya.avi" -map 0:v:0 -map 1:a:0 -c copy -shortest ".\output_audio.mp4"
  • -i ".:\output.mp4" — обработанное (апскейленное) видео без звука;
  • -i ".\01. Istoriya nachinaetsya.avi" — оригинальное видео, из которого берём звуковую дорожку;
  • -map 0:v:0 — берём видеодорожку из первого входа (из output.mp4);
  • -map 1:a:0 — берём аудиодорожку из второго входа (из 01. Istoriya nachinaetsya.avi);
  • -c copy — копируем оба потока без дополнительного перекодирования;
  • -shortest — останавливает выходное видео, как только заканчивается самый короткий из потоков (то есть, если звуковая дорожка короче или длиннее);
  • .\output_audio.mp4 — итоговый файл с видео и звуком.

Результат

  1. Исходное видео разбито на кадры с помощью FFmpeg;
  2. Апскейл каждого кадра произведён при помощи нейросетевой модели Real-ESRGAN;
  3. Сборка улучшенных кадров в новое видео;
  4. Добавление звуковой дорожки из оригинального видео.
Таким образом, мы получили видео в более высоком разрешении (визуально заметно лучшее качество, сохранив при этом исходный звук. Процесс может занять значительное время в зависимости от длины ролика и производительности железа, однако результат стоит затраченных усилий, позволяя «оживить» старые и низкокачественные материалы.
`
ОЖИДАНИЕ РЕКЛАМЫ...
31
крупные планы получаются хорошо, но при этом задники превращаются в мыло + видно, что ранее статичные элементы дергаются, из-за покадровой перерисовки сетью, видимо.
Не критично конечно, если смотреть не впритык к монитору, а откуда-нибудь с дивана.
Нормально работает только с мультиками? или с кино тоже..?
Ответы (2)
13
Алексей Андреич, мыло появляется, скорее всего, из-за того, что я в своём примере использовал максимально лёгкую модель для ускорения обработки. Можно поэкспериментировать с моделями и посмотреть на результаты. Апскейлить можно что угодно: главное — подобрать правильную модель, обученную на материалах, визуально похожих на то, что нужно апскейлить (в моём случае это были популярные аниме). Есть модели, которые обучали на реальных фильмах/фото, и они подойдут для апскейла фильмов.
13
Ну и такой вариант апскейла не всем подойдет из-за требовательности к GPU, на моей 4070 ti super обработка всех кадров данной серии заняла часов 8
Чтобы оставить комментарий, пожалуйста, войдите на сайт.