Кодек нового поколения AV1: корректирующий направленный фильтр CDEF

в 12:20, , рубрики: AV1, CDEF, Daala, DCT, Thor, Алгоритмы, блочные артефакты, кодек, обработка изображений, подавление шума, Работа с видео, энкодер

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 1

Автор: Monty (monty@xiph.org, cmontgomery@mozilla.com). Опубликовано 28 июня 2018 года.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 2Если кто не читал предыдущую статью… AV1 — это новый универсальный видеокодек, разработанный Альянсом за открытые медиа (Alliance for Open Media). Альянс взял за основу кодек VPX от Google, Thor от Cisco и Daala от Mozilla/Xiph.Org. Кодек AV1 превосходит по производительности VP9 и HEVC, что делает его кодеком не завтрашнего, а послезавтрашнего дня. Формат AV1 свободен от любых роялти и навсегда останется таковым с разрешительной лицензией.

Эта статья задумывалась как вторая в серии статей, которые подробно описывают функциональность AV1 и новых технологий, которые лежат в его основе и впервые используются в продакшне. Предыдущая статья на Xiph.org объясняла функцию прогнозирования яркости Chroma from Luma (CfL). Сегодня мы расскажем об ограниченном направленном корректирующем фильтр (Constrained Directional Enhancement Filter). Если вы всегда задавались вопросом, что нужно для написания кодека, пристегните ремни и приготовьтесь к образованию!

Фильтры в АV1

Практически во всех видеокодеках применяются корректирующие фильтры для улучшения субъективного качества материала на выходе.

Под «корректирующими фильтрами» я подразумеваю методы, которые не обязательно кодируют информацию об изображении или улучшают объективную эффективность кодирования, но они в некотором роде улучшают результат. Корректирующие фильтры следует использовать аккуратно, потому что они обычно теряют некоторую информацию — и по этой причине их иногда считают недопустимым методом обмана, чтобы результат выглядел лучше, чем есть на самом деле.

Но это нечестно. Корректирующие фильтры созданы для того, чтобы обойти или устранить специфические артефакты, незаметные для объективных метрик, но очевидные человеческому глазу. И даже если считать фильтры формой обмана, хорошему видеокодеку всё равно нужны все практические и эффективные «читы», какие он может использовать.

Фильтры делятся на несколько категорий. Во-первых, они могут быть нормативными или ненормативными. Нормативный фильтр — обязательная часть кодека; без него невозможно правильно декодировать видео. Ненормативный фильтр необязателен.

Во-вторых, фильтры отличаются по месту применения. Существуют фильтры предварительной обработки (препроцессинг), применяемые к входным данным до начала кодирования, фильтры постобработки (постпроцессинг), применяемые к выходным данным после завершения декодирования, а также контурные фильтры (in-loop filters, loop filters), интегрированные в процесс кодирования. Фильтры предварительной обработки и постобработки обычно ненормативные и не включатся в кодек. А контурные фильтры являются нормативными практически по определению. Это часть кодека; они используются в процессе оптимизации кодирования и применяются к опорным кадрам или для межкадрового кодирования.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 3

AV1 использует три нормативных корректирующих фильтра. Первый — деблочный фильтр для удаления «блочности» — очевидных артефактов по краям закодированных блоков. Хотя DCT относительно хорошо подходит для уплотнения энергии в естественных изображениях, но всё равно имеет тенденцию скапливать ошибки на краях блоков. Если помните, устранение этих артефактов стало основной причиной, почему в Daala применили преобразование с перекрытием (lapped transform). Но AV1 — более традиционный кодек с жёсткими границами блоков. В результате здесь требуется традиционный деблочный фильтр, чтобы сгладить артефакты на краях блоков.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 4
Пример артефактов на границах блоков в традиционном блочном кодеке DCT. Эти ошибки особенно заметны

Последний из трёх фильтров — это контурный фильтр восстановления (Loop Restoration filter). Он состоит из двух конфигурируемых и заменяемых фильтров: винеровского фильтра и «самонаводящегося» фильтра (Self-Guided filter). Это два свёрточных фильтра, которые пытаются построить ядро для частичного восстановления потерянного качества исходного входного изображения. Обычно они используются для шумоподавления и/или коррекции на краях блоков. В случае AV1 они выполняют общую задачу шумоподавления, удаляя базовый шум DCT через регулируемое размытие.

