MS-SSIM простыми словами: многошкальное сходство

Автор: Николай СапуновОбновлено: август 202618 мин чтения
Содержание статьи +

Кратко

Multi-Scale Structural Similarity, записываемое MS-SSIM, берёт идею измерения структуры, лежащую в основе SSIM, и прогоняет её на пяти размерах изображения вместо одного – потому что «правильная» шкала для оценки картинки зависит от того, насколько она велика на экране и как далеко вы сидите. Оно многократно низкочастотно фильтрует и уменьшает и оригинал, и искажённый кадр, измеряет контраст и структуру на каждом размере, измеряет яркость только на самом маленьком и смешивает результаты пятью фиксированными весами, откалиброванными перцептивным экспериментом. Выигрыш – одно число от 0 до 1, которое отслеживает человеческий глаз лучше одношкального SSIM при меняющемся разрешении экрана и дистанции просмотра – потому-то его и приводит большинство сравнений кодеков. Эта статья показывает систему, веса и почему побеждают средние шкалы, разобранный пример с реальными числами по шкалам, точную команду FFmpeg и где MS-SSIM всё ещё врёт.

Почему это важно

Если вы сравниваете кодеки, читаете бенчмарки кодировщиков или выбираете объективную метрику для ворот качества, MS-SSIM – одно из трёх чисел, которые вы встречаете постоянно, наряду с SSIM и VMAF, – и именно его чаще всего приводят, не понимая, что даёт приставка «много-». Оно встречается в выводе libvmaf, в таблицах сравнения AV1 и HEVC, в академических результатах – обычно как голое число без объяснения пяти шкал или весов под ним. Эта статья даёт такое объяснение: почему одной шкалы мало, как работает пятишкальная машина, арифметику, показанную один раз на реальных числах, и контент, где MS-SSIM всё ещё врёт. Это мост между одношкальным SSIM и обученными на восприятии метриками, которые пришли следом.

Проблема одной шкалы: одно окно предполагает один экран

Начнём с разрыва, который MS-SSIM был создан закрыть, потому что из него следует вся конструкция. Одношкальное SSIM – индекс структурного сходства – скользит небольшим окном по изображению (патчем 11×11 в оригинальной статье) и в каждой точке спрашивает, уцелели ли локальная яркость, контраст и структура. Структура – это та часть, что важна: узор света и тени, который глаз читает как края и текстуру. SSIM измеряет её ровно при одном размере окна, на изображении в его родном разрешении.

Это единственное окно тихо предполагает одно условие просмотра. Видимо ли данное искажение, зависит от трёх вещей, которые авторы MS-SSIM назвали прямо: плотности дискретизации изображения (сколько пикселей), расстояния от экрана до глаза и самой зрительной системы (Wang, Simoncelli и Bovik, 2003). Подойдите ближе – и мелкая деталь становится видимой; отсядьте – и та же мелкая деталь размывается, а доминирует то, что вы замечаете, грубая структура. Метрика, измеряющая структуру на одной фиксированной шкале, может быть права лишь для одной из этих ситуаций.

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

Есть и вторая, более острая причина, по которой одной шкалы мало, и оригинальная статья её измерила. Сжатие портит не каждую шкалу одинаково. Кодеки вроде JPEG, и каждый современный видеокодек после него, выбрасывают мелкую деталь куда агрессивнее, чем грубую структуру. Поэтому сжатый кадр «выглядит» тем более похожим на оригинал, чем сильнее вы его размываете и уменьшаете, – а значит, одношкальное SSIM даёт систематически разный вердикт в зависимости от того, на какой шкале вы измеряете. Решение не в том, чтобы угадать удачную шкалу; оно в том, чтобы измерить их все и взвесить по тому, насколько каждая важна глазу.

Что делает MS-SSIM: измеряет структуру вниз по пирамиде

