Кодек JPEG на CUDA
Обновлено:
JPEG-кодер и декодер на видеокартах NVIDIA: до 5500 кадров Full HD в секунду на RTX 4090, полное соответствие стандарту Baseline JPEG. Для тех, кому нужно кодировать и декодировать потоки с камер или архивы изображений в реальном времени.
Кодек JPEG на CUDA — JPEG-кодер и декодер компании Фаствидео для видеокарт NVIDIA. Он полностью соответствует стандарту Baseline JPEG и на видеокарте GeForce RTX 4090 кодирует до 5500 кадров Full HD в секунду при коэффициенте сжатия около 10:1.
Зачем GPU-кодек, если есть libjpeg-turbo? CPU-кодеки упираются в потолок на многомегапиксельных потоках: даже многопоточный libjpeg не даёт тысяч кадров в секунду и занимает процессор, нужный под другие задачи. Наш JPEG работает целиком в памяти видеокарты, освобождает CPU и выдаёт на порядок большую скорость при том же качестве и полной совместимости со стандартом — файлы открываются любым просмотрщиком.
Мы сами написали эти алгоритмы
Кодеки и ISP-модули Fastvideo — это не обёртки над чужим кодом. Алгоритмы демозаики, шумоподавления, тон-маппинга и кодеков JPEG/JPEG2000 мы спроектировали — а многие и придумали — сами и сами реализовали на CUDA, на базе экспертизы в обработке изображений, которую нарабатываем с 2009 года. Поэтому вы получаете цельное, настроенное решение, а не набор GPU-примитивов; и если вашей задаче нужно что-то специфическое, мы можем изменить сам алгоритм, а не просто вызвать его.
Крупный веб-сервис обрабатывал на нашем SDK свыше 400 000 изображений JPEG в секунду.
Алгоритм кодека JPEG известен с 80-х годов прошлого века. Этот метод кодирования и декодирования естественных (фотографических) изображений сочетает в себе относительно невысокую сложность и высокое качество при хорошей степени сжатия. Таким образом, можно сжать фотографию в 10-15 раз при минимальном уровне артефактов. Алгоритм JPEG в настоящее время крайне популярен и формат JPEG наиболее распространён в мире, так что имеется огромное количество задач по работе с такими изображениями.