Между ними находится ограниченный направленный корректирующий фильтр (Constrained Directional Enhancement Filter, CDEF), о котором мы и поведём речь. Как и контурный фильтр восстановления, он удаляет артефакты и базовый шум на стыках, но в отличие от контурного фильтра восстановления, это направленный фильтр. В отличие от большинства фильтров, он применяется не ко всему подряд, а конкретно находит границы блоков. Поэтому CDEF особенно интересен: это первый практичный и полезный направленный фильтр, который применяется в кодировании видео.

Длинная и извилистая дорога

История CDEF развивалась непросто. Это длинная дорога с разворотами, боковыми тропинками и тупиками. CDEF объединяет несколько исследовательских работ, каждая из которых дала идею или вдохновение для окончательного фильтра в AV1.

Весь смысл преобразования блоков пиксельных данных с помощью DCT и DCT-подобных преобразований заключается в том, чтобы представить блок пикселей как можно меньшим количеством чисел. DCT довольно хорошо сжимает энергию в большинстве изображений, то есть имеет тенденцию собирать разбросанные пиксельные шаблоны всего в несколько важных выходных коэффициентов.

Но есть исключения в эффективности сжатия DCT. Например, DCT не очень хорошо преобразует направленные границы или паттерны. Если посмотреть на DCT-выдачу острого диагонального края, то выходные коэффициенты тоже образуют… острую диагональ! Она отличается после преобразования, но всё ещё присутствует в изображении, хотя обычно в более сложном виде, чем в начале. Сжатие повержено!

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 5
Резкие границы — традиционная проблема для кодеков на основе DCT, поскольку они не очень хорошо сжимаются, если вообще сжимаются. Здесь мы видим резкую границу (слева) и коэффициенты преобразования DCT (справа). Энергия исходной границы распространяется через DCT в рисунок направленной ряби

За два последних десятилетия в исследованиях видеокодеков всё чаще рассматривали преобразования, фильтры и методы прогнозирования, которые по своей сути являются направленными. Исследователи искали способ лучшей обработки подобных границ и шаблонов, чтобы исправить это фундаментальное ограничение DCT.

Классические направленные предикторы

Направленное intra-прогнозирование — вероятно, один из самых известных методов направленного действия в современных видеокодеках. Все знакомы с режимами направленного прогнозирования h.264 и VP9, где кодек переносит прогноз конкретного паттерна в новый блок на основании окружающих пикселей из уже декодированных блоков. Цель состоит в том, чтобы удалить (или значительно уменьшить) энергию в жёстких, направленных краях перед преобразованием блока. Прогнозируя и удаляя признаки, которые невозможно сжать, мы повышаем общую эффективность кодека.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 6
Иллюстрация режимов направленного прогнозирования в AVC/H.264 для блоков 4×4. Предиктор расширяет значения из однопиксельных полосок соседних пикселей, перенося их в прогнозируемый блок в одном из восьми направлений, плюс режим усреднения для простого DC-прогнозирования

Ещё более старая идея — компенсация движения. Это тоже форма направленного прогнозирования, хотя мы редко думаем о ней таким образом. Этот режим смещает блоки в определённых направлениях опять же для прогнозирования и извлечения энергии перед работой DCT. Такое смещение блока является направленным и фильтруется. Как и направленное intra-прогнозирование, оно применяет тщательно построенные фильтры передискретизации, если смещение составляет не целое число пикселей.

Направленные фильтры

Как отмечалось ранее, видеокодеки активно применяют фильтры для удаления блочных артефактов и шума. Хотя фильтры применяются на плоскости 2D, но сами фильтры обычно работают в 1D, то есть выполняются горизонтально и вертикально по отдельности.

