Сжимать изображения с помощью mrc что это
Как устроено сжатие с потерями
Благодаря этому у нас есть стримы и ютуб.
Недавно мы рассказывали про сжатие данных без потерь. Смысл в том, что существуют некие алгоритмы, которые позволяют уложить данные более компактно и передать их другому человеку, не потеряв ни байта.
Часто сжатия без потерь недостаточно. Сегодня поговорим о сжатии с потерями.
Чем отличается от сжатия без потерь
При таком сжатии мы теряем часть информации. Но смысл алгоритмов сжатия в том, чтобы мы этого не замечали: сжатие должно происходить так, чтобы всё важное передалось, а неважное — нет.
Можно представить, что мы говорим с человеком по телефону. Его голос немного искажён, может прерываться или немного сбоить. Но если мы смогли понять собеседника, то нам достаточно такого качества. При этом мы можем не расслышать какие-то нюансы, не ощутить всю глубину баса или не оценить все оттенки интонаций, но это нам и неважно. Разговор по телефону — это пример передачи информации с использованием сжатия с потерями.
Сжатие фотографий
Есть алгоритм сжатия для фотографий, который используют для изображений типа JPEG. В этом алгоритме изображение разделяется на один слой яркости и два слоя цвета (если упрощённо, то картинка разделяется, на чёрно-белый слой и на слой с красками).
Из Википедии: Цветное изображение и его компоненты Y, CB и CR
Эти слои нарезаются на квадраты 8 × 8 пикселей и кодируются с помощью особой математики. Её смысл в том, чтобы понять: есть ли в этом квадрате 8 × 8 что-то важное. Если оно есть, то оно кодируется и данные сохраняются. Если квадрат более-менее однородный, то он записывается как однородный, данных мало.
Экономия данных происходит как раз за счёт этой математики: например, если в квадрат 8 × 8 попал кусочек ясного неба, то там достаточно сказать «весь кусок такого-то синего цвета», и тогда нужно хранить немножко данных. А если на квадрат пришёлся какой-то угол или деталь, то данных нужно сохранить больше.
А если у вас картинка нарезана отдельно на яркость и отдельно на цвет, вы экономите ещё больше данных: в слое с яркостью у вас будут все контрастные детали, а в цветовых слоях — плавные цветовые переливы. Плавные переливы легче закодировать, это будет незаметно для глаза.
Сжатие JPEG идеально подходит для фотографий, где размер деталей намного больше, чем размер пикселей.
Возьмём странное изображение винограда на ржавой трубе. Найдите различия между двумя картинками:
Слева — оригинал, справа изображение сжато в 20 раз. Визуально разницу заметить трудно.
Теперь сожмём оригинал в 415 раз: было 10 мегабайт, стало 24 килобайта. При этом мы всё равно понимаем, что на фотографии — виноград с плодами на ржавой трубе. Наш мозг сглаживает эти неровности и узнаёт картинку.
Справа уже видны пиксели и размытость — это побочные явления сильного сжатия.
Хуже всего JPEG подходит для сжатия изображений, в которых есть мелкие детали, острые края и резкие контрасты. Особенно — если изображения мелкие. Тогда алгоритмы JPEG создают слишком много артефактов. Дизайнеры говорят, что картинку зашакалило (от слова «шакал»):
Убейте меня
Сжатие звука
Существуют алгоритмы сжатия для аудиозаписей. Их смысл в том, чтобы не кодировать ту часть данных, которая не особо влияет на восприятие аудиосигнала.
Например, человеческое ухо в среднем воспринимает звуки частотой от 20 герц до 20 килогерц. 20 Гц — это супергрудной бас, а 20 КГц — это супертонкий писк. Чтобы закодировать волну с максимальной частотой 20 КГц, на каждую секунду вам нужно 40 тысяч чисел размером 2 байта. Получается, что секунда несжатого звука будет занимать 80 килобайт.
Но содержательная часть человеческого голоса (та, в которой зашита вся информация) заканчивается на 4000 герцах. Если отрезать у голоса всё, что выше 4000 герц, вы запросто различите смысл слов и поймёте интонацию. Пропадёт лишь некоторая «воздушность» звука. Если нет цели сделать суперкрутой звук, то алгоритмам нет смысла кодировать диапазон 4—20 КГц.
Тогда из звука отсекается лишняя информация и кодируется только диапазон до 4 КГц. Для этого кодирования достаточно 16 килобайт в секунду. Это уже экономия в 5 раз!
Самая важная часть голоса вообще болтается в районе 1000—2000 герц. Если отрезать у голоса всё от 2 до 20 КГц, то нам хватит 8 КБ в секунду, а это экономия в 10 раз по сравнению с несжатым файлом.
Сравните три варианта аудио: сначала несжатый вариант, потом сжатый в 6 раз, наконец — в 160 раз:
При таком сжатии существенно «съедаются» верхние частоты, но оно и понятно: на их кодирование компьютеру нужно в несколько раз больше данных, чем на кодирование основной информационной нагрузки аудиофайла.
Когда вы говорите по телефону, ваш голос сжимается в несколько сотен раз, потому что телефонный разговор заточен только под частоты голоса. Поэтому любая музыка в телефонной трубке звучит так погано.
Сжатие видео
Чтобы сжать видео, используют комбинацию сжатия картинок и звука. И есть один дополнительный момент: сжатие только изменяющихся частей кадра. Как это работает:
Пример кодирования одной и той же сцены с разной чувствительностью — на видео она отображена в килобитах в секунду. Чувствительность влияет на итоговый размер видеофайла:
Стримы и потоковое видео
В потоковом видео ситуация усугубляется тем, что данные нужно передавать миллионам людей как можно скорее. Поэтому, помимо того чтобы сжимать видео, стриминговые сервера ещё и меняют его физический размер, то есть из большой картинки делают маленькую.
Размеры кадров в таких видео часто измеряются в «строках» — это те самые числа возле буквы p:
Соответственно, чем выше кадр, тем он шире; тем больше размер изображения; тем больше деталей в него влезает.
Самое низкое качество, которое есть в потоковом видео — 144p. Мутная картинка и пиксели, зато можно смотреть даже с медленным интернетом
То же самое видео в формате HD или 1080p — можно прочитать даже мелкие надписи в интерфейсе игры, запущенной на умных часах. Но для этого нужен быстрый интернет/img]
Буква p в 1080p означает progressive — то есть кодируется каждая строка видеофайла. А бывает ещё буква i, которая означает interlaced. Это значит, что в одном кадре кодируются каждые чётные строки, а в следующем — каждые нечётные. Потом их объединяют в одной картинке, и если не знать, куда смотреть, то можно не заметить подвоха.
Межстрочное сжатие будет хорошо видно, если в кадре что-то движется. Вы заметите характерные «полоски» и задвоение изображения:
Машина кажется раздвоенной, потому что в одном кадре она была левее, в другом — правее, а потом эти два кадра соединили в одном, используя чересстрочное кодирование
И что нам с этим делать
Да ничего особо. Радоваться, что в наше время можно смотреть потоковое видео в прямом эфире с телефона в разрешении 1080p через сотовую вышку, пользуясь роскошным сжатием и широкополосным доступом в интернет.
Как технология MRC уменьшает размер PDF-документов
Формат PDF уже давно прижился как средство сохранения документов, которые затем не предполагается редактировать. Все PDF файлы можно условно разделить на два класса. Первый – это документы, которые были свёрстаны в цифровом виде, и затем были сконвертированы в PDF. Инструкция к какому-нибудь устройству будет, скорее всего, именно таким файлом. Внутри он выглядит как текст и графика плюс команды форматирования, описывающие, как надо располагать элементы на странице.
Второй класс – это документы, полученные в результате сканирования бумажных изображений. Их можно пропустить через ABBYY FineReader, и они превратятся в первый тип, а можно просто сохранить в PDF как картинки. И этим часто имеет смысл пользоваться, когда хочется сохранить исходный вид документа. Несмотря на то, что ABBYY FineReader довольно хорошо распознаёт документы, возникают ошибки распознавания, какие-то важные элементы на странице не находятся, в общем, то, что получается, по виду несколько отличается от исходного документа.
Поэтому часто имеет смысл сохранять в PDF изображение исходной картинки, а под него подкладывать распознанный текст для того, чтобы можно было найти документ по ключевым словам или воспользоваться copy-paste. Смущает только один момент – такие PDF-файлы имеют немаленький размер, от полумегабайта на страницу и больше. Соответственно, если отсканировать среднего размера учебник по матанализу, получится файл мегабайт на 200.
Такой размер объясняется тем, что внутри в PDF отсканированные, растровые изображения сжаты обычными картиночными кодеками, JPEG, JPEG2000, LZW или ZIP. Соответственно, меньше, чем занимают обычные JPEG-файлы для таких страничек, не получается. Чтобы уменьшить размер, обычно прибегают к разного рода ухищрениям – уменьшают разрешение, сильно занижают сжатие картинки, в результате чего сильно страдает качество текста в таких PDF.
Или тогда приходится отказываться от PDF и сохранять всё в DjVu. Получается довольно маленький размер, но действительность такова, что не все пользователи полученного файла с лёгкостью смогут его прочитать – всё-таки Adobe Acrobat стоит на гораздо большем числе компьютеров, чем DjVu-просмотрщик.
И тут на помощь приходит технология PDF MRC (от “Mixed Raster Content”) – ответ Adobe формату DjVu. Это тот же PDF, но заимствующий многие элементы из DjVu, и может читаться всеми популярными PDF-читалками. При использовании MRC размер страницы уменьшается раза в 4 при сохранении качества отсканированного изображения. Это происходит благодаря решению разделить изображение на слои и каждый слой сжимать наиболее подходящим кодеком. Текст сжимается кодеком JBIG2, всё остальное сжимается с помощью JPEG/JPEG2000/ZIP с разным качеством.
Как устроен внутри PDF MRC? Рассмотрим простой пример, а затем постепенно будем его усложнять.
Пускай у нас есть скан белой страницы с чёрным текстом, например, страницы из книги (все картинки кликабельны).
Полезная информация – только буквы, всё остальное можно игнорировать. Найдём весь текст на странице, например, логично для этого запустить FineReader и распознать страницу. Затем выделяем весь найденный текст в отдельный слой, и сжимаем его с помощью кодека JBIG2. Получаем 50 килобайт на страницу против 400 у JPEG и 200 у чёрно-белого факсового кодека CCITT4.
JBIG2 специально создан для сжатия текста. При работе он объединяет внешне похожие изображения букв в кластеры. Примерами таких кластеров, например, могут служить все буквы ‘a’, напечатанные одним шрифтом одинакового размера. Немного отличающиеся буквы ‘a’, например, с искажениями от сканирования, или напечатанные другим шрифтом, попадут в другие кластеры. В результате получается словарь, в котором объединены часто встречающиеся одинаковые буквы. Затем для каждой буквы запоминается её место. Получается весьма компактно.
JBIG2, 50 Кб. PDF с дополнительной информацией имеет размер 80 Кб
Теперь усложним задачу. Пускай у нас есть неравномерный фон, который не хочется терять.
Для этого нам понадобится уже два слоя. Первым из них по-прежнему будет текст, сжатый JBIG2. А во второй слой попадёт всё, что остаётся от исходной картинки после вырезания букв и закрашивания дырок от них. Второй слой мы можем достаточно сильно сжать с помощью JPEG, так как на нём обычно нет особо ценной информации.
Итоговый PDF имеет размер 35 Кб против 190, которые мы бы получили, просто сжав всю картинку в JPEG.
Итоговый PDF MRC, 35 Кб
Следующее усложнение. До сих пор мы выводили только чёрно-белый текст. Пусть теперь у нас будет встречаться цветной текст.
По-прежнему жмём текст чёрно-белым кодеком JBIG2, но под цветные буквы подкладываем так называемую цветовую маску – ещё один слой, который видно в «прорезях», сделанных буквами. Этот слой содержит мало цветов, и прекрасно упаковывается, например, с помощью ZIP.
Цветовая маска, ZIP, 3 Кб
Текст + цветовая маска выглядят так:
Со сжатием фона важно не переусердствовать – на него может попасть текст, который не был распознан как текст. И если мы сожмём его слишком сильно, такой текст будет трудно читать.
Итоговый PDF MRC, 60 Кб
Итак, набралось уже 3 слоя: текст, цветовая маска, которая раскрашивает текст, и фон. Осталось разделаться с элементами, которые не являются ни текстом, ни фоном. Например, это картинки или фотографии. С ними ничего особенного сделать нельзя, и мы просто добавим их в фон, сжимая JPEG или JPEG 2000 с высоким качеством.
Цветовая маска, ZIP, 5 Кб
PDF MRC готов. Он содержит несколько слоёв, каждый из которых содержит разные кусочки картинки и сжат наиболее подходящим кодеком.
Итоговый PDF MRC, 72 Кб
Конечно же, есть изображения, которые не выигрывают в размере от использования MRC. Например, пытаться сжать так фотографию пейзажа нет никакого смысла, меньше, чем JPEG не получится. Или текст, напечатанный на фоне, содержащем много мелких деталей.
Из такой картинки PDF MRC не получится
Однако для многих документов, которые мы встречаем в повседневной жизни, MRC даёт отличные результаты.
И напоследок – несколько примеров PDF MRC, которые можно получить с помощью ABBYY FineReader, ABBYY FineReader Engine или ABBYY Recognition Server:
Итого, мы получаем сжатие в 2-6 раз при том же качестве, и это не предел. PDF MRC – ещё очень молодая технология, и она продолжает активно развиваться. Будут улучшения и в сторону улучшения качества, и в сторону уменьшения размера.
Все примеры PDF, приведённые в этой статье, получены с помощью ABBYY FineReader Engine 10, настройки по умолчанию.
Василий Панфёров,
Департамент продуктов для разработчиков
Чёткость до последнего байта: как делать веб-графику хорошо, часть вторая
Вторая часть перевода статьи, в которой мы продолжаем разбираться в веб-графике и оптимизации.
В предыдущем посте вы узнали, почему не все пиксели равны, критерии качества изображений и почему те иногда «шакалятся», а еще познакомились с SVG-форматом поближе. Сегодня продолжаем тему — расскажем о растровых форматах графики в интернете и поговорим о сжатии изображений. Оригинал статьи авторства Полины Гуртовой, Риты Клубочкиной и Энди Барнова ищите в блоге Evil Martians.
У нас есть изображение размером 1000 × 1000 пикселей. Мы можем представить каждый пиксель четырьмя числами: три для цвета и одно для прозрачности. Каждое число — это один байт. Итого: 4 * 1000 * 1000 * 1 байт — это 4 Мбайт необработанных данных изображения (довольно много). Нам нужно сжать изображение перед отправкой в браузер, а браузер должен декодировать его обратно.
Алгоритмы сжатия бывают «без потерь» и «с потерями»: первый способ гарантирует, что пиксели, из которых состоит изображение, будут точно соответствовать оригиналу, а второй будет ухудшать качество изображения для экономии места.
Сжатие обрабатывается кодировщиками — программами, которые используют набор алгоритмов, работающих с исходными данными изображения на разных этапах сжатия. На некоторых из этих этапов исходные данные могут быть отброшены, что приведет к сжатию с потерями (кстати, описанное выше уменьшение масштаба также приводит к потерям).
Создавая цифровой продукт, вам необязательно знать математику алгоритмов сжатия. Все, что нужно знать, — что выбор энкодера, его настройки и количество его запусков приведут к изменению визуального качества. А уж насколько это будет приемлемое изменение, зависит от вашего контекста.
Идеальной компрессии не бывает — есть только та, которая подходит для вашего случая.
Использование ИИ для сверхсжатия изображений
Управляемые данными алгоритмы, такие как нейронные сети, взяли мир штурмом. Их развитие вызвано несколькими причинами, в том числе дешевым и мощным оборудованием и огромным объемом данных. Нейронные сети в настоящее время находятся в авангарде во всем, что касается «когнитивных» задач, таких как распознавание изображений, понимание естественного языка и т.д. Но они не должны ограничиваться такими задачами. В этом материале рассказывается о способе сжатия изображений с помощью нейронных сетей, при помощи остаточного обучения. Представленный в статье подход работает быстрее и лучше стандартных кодеков. Схемы, уравнения и, конечно, таблица с тестами под катом.
Эта статья основана на этой работе. Предполагается, что вы знакомы с нейронными сетями и их понятиями свертка и функция потерь.
Что такое сжатие изображений и какое оно бывает?
Сжатие изображений — это процесс преобразования изображения таким образом, чтобы оно занимало меньше места. Простое хранение изображений заняло бы много места, поэтому существуют кодеки, такие как JPEG и PNG, которые нацелены на уменьшение размера исходного изображения.
Как известно, существует два типа сжатия изображений: без потерь и с потерями. Как следует из названий, при сжатии без потерь можно получить данные исходного изображения, а при сжатии с потерями некоторые данные теряются во время сжатия. например, JPG — это алгоритмы с потерями [прим. перев. — в основном, не будем также забывать о JPEG без потерь], а PNG — алгоритм без потерь.
Сравнение сжатия без потерь и с потерями
Обратите внимание, что на изображении справа много блочных артефактов. Это потерянная информация. Соседние пиксели похожих цветов сжимаются как одна область для экономии места, но при этом теряется информация о фактических пикселях. Конечно, алгоритмы, применяемые в кодеках JPEG, PNG и т.д., намного сложнее, но это хороший интуитивный пример сжатия с потерями. Сжатие без потерь — это хорошо, но сжатые без потерь файлы занимают много места на диске. Есть более эффективные способы сжатия изображений без потери большого количества информации, но они довольно медленные, и многие применяют итеративные подходы. Это означает, что их нельзя запускать параллельно на нескольких ядрах центрального или графического процессора. Такое ограничение делает их совершенно непрактичными в повседневном использовании.
Ввод сверточной нейронной сети
Если что-то нужно вычислить и вычисления могут быть приближёнными, добавьте нейронную сеть. Авторы использовали довольно стандартную сверточную нейронную сеть для улучшения сжатия изображений. Представленный метод не только работает наравне с лучшими решениями (если не лучше), он также может использовать параллельные вычисления, что приводит к резкому увеличению скорости. Причина в том, что сверточные нейронные сети (CNN) очень хороши в извлечении пространственной информации из изображений, которые затем представляются в форме компактнее (например, сохраняются только «важные» биты изображения). Авторы хотели использовать эту возможность CNN, чтобы лучше представлять изображения.
Архитектура
Авторы предложили двойную сеть. Первая сеть принимает на вход изображение и генерирует компактное представление (ComCNN). Выходные данные этой сети затем обрабатываются стандартным кодеком (например, JPEG). После обработки кодеком изображение передается во вторую сеть, которая «исправляет» изображение из кодека в попытке вернуть исходное изображение. Авторы назвали эту сеть реконструирующей CNN (RecCNN). Подобно GAN обе сети обучаются итеративно.
ComCNN Компактное представление передается стандартному кодеку
RecCNN. Выходные данные ComCNN масштабируются с увеличением и передаются в RecCNN, которая попытается изучить остаток
Выходные данные кодека масштабируются с увеличением, а затем передаются в RecCNN. RecCNN будет пытаться вывести изображение, похожее на оригинал настолько, насколько это возможно.
Сквозной фреймворк сжатия изображений. Co(.) представляет собой алгоритм сжатия изображений. Авторы применяли JPEG, JPEG2000 и BPG
Что такое остаток?
Остаток можно рассматривать как шаг постобработки для «улучшения» декодируемого кодеком изображения. Обладающая большим количеством «информации» о мире нейронная сеть может принимать когнитивные решения о том, что исправлять. Эта идея основана на остаточном обучении, прочитать подробности о котором вы можете здесь.
Функции потерь
Две функции потерь используются потому, что у нас две нейронные сети. Первая из них, ComCNN, помечена как L1 и определяется так:
Функция потерь для ComCNN
Объяснение
Это уравнение может показаться сложным, но на самом деле это стандартная (среднеквадратичная ошибка) MSE. ||² означает норму вектора, который они заключают.
Cr обозначает выходные данные ComCNN. θ обозначает обучаемость параметров ComCNN, XK — это входное изображение
Re() означает RecCNN. Это уравнение просто передает значение уравнения 1.1 В RecCNN. θ обозначает обучаемые параметры RecCNN (шляпка сверху означает, что параметры фиксированы).
Интуитивное определение
Уравнение 1.0 заставит ComCNN изменить свои веса таким образом, чтобы после воссоздания с помощью RecCNN окончательное изображение выглядело как можно более похожим на входное изображение. Вторая функция потерь RecCNN определяется так:
Объяснение
Снова функция может выглядеть сложной, но это по большей части стандартная функция потерь нейронной сети (MSE).
Co() означает вывод кодека, x со шляпкой сверху означает вывод ComCNN. θ2 — это обучаемые параметры RecCNN, res() представляет собой просто остаточный вывод RecCNN. Стоит отметить, что RecCNN обучается на разнице между Co() и входным изображением, но не на входном изображении.
Интуитивное определение
Уравнение 2.0 заставит RecCNN изменить свои веса так, чтобы выходные данные выглядели как можно более похожими на входное изображение.
Схема обучения
Модели обучаются итеративно, подобно GAN. Веса первой модели фиксируются, пока веса второй модели обновляются, затем веса второй модели фиксируются, пока первая модель обучается.
Тесты
Авторы сравнили свой метод с существующими методами, включая простые кодеки. Их метод работает лучше других, сохраняя при этом высокую скорость на соответствующем оборудовании. Кроме того, авторы попытались использовать только одну из двух сетей и отметили падение производительности.
Сравнение индекса структурного сходства (SSIM). Высокие значения указывают на лучшее сходство с оригиналом. Жирным шрифтом выделен результат работы авторов
Заключение
Мы рассмотрели новый способ применения глубокого обучения для сжатия изображений, поговорили о возможности использования нейронных сетей в задачах помимо «общих», таких как классификация изображений и языковая обработка. Этот метод не только не уступает современным требованиям, но и позволяет обрабатывать изображения гораздо быстрее.
Изучать нейронные сети стало проще, ведь специально для хабравчан мы сделали промокод HABR, дающий дополнительную скидку 10% к скидке указанной на баннере.