Задача
Мне был интересен вопрос: можно ли представить видео не как сжатый поток блоков и коэффициентов, как в 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