Направленная фильтрация запускает фильтры в иных направлениях, кроме горизонтального и вертикального. Такой метод уже распространён в обработке статичных изображений, где фильтры шумоподавления и наложения спецэффектов часто учитывают границы и направление. Но эти направленные фильтры часто основаны на фильтрации выдачи направленных преобразований. Например, [слегка устаревшие] фильтры шумоподавления, о которых я писал, основаны на двойном дереве комплексных вейвлетов.

Но для кодирования видео мы больше всего заинтересованы в направленных фильтрах, которые непосредственно применяются на пикселях по определённому направлению, а не фильтруют частотную область на выходе направленного преобразования. Как только вы попытаетесь создать такого зверя, то быстро возникнет Большой Вопрос: как формализовать некое направление, отличное от горизонтального и вертикального, когда позиции фильтра больше не привязаны к пикселям на сетке?

Один из вариантов — использовать классический подход, используемый в высококачественной обработке изображений: преобразовать ядро фильтра и производить повторную выборку (ресэмплинг) пиксельного пространства по мере необходимости. Можно даже утверждать, что это единственный «правильный» или «полный» ответ. Он используется в компенсации субпиксельного движения, где невозможно получить хороший результат без хорошей повторной выборки, а также в направленном прогнозировании, где обычно используется быстрое приближение.

Тем не менее, даже быстрое приближение дорого обходится с точки зрения вычислительных ресурсов, если применять его повсеместно, поэтому желательно избежать повторной выборки, если это возможно. Дорогая цена за скорость — одна из причин, почему в кодировании видео до сих пор не применялись направленные фильтры.

Направленные преобразования

Направленные преобразования пытаются исправить проблемы DCT с уплотнением границ блоков на уровне самого преобразования.

Эксперименты в этой области делятся на две категории. Есть преобразования, использующие по сути направленные базы, такие как направленные вейвлеты. Как правило, они склонны к излишнему пересчёту/сверхполноте, то есть производят больше выходных данных, чем принимают на входе: обычно намного больше. Это словно работать в обратном направлении, ведь мы хотим уменьшить объём данных, а не увеличить его! Но эти преобразования всё-таки сжимают энергию, и энкодер по-прежнему выбирает небольшое подмножество выходных данных для кодирования, так что в реальности здесь немного отличий от обычного кодирования DCT с потерями. Тем не менее, «сверхполные» преобразования обычно требуют излишнего количества памяти и вычислительных ресурсов, поэтому не используются в популярных видеокодеках.

Вторая категория направленных преобразований берёт регулярные ненаправленные преобразования вроде DCT — и изменяет их, влияя на вход или выход. Изменения могут проводиться в виде повторной выборки, перемножения матриц (что можно рассматривать как специализированную форму повторной выборки) или жонглирования с порядком входных данных.

Вот эта последняя идея самая сильная, потому что метод работает быстро. Для простой перестановки чисел не требуется никаких математических вычислений.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 7
Два примера преобразований в разных направлениях перестановкой пикселей и коэффициентов, а не фильтром повторной выборки. Пример взят из «Обзора направленных преобразований в кодировании изображений», Цзичэн Сюй, Бинг Цзэн, Фэн Ву

Реализацию осложняют несколько практических сложностей. Переориентация квадрата даёт диагональное ребро с преимущественно вертикальными или горизонтальными линиями, что приводит к неквадратной матрице чисел в качестве входных данных. Концептуально это не проблема. Поскольку можно запускать преобразования строк и столбцов независимо друг от друга, то просто используем разные размеры 1D DCT для каждой строки и столбца, как показано на рисунке выше. Но на практике это означает, что нам понадобится разная факторизация DCT для каждой возможной длины столбца — и как только отдел аппаратной разработки этой поймёт, вас выбросят из окна.

Есть и другие способы обработки неквадратных областей после перестановки, Можно придумать схемы повторной выборки, которые сохраняют входной квадрат или работают только на выходе. Большинство перечисленных ниже статей о направленном преобразовании предлагают для этого разные схемы.