Машина проще, чем звучит. Берём опорный и искажённый кадры. На текущем размере вычисляем сравнения контраста и структуры – те же два члена, что использует SSIM и которые мы разберём через секунду. Затем низкочастотно фильтруем оба кадра (мягкое размытие, убирающее мельчайшую деталь до того, как она вызовет алиасинг) и уменьшаем их в 2 раза, вдвое по каждой стороне. Повторяем. Оригинальная статья использует пять шкал: Шкала 1 – изображение в полном разрешении, и каждый шаг вниз – половина ширины и половина высоты предыдущего, так что Шкала 5 – изображение, уменьшенное в 16 раз по каждой оси (Wang, Simoncelli и Bovik, 2003).

Рисунок 1. MS-SSIM прогоняет измерение структуры вниз по пятиуровневой пирамиде. Контраст и структура измеряются на каждой шкале; яркость – один раз, на самой грубой. Пять результатов сводятся в одно число.

Два проектных выбора в этой машине стоит отметить, потому что именно они отличают MS-SSIM от «прогони SSIM пять раз и усредни».

Контраст и структура на каждой шкале; яркость только на самой грубой. SSIM построено из трёх сравнений – члена яркости l (совпала ли яркость?), члена контраста c (совпал ли разброс света и тени?) и члена структуры s (уцелел ли узор?). Полная математика и аналогии живут в статье про SSIM; здесь вам нужна лишь форма. MS-SSIM измеряет контраст и структуру на каждой из пяти шкал, но яркость – только один раз, на самой маленькой шкале. Причина практическая: абсолютная яркость – низкочастотное, крупномасштабное свойство, поэтому измерять её на каждой шкале значило бы её удваивать. Измерить её один раз, на самом грубом уровне, где она живёт, достаточно.

Комбинация – это взвешенное произведение, а не среднее. Пятишкальный результат собирается по этой формуле (это определяющее уравнение метрики из статьи 2003 года):

                              M
MS-SSIM(x,y) = [l_M(x,y)]^αM · ∏ [c_j(x,y)]^βj · [s_j(x,y)]^γj
                             j=1

Прочтите её простыми словами: возьмите член яркости на самой грубой шкале M и умножьте его на члены контраста и структуры с каждой шкалы j, каждый возведённый в степень, задающую, насколько эта шкала считается. Степени (α, β, γ) – это веса. Чтобы упростить, авторы сделали три показателя равными на каждой шкале (так у шкалы один вес) и нормализовали пять весов в сумму 1. Эта нормализация и держит MS-SSIM на той же базе 0–1, что и SSIM, и поэтому MS-SSIM двух идентичных изображений ровно 1.

Маленькое упрощение делает разобранный пример ниже чище. Поскольку константы SSIM выбраны так, что C3 = C2/2, член контраста, умноженный на член структуры, сворачивается в одно выражение – назовём его членом cs:

cs(x,y) = c(x,y) · s(x,y) = ( 2·σxy + C2 ) / ( σx² + σy² + C2 )

где σx² и σy² – дисперсии двух окон, а σxy – их ковариация. Так что на шкалах с 1 по 4 MS-SSIM нужен лишь член cs; на шкале 5 оно также вносит яркость, что делает вклад шкалы 5 полным одношкальным SSIM. Именно это и вычисляет эталонная реализация.

Веса и почему побеждают средние шкалы

Пять весов – не круглые числа, и это самая интересная часть метрики. Они получены из специального перцептивного эксперимента, а не из догадки. Авторы построили тест с синтезом изображений: для десяти исходных изображений 64×64 они генерировали искажения, ограниченные одной шкалой за раз, на двенадцати уровнях искажения, и просили восьмерых наблюдателей подобрать изображения равного воспринимаемого качества по шкалам при фиксированной дистанции просмотра 32 пикселя на градус угла зрения. Усреднение того, куда наблюдатели поместили изображения равного качества, дало относительную важность каждой шкалы (Wang, Simoncelli и Bovik, 2003). Полученные веса:

ШкалаРазмер vs оригиналВес (βj = γj)
Шкала 1 (самая мелкая)полное разрешение0.0448
Шкала 21/20.2856
Шкала 31/40.3001
Шкала 41/80.2363
Шкала 5 (самая грубая)1/160.1333

