Comments 15
Увлёкся нейронными сетями, в том смысле, что запускаю их на своих мощностях и пытаюсь разбираться в их сферах применимости. В коллекции много нейронных сетей и среди них есть SwinIR, которая умеет убирать артефакты сжатия JPEG (JPEG Compression Artifact Reduction), НО только для gray изображений.
А почему нельзя тот же алгоритм применить к трем каналам (YCbCr) по отдельности, чтобы получить полноцветное изображение? Потенциальные проблемы могут быть с субсемплингом, но в крайнем случае можно лишний раз свернуть цветовые каналы, применить алгоритм, развернуть снова.
![](https://habrastorage.org/getpro/habr/upload_files/d91/4a1/2ea/d914a12eaa35b5933a82e3ccf4cf7839.jpg)
Выхлоп нейронки:
![](https://habrastorage.org/webt/ca/a6/qf/caa6qfuxektaxb9huwzrwff_sme.png)
Результат выглядит в разы лучше, чем КДПВ.
В последнее время я вообще много думаю над философией сжатия с потерями. Пока что, я пришел к пониманию, что глобально есть два, можно сказать, противоположнонаправленных юзкейса.
Хранение. Нужно сохранить максимум информации из оригинально изображения, при этом допускается равномерная потеря информации. То, с чем классический JPEG справляется отлично и с успехом конкурирует с новыми форматами на высоких битрейтах.
Демонстрация. Тут количество потерянной информации уже играет второстепенную роль, на первый план выходит непротиворечивость изображения при меньшем битрейте. То есть, условно, мы можем смириться, что какая-то текстура или дымка пропадут с изображения полностью, если это не будет выглядеть шакально.
И вот во втором юзкейсе JPEG уже значительно проигрывает современным форматам. Главным образом потому что ограничен окном 8x8 пикселей и за пределами него не может решить потерять детали. Очень рекомендую прочитать раздел What is 'acceptable quality' этой замечательной статьи.
И ваш результат как раз пример работы «современного» кодека, когда результат бесконечно далек от оригинала, но на данном битрейте (если считать входными данными зажатый JPEG) выдает абсолютно непротиворечивую картинку.
В этом смысле данная статья — попытка приблизить JPEG к современным форматам, используя «хак» нашего зрения. Многие изображения из примеров потеряли массу деталей на картинках с исправленными таблицами, но если бы вы не увидели пример с большим битрейтом, вы бы об этом не догадались.
Года 3 назад я как часть задачи обучал мелкую нейронку для восстановления JPEG артефактов, опубликована https://github.com/vlesu/SNet-pytorch вместе с коэффициентами. Пример ее работы с файлом из статьи:
![](https://habrastorage.org/getpro/habr/upload_files/2ce/18f/dc3/2ce18fdc331decd372628a22db16661c.png)
Мне кажется, эффект "съедания" текстур можно побороть правильным обучением нейронки, чтобы она "догадывалась" о правильной текстуре. Как в GAN сетях, только здесь-то сколько-то информации в JPEG коэффициентах есть...
Тут, конечно, звезды сошлись. Пример как раз libjpeg с q=20.
Мне и нужно было восстанавливать как раз quality 20, до которого некоторые любят принудительно дожимать публикуемые изображения.
За 3 года сеточки улучшились, можно допилить и доучить, качество поднимется.
Т.е. видится некая библиотечка для перфекционистов "нейросетевой распаковщик пережатого JPEGа". Все публикуют картиночки как им совесть позволяет, размер файлов маленький, а эстетическое чувство у зрителей не страдает :)
Открытие того, что пользователь по-разному воспринимает артефакты сжатия в зависимости от плотности пикселей очень важно. Это дает простор для дальнейшего уменьшения размера файлов без значительной визуальной потери качества.
Уменьшить число пикселей в 4 раза, но увеличить уровень качества? Ели человек не различает столь мелких деталей, то их можно безболезненно убрать.
я думаю примерно так думали создатели видеоформатов. Где снизили цветовое разрешение, но оставив яркостное.
Если бы не замечал, не было бы никакого смысла в большей плотности пикселей. А он точно есть. Сравните два изображения, первое q=15 + fix, subsampling=420, второе q=79 без субсемплинга, оба 25 кб. Разница колоссальная.
![](https://habrastorage.org/webt/uz/2t/ox/uz2toxbephbxsikbbonmg-bf5rq.jpeg)
![](https://habrastorage.org/webt/hk/sr/sv/hksrsvmkjmh4eytqzoglrfemsps.jpeg)
Тут несколько иное, видимо мы не замечаем флуктуаций на мелком масштабе, они сглаживаются. А более устойчивые детали вполне замечаем.
Так в нём и нет никакого смысла. И ваши примеры это прекрасно иллюстрируют - никакой разницы я как пользователь не вижу - обе картинки шакальные. Что уж говорить про людей с не таким хорошим зрением, как у меня..
Похоже, на правом фото мелкие детали ещё и испорчены отсутствием гамма-коррекции (gamma-aware алгоритм не позволил бы светлым штрихам потерять яркость).
Борьба с цветными полосами в JPEG