И на этом история направленных преобразований по сути заканчивается. Как только вы обходите различные осложнения направленных преобразований и делаете реальный фильтр, он нормально не работает в современном кодеке по неожиданной причине: из-за конкуренции с переменным размером блока. То есть в кодеке с фиксированным размером блока добавление направленных преобразований даёт впечатляющий прирост эффективности. И переменный размер блока сам по себе даёт ещё большую выгоду. А вот объединение переменного размера блока и направленных преобразований приводит к худшему результату, чем использование каждого из этих методов по отдельности. Переменный размер блока уже устранил те избыточности, которые используются направленными преобразованиями, и даже сделал это более эффективно.

При разработке Daala мы с Натаном Эгге много экспериментировали с направленными преобразованиями. Я рассмотрел проблему и со стороны входных данных, и на стороне выхода, используя разреженные матричные умножения для преобразования на выходе диагональных границ в вертикальное/горизонтальное положение. Натан протестировал известные подходы к направленным преобразованиям, перестраивая данные на входе. Мы пришли к одному выводу: дополнительная сложность не даёт ни объективной, ни субъективной выгоды.

Применение направленных преобразований в Daala (и других кодеках) могло бы стать ошибкой, но в исследованиях затронули один вопрос, упомянутый ранее: как быстро фильтровать вдоль границ без дорогостоящей повторной выборки? Ответ: не нужно проводить повторную выборку. Сделайте приближение угла, двигаясь вдоль целого ближайшего пикселя. Сделайте приближение преобразованного ядра, буквально или концептуально переставляя пиксели. Такой подход приводит к некоторым искажениям (алиасинг), но работает достаточно хорошо и достаточно быстро.

Направленные предикторы, часть 2: хроники Daala

История CDEF в кодеке Daala началась с попыток сделать нечто совершенно иное: обычное скучное направленное intra-прогнозирование. Или по крайней мере что-то нормальное для кодека Daala.

Я писал о схеме intra-прогнозирования Daala в частотной области, когда мы только начинали работать над ней. Математика здесь вполне рабочая; никаких причин для беспокойства. Однако наивная реализация потребовала огромного количества перемножений матриц, что оказалось слишком дорого для кодека в продакшне. Мы надеялись, что вычислительную нагрузку можно на порядок снизить за счёт разреживания — устранения матричных элементов, не вносящих большого вклада в прогноз.

Но разреживание работает не так, как хотелось бы. По крайней мере, когда мы его реализовали, оно теряло слишком много информации, делая технику непригодной на практике.

Конечно, для Daala по-прежнему нужна была некая форма intra-прогнозирования, и у Жан-Марка Валина появилась идея: автономный кодек прогнозирования, который работает в пространственной области параллельно кодеку Daala в частотной области. Как своего рода симбионт, работающий в тандеме, но не имеющий зависимостей от Daala, он не ограничен требованиями Daala для частотной области. Так появился Intra Paint.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 8
Пример алгоритма прогнозирования Intra Paint на фотографии Сиднейской гавани. Визуальный выход чётко направленный, хорошо соответствует границам блоков и особенностям исходного изображения, создавая приятный (разве что немного странный) результат с чёткими границами

Фильтр Intra Paint работал по-новому: он кодировал одномерные векторы только вдоль границ блоков, а затем прогонял шаблон по выбранному направлению. Это как разбрызгать краску, а потом размазать её в разных направлениях по открытым областям.

Intra Paint казался перспективным и сам по себе выдавал потрясающе красивые результаты, но опять же оказался недостаточно эффективным, чтобы работать в качестве стандартного intra-предиктора. Он просто не получал достаточно бит для кодирования собственной информации.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 9
Разница между оригинальной фотографией Сиднейской гавани и результатом Intra Paint. Несмотря на визуально приятную выдачу Intra Paint, объективно её нельзя назвать сверхточным предиктором. Разница довольно значительная даже вдоль многих границ, которые казались хорошо обработанными

«Провал» Intra Paint натолкнул нас на другую идею. Хотя это «рисование» объективно не слишком хороший предиктор, но субъективно по большей части выглядит неплохо. Может быть, использовать метод «размазывания краски» в качестве фильтра постобработки для улучшения субъективного визуального качества? Intra Paint очень хорошо следует вдоль чётких границ, и поэтому потенциально должен хорошо устранять шум, который скапливается вдоль самых резких границ. Из этой идеи родился оригинальный фильтр Paint-Dering в Daala, который в конечном итоге привёл к самому CDEF.