Поэтому мы создали быстрый кодек JPEG в соответствии со стандартом JPEG для монохромных и цветных изображений, а также оптимизировали кодер и декодер для получения высокой производительности. Идея как раз и состояла в том, чтобы кодировать или декодировать фотографические изображения с максимальной скоростью. Этот алгоритм обеспечивает не только минимальные искажения при значительном коэффициенте сжатия, но также он может быть эффективно распараллелен. Именно распараллеливание алгоритма JPEG на видеокартах NVIDIA дало возможность получить очень высокую скорость работы.
Возможности кодека JPEG для CUDA
- Кодек полностью соответствует стандарту Baseline JPEG
- Компрессия и декомпрессия по алгоритму JPEG для 8/24-битных изображений
- Входные данные: 8/24-битные изображения в RAM/HDD/RAID/SSD/GPU
- Выходные данные: итоговые сжатые/несжатые изображения в RAM/HDD/RAID/SSD/GPU
- Максимальный размер изображения 16000 × 16000 и более (опция)
- Качество сжатия (параметр Q алгоритма JPEG) от 1 до 100
- Прореживание цветоразностных компонент 4:4:4, 4:2:2, 4:2:0 (4:1:1)
- Максимальное количество рестарт маркеров - 1 на MCU
- Непрерывный режим работы (потоковое кодирование и декодирование)
- Опция: поддержка кодирования 12-битных изображений (Extended JPEG)
- Стандартная схема обработки данных в соответствии со стандартом Baseline JPEG
- Кодирование JPEG: Input data parcing, Color Transform, Level shift, 2D DCT, Quantization, Zig-zag, AC/DC, DPCM, RLE, Huffman, Byte stuffing, JFIF formatting
- Декодирование JPEG: JFIF parcing, Restart marker search, Inverse Huffman, Inverse RLE, Inverse DPCM, AC/DC, Inverse Zig-zag, Inverse Quantization, IDCT, Inverse Level shift, Inverse Color Transform, Output formatting
- Оптимизация для видеокарт NVIDIA (Pascal, Volta, Turing, Ampere, Ada)
- Возможность работы на NVIDIA Jetson NX/AGX Xavier, Orin
- ОС Windows-10/11, Linux Ubuntu, L4T
Нам удалось распараллелить все стадии алгоритма JPEG, в том числе энтропийное кодирование и декодирование. Ранее считалось, что кодек Хаффмана является последовательным алгоритмом. В нашем решении кодек Хаффмана распараллелен и благодаря этому вся обработка выполняется на видеокарте, без выполнения части вычислений на центральном процессоре, что позволило получить высокие значения производительности для кодека JPEG.
Бенчмарки кодека JPEG на NVIDIA GeForce RTX 4090 (Windows-10, CUDA-12.6)
На этой видеокарте нам требуется всего лишь 0,65 мсек для сжатия по алгоритму Baseline JPEG 24-битного цветного изображения с разрешением 5328 × 4508, качеством JPEG 90% и схемой прореживания 4:2:0 (этот набор параметров соответствуют так называемому визуальному сжатию без потерь), при этом коэффициент сжатия примерно равен 10:1.
Ниже приведены бенчмарки производительности при кодировании и декодировании цветных изображений с разрешениями 2K и 4K, 24-бит (все вычисления на видеокарте, без учёта латентности ввода/вывода, при сжатии одиночных изображений, без режима пачки и без стримов, качество JPEG 90%, прореживание 4:2:0) на видеокарте NVIDIA GeForce RTX 4090:
| Разрешение (24-бит, 4:2:0, качество 90%) | Кодирование | Декодирование |
| Full HD (2K, 1920×1080) | ~5500 фпс | — |
| 4K (3840×2160) | ~3800 фпс | ~1350 фпс |
| 8K (7680×4320) | ~1180 фпс | ~650 фпс |
Как проверить эти цифры: они измерены на указанной видеокарте NVIDIA и воспроизводимы на вашем GPU — скачайте демо-программы и измерьте скорость на своих изображениях.
Скорость декодирования JPEG может быть увеличена в несколько раз при использовании рестарт-маркеров.
Чем кодек JPEG на видеокарте быстрее libjpeg-turbo?
Эти результаты гораздо лучше, чем бенчмарки самого быстрого на сегодня кодека джипега libjpeg-turbo для CPU. Даже если учесть время копирования данных на видеокарту и обратно, всё равно производительность кодека JPEG на видеокарте будет во много раз больше.
Тут очень важным моментом является не только скорость кодирования или декодирования, но и латентность такого решения. Латентность кодека JPEG на видеокарте более чем на порядок лучше, чем у кодека либджипег-турбо. Таким образом, у кодека JPEG на видеокарте NVIDIA результаты значительно лучше как по скорости, так и по латентности.
Этот кодек JPEG входит в состав библиотеки Fastvideo SDK для быстрой обработки изображений на видеокартах NVIDIA.
Смежные продукты Фаствидео
- Кодек JPEG2000 на CUDA для сжатия с потерями и без потерь
- Дебайер на CUDA — быстрая демозаика по алгоритму MG
- RawZipper — сжатие RAW-данных с камер
- Просмотрщик JPEG2000 на видеокарте NVIDIA
- Fastvideo SDK — полная библиотека обработки изображений на GPU
- Решения Фаствидео для задач обработки изображений
Сначала — на ваших данных, бесплатно
До любых обязательств пришлите нам несколько своих снимков или опишите задачу. Мы прогоним их через софт, покажем результат и разберём его вместе на созвоне. Если решаете двигаться дальше — заказ простой: коммерческое предложение, ваш заказ (договор/PO), наш счёт; условия лицензии уже входят в софт.