Поговорим об инженерной части нашей работы, о производительности.
В оригинальном посте я я сравнивал нас с библиотекой для процессинга данных Nvidia DALI (используется в Triton Server), но на самом деле функционал пересекается лишь частично. Однако, как я писал, где он всё-таки пересекается, там производительность у нас намного выше.
В этой серии хочу раскрыть те детали, которые можно брать и применять в работе хоть завтра. В общем, упор на практичность.
Начнём мы с PNG и GIF.
Секундный ликбез (почему-то для многих это проблема на собеседовании О_о): это второй по популярности в известной нам части Вселенной формат хранения изображений и хранит он их сжимая без потерь. В большинстве случаев, для сжатия под капотом будет использоваться zlib, т.е. алгоритм общего назначения DEFLATE, точно такой же, который, зачастую, применяется и когда вы используете ZIP утилиту.
Гонять PNG на карту для декомпрессии там, как в случае с JPG, совершенно бессмысленно: вес большой, а сам алгоритм прекрасно оптимизирован для CPU. Кроме того, в нашей области крайне велика вероятность, что CPU у вас намного свободнее карты :)
Но, общем и целом, производительность PNG всё равно намного хуже, чем у JPEG. Поэтому, кажется, что разработчики Nvidia DALI должны были уделить вопросу особое внимание. Однако на деле библиотека, не мудрствуя лукаво, просто вызывает OpenCV. Который, в свою очередь, дёргает libpng, который дёргает zlib
Из-за чего может показаться, что лучше ничего не трогать и оставить всё, как в DALI. Но нет.
Серебряная пуля существует и имя ей Wuffs от Google. Эта библиотека не только в 1.5 - 2.75 раза быстрее libpng, но ещё и безопаснее с точки зрения эксплойтов! Вместо zlib там своя реализация. По ссылке есть все необходимые числа, эксперименты и обоснования.
И, совершенно потрясающим образом, насколько эта библиотека невероятно крута, настолько же мало используема!
Google и PR... you know.
К сожалению, просто взять и воткнуть Wuffs в Python не получится, по крайней мере я не нашёл готовых модулей. Но вот написать такой совсем не сложно.
Лично я реализовал его так, что на выходе Wuffs сразу пишет в буфер OpenCV изображения: его затем легко и прокинуть назад в Python и провести с ним любые манипуляции. Разница в скорости - колоссальная, и это если сравнивать с OpenCV \ libpng, не говоря о других библиотеках, как PIL.
Ну, а GIF тут идёт бонусом :) В его случае разница может быть даже больше.
Тут дубликат поста в LinkedIn, если вы там есть и пост вам понравился, пожалуйста, клацните лайк. Это поможет мне понять, какие темы стоит развивать дальше.