Есть ещё одна интересная вещь в направленном прогнозировании, хотя в настоящее время это тупиковое направление в кодировании видео. Дэвид Шлиф реализовал интересный фильтр повторной выборки с учётом границ/направления под названием Edge-Directed Interpolation (EDI). Другие кодеки (как серия VPx и в некоторое время AV1) экспериментировали с опорными кадрами уменьшенного размера для экономии битов кодирования, а затем увеличивая разрешение. Мы надеялись, что при увеличении разрешения значительно улучшенная интерполяция EDI улучшит технику до такой степени, что это будет полезно. Мы также надеялись использовать EDI как улучшенный фильтр субпиксельной интерполяции для компенсации движения. К сожалению, эти идеи остались нереализованной мечтой.

Заполнение дыр, слияние веток

На данный момент я описал все основные предпосылки, необходимые для подхода к CDEF, но в реальности мы продолжали блуждать в пустыне. Intra Paint породил оригинальный фильтр Daala Paint-Dering, который использовал алгоритм Intra-Paint в качестве постфильтра для устранения артефактов. Он оказался слишком медленным для применения в реальном кодеке.

В результате мы учли уроки Intra Paint и отказались от экспериментов в этом направлении. Daala на некоторое время позаимствовал CLPF из Thor, а затем Жан-Марк создал другой, гораздо более быстрый фильтр подавления шума (Deringing) для Daala, основанный на поиске направлений границ Intra-Paint (он работал быстро и хорошо), а также Conditional Replacement Filter, фильтр условной замены. CRF создан в чём-то на идеях медианного фильтра и выдавал результаты, похожие на билатеральный фильтр, но работал по сути в векторах и поэтому гораздо быстрее.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 10
Сравнение линейного фильтра 7-tap с фильтром условной замены на зашумлённом одномерном сигнале, где шум имитирует эффекты квантования на исходном сигнале

Окончательный фильтр подавления шума Daala использует два одномерных фильтра CRF, фильтр 7-tap в направлении границ и слабый фильтр 5-tap. Оба фильтра работают только на целых пикселях, не выполняя повторную выборку. Здесь фильтр подавления шума Daala становится очень похож на то, что мы теперь знаем как CDEF.

Недавно мы предложили Daala в качестве кодека AOM, и этот промежуточный фильтр стал экспериментом AV1 daala_dering. Компания Cisco тоже представила свой фильтр подавления шума, Constrained Low-Pass Filter (CLPF) из кодека Thor. Какое-то время оба фильтра существовали параллельно в экспериментальной сборке AV1: их можно было включать по отдельности и даже вместе. Благодаря этому в их работе удалось заметить полезную синергию, а также дополнительные сходства фильтров на различных этапах работы.

Итак, мы наконец добрались до CDEF: произошло слияние фильтра CLPF от компании Cisco и второй версии фильтра устранения шумов Daala в одном высокопроизводительном фильтре подавления шумов с учётом направления границ.

Современный CDEF

Фильтр CDEF прост и очень похож на наши предыдущие фильтры. Он состоит из трёх частей (поиск направления, фильтр ограниченной замены/нижних частот и размещение целпиксельных меток), которые мы использовали раньше. Учитывая долгую предысторию, взглянув на готовый CDEF вы можете спросить «И это всё? А где остальное?» CDEF — пример того, как получить полезный эффект за счёт правильной реализации деталей, а не за счёт усложнения. Простой и эффективный фильтр — таким он и должен быть.

Поиск направления

CDEF работает в определённом направлении, поэтому необходимо определить его. Алгоритм такой же, как у Intra Paint и Paint-Dering. Существует восемь возможных направлений.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 11
Восемь возможных направлений работы фильтра CDEF. Нумерованные линии в каждом блоке направления соответствуют параметру 'k' в поиске направления

