Содержание статьи +
- Кратко
- Почему это важно
- Особенность, делающая VMAF особенным, – его же слабое место
- Насколько велика проблема, в реальных числах
- Что NEG на самом деле меняет внутри метрики
- Разобранное сравнение: те же энкоды, двумя способами
- Когда сообщать NEG, а когда – default
- Как вычислить VMAF-NEG с помощью FFmpeg и libvmaf
- NEG – это ограничитель, а не лекарство: остаточная слепая зона
- Частые ошибки с VMAF-NEG
- Где здесь Фора Софт
- Ключевые выводы
- Что почитать дальше
Кратко
VMAF вознаграждает улучшение изображения – повышение резкости, контраста, выравнивание гистограммы, – и эту награду можно получить ещё до того, как сжат хотя бы один бит, поэтому трюк на этапе препроцессинга способен завысить оценку VMAF, не сделав видео лучше для зрителя, а иногда – сделав его хуже. VMAF-NEG, где NEG означает «no enhancement gain» (без выигрыша от улучшения), – это вариант модели от Netflix, который ограничивает эту награду на уровне признаков: искажённый кадр не получает кредита за то, что выглядит контрастнее или резче оригинала, – только за совпадение с ним. Рекомендация самого Netflix – использовать NEG для сравнения кодеков и кодировщиков, где нужен выигрыш от одного только сжатия, и модель default, когда вы хотите засчитать улучшение как часть доставленного зрителю результата. Статья показывает проблему «накрутки» на реальных числах (один приём поднял оценку VMAF до 144 по шкале 0–100), объясняет, что именно NEG меняет внутри признаков VIF и потери детали, и говорит, когда сообщать NEG вместо стандартной модели.
Почему это важно
Если вы сравниваете два кодировщика, два кодека или две цепочки препроцессинга по VMAF, стандартная модель может отдать победу тому конвейеру, который сильнее «шарпит», – а не тому, который лучше сжимает. Это прямой путь выбрать не тот кодек, заплатить за не тот кодировщик или выкатить фильтр резкости, который радует метрику и раздражает зрителя. Статья – для видеоинженера, лида по кодированию или QA-инженера, кто гоняет сравнения кодеков и ворота качества и кому нужно, чтобы число отражало сжатие, а не косметику. Она предполагает, что вы прочли VMAF простыми словами, и строится прямо на дисциплине модели и пулинга из VMAF в деталях; короткая версия метрики на стороне кодировщика – в обзоре метрик качества раздела Video Encoding.
Особенность, делающая VMAF особенным, – его же слабое место
Начнём с того, чем VMAF отличается от метрик-предшественниц. Старейшая метрика – та, что сравнивает сжатый кадр с оригиналом пиксель за пикселем и сообщает ошибку в децибелах, называется PSNR (Peak Signal-to-Noise Ratio), – всегда только падает, когда вы меняете картинку: любое отклонение от оригинала считается уроном. В целом то же верно и для метрики, сравнивающей структуру двух кадров, – SSIM (Structural Similarity). VMAF – Video Multimethod Assessment Fusion, перцептивная оценка Netflix по шкале 0–100, обученная машинным обучением, – делает то, чего не делает ни одна из них: он может зарегистрировать улучшение. Если обработка делает картинку чётче или сочнее для человеческого глаза, VMAF может оценить её выше, потому что часть признаков, на которых он обучался, реагирует положительно на добавленные контраст и детали.
Эта способность по-настоящему полезна. Хороший шаг препроцессинга – например, мягкая резкость, восстанавливающая детали, смягчённые масштабированием, – действительно улучшает то, что видит зритель, и VMAF может засчитать это там, где PSNR и SSIM лишь наказали бы за изменение. Netflix заложил это намеренно, и отчасти поэтому VMAF предсказывает мнение человека лучше старых метрик.
Проблема в том, что та же дверь открывается в обе стороны. Раз VMAF вознаграждает добавленные контраст и резкость, поднять оценку VMAF можно, добавляя контраст и резкость, помогает это зрителю или нет, – и сделать это можно в препроцессинге, до запуска кодировщика, так что «выигрыш» вообще никак не связан с тем, насколько хорошо кодек что-то сжал. Когда улучшение перестарались, оно может активно портить картинку – ореолы у краёв, выбитые света, – пока число VMAF растёт. Метрика, которую можно сдвинуть, не улучшая качества, – это метрика, которую можно обмануть, а в сравнениях кодеков, где на доле пункта BD-rate висят карьеры и решения о закупке, обманываемая метрика – реальная уязвимость.
Насколько велика проблема, в реальных числах
Это не теоретическое опасение; его показали на числах, с которыми трудно спорить. В техническом отчёте 2020 года руководитель VMAF в Netflix Чжи Ли (Zhi Li) прогнал обычные операции улучшения по исходному клипу и измерил оценку default VMAF до и после (по материалам Jan Ozer, Streaming Learning Center, июль 2020, со ссылкой на меморандум Ли в Netflix).
Одна только резкость подняла оценку VMAF примерно до 112. Выравнивание гистограммы – операция растяжения контраста – подняло её примерно до 144. Оба числа – на шкале, максимум которой должен быть 100. Оценка выше 100 – это красный флаг от самой метрики: она измеряет уже не «насколько близко к оригиналу», а «насколько больше контраста, чем у оригинала», что для метрики верности – другая и по сути бессмысленная величина.
Случай со сравнением кодеков – тот, что должен встревожить команду кодирования. Эталонный кодировщик AV1, libaom, поставляет режим tune=vmaf, который улучшает свою оценку VMAF в основном за счёт резкости каждого кадра перед сжатием (Netflix Technology Blog, декабрь 2020; libaom). В измерениях Ли энкод AV1 с tune=vmaf набрал около 105 против 95,1 у базового энкода – кажущийся скачок качества на 10 пунктов, который по большей части есть фильтр резкости, а не лучшее сжатие. Если бы вы сравнивали AV1 с другим кодеком по default VMAF, этих 10 пунктов хватило бы, чтобы короновать не того победителя.
Решение, которое выпустил Netflix, – это VMAF-NEG. С отключённым выигрышем от улучшения те же «накрученные» энкоды набирают на уровне базового или ниже, потому что резкость больше не приносит кредита. Цена есть, и её стоит назвать прямо: отключение выигрыша от улучшения слегка снижает каждую оценку – Netflix сообщает, что абсолютный VMAF «обычно падает на 1–3 пункта» даже на неулучшенном контенте, – потому что модель default почти везде даёт немного кредита за улучшение. NEG меняет небольшой равномерный сдвиг вниз на число, которое нельзя завысить фильтром.
Что NEG на самом деле меняет внутри метрики
Чтобы понять исправление, нужно быстро заглянуть VMAF под капот. VMAF не измеряет качество напрямую; он вычисляет на каждом кадре горсть более простых «элементарных признаков» и подаёт их в обученную модель – регрессор на опорных векторах (SVR), – которая сводит их в итоговую оценку 0–100 (Netflix Technology Blog, июнь 2016). Работу делают три семейства признаков: мера того, сколько информации картинки уцелело, называется VIF (Visual Information Fidelity); мера того, сколько детали потеряно, называется DLM (Detail Loss Metric, в коде реализована как ADM, Additive Distortion Measure); и признак движения, отслеживающий покадровое изменение.
Два из этих признаков – VIF и признак потери детали – те самые, что переусердствуют в ответ на улучшение (Чжи Ли, меморандум Netflix, 2020). Когда резкость добавляет локальный контраст, оба признака могут сообщить значение, говорящее, что искажённый кадр несёт больше информации или больше детали, чем оригинал. В своей форме по умолчанию они пропускают этот излишек как бонус, и сведённая оценка поднимается выше того, что дала бы одна верность. Поскольку «барахлят» оба признака, исправлять надо оба – починка только одного оставит другой завышать оценку.
NEG исправляет их ограничителем под названием лимит выигрыша от улучшения (enhancement-gain limit). Идея в одном предложении: признак может сообщить, что искажённый кадр совпадает с оригиналом, но никогда – что он его превосходит. Конкретно: каждый признак вычисляет отношение энергии искажённого к опорному; NEG зажимает это отношение на 1,0 – точке паритета (документация VMAF от Netflix; командные параметры – vif_enhn_gain_limit=1.0 и adm_enhn_gain_limit=1.0). Ниже паритета – где искажённый кадр потерял информацию или деталь – признак ведёт себя ровно как раньше и фиксирует потерю. На паритете и выше – где улучшение протолкнуло искажённый кадр за оригинал – признак приколот к «равно». Метрика перестаёт платить за избыток контраста, и трюк с резкостью не зарабатывает ничего.
Эффект легче всего увидеть как кривую. Представьте кредит признака по вертикальной оси и то, насколько искажённый кадр резче-или-контрастнее оригинала, – по горизонтальной. До паритета модель default и NEG совпадают в точности. За паритетом модель default продолжает расти – вознаграждая избыток, – а NEG идёт ровно, зажатая на значении паритета. Всё левее паритета, где живёт честное сжатие (оно убирает информацию, а не добавляет её), не тронуто. NEG – это односторонний ограничитель, который срабатывает только когда кадр заявляет, что он лучше источника.
Разобранное сравнение: те же энкоды, двумя способами
Сведём числа выше в одну таблицу. Колонка «default» – стандартная модель VMAF; колонка «NEG» – тот же контент с отключённым выигрышем от улучшения. Закономерность и есть весь аргумент в пользу NEG.
| Энкод | VMAF (default) | VMAF-NEG | О чём говорит зазор |
|---|---|---|---|
| Базовый (без улучшения) | 95,1 | ~93 | NEG везде сидит на 1–3 пункта ниже |
| AV1 с резкостью tune=vmaf | ~105 | ниже ~93 | те +10 были резкостью, не сжатием |
| Источник + сильная резкость | ~112 | ниже базового | оценка выше 100 – флаг «накрутки» |
| Источник + выравнивание гистограммы | ~144 | сильно ниже базового | невозможно на шкале верности 0–100 |
Прочтите строки. На модели default «выигрывает» каждое улучшение, и клип с выровненной гистограммой выглядит лучшим из всех при VMAF 144 – что есть бессмыслица, ведь метрика верности не может честно превысить 100. На NEG ранжирование переворачивается под реальность: неулучшенный базовый энкод вернее всех источнику, а каждая улучшенная версия набирает меньше, потому что каждая отошла от оригинала. Самый полезный диагностический показатель здесь – зазор между оценками default и NEG. Маленький зазор (пункт-другой) означает, что улучшения почти нет. Большой зазор означает, что число default едет на улучшении, и доверять ему в сравнении сжатия нельзя.
Когда сообщать NEG, а когда – default
NEG – это не «правильный VMAF», заменяющий default везде. Они отвечают на разные вопросы, и Netflix прямо говорит, какой использовать (Netflix Technology Blog, декабрь 2020).
Используйте NEG для оценки кодеков и кодировщиков – всюду, где вам нужен выигрыш качества, относимый к одному только сжатию, с вынесенным за скобки препроцессингом. Сравнения кодеков (бьёт ли AV1 HEVC на этом контенте?), сравнения кодировщиков (бьёт ли эта сборка x265 прошлую?) и любой тест, где одна сторона может применить резкость, – ровно те случаи, под которые построили NEG. Это и честный выбор для любого публичного бенчмарка, потому что он убирает простейший способ положить палец на весы. Сам Netflix использует VMAF-NEG как одну из метрик при разработке кодеков, включая кодек следующего поколения AV2 (Netflix Technology Blog, июнь 2026).
Используйте модель default, когда улучшение действительно часть доставляемого опыта и вы хотите его засчитать. Если ваш продакшен-конвейер намеренно применяет настроенную резкость или шаг восстановления детали и вам нужно число, отражающее то, что зритель реально видит, – с учётом улучшения, – правильна модель default. Повседневная настройка кодировщика, где вы крутите один кодировщик против самого себя и не пытаетесь отделить сжатие от препроцессинга, тоже нормально идёт на модели default. Правило большого пальца: если кто-то в сравнении мог бы выиграть от резкости картинки – сообщайте NEG; если вы измеряете доставленный опыт целиком – сообщайте default, и в любом случае называйте, какой режим вы взяли.
Как вычислить VMAF-NEG с помощью FFmpeg и libvmaf
Практический путь – тот же фильтр libvmaf, что вы уже используете для VMAF, направленный на модель NEG. Файлы моделей NEG – те, чьи имена кончаются на neg; для условия default 1080p это vmaf_v0.6.1neg, и они поставляются в libvmaf с версии 2.0.0 (документация VMAF от Netflix; документация фильтра libvmaf в FFmpeg). Искажённый клип – первый вход, опорный – второй, и эти два должны совпадать по разрешению и частоте кадров.
# Оценка моделью NEG (выигрыш от улучшения отключён).
# Искажённый — ПЕРВЫЙ вход, опорный — ВТОРОЙ.
ffmpeg -i distorted.mp4 -i reference.mp4 \
-lavfi "libvmaf=model='version=vmaf_v0.6.1neg':\
log_path=vmaf_neg.json:log_fmt=json:n_threads=8" \
-f null -Полезнее всего считать модели default и NEG в одном проходе, чтобы получить оба числа – а значит, и зазор выигрыша от улучшения – бесплатно. Фильтр принимает несколько моделей через вертикальную черту:
# Default И NEG в одном проходе; зазор между ними и есть выигрыш от улучшения.
ffmpeg -i distorted.mp4 -i reference.mp4 \
-lavfi "libvmaf=model='version=vmaf_v0.6.1\:name=vmaf|\
version=vmaf_v0.6.1neg\:name=vmaf_neg':\
log_path=vmaf_both.json:log_fmt=json" \
-f null -На VMAF v1, модели, которую Netflix открыл в июне 2026, отдельная модель NEG вообще не нужна: лимит выигрыша от улучшения встроен и включён по умолчанию, так что v1 из коробки ведёт себя как NEG (Netflix Technology Blog, июнь 2026). Если вы всё ещё на v0 – как большинство инструментов в 2026-м, – модель neg и есть способ получить ту же защиту. Полный рабочий процесс FFmpeg и libvmaf, включая то, как сохранять покадровый лог, – в измерении качества с FFmpeg и libvmaf; контекст tune=vmaf и AV1 на стороне кодировщика – в состоянии AV1 раздела Video Encoding.
Чтобы зазор было легко прочитать, мы собрали небольшой скрипт без тяжёлых зависимостей: он берёт лог libvmaf с оценками default и NEG (или два отдельных лога), сообщает каждую сведённую оценку, считает покадровый и общий зазор выигрыша от улучшения и отмечает любой клип, чей зазор достаточно велик, чтобы заподозрить, что число default едет на улучшении, – плюс любой кадр, набравший выше 100. Скачайте проверщик выигрыша от улучшения VMAF-NEG (Python) и запустите на собственных логах.
NEG – это ограничитель, а не лекарство: остаточная слепая зона
Честность измерения требует назвать, где NEG всё ещё недотягивает, потому что это не силовое поле. NEG убирает лазейку улучшения – кредит за превышение оригинала, – но не делает VMAF неуязвимым к манипуляциям. Независимые исследователи показали, что даже с отключённым выигрышем от улучшения некоторые операции препроцессинга всё ещё могут сдвинуть оценку VMAF-NEG, хотя куда слабее, чем они двигают модель default («Hacking VMAF and VMAF NEG: vulnerability to different preprocessing methods», Siniukov и др., 2021; более ранняя «Hacking VMAF with Video Color and Contrast Distortion», Zvezdakova и др., 2019, намерила примерно 5–6% прироста на модели default от выравнивания гистограммы и нерезкого маскирования).
Есть и оговорка, которую поднял сам Netflix: в обычном режиме VMAF может переоценивать качество, когда чрезмерная резкость на деле портит картинку, и NEG описан как первый шаг к ограничению этого, а не последнее слово (Netflix Technology Blog, декабрь 2020). Честное прочтение: NEG закрывает крупнейшую и простейшую дыру, поэтому ему место в каждом сравнении кодеков, – но он не отменяет старейшего правила этой области: когда решение важно, сверьте метрику с правильно проведённым субъективным тестом, потому что глаз – это истина, а любая объективная оценка, включая NEG, – это прокси. Более широкий каталог того, где объективные метрики вводят в заблуждение, – в где объективные метрики врут.
Частые ошибки с VMAF-NEG
«Ошибка: сравнивать кодеки на модели default. Если любой из конвейеров «шарпит», default VMAF вознаграждает резкость, а не сжатие. Используйте NEG для любого сравнения кодеков или кодировщиков и для любого публичного бенчмарка.»
«Ошибка: считать оценку выше 100 «очень хорошей». VMAF выше 100 – это не отличное качество; это флаг «накрутки». Он означает, что улучшение протолкнуло признак за оригинал. Пересчитайте на NEG, прежде чем поверить числу.»
«Ошибка: смешивать оценки default и NEG в одном сравнении. Default 95 и NEG 92 – не одна шкала: NEG везде сидит на 1–3 пункта ниже. Каждое число в сравнении должно быть на одном режиме, модели и версии инструмента.»
«Ошибка: считать, что NEG делает VMAF необманываемым. NEG ограничивает выигрыш от улучшения; он не блокирует любую манипуляцию. Для важных решений сверьтесь с субъективным тестом.»
«Ошибка: настраивать на NEG в повседневке и потом удивляться падению оценок. NEG – для отделения сжатия от улучшения, в основном в сравнениях. Для рутинной настройки одного кодировщика, где вы хотите засчитать доставленный вид, модель default нормальна – просто держитесь одного выбора.»
Где здесь Фора Софт
Фора Софт строит видеософт с 2005 года – стриминг, WebRTC-конференции, OTT, e-learning, телемедицина и видеонаблюдение, – и когда мы сравниваем кодеки или кодировщики для клиента, мы сообщаем VMAF-NEG, а не модель default, чтобы фильтр резкости не решал, какой кодек мы рекомендуем. Мы также сообщаем зазор между оценками default и NEG, потому что этот зазор – быстрый и честный показатель того, сколько в «выигрыше качества» на самом деле препроцессинга. Когда продакшен-конвейер клиента включает намеренный шаг улучшения и они хотят оценить доставленный опыт целиком, мы переключаемся на модель default и говорим об этом. Наша методология бенчмарков фиксирует модель, режим и версию инструмента за каждой цифрой, поэтому наши сравнения кодеков воспроизводимы, а не льстивы.
Ключевые выводы
- VMAF уникально вознаграждает улучшение, поэтому резкость или контраст могут завысить оценку, не помогая зрителю.
- NEG («no enhancement gain») зажимает признаки VIF и потери детали на паритете с оригиналом.
- Накрутка была реальной: резкость дала VMAF 112, выравнивание гистограммы – 144, на шкале 0–100.
- Используйте NEG для сравнения кодеков, кодировщиков и препроцессинга и для любого публичного бенчмарка.
- Используйте модель default, когда засчитываете улучшение как часть доставленного опыта.
- NEG снижает все оценки на ~1–3 пункта и является ограничителем, а не гарантией необманываемости.