Таблица 1. Откалиброванные веса по шкалам из Wang, Simoncelli & Bovik (2003). В сумме ≈ 1.0. Самая мелкая шкала несёт лишь ≈ 4.5% веса; шкалы 2–4 вместе несут ≈ 82%.

Рисунок 2. Веса шкал достигают пика в середине (Шкала 3, 0.3001) и спадают к самой мелкой и самой грубой шкале – та же форма, что у контрастной чувствительности глаза, наиболее сильной на средних пространственных частотах.

Форма этих весов – и есть урок. Самая мелкая шкала – изображение в полном разрешении, где живут пиксельный шум и резчайшая деталь, – получает лишь 4.5% голоса. Средние шкалы (2, 3 и 4) вместе несут около 82%. Это повторяет известный факт о зрении: контрастная чувствительность, описывающая, насколько глаз чувствителен на разных пространственных частотах, достигает пика на средних частотах (около четырёх циклов на градус) и спадает к очень мелкой и очень грубой детали (Wang, Simoncelli и Bovik, 2003). MS-SSIM не скопировало контрастную чувствительность напрямую – статья аккуратно говорит, что не могло, потому что эта кривая измеряется на пороге видимости простыми синусоидами, а не на видимо искажённых сложных изображениях, – но откалиброванные веса легли на ту же общую форму. Поэтому MS-SSIM прощает немного мелкозернистого шума, который одношкальное SSIM, измеряя только самую мелкую шкалу, наказывает сильно.

Разобранный пример: смотрим, как шкалы складываются

Числа делают это осязаемым. Мы взяли опорный кадр 512×512 со структурой на нескольких шкалах и сжали его в JPEG низкого качества (quality 15), затем прогнали скрипт MS-SSIM «с нуля», который идёт с этой статьёй. Вот что сообщила каждая шкала:

ШкалаРазмерЧлен cs (c·s)Вес
Шкала 1512×5120.8510.0448
Шкала 2256×2560.9530.2856
Шкала 3128×1280.9880.3001
Шкала 464×640.9970.2363
Шкала 532×320.9996 (полное SSIM, с яркостью)0.1333

Таблица 2. Члены по шкалам для JPEG quality 15 кадра 512×512, из скрипта-компаньона. Урон сильнее всего на самой мелкой шкале и тает по мере уменьшения изображения – ровно та картина, что предсказала статья 2003 года для блочного сжатия.

Прочтите таблицу сверху вниз – и виден весь довод метрики. В полном разрешении структура сильно повреждена: член cs равен 0.851, потому что блочность и ringing у JPEG уродуют мелкую деталь. Но по мере уменьшения кадра этот мелкий урон размывается, и доминирует грубая структура, которую JPEG в основном сохранил: 0.953, затем 0.988, затем 0.997, затем почти идеально. Одношкальное SSIM, которое смотрит только на Шкалу 1, сообщило бы 0.850 и назвало бы это плохим кодированием. Теперь скомбинируем шкалы с их весами:

MS-SSIM = 0.851^0.0448 · 0.953^0.2856 · 0.988^0.3001 · 0.997^0.2363 · 0.9996^0.1333
        = 0.975

Многошкальный вердикт – 0.975, а не 0.850. Разница – не метрика, мягкая ради мягкости; это метрика, отказывающаяся позволить самой мелкой шкале, несущей лишь 4.5% перцептивного веса, диктовать всю оценку. На нормальной дистанции просмотра человек не будет рассматривать этот кадр попиксельно в 512×512; он увидит его в каком-то реальном размере, где грубая структура важнее, и 0.975 у MS-SSIM ближе к этому суждению, чем 0.850 у одношкального. Прогоните ту же машину на искажении, живущем в основном в мелком зерне, – высокочастотном шуме, – и разрыв ещё шире: одношкальное SSIM около 0.876, MS-SSIM около 0.989. Режим --demo скрипта воспроизводит ровно этот случай.

Чтение оценки MS-SSIM