Мы определяем направление фильтра, делая «направленные» варианты входного блока, по одному для каждого направления, где все пиксели вдоль линии в выбранном направлении приводятся к одинаковому значению. Затем выбираем направление, где результат наиболее точно соответствует исходному блоку. То есть для каждого направления d мы сначала находим среднее значение пикселей в каждой строке k, а затем вдоль каждой строки суммируем квадратичную ошибку между заданным значением пикселя и средним значением этой пиксельной линии.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 12
Пример процесса выбора направления d, которое наилучшим образом соответствует входному блоку. Сначала мы определяем среднее значение пикселя для каждой строки операции k по каждому направлению. Это показано выше путём приведения каждого пикселя данной линии k к этому среднему значению. Затем суммируем ошибку для данного направления, пиксель за пикселем, вычитая входное значение из среднего значения. В качестве наилучшего направления выбирается направление с наименьшей ошибкой/дисперсией

Так мы получаем общую квадратичную ошибку, а наименьшая общая квадратичная ошибка — то направление, которое мы выберем. Хотя в примере выше делается именно так, но в реальности необязательно преобразовывать квадратичную ошибку в дисперсию: в каждом направлении одинаковое количество пикселей, поэтому оба выберут один и тот же ответ. Меньше вычислений!

Это интуитивный, длинный путь для вычисления ошибки направления. Можно упростить механическую обработку следующим уравнением:

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 13

В данной формуле $E$ — ошибка, $p$ — пиксель, $x_p$ — значение пикселя, $k$ — одна из пронумерованных строк на диаграмме направлений выше, а $N_{d, k}$ — мощность множества (количество пикселей в нём) линии $k$ для направления $d$. Это уравнение на практике можно упростить. Например, первый член одинаков для каждого $d$. В конечном итоге, реализация AV1 CDEF в настоящее время требует 5,875 сложений и 1,9375 умножений на пиксель и глубоко векторизуется, что приводит к общей стоимости менее 8×8 DCT.

Метки фильтра (filter taps)

Фильтр CDEF работает попиксельно в полном блоке. Направление $d$ выбирает один из фильтров направления, каждый из которых состоит из набора меток фильтра (то есть локаций входных пикселей) и весов.

Концептуально CDEF конструирует направленный фильтр из двух одномерных. Основной фильтр работает вдоль выбранного направления, как в фильтре устранения шумов Daala. Вторичный фильтр запускается дважды под углом 45° к основному, как в CLPF Thor.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 23

Направление основного и вторичного одномерных фильтров по отношению к выбранному направлению d. Основной фильтр запускается по выбранному направлению, вторичные работают под углом 45° к основному направлению. Каждый пиксель в блоке фильтруется одинаково

Фильтры работают под такими углами, что идеальные метки часто попадают между пикселями. Вместо повторной выборки мы выбираем точное местоположение ближайшего пикселя, принимая в учёт симметричное ядро фильтра.

У каждой метки в фильтре также одинаковый вес. Во время фильтрации на вход подаётся её входное значение, затем применяется функция ограничений (constraint function), затем результат умножается на фиксированный вес метки и к фильтруемому пикселю по итогу добавляется это выходное значение.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 24
Местоположения первичных и вторичных меток (taps) и фиксированные веса (w) по направлениям фильтра. Для первичных меток и чётных значений силы a = 2 и b = 4, тогда как для нечётных a = 3 и b = 3. Отфильтрованный пиксель показан серым цветом

На практике первичный и вторичный фильтры не работают по отдельности, а объединяются в одно ядро фильтра, которое выполняется за один шаг.

Функция ограничений

CDEF использует ограниченный фильтр нижних частот, в котором значение каждой метки сначала обрабатывается функцией ограничений (constraint function) с параметром разницы между значением метки и фильтруемого пикселя $d$, силы фильтра $S$ и параметром демпфирования $D$:

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 28

Функция ограничений призвана снизить или полностью отказаться от обработки пикселей, которые не слишком отличаются от фильтруемых пикселей. В опрелелённом диапазоне полностью учитываются различия значений меток от центрального пикселя (что задаётся параметром силы $S$). Если разница в значениях попадает в диапазон между параметрами $S$ и $D$, то значение ослабляется. Наконец, значения меток за пределами $D$ полностью игнорируются.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 33
Иллюстрация функции ограничений. На обоих рисунках разница (d) между центральным пикселем и пикселем метки откладывается по оси x. Выходное значение функции ограничений показано вдоль оси y. Рисунок слева демонстрирует эффект изменения параметра силы (S). На рисунке справа показан эффект изменения параметра демпфирования (D)

