Всем привет! Курс компьютерной графики в том или ином виде присутствует в образовательной программе любой ИТ-специальности. В числе прочего там обязательно проходят форматы графических файлов и затрагивают алгоритмы сжатия изображений. Сегодня я расскажу о новом, современном методе сжатия изображений, который ещё не вошёл ни в один учебник.
▍ Существующие методы сжатия изображений
Как гласит Википедия (да и остальные источники):
Сжатие изображений — применение алгоритмов сжатия данных к изображениям, хранящимся в цифровом виде. В результате сжатия уменьшается размер изображения, из-за чего уменьшается время передачи изображения по сети и экономится пространство для хранения.
Сжатие изображений подразделяют на сжатие с потерями качества и сжатие без потерь. Сжатие без потерь часто предпочтительней для искусственно построенных изображений, таких как графики, иконки программ, либо для специальных случаев, например, если изображения предназначены для последующей обработки алгоритмами распознавания изображений. Алгоритмы сжатия с потерями при увеличении степени сжатия, как правило, порождают хорошо заметные человеческому глазу артефакты.
Алгоритмы сжатия изображений без потерь базируются на стандартных алгоритмах компрессии данных (rle, huffman, lz и т. д.), а также их вариациях и комбинациях. В общем тут всё хорошо исхожено до нас и придумать что-либо новое практически невозможно. И, как мне кажется, в связи с ростом разрешения и размеров изображений движение в данном направлении полностью прекратилось.
Алгоритмы сжатия изображений с потерями спекулируют на «несовершенстве» человеческих органов зрения и применяют «читерские» приёмы снижения объёма конечной картинки. Как следствие результат будет чуточку (или не чуточку — всё зависит от степени сжатия) отличаться от оригинального изображения. Но мы этого не замечаем, т. к.
Предлагаемый метод как раз относится ко второму «классу» методов сжатия изображений, но при этом не использует аппаратные особенности наших глаз и баги в их прошивке. Пора пояснить суть метода, а также рассказать про уже реализованные(!) энкодеры и декодеры изображений для него.
▍ Суть нового метода сжатия/кодирования изображений
Унылая пора! Очей очарованье!
Приятна мне твоя прощальная краса —
Люблю я пышное природы увяданье,
В багрец и в золото одетые леса.
Помните?
Конечно, помните! Всего 4 строфы от великого Александра Сергеевича, а воображение уже рисует яркую картину осеннего леса. Да что там воображение — я только что запустил «Кандинский 2.0» и нейросеть сгенерировала картинку в цифровом виде за какие-то жалкие 2 минуты.
Думаю, вы уже догадались, в чём суть экстремально сильного метода сжатия изображений. Да, теперь сжатое изображение — это описание на родном языке в простом текстовом виде. Соответственно, энкодер по какому-либо изображению должен генерировать художественное, достаточно подробное текстовое представление, а декодер по этому тексту восстанавливает картинку. Не забыть бы ещё придумать расширение файла и зарезервировать content-type.
▍ Декодеры
Начнём с конца, тем более я уже заспойлерил использование «Кандинского». Помимо «Кандинского» есть ещё некоторое количество публичных нейрохудожников — перечислять их не буду, гугл с этим справится лучше меня. Как правило, на вход подаётся описание изображения в текстовом виде, возможно, даже на родном языке, а на выходе получаем финальную картинку.
«Декодеры» в настоящее время не слишком хороши: медленные, входной текст короткий, итоговый размер изображения фиксированный, результат не всегда радует глаз (вернее сильно зависит от качества «сжатого изображения»), но это мы ещё обсудим, когда перейдём к тестам.
▍ Энкодеры
Их нет. Возможно, реализация формирования художественного описания изображения пока не представляет интереса для общества или технологии не созрели — в общем пока так. Казалось бы, статью можно завершать, но мы воспользуемся очередным хаком — пока искусственный интеллект не созрел, его будет заменять интеллект человеческий! Ловите флешбэк: класс в полнейшей тишине пишет сочинение по репродукции, приколотой на доску или с разворота учебника, выдавливая из себя «на переднем плане изображено...». Мы, конечно, не Пушкины и не Толстые, но пару абзацев набросать сумеем. Есть ещё один нюанс, связанный с декодером, а конкретно с Кандинским — текст не более 300 символов (полагаю, и в остальных местах не лучше).
▍ Тестирование
Исходное изображение — легендарная, эталонная Лена Сёдерберг. Кто не в курсе, марш в Википедию!
Энкодеры — три очаровательные, весьма близкие мне особы, которые любезно согласились поучаствовать в этом безумном эксперименте.
Энкодер 1 — поколение «ТикТока». Выражается весьма лаконично, молодёжно. Экономит своё время и буквы — то, что нужно, с учётом ограничения на 300 символов.
Сегодня мы рассмотрим фотографию с прекрасной девушкой — брюнеткой. Она смотрит прямо на нас своими большими голубыми глазами. Мы видим, что на ней надета панама бежевого цвета с синим пером, которое, безусловно, дополняет её образ. Девушка сфотографирована напротив стены, покрытой лучами заката.
Энкодер 2 — по классификации Википедии типичный «зуммер». Очень старательный и умный человечек. В 300 символов уложилась с трудом — не хватило :(
В центре мы видим портрет девушки в широкополой шляпе песочного цвета. Незнакомка оборачивается через правое плечо. Взгляд исподлобья карих глаз загадочный и уверенный. Лицо обрамляют тёмные волосы и ниспадающее с полей шляпы фиолетовое боа. Солнечные лучи ложатся на плечо, оттеняя светлую кожу.
Энкодер 3 — имеет приличное, ещё советское образование — моя главная надежда :)
С фотографии на нас смотрит красивая девушка. На заднем плане мы видим зеркало, в котором она мгновением раньше любовалась собой, примеряя прекрасную широкополую шляпу, богато украшенную пышным страусиным боа. Её взгляд загадочен и в то же время игрив, она прекрасно осознаёт свою привлекательность.
Энкодер 4 — а это сюрприз даже для меня. Начал готовить статью и вспомнил про незрячих. Онлайн-сервисов не нашёл, зато скачал и установил мобильное приложение TapTapSee — наводишь на объект, тапаешь по экрану и получаешь озвучку с текстом. Достаточно быстро, но весьма лаконично:
Женщина в бело-коричневой шляпе.
Декодер, как уже писал выше, «Кандинский» версии 2.0 (да, я ленивый — пробовать остальных не стал :) Декодеру мы немного поможем и будем указывать в настройках стиль генерации «Портретное фото». На страничке с «Кандинским 2.0» есть и просто «Кандинский» (без версии) и «Малевич». Тестировал обоих, но решил не перегружать статью, впрочем, и работают они менее задорно, чем «Кандинский 2.0».
Скорость кодирования/декодирования оценивать пока бессмысленно. Скорость кодирования зависит от настроения/вдохновения наших дам, в общем всё, что называется «человеческим» фактором. Сюда же приплюсуем время, затраченное на их уговоры :) Декодирование также не поддаётся точной оценке — «на глазок» примерно 2 минуты. Пока проигрываем классическим методам.
Степень сжатия колоссальная. Исходное изображение Лены — 512х512 пикселей и занимает 474Kb, а «компрессированное» изображение — 300 символов — это не более 600 байт текста на русском языке в UTF-8. При этом прошу учесть, что мы жмём изображение, уже поджатое алгоритмами PNG! Здесь безусловная победа.
Качество изображения после декодирования. Ввиду того, что нейросеть выдаёт нам результат в формате JPG, то ни о какой цветопередаче, зашумлённости в области перьев и прочих артефактах речи быть не может. Когда разработчики будут готовы предоставить результат в RAW или BMP, тогда и будем это обсуждать.
Напоследок ещё одна несерьёзная метрика — степень схожести исходной Лены и того, что нам сгенерировала нейросеть. Случайно нашёл один ресурс, вернее это первый из выборки гугла, в общем, почему бы и не попробовать?
Результаты привожу ниже:
Изображение | Похожесть картинок |
---|---|
Энкодер 1
|
40.64 % |
Энкодер 2
|
34.51 % |
Энкодер 3
|
36.27 % |
Энкодер 4
|
43.69 % |
На мой взгляд, данные абсолютно некорректные, т. к. непонятно, каким образом всё измерялось. Не обращайте на них внимания :)
▍ Выводы
Вот вроде и всё, что я хотел написать про алгоритм экстремального сжатия изображений. Небольшие артефакты выходной картинки связаны с несовершенством современных нейросетей, но мы только в начале большого пути и всякие выводы выводить рано.
Если материал показался сложным, то видимо потому, что статья немного опередила своё время — планировал выпустить где-нибудь в первых числах апреля.
Автор:
alef13