MS-SSIM идёт от 0 до 1, больше – лучше, и 1 означает идентичность – та же шкала, что у SSIM, отчасти поэтому их и путают. Но числа не взаимозаменяемы. Для одного и того же контента и искажения MS-SSIM обычно читается выше, чем одношкальное SSIM, потому что грубые шкалы (где сжатие вредит меньше) тянут взвешенное произведение вверх, как только что показал пример. Команда, тихо подменившая одношкальное SSIM на MS-SSIM в дашборде, увидит, что каждая оценка подскочила, и может подумать, что качество выросло, тогда как сменилась лишь метрика.

Отсюда два практических следствия. Во-первых, никогда не сравнивайте число одношкального SSIM с числом MS-SSIM – они отвечают на разные вопросы и живут на разных эффективных диапазонах. Во-вторых, грубые полосы качества, которые вы, возможно, запомнили для SSIM, не переносятся один в один; MS-SSIM ещё сильнее жмётся к 1.0 на хорошем контенте, поэтому некоторые конвейеры приводят его в децибельной форме 10·log₁₀(1/(1−MS-SSIM)), чтобы растянуть тесный верх, ровно как для SSIM. Наш пример 0.975 – это около 16 дБ в той форме.

MS-SSIM vs SSIM vs VMAF: когда что брать

MS-SSIM стоит между обычным SSIM и обученными на восприятии метриками. Быстрейший способ удержать три структурно-перцептивные метрики в голове – поставить их рядом, со столбцами, которые реально важны: что каждая измеряет и где каждая врёт.

МетрикаШкалаЧто измеряетГде врёт (слепая зона)Лучше всего для
SSIM0–1Структура на одной шкале: яркость, контраст, структураОдно условие просмотра; только luma, покадрово; насыщается у 1Быстрая проверка структуры; покадровые карты качества
MS-SSIM0–1Структура на пяти шкалах, взвешенная под глазПо-прежнему только luma и покадрово; игнорирует движение; читается выше SSIMСравнение кодеков/кодирований, устойчивое к размеру экрана
VMAF0–100Слитое, обученное на восприятии качество (зависит от модели)Бессмысленно без названной модели; обманывается резкостьюПредсказание воспринимаемого стримингового качества

Таблица 3. Три метрики с одного взгляда. MS-SSIM – многошкальное улучшение SSIM; VMAF – обученный, перцептивный шаг за пределы обеих. Выбирайте строку под задачу – и всегда называйте условия: инструмент и версию для SSIM/MS-SSIM, модель для VMAF.

Рисунок 3. SSIM, MS-SSIM и VMAF в сравнении. MS-SSIM закрывает одношкальную слепую зону SSIM; VMAF учится прямо на человеческих оценках. Каждая – лучший прокси, чем предыдущая, и каждая где-то всё ещё врёт.

Прогрессию стоит сказать прямо, потому что она говорит, когда что использовать. PSNR измеряет пиксельную ошибку. SSIM измеряет структуру на одной шкале. MS-SSIM измеряет структуру по шкалам, поэтому устойчивее, когда размер экрана или дистанция просмотра не фиксированы, – потому оно и есть объективная метрика по умолчанию в большинстве публикуемых сравнений кодеков. VMAF учит модель качества прямо на человеческих оценках и обычно коррелирует лучше всех – ценой необходимости называть свою модель. Для выбора метрики под конкретную задачу гид по решению – как выбрать правильную метрику; версия всех «на один экран» для оператора кодировщика живёт в статье метрики качества раздела Video Encoding, на которую этот глубокий разбор ссылается, а не повторяет её.

Как вычислить MS-SSIM с помощью FFmpeg

Вот первая ловушка, и она кусает сразу. Встроенный фильтр ssim у FFmpeg – только одношкальный: он не вычисляет MS-SSIM, какие опции ни задавай. MS-SSIM в мире FFmpeg приходит из libvmaf, который сообщает фичу float_ms_ssim рядом с оценкой VMAF. Нужен современный FFmpeg (5.1 или новее), собранный с --enable-libvmaf:

# MS-SSIM через libvmaf. Сначала искажённый, затем опорный.
# libvmaf сообщает float_ms_ssim покадрово и пулингом, в JSON-логе.
ffmpeg -i distorted.mp4 -i reference.mp4 \
  -lavfi libvmaf="feature=name=float_ms_ssim:log_path=out.json:log_fmt=json" \
  -f null -

Затем читайте поля float_ms_ssim из out.json. Одна особенность, которую стоит знать: libvmaf всегда вычисляет и оценку VMAF тоже, так что быстрого пути «только MS-SSIM» через FFmpeg нет – если нужен лишь MS-SSIM, вы всё равно платите за VMAF. Выделенные инструменты идут другим путём: standalone-CLI vmaf от Netflix выдаёт ту же фичу float_ms_ssim, а инструмент MSU VQMT вычисляет MS-SSIM напрямую. Полный рабочий процесс FFmpeg-плюс-libvmaf, с выбором модели и разбором лога, разобран в статье измерение качества с FFmpeg и libvmaf.

Чтобы пятишкальная машина стала осязаемой прямо на рабочем столе, мы собрали небольшой скрипт с минимумом зависимостей, который вычисляет MS-SSIM между двумя файлами изображений или кадров с нуля – члены cs по шкалам, член яркости на самой грубой шкале, откалиброванные веса и итоговое взвешенное произведение, печатая каждую шкалу, чтобы вы видели, как оценка собирается ровно как в Таблице 2. Скачайте MS-SSIM-калькулятор «с нуля» (Python) и запустите его на своих кадрах или используйте режим --demo, чтобы увидеть случай с мелкозернистым шумом.

Ловушка минимального размера

Вторая ловушка следует прямо из пирамиды. Поскольку MS-SSIM уменьшает изображение четыре раза – в 16 раз – и всё ещё требует окно 11×11 на самой грубой шкале, короткая сторона кадра должна быть не менее примерно 176 пикселей (реализации немного различаются; некоторые опускаются примерно до 161). Подайте MS-SSIM миниатюру, маленький кроп или сильно залетербоксенную область уже этого порога – и самая грубая шкала станет меньше окна, а метрика либо не определена, либо тихо откатывается к меньшему числу шкал. Это реальная проблема при измерении крошечных UI-миниатюр или спрайтов и не-проблема для любого нормального видеоразрешения. Скрипт-компаньон обрабатывает это явно: ниже порога он уменьшает число шкал и перенормирует веса и говорит вам, что так сделал.

Где MS-SSIM всё ещё врёт

MS-SSIM – лучший перцептивный прокси, чем одношкальное SSIM, но не идеальный. Назвать его слепые зоны – цена честного использования, и несколько из них он наследует прямо у SSIM.

Во-первых, на практике оно всё ещё только по luma. Большинство конвейеров считают MS-SSIM по каналу яркости и игнорируют цвет, так что артефакт только в chroma – растекание цвета, проблема субдискретизации chroma – может оставить оценку почти нетронутой, хотя картинка явно выглядит неверно. Многошкальная механика ничего тут не меняет; если вопрос в цвете, MS-SSIM по luma его не поймает.

Во-вторых, оно пространственное и покадровое. MS-SSIM оценивает каждый кадр по отдельности, поэтому слепо к временным проблемам – джиттеру, мерцанию, рывку в движении, – которые существуют лишь между кадрами. Видео, прекрасно набирающее кадр за кадром, всё равно может играть плохо. Многошкальность чинит слепую зону пространственной шкалы, а не ось времени.

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

В-четвёртых, его можно обмануть. Кодировщик, настроенный на максимизацию MS-SSIM – многие поддерживают режимы вроде --tune ssim, – может научиться угождать метрике способами, не угождающими глазу, например сохраняя ровно ту мид-масштабную структуру, которую веса вознаграждают, и давая просесть остальному качеству. Метрика, используемая как цель оптимизации, перестаёт быть честным судьёй этой цели. Заметьте также, что популярные кодировщики AV1 (libaom, SVT-AV1) по умолчанию настраиваются под PSNR, а не MS-SSIM, так что выбор тюнинга в бенчмарке меняет его результаты.

В-пятых, оценка зависит от реализации. Как нет единого SSIM, так нет и единого MS-SSIM: низкочастотный фильтр, правило даунсэмплинга и окно различаются между libvmaf, эталонным кодом MATLAB и портами библиотек. Тот же клип даёт слегка разные числа MS-SSIM от разных инструментов. Правило строгое – сравнивайте только MS-SSIM, вычисленное одним инструментом, одной версией и одними настройками, и называйте их в отчёте («libvmaf 3.x float_ms_ssim», а не просто «MS-SSIM 0.98»). Где каждая объективная метрика вводит в заблуждение, контент за контентом, каталогизировано в статье где врут объективные метрики.

Частые ошибки с MS-SSIM

«Ошибка: сравнивать число MS-SSIM с числом одношкального SSIM. MS-SSIM читается систематически выше, потому что грубые шкалы тянут взвешенное произведение вверх. Это разные метрики на разных эффективных диапазонах – никогда не ставьте их в один столбец или тренд.»
«Ошибка: ждать MS-SSIM от фильтра ssim у FFmpeg. Он только одношкальный. MS-SSIM приходит из libvmaf как фича float_ms_ssim (FFmpeg ≥ 5.1), либо из VQMT, либо из standalone-инструмента vmaf.»
«Ошибка: запускать MS-SSIM на кадрах меньше ~176 px по короткой стороне. Четыре уменьшения плюс окно 11×11 исчерпывают пиксели; метрика не определена или тихо роняет шкалы. Проверьте разрешение, прежде чем доверять числу.»
«Ошибка: считать MS-SSIM истиной в последней инстанции. Как любая объективная метрика, это прокси, валидированный против человеческих Mean Opinion Scores по статистикам из ITU-T P.1401 (корреляция Пирсона и Спирмена, RMSE). Когда MS-SSIM и аккуратный субъективный тест расходятся, побеждает глаз, а метрика провалилась на этом контенте.»

Где здесь Фора Софт

Фора Софт делает видеософт с 2005 года – стриминг, WebRTC-конференции, OTT, e-learning, телемедицину и видеонаблюдение – и MS-SSIM – это структурная метрика, к которой мы тянемся, когда кодирование должно держаться на всём диапазоне экранов, на которых наши пользователи реально смотрят, от телефона до дисплея переговорной. Мы используем её там, где она сильна: как устойчивую к размеру экрана объективную проверку в сравнении кодеков или per-title, с названным инструментом и версией на каждом числе. Мы строги к её пределам – никогда не сравниваем её с одношкальным SSIM, следим за порогом минимального разрешения и переходим к VMAF с названной моделью, когда вопрос «как хорошо это выглядит для стримингового зрителя». Наша методология бенчмарков фиксирует, какая метрика дала каждое число и почему именно она была правильной для того сравнения.

Ключевые выводы

  • MS-SSIM измеряет структуру на пяти размерах изображения, а не на одном, потому что правильная шкала зависит от размера экрана и дистанции просмотра.
  • Оно низкочастотно фильтрует и уменьшает в 2 раза четыре раза; контраст и структура на каждой шкале, яркость только на самой грубой.
  • Пять откалиброванных весов смешивают шкалы; средние шкалы несут ≈ 82%, самая мелкая лишь ≈ 4.5%, повторяя глаз.
  • Оно читается выше одношкального SSIM на том же контенте – никогда не сравнивайте эти два числа напрямую.
  • Фильтр ssim у FFmpeg одношкальный; MS-SSIM приходит из libvmaf как float_ms_ssim. Кадрам нужен минимум ~176 px.
  • По-прежнему только luma, покадрово, насыщается, обманывается и зависит от реализации – называйте слепую зону под ваш контент.

Что почитать дальше

Строите такую систему?

Подберём параметры кодирования под ваш контент и посчитаем стоимость доставки до старта разработки.