Выходное значение функции ограничений затем умножается на фиксированный вес, связанный с каждым положением метки относительно центрального пикселя. Наконец, результирующие значения (по одному для каждой метки) добавляются к центральному отфильтрованному пикселю, что даёт окончательное отфильтрованное значение пикселя. Все это выражается в такой формуле:

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 34

… где $(p)$ и $(s)$ соответствуют значениям первичного и вторичного наборов меток.

Есть несколько дополнительных деталей реализации относительно округления и отсечения. Но для понимания они не так важны. Если вы собираетесь реализовать CDEF, конечно, их можно найти в полном описании CDEF.

Результаты

CDEF предназначен для удаления или уменьшения основного шума и артефактов окантовки (ringing) у резких границ изображения без их размытия или повреждения. Фильтр сейчас используется в AV1 и даёт тонкий, но последовательный эффект. Возможно, в будущем можно будет ещё больше полагаться на CDEF.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 37
Пример уменьшения шума и артефактов при кодировании изображения Fruits. На первой врезке показана область без обработки CDEF, на второй — та же область после обработки CDEF

Количественное значение любого корректирующего фильтра должно определяться субъективными тестами. Объективные метрики не стоит сбрасывать со счетов, но разработка CDEF создана для получения результата, который выходит за рамки возможностей примитивных инструментов объективного тестирования, таких как PSNR и SSIM.

Таким образом, мы провели несколько раундов субъективного тестирования, сначала во время разработки CDEF (когда Daala Dering и Thor CLPF были ещё технически конкурентами), а затем провели более полное тестирование объединённого фильтра CDEF. Поскольку это новый фильтр, который вообще отсутствует в предыдущих поколениях кодеков, тестирование в основном состояло из AV1 с включенным CDEF и AV1 без CDEF.

Кодек нового поколения AV1: корректирующий направленный фильтр CDEF - 38
Субъективные результаты A/B-тестирования AV1 с CDEF и AV1 без CDEF для конфигурации с высокой задержкой

Субъективные результаты показывают статистически значимое (p<.05) улучшение в трёх из шести клипов. Как правило, это соответствует повышению эффективности кодирования на 5−10%. Это довольно большой выигрыш для одного инструмента, добавленного к вполне зрелому кодеку.

Как и ожидалось, объективное тестирование показало более скромную прибавку примерно на 1%, Однако объективное тестирование полезно только в той мере, в какой оно согласуется с субъективными результатами. Субъективное тестирование — золотой стандарт, а субъективные результаты вполне однозначны.

Тестирование также показало, что CDEF лучше проявляет себя, если во время кодирования отключен дополнительный «инструментарий» кодека. Как и направленные преобразования, CDEF конкурирует за выгоду с другими, более сложными методами AV1. Поскольку CDEF — простой, маленький и быстрый фильтр, в будущем он может найти применение для уменьшения сложности энкодеров AV1. С точки зрения сложности декодера на CDEF приходится от 3% до 10% декодера AV1, в зависимости от конфигурации.

Дополнительные ресурсы

  1. Стандартные наборы тестов ‘derf’ от Xiph.Org, на сайте media.xiph.org
  2. Система автоматизированного тестирования и метрик, используемых при разработке Daala и AV1: «Мы уже сжаты?»
  3. Фильтр Constrained Directional Enhancement Filter (CDEF) в AV1. Штейнар Мидтскоген, Жан-Марк Валин, октябрь 2017
  4. Слайды презентации CDEF для ICASSP 2018, Штейнар Мидтскоген, Жан-Марк Валин
  5. Фильтр Deringing для Daala и дальнейшее развитие. Жан-Марк Валин. Предыдущий фильтр подавления шумов, созданный при разработке кодека Daala, который использовался при создании CDEF в AV1.
  6. Daala: раскрашивание картинок для удовольствия и пользы. Жан-Марк Валин. Ещё более ранний корректирующий фильтр на базу Intra-Paint, который привёл к созданию фильтра подавления шумов в Daala, который в свою очередь привёл к CDEF
  7. Фильтр Intra Paint Deringing. Жан-Марк Валин, 2015. Заметки по корректирующему фильтру с подавлением шумов, который появился из эксперимента Intra Paint в Daala
  8. Управляемая фильтрация изображений. Каймин Хе, Цзянь Сан, Сяоу Тан, 2013
  9. Направленно-адаптивное дискретное вейвлетное преобразование для сжатия изображений. Чуо-Линг Чанг, Бернд Жирод, IEEE Transactions on Image Processing, том 16, номер 5, май 2007
  10. Направленно-адаптивные преобразования для обмена изображениями. Чуо-Линг Чанг, кандидатская диссертация в Стэнфордском университете, 2009. Эта диссертация даёт хороший обзор области направленных преобразований по состоянию на 2009 год; к сожалению, доступных копий в онлайне не нашлось
  11. Направленно-адаптивное разбитое на блоки преобразование для кодирования цветного изображения. Чуо-Линг Чанг, Мина Макар, Сэм С. Цай, Бернд Жирод, IEEE Transactions on Image Processing, том 19, номер 7, июль 2010
  12. Собранная на основе шаблона схема DCT с прогнозированием DC и кодированием в адаптивном режиме. Жибо Чен, Сяочжун Сюй. Статья за пейволом IEEE
  13. Направленно-адаптивные преобразования для остаточного прогнозирования кодирования. Роберт Коэн, Свен Кломп, Энтони Ветро, Хуифан Сан. Proceedings of 2010 IEEE 17th International Conference on Image Processing, 26-29 сентября, 2010, Гонконг
  14. Ориентационно-избирательное ортогональное преобразование с перекрытием. Дитмар Кунц, 2008. Статья за пейволом IEEE
  15. Анализ скорость-искажения направленных вевлетов. Ариан Малеки, Бошра Раджай, Хамид Реза Пурреза. IEEE Transactions on Image Processing, том 21, номер 2, февраль 2012
  16. Теоретический анализ моментов изменения тенденций в направленных ортогональных преобразованиях. Шого Мурумацу, Дандан Хан, Томоя Кобаяши, Хисаказу Кикучи. Статья за пейволом IEEE. Однако свободно доступна краткая версия
  17. Обзор направленных преобразований в кодировании изображений. Цзичэн Сюй, Бинг Цзэн, Фэн Ву.
  18. Преобразование с направленной фильтрацией для сжатия изображений и межкадровой информации. Сюлянь Пэн, Цзичэн Сюй, Фэн Ву, IEEE Transaction in Image Processing, том 19, номер 11, ноябрь 2010. Статья за пейволом IEEE
  19. Аппроксимация и сжатия с помощью разреженных ортонормальных преобразований. O. Г. Сезер, O. Г. Гулерюз, Юсель Алтунбасак, 2008
  20. Надёжное изучение двухмерных разделяемых преобразований для видеокодеков следующего поколения. O. Г. Сезер, Р. Коэн, A. Ветро, март 2011
  21. Совместная оптимизация на основе разреженности набора ортонормированных двумерных разделяемых блочных преобразований. Джоэл Соле, Пэн Инь, Юньфэй Чжэн, Кристина Гомила, 2009. Статья за пейволом IEEE
  22. Направленные преобразования с перекрытием для кодирования изображений. Цзичэн Сюй, Фэн Ву, Цзе Лян, Вэньцзюнь Чжан, IEEE Transactions on Image Processing, апрель 2008
  23. Направленные дискретные косинусные преобразования — новый фреймворк для кодирования изображений. Бинг Цзэн, Цзинцзин Фу, IEEE Transactions on Circuits and Systems for Video Technology, апрель 2008
  24. Двойное дерево комплексных вейвлетных преобразований. Иван Селезник, Ричард Баранюк, Ник Кингсбери, IEEE Signal Processing Magazine, ноябрь 2005

Автор: m1rko

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js