AG
Все проекты

video_nn_zip: нейросетевое сжатие видео

Исследовательский проект по нейросетевой видеокомпрессии: видео кодируется не кадрами, а весами компактной сети. Собственный формат .nnv, плеер на GPU, метрики качества, конвейер на C++/CUDA.

C++LibTorchCUDAFFmpegSDL2CMakeНейросетевое сжатие
video_nn_zip: нейросетевое сжатие видео

Задача

Мне был интересен вопрос: можно ли представить видео не как сжатый поток блоков и коэффициентов, как в H.264/H.265, а как компактную нейросетевую репрезентацию, которую воспроизводит GPU. Проект обучает сеть, которая по координатам (t, x, y) восстанавливает фрагмент изображения; результат сериализуется в собственный бинарный формат .nnv.

Интересные ниши для такого подхода: короткие и зацикленные ролики, почти статичные сцены, анимированные фоны - там, где стоимость хранения и передачи важнее универсальности кодека.

Как устроено

Это полный конвейер на C++, а не прототип на Python:

  • video/ - декодирование через FFmpeg и нарезка кадров на сегменты
  • nn/ - модели (SIREN, multi-scale SIREN, hash-grid), позиционное кодирование, функции потерь, обучение
  • format/ - чтение и запись .nnv: веса модели, метаданные видео, аудиодорожка
  • player/ - пакетный инференс по координатной сетке и сборка кадра через SDL2

Кодирование: видео разбирается на кадры, кадры - на патчи (например, 8×8), для каждого патча формируется обучающий пример «время + координаты → RGB-блок», модель обучается, лучшее состояние сохраняется в .nnv. Воспроизведение - в обратную сторону: плеер строит координатную сетку для момента t, прогоняет её через сеть на GPU и собирает кадр. Для multi-scale режима есть прогрессивная отрисовка: сначала грубый кадр, потом уточнение.

Инженерные детали: комбинированная функция потерь MSE + SSIM, асинхронный конвейер decode → segment scan → training, чекпоинты с возобновлением долгих прогонов, CLI-утилиты для кодирования, воспроизведения, экспорта и сравнения, воспроизводимая Docker-сборка.

Результат

Рабочий цикл «MP4 → обучение → .nnv → воспроизведение на GPU» с замером качества через PSNR, SSIM и покадровое сравнение. Публичных замеров степени сжатия нет - утилиты сравнения встроены в проект именно для того, чтобы считать компромисс «размер / качество / стоимость декодирования» честно, на конкретных сценах. Для промышленного применения это не замена универсальным кодекам, а исследовательский полигон для узких сценариев.

Технический стек

  • Язык: C++
  • ML: LibTorch (PyTorch C++ API)
  • GPU: CUDA
  • Видео: FFmpeg (ввод/вывод)
  • Плеер: SDL2
  • Сборка: CMake
  • Окружение: Docker