Увеличение (Upscale) видео с помощью нейросетевых моделей и FFmpeg
Сегодня всё чаще возникает необходимость улучшить качество старых записей, аниме, фильмов или видеофайлов, снятых на устройства с невысоким разрешением. Один из популярных способов — использовать нейросетевые модели (к примеру, Real-ESRGAN), которые занимаются апскейлом (увеличением разрешения) изображений и кадров видео. Ниже описан пошаговый процесс, как можно повысить качество аниме-видео, а затем сохранить и аудио в итоговом файле.
Сегодня всё чаще возникает необходимость улучшить качество старых записей, аниме, фильмов или видеофайлов, снятых на устройства с невысоким разрешением. Один из популярных способов — использовать нейросетевые модели (к примеру, 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. Эта модель особенно хорошо работает с аниме и иллюстрированным контентом.
Пример использования:
- Установить необходимые зависимости (Python, PyTorch, Git LFS и т.д., если это не сделано ранее).
- Клонировать репозиторий Real-ESRGAN или скачать готовые бинарные файлы (в зависимости от платформы).
- Запустить скрипт командой вида:
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 — итоговый файл с видео и звуком.
Результат
- Исходное видео разбито на кадры с помощью FFmpeg;
- Апскейл каждого кадра произведён при помощи нейросетевой модели Real-ESRGAN;
- Сборка улучшенных кадров в новое видео;
- Добавление звуковой дорожки из оригинального видео.
Таким образом, мы получили видео в более высоком разрешении (визуально заметно лучшее качество, сохранив при этом исходный звук. Процесс может занять значительное время в зависимости от длины ролика и производительности железа, однако результат стоит затраченных усилий, позволяя «оживить» старые и низкокачественные материалы.
Не критично конечно, если смотреть не впритык к монитору, а откуда-нибудь с дивана.
Нормально работает только с мультиками? или с кино тоже..?