Быстрое сжатие изображений по алгоритму JPEG на CUDAЗадача максимально быстрого сжатия изображений возникла в контексте приложений для скоростных видеокамер, выпускаемых нашей компанией. Все наши скоростные видеокамеры работают по принципу онлайн передачи всего регистрируемого потока несжатых данных от камеры в кольцевой буфер оперативной памяти компьютера. Таким образом, в компьютер поступает очень большой поток данных, которые нужно быстро обработать и записать. Обычно такие потоки данных записывают либо в оперативную память компьютера, либо на RAID-массив или SSD, а обработка всего потока данных в онлайне возможна только внутри камеры на ПЛИС (FPGA). К сожалению, софт для CPU с обработкой таких потоков данных не справляется в принципе, поэтому для решения задач этого класса мы использовали видеокарты NVIDIA с технологией CUDA. В системах скоростной съёмки обычно используются монохромные видеокамеры, поскольку их чувствительность значительно выше, чем у цветных, поэтому ниже мы рассмотрим задачу онлайн компрессии видеопотока именно от монохромной камеры. Наша цель состоит в том, чтобы успеть всё сжать в онлайне, а полученный выходной поток записать на жёсткий диск компьютера. Мы выбрали алгоритм компрессии JPEG с потерями, потому что он может обеспечить быстроту и минимальные искажения при значительном коэффициенте сжатия, а также может быть эффективно распараллелен. Вопрос быстрого декодирования для задач скоростной съёмки не критичен, но тем не менее, декодирование изображений в формате JPEG тоже было реализовано на видеокарте. Общая схема работы кодера JPEG на CUDA
Конфигурация компьютеров для тестирования
Производительность CUDA JPEG на видеокарте GeForce GTX 1080 для 24-битных изображенийМы получили следующие результаты для скорости сжатия (время загрузки изображений и их выгрузки после сжатия не включено в представленные результаты) на видеокарте GeForce GTX 1080:
Кодирование в JPEG с качеством 90% и 4:2:0 примерно соответствует коэффициенту сжатия 10:1. Это случай сжатия, который визуально определяется как "почти без потерь" (visually lossless compression), т.е. при выборе таких параметров искажения малозаметны. Производительность CUDA JPEG на видеокарте GeForce GTX 1080 для 12/36-битных изображенийКроме стандартного решения для кодирования в JPEG для 8/24-битных изоражений была реализована и схема работы с изображениями, у которых 12 бит на канал (монохромные и цветные). Были получены следующие результаты для времени работы (время загрузки изображений и их выгрузки после сжатия не включено в представленные результаты) на видеокарте GeForce GTX 1080 для 12-битного изображения с разрешением 8736 × 5856:
Таким образом, показана принципиальная возможность онлайн сжатия для систем скоростной съёмки, причём для довольно широкого класса графических карт, в том числе бюджетных и мобильных. Такое решение позволит значительно увеличить длительность скоростной съёмки и даст возможность записывать сжатый поток данных на жёсткий диск компьютера даже без использования RAID или SSD. Бенчмарки для кодека JPEG и для других алгоритмов на CUDA можно скачать здесь. |