- Кодек JPEG на CUDA. Быстрое сжатие изображений на видекартах NVIDIA.
высокоскоростная съёмка скоростная съёмка
ГЛАВНАЯ
  ВИДЕОКАМЕРЫ
  ПРОГРАММЫ
  РЕШЕНИЯ
  ПРОЕКТЫ
  НОВОСТИ
  ИНФО
  ВАКАНСИИ
  АДРЕС
  КАРТА САЙТА
  ENGLISH VERSION
 
  Поиск по сайту:

кодек JPEG на CUDAКодек JPEG на CUDA

Изначально задача максимально быстрого сжатия изображений возникла в контексте приложений для скоростных видеокамер, выпускаемых нашей компанией. Все наши скоростные видеокамеры работают по принципу онлайн передачи всего регистрируемого потока несжатых данных от камеры в кольцевой буфер оперативной памяти компьютера. Таким образом, в компьютер поступает очень большой поток данных, которые нужно быстро обработать и записать. Обычно такие потоки данных записывают либо в оперативную память компьютера, либо на RAID-массив или SSD, а обработка всего потока данных в онлайне возможна только внутри камеры на ПЛИС (FPGA). К сожалению, софт для CPU с обработкой таких потоков данных не справляется, поэтому для решения задач этого класса мы использовали видеокарты NVIDIA с технологией CUDA.

Впоследствии оказалось, что задача быстрого сжатия изображений очень интересна не только для скоростных камер, а вообще для любых. Поэтому нам пришлось реализовать стандарт JPEG для цветных изображений и оптимизировать программное обеспечение, чтобы добиться высокой производительности. Цель состоит в том, чтобы успеть сжать видеопоток в онлайне, а затем записать результат на жёсткий диск компьютера. Мы выбрали алгоритм компрессии JPEG с потерями, потому что он может обеспечить быстроту и минимальные искажения при значительном коэффициенте сжатия, а также может быть эффективно распараллелен. Оказалось что можно сделать параллельным и алгоритм декодирования JPEG, что привело нас к созданию быстрого кодека JPEG на видеокарте.

Возможности кодека JPEG для CUDA

  • Кодек полностью соответствует стандарту Baseline JPEG
  • Компрессия и декомпрессия по алгоритму JPEG для 8/24-битных изображений
  • Входные данные: 8/24-битные изображения в RAM/HDD/RAID/SSD
  • Выходные данные: итоговые сжатые/расжатые изображения в RAM/HDD/RAID/SSD
  • Максимальный размер изображения 12000 x 12000 и более (опция)
  • Качество сжатия (параметр алгоритма JPEG) от 1 до 100%
  • Режимы работы 4:4:4, 4:2:2, 4:2:0 (4:1:1)
  • Максимальное количество рестарт маркеров (для быстрого декодирования) до 65535
  • Непрерывный режим работы (потоковое кодировани и декодирование)
  • Стандартная схема обработки данных в соответствии с 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 (Fermi, Kepler и Titan)
  • ОС Windows-7/8 (32/64)

Нам удалось распараллелить все стадии алгоритма JPEG, в том числе энтропийное кодирование и декодирование. Ранее считалось, что кодирование по Хаффману является последовательным алгоритмом. В нашем решении эта стадия распараллелена и благодаря этому вся обработка выполняется на видеокарте, без выполнения части вычислений на центральном процессоре, что позволило получить высокие значения производительности.

Тестирование

  • Настольный компьютер с Core i7 3770, 3,4 ГГц, DDR-III 8 ГБайт
  • Видеокарты для вычислений GeForce GT 580, 680, Titan
  • Операционная система Windows-7, 64-bit, CUDA 5.0, драйвер 296.10
  • Тестовое изображение big_tree c сайта http://www.imagecompression.info/test_images/
  • Качество сжатия в JPEG от 50% до 100%, формат 4:2:0, ОС Windows-7 (64-бит)
  • Кодеки для тестирования:
    • Fastvideo JPEG на видеокартах NVIDIA
    • LibJpeg-Turbo 1.3.0 с опциями fastdct и sse3 на Core i7-3770
    • Intel IPP-7.1 JPEG (многопоточный) на Core i7-3770

Сравнение с самыми быстрыми аппаратными кодеками JPEG на FPGA

Интересно отметить, что производительность системы сжатия в JPEG с потерями на базе видеокарт GeForce GTX 580, 680 и Titan оставила позади лучшие на сегодняшний день системы аппаратного сжатия, построенные на ПЛИС (FPGA). Одни из самых быстрых систем на ПЛИС предлагают следующие компании:

  • Cast Inc. (JPEG-E Baseline JPEG Compression Core) - функция аппаратного сжатия в джипег для FPGA, производительность до 750 МБайт/с.
  • Alma-Tech (SVE-JPEG-E, SpeedView Enabled JPEG Encoder Megafunction) - функция аппаратного сжатия по Baseline JPEG для FPGA Altera/Xilinx, производительность до 500 МБайт/с.
  • Visengi JPEG Encoder (JPEG / MJPEG Hardware Compressor IP Core) - функция аппаратного кодирования в джипег для FPGA Virtex-5, производительность до 405 МБайт/с.
  • Barco BA116 JPEG Encoder (High speed baseline DCT-based JPEG color encoder) - функция аппаратного кодирования в JPEG для FPGA, производительность до 140 МБайт/с.

Эти высокопроизводительные решения написаны на Verilog/VHDL и являются оптимальными для компактных (встраиваемых) систем с минимальными требованиями по питанию и габаритам. Сравнивая наше решение с аппаратными кодерами jpeg на ПЛИС, стоит отметить, что кроме более высокой производительности и масштабируемости полученного нами решения, по сравнению с Verilog/VHDL, код на Си для CUDA намного более понятный и приспособленный для модификации и создания на его базе новых, более сложных систем обработки и сжатия изображений.

Rambler's Top100 НПО Астек - официальный дилер "Фаствидео"
Москва, 129344, ул. Искры 17А, корп. 3, тел: +7 (495)-542-04-49
высокоскоростные камеры