VMAF в деталях: модели, 4K и доверительные интервалы

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

Кратко

Оценка VMAF становится числом, на котором можно строить решения, только когда вы зафиксировали четыре вещи, которые голое значение прячет: какая модель его выдала, какое условие просмотра эта модель предполагает, как покадровые оценки свели в одно число (пулинг) и насколько широка планка погрешности вокруг него. Вопрос модели – самый важный: модель default (1080p), модель phone и модель 4K дают разные, одинаково корректные оценки для одного и того же энкода, потому что каждая предсказывает свой экран и своё расстояние просмотра, – поэтому сравнение валидно, только когда все числа посчитаны одной моделью. VMAF умеет сообщать 95%-й доверительный интервал через свои bootstrap-модели – это честный способ отличить реальную разницу качества от шума измерения, – а метод пулинга (среднее арифметическое, гармоническое среднее или нижний перцентиль) решает, всплывёт ли одна развалившаяся секунда или утонет в среднем. Эта статья – практическое продолжение VMAF простыми словами: она показывает, как выбрать правильную модель, прочитать планку погрешности, свести покадровые оценки, не обманув себя, и привести оценку VMAF так, чтобы ей мог доверять другой инженер.

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

Большинство команд внедряют VMAF, запускают libvmaf и приводят единственное напечатанное число – среднее модели default без планки погрешности – так, будто это и есть «качество». Привычка порождает три дорогие ошибки: сравнить оценку модели phone с оценкой модели default и сделать вывод, что победил не тот кодировщик; принять разницу меньше пункта за реальный выигрыш, хотя она внутри шума измерения; и выпустить энкод, у которого среднее выглядит хорошо, пока три секунды в нём разваливаются. Эта статья – для видеоинженера, лида по кодированию или QA-инженера, который уже знает, что такое VMAF, и теперь должен использовать его, чтобы принимать реальные решения по битрейту, кодировщикам и релизам. Это глубокий, операционный слой под коротким обзором метрик качества на стороне кодирования, и она предполагает, что вы сначала прочитали VMAF простыми словами.

Четыре вещи, которые оценка VMAF сама по себе не говорит

Начнём с центральной мысли всей статьи. Голое число – «VMAF 93» – это ещё не утверждение о качестве, потому что один и тот же энкод может честно выдать несколько разных значений VMAF в зависимости от выборов, которые само число не фиксирует. Сильнее всего влияют четыре выбора, и каждый меняет оценку:

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

Статья берёт первые три по очереди (четвёртое, выравнивание apples-to-apples, разобрано в как читать отчёт о качестве). Дисциплина, к которой они сводятся, проста на словах и трудна на деле: никогда не приводите оценку VMAF без её модели, её пулинга и – когда разница близка – её доверительного интервала. Заведите эту привычку – и VMAF становится надёжным инструментом. Пропустите её – и VMAF превращается в число, которое подтверждает всё, на что вы надеялись.

Рисунок 1. Один и тот же энкод может выдать несколько честных чисел VMAF. Четыре выбора, которые голая оценка прячет, – модель, пулинг, доверительный интервал и выравнивание – каждый из них её меняет.

Модели: один энкод, три корректные оценки

VMAF – это не один предсказатель. Это семейство обученных моделей, каждая подогнана под человеческие оценки, собранные в конкретном условии просмотра – при конкретном размере экрана и конкретном расстоянии от глаза зрителя. Поскольку одно и то же повреждение от сжатия заметно по-разному в зависимости от того, насколько велика картинка и насколько близко вы сидите, каждая модель отображает один и тот же энкод в свою оценку – и каждая корректна для своего условия.

Связующая величина здесь – высота экрана, обозначаемая «H»: расстояние просмотра, выраженное как кратное физической высоты дисплея. Сидеть «на 3H» – значит, что ваш глаз удалён от панели на три высоты экрана. Чем дальше вы сидите в высотах экрана, тем меньше мелких деталей различает глаз и тем терпимее он к сжатию. Эта единственная идея объясняет всю линейку моделей.

Модель default – 1080p TV на 3H

Модель default, файл vmaf_v0.6.1.json, предсказывает качество для 1080p HDTV в условиях гостиной, при этом искажённое видео масштабируется до 1080 и смотрится с расстояния в три высоты экрана (документация моделей VMAF от Netflix, обращение 2026-06-23). Выбор 3H не случаен: это расстояние, на котором зритель как раз начинает ценить резкость, которую даёт 1080p, согласно ITU-R BT.2022. Эту модель вы получаете, если не назвали никакой модели вовсе, и она – правильный default для стриминга на ноутбук и телевизор. Её обучающие данные – клипы из каталога Netflix по десять секунд, оценённые по непрерывной шкале от «плохо» до «отлично» методом Absolute Category Rating из ITU-T P.910, где «плохо» отображается примерно в 20, а «отлично» – в 100.

Модель phone – маленький экран даёт выше

Модель phone предсказывает качество на смартфоне. В исходном поколении v0 это не отдельный файл, а преобразование, применяемое к модели default и включаемое флагом --phone-model (или эквивалентной опцией модели в libvmaf); сам субъективный тест проводили на Samsung S5 с разрешением 1080p, и каждый зритель держал телефон на комфортном для себя расстоянии (документация моделей VMAF от Netflix, обращение 2026-06-23). Определяющий факт о модели phone в том, что она даёт для того же энкода более высокие оценки, чем default. Причина – та же геометрия: телефон мал и держится сравнительно далеко в высотах экрана, поэтому тот же артефакт сжатия просто менее заметен, и как только воспринимаемое качество на телефоне достигает 100, лишний битрейт не покупает улучшения, которое зритель смог бы увидеть. Энкод, набирающий 88 на модели default, может оказаться в районе середины 90-х на модели phone – и оба числа верны, для своих экранов.

Модель 4K – большой экран, смотрят близко

Модель 4K, vmaf_4k_v0.6.1.json, добавленная в июне 2018, предсказывает качество на 4K-телевизоре, который смотрят с расстояния в 1.5 высоты экрана (документация моделей VMAF от Netflix, обращение 2026-06-23). Близкое расстояние 1.5H – это точка, в которой зритель действительно различает детали 4K; сядьте дальше – и 4K с 1080p выглядят одинаково. Поскольку зритель близок к большой панели высокого разрешения, это условие – самое требовательное из трёх, и оно – правильная модель только тогда, когда вы по-настоящему доставляете и измеряете 4K для близкого просмотра.

Когда какая модель корректна

Правило выбора – «подберите модель под то, где зритель на самом деле смотрит», а сравнение валидно, только когда каждый энкод в нём посчитан одной и той же моделью, одним инструментом и одной версией. Выбирайте по доминирующему условию просмотра вашей аудитории: модель default – для стриминга на ноутбук и телевизор, модель phone – когда вы оптимизируете мобильную лестницу битрейтов и хотите учесть меньшую заметность артефактов на смартфоне, и модель 4K – только для настоящего близкого 4K. Ошибка – никогда не «использование модели phone», а её смешивание с другой моделью в одном сравнении или приведение её более высокого числа без указания, что это модель phone.

Модель VMAFУсловие просмотра (экран · расстояние)Оценка того же энкодаКогда это правильная модель
default (vmaf_v0.6.1)экран 1080p · 3H88Стриминг на ноутбук и TV – безопасный default
phone (--phone-model)смартфон · далеко в высотах экрана96 (выше)Мобильные лестницы – учесть меньшую заметность артефактов
4K (vmaf_4k_v0.6.1)4K TV · 1.5H85 (самая строгая)Только для настоящего близкого 4K

Таблица 1. Один энкод набирает по-разному в каждой модели, потому что каждая предсказывает своё условие просмотра. Числа 88 / 96 / 85 иллюстративны; правило – сравнивать только внутри одной модели, посчитанной одним инструментом и версией.

Рисунок 2. Выбирайте модель по тому, где зритель на самом деле смотрит. Оценка сравнима, только когда каждый энкод в сравнении посчитан одной и той же моделью.
Рисунок 3. Почему один энкод набирает по-разному в разных моделях: каждая предсказывает свой размер экрана и своё расстояние просмотра в высотах экрана (H). Меньше-и-дальше прячет артефакты, поэтому оценка phone – самая высокая.

Что поколение v1 2026 года меняет в моделях

Модели v1, которые Netflix выпустил в июне 2026, меняют то, как обрабатывается расстояние просмотра, и это стоит знать, даже если вы пока на v0. Вместо того чтобы пристёгивать отдельные модели phone и 4K к default постфактум, v1 встраивает нормированное расстояние просмотра прямо в расчёт признаков, а затем обучает одну согласованную модель, которую переприменяют для условия phone (заданного на 5H), для 4K на 1.5H и для потребительского условия 4K-на-3H (Netflix Technology Blog, «VMAF v1: Good Is Not Good Enough», июнь 2026). Модель 4K-на-3H использует расширенный диапазон [0, 110] вместо [0, 100], чтобы количественно выразить дополнительную пользу 4K над 1080p, когда оба смотрят с одного расстояния. Практический вывод неизменен: называйте модель и условие. Если вы стартуете с нуля в 2026 – оценивайте v1; если у вас есть история чисел v0 – не смешивайте v0 и v1 в одном сравнении, пересчитайте базу. Полные изменения признаков v1 разобраны в VMAF простыми словами.

Доверительные интервалы: VMAF даёт вам планки погрешности

Вот факт, на который большинство пользователей VMAF никогда не реагируют: метрика умеет говорить, насколько доверять собственному числу. Поскольку каждая модель VMAF подогнана под выборку человеческих мнений – а не под всю совокупность всех зрителей, которые когда-либо могли бы посмотреть, – её предсказание несёт статистическую неопределённость, и Netflix поставляет способ её измерить (документация доверительного интервала VMAF от Netflix, начиная с v1.3.7, июнь 2018).

Что такое «бутстрэп» простыми словами

Метод называется бутстрэп (bootstrapping), и идея проще названия. Представьте, что вы могли бы переобучить VMAF много раз, каждый раз на чуть иной перетасовке тех же данных человеческих оценок, отбирая оценки случайно с повторами. Каждая перетасовка даёт чуть иную обученную модель, и каждая модель даёт чуть иную оценку для вашего клипа. Если все эти оценки лежат плотно – предсказание уверенное; если разбросаны – шаткое. Разброс этих многих предсказаний и есть доверительный интервал (документация доверительного интервала VMAF от Netflix, обращение 2026-06-23). Netflix сделал именно это и поставил результат как bootstrap-модели – например, vmaf_b_v0.6.3 (обычный бутстрэп) и vmaf_rb_v0.6.3 (бутстрэп по остаткам). Документация рекомендует обычный бутстрэп: он даёт чуть бóльшую, более консервативную неопределённость, но несмещён относительно полной модели.

Как его включить и что приходит обратно

Вы включаете это, измеряя bootstrap-моделью. В инструментах командной строки флаг – --ci с bootstrap-моделью; в libvmaf вы ставите enable_conf_interval в 1; самостоятельный исполняемый файл vmaf сам распознаёт bootstrap-модель и не требует дополнительного флага (документация доверительного интервала VMAF от Netflix, обращение 2026-06-23). Обратно приходит уже не одно число, а небольшой набор полей. Вот пример прямо из документации Netflix, для одного клипа:

"BOOTSTRAP_VMAF_score":           75.44   # оценка, которую вы приводите
"BOOTSTRAP_VMAF_bagging_score":   74.96   # среднее bootstrap-моделей
"BOOTSTRAP_VMAF_stddev_score":     1.31   # разброс bootstrap-предсказаний
"BOOTSTRAP_VMAF_ci95_low_score":  72.99   # 2.5-й перцентиль
"BOOTSTRAP_VMAF_ci95_high_score": 77.39   # 97.5-й перцентиль

Читается так. Оценка, которую вы приводите, – 75.44. 95%-й доверительный интервал – [72.99, 77.39] – 2.5-й и 97.5-й перцентили bootstrap-предсказаний, и это не делает никаких допущений о форме распределения. Если вам удобнее упрощение через нормальное распределение, интервал – это оценка плюс-минус 1.96 стандартного отклонения:

95% CI ≈ 75.44 ± 1.96 × 1.31
       = 75.44 ± 2.57
       = [72.87, 78.01]

Оба прочтения говорят одно и то же простыми словами: истинное качество, которое эта модель пытается предсказать, очень вероятно лежит где-то в полосе шириной примерно два с половиной пункта в каждую сторону от 75.4, – а не ровно 75.44. Полезная особенность: доверительные интервалы обычно уже у верха шкалы, чем у низа, потому что обучающие данные VMAF там плотнее, – так что у 95 обычно меньшая планка погрешности, чем у 35 (документация доверительного интервала VMAF от Netflix, обращение 2026-06-23).

Использовать планку погрешности, чтобы решить спор сравнения

Вот где доверительный интервал оправдывает себя. Вспомните разобранный пример из VMAF простыми словами: энкод A на VMAF 95.2, энкод B на 93.4, разрыв в 1.8 пункта, уже ниже примерно 6-пунктовой едва заметной разницы. Теперь добавим планки погрешности. Пусть каждая оценка несёт 95%-й интервал около ±1.3 пункта:

Энкод A: 95.2  →  [93.9, 96.5]
Энкод B: 93.4  →  [92.1, 94.7]

Эти интервалы перекрываются почти по всей ширине. Разрыв в 1.8 пункта между двумя энкодами, чьи планки погрешности перекрываются настолько, – это результат, за который нельзя поручиться: перезапустите на чуть иных кадрах, и порядок может перевернуться. Доверительный интервал превращает «A обгоняет B на 1.8» в честное «A и B статистически неразличимы на этом контенте». Это и есть разница между измерением и подброшенной монеткой, наряженной в десятичную дробь.

Рисунок 4. Bootstrap-модели VMAF дают 95%-ю планку погрешности. Когда интервалы двух энкодов перекрываются настолько, разрыв между их числами – внутри шума, а не реальная разница.

Пулинг: как покадровые оценки становятся одним числом

VMAF считается покадрово. Десятисекундный клип при 24 fps даёт 240 оценок VMAF, по одной на кадр, и единственное число, которое вы приводите, – это сводка из этих 240. То, как вы их сворачиваете, – метод пулинга – может полностью изменить картину, и это шаг, который инженеры чаще всего портят, просто приняв значение по умолчанию.

Опции пулинга в libvmaf – три: среднее арифметическое (по умолчанию), гармоническое среднее и минимум (документация фильтра libvmaf в FFmpeg, обращение 2026-06-23). Разница между ними целиком про то, сколько веса получают худшие кадры.

Разобранный пример: среднее прячет плохие секунды

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

95, 96, 94, 95, 30, 28, 32, 95, 96, 94

Восемь кадров отличные; три в середине развалились. Теперь свернём их четырьмя способами.

Среднее арифметическое складывает их и делит на десять:

(95+96+94+95+30+28+32+95+96+94) / 10 = 755 / 10 = 75.5

Гармоническое среднее делит количество на сумму обратных величин, что математически тянет результат к наименьшим значениям:

10 / (1/95 + 1/96 + 1/94 + 1/95 + 1/30 + 1/28 + 1/32 + 1/95 + 1/96 + 1/94) = 57.5

5-й перцентиль – «плохие куски», уровень, который превосходят 95% кадров, – оказывается около 28.9. Минимум, единственный худший кадр, – 28.

Посмотрите на разброс: один и тот же клип – это «удовлетворительные» 75.5 по среднему арифметическому, «плохие» 57.5 по гармоническому среднему и почти сломанные 29 по показателям худших кадров. В видео ничего не изменилось; изменилась только сводка. Среднее арифметическое позволяет восьми хорошим кадрам перевесить три ужасных – а это ровно неправильное поведение, когда впечатление зрителя от клипа определяется его худшим моментом. Поэтому и существуют гармоническое среднее и пулинг по нижнему перцентилю: они отказываются давать длинному чистому участку спрятать короткую катастрофу.

Какой пулинг использовать

Используйте среднее арифметическое для общей сводки качества на спокойном контенте, где вы не ждёте локальных провалов, и потому что это значение по умолчанию, которое приводят все остальные, – так что это выбор apples-to-apples для сравнения с чужими числами. Используйте гармоническое среднее или нижний перцентиль (5-й или 1-й), когда важны локальные провалы – ворота качества, регрессионный тест или любой per-title-энкод, где один сломанный кадр способен испортить зрителю сессию. Всегда читайте минимум или нижний перцентиль рядом со средним, когда решаете, безопасно ли выпускать энкод; разрыв между средним и 5-м перцентилем – прямая мера того, сколько прячет головное число. Более глубокий разбор пулинга, включая выбор перцентилей и временные модели, – в пулинг: из покадровых оценок в одно число.

Рисунок 5. Одна и та же покадровая трасса, сведённая четырьмя способами. Среднее арифметическое даёт восьми хорошим кадрам похоронить три сломанных; гармоническое среднее и нижние перцентили вытаскивают плохие секунды.

Покадрово против на-клип: читайте трассу, а не только сводку

Пример пулинга указывает на привычку покрупнее: самый полезный взгляд на VMAF – часто покадровая трасса, а не единственное сведённое число. Сведённая оценка отвечает на «насколько хорош этот клип в среднем»; покадровая трасса отвечает на «где именно этот клип ломается» – и именно второй вопрос чинит энкоды.

Когда вы сохраняете покадровый лог, вы можете построить VMAF против времени и увидеть форму качества. Ровная линия около 95 – здоровый энкод. Линия, которая держится высоко, но проваливается на каждой склейке, говорит, что кодировщик морит ключевые кадры битами. Медленное проседание на участке с высоким движением говорит, что потолок битрейта слишком низок для действия. Ничего из этого не переживает сворачивания в одно число; всё это очевидно на трассе. Так же вы локализуете жалобу: зритель говорит «около гола выглядело плохо», вы поднимаете покадровый VMAF для этого отрезка – и провал прямо здесь, с таймкодом.

Практическое правило – всегда писать покадровый лог и хранить его, даже когда вы приводите только сведённую оценку. Сведённое число – для дашборда; покадровая трасса – для инженера, которому придётся объяснить или починить результат. Превращение этой трассы в пространственную картину – теплокарту того, где в кадре упало качество, – тема статьи визуализация качества.

Считаем всё это с FFmpeg и libvmaf

Повседневный путь к каждому числу выше – фильтр libvmaf в FFmpeg, обёртка над библиотекой Netflix. Статья 2.4 покрыла базовый вызов; здесь – как явно задать модель, пулинг, покадровый лог и доверительный интервал. Искажённый клип – первый вход, оригинал – второй, и оба должны совпадать по разрешению и частоте кадров.

# Покадровый лог + явная модель + гармонический пулинг.
# Искажённый — ПЕРВЫЙ вход, оригинал — ВТОРОЙ.
ffmpeg -i distorted.mp4 -i reference.mp4 \
  -lavfi "libvmaf=model='version=vmaf_v0.6.1':pool=harmonic_mean:\
log_path=vmaf.json:log_fmt=json:n_threads=8" \
  -f null -

Три опции делают работу. model='version=vmaf_v0.6.1' называет модель явно – подставьте vmaf_v0.6.1neg для сравнения кодировщиков (см. VMAF-NEG) или путь к 4K-модели для близкого 4K. pool=harmonic_mean задаёт пулинг для единственного приводимого значения (варианты – mean, harmonic_mean и min). log_path/log_fmt пишут покадровый JSON, который вы всегда должны хранить. Чтобы получить доверительный интервал, направьте фильтр на bootstrap-модель:

# Доверительный интервал через bootstrap-модель.
# Тогда покадровый лог несёт поля bootstrap CI.
ffmpeg -i distorted.mp4 -i reference.mp4 \
  -lavfi "libvmaf=model='version=vmaf_b_v0.6.3':\
log_path=vmaf_ci.json:log_fmt=json" \
  -f null -

Одна реальная предосторожность: между версиями FFmpeg и libvmaf флаг pool внутри фильтра не всегда менял агрегат так, как ждут пользователи, и логика пулинга переезжала между библиотекой и фильтром. Надёжная привычка – и та, что использует наш скрипт ниже, – писать покадровый лог и сворачивать его самому в коде, чтобы число не зависело от того, какую сборку фильтра вы запустили. Полный рабочий процесс FFmpeg-и-libvmaf живёт в измерение качества с FFmpeg и libvmaf; краткая справка на стороне кодирования – FFmpeg cheat sheet в разделе Video Encoding.

Чтобы сделать это осязаемым у вас на столе, мы собрали небольшой, нетребовательный к зависимостям скрипт: он читает JSON-лог libvmaf (с полями bootstrap CI или без них), затем приводит оценку, свёрнутую четырьмя способами – среднее, гармоническое среднее, 5-й перцентиль и единственный худший кадр, – рядом с доверительным интервалом, когда он есть, и вердиктом значимости для разрыва между двумя клипами, прочитанным по перекрытию планок погрешности и по примерно 6-пунктовой едва заметной разнице. Скачать анализатор моделей, пулинга и доверительного интервала VMAF (Python) и запустить его на своих логах.

Частые ошибки с моделями, пулингом и доверительными интервалами VMAF

«Ошибка: сравнивать оценки из разных моделей. 96 модели phone и 88 модели default описывают один и тот же энкод на двух разных экранах. Выстраивать их так, будто энкод phone «победил», – это сравнивать два разных вопроса. Каждое число в сравнении должно использовать одну и ту же модель, инструмент и версию.»
«Ошибка: принимать разрыв внутри интервала за реальную разницу. Если 95%-е доверительные интервалы двух энкодов перекрываются, разрыв между их числами – внутри шума измерения. Приводите интервал, а не только точку, всякий раз, когда решение опирается на малую разницу.»
«Ошибка: принимать среднее по умолчанию на склонном к провалам контенте. Среднее арифметическое даёт длинному чистому участку спрятать короткую сломанную вставку. Для ворот качества и регрессионных тестов сворачивайте гармоническим средним или нижним перцентилем и всегда читайте минимум рядом со средним.»
«Ошибка: выбрасывать покадровый лог. Сведённое число не скажет вам, где клип ломается. Всегда пишите и храните покадровую трассу; это единственный артефакт, который привязывает падение качества к таймкоду.»
«Ошибка: приводить VMAF до двух знаков, будто он точен. Модель, обученная на конечной человеческой выборке, предсказывает полосу, а не точку. «VMAF 93.42» подразумевает точность, которой у метрики нет; «VMAF 93.4, default v0.6.1, mean pooling, 95% CI ±1.3» – честный отчёт.»

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

Фора Софт строит видеософт с 2005 года – стриминг, WebRTC-конференции, OTT, e-learning, телемедицина и видеонаблюдение – и то, как мы приводим VMAF, и есть то, что описывает эта статья. Когда мы настраиваем лестницу битрейтов под аудиторию с преобладанием мобильных, мы измеряем моделью phone и говорим об этом; когда задаём ворота релиза – сворачиваем нижним перцентилем, чтобы один сломанный кадр не прошёл; а когда разница между двумя кодировщиками мала – приводим доверительный интервал, а не коронуем победителя, которого планки погрешности не поддерживают. Мы храним покадровую трассу для каждого измеренного клипа, потому что на жалобу о качестве отвечают провалом с таймкодом, а не пожатием плеч. Наша методология бенчмарков фиксирует точную модель, пулинг и интервал за каждой публикуемой нами цифрой VMAF, чтобы числа были воспроизводимыми, а не декоративными.

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

  • Оценке VMAF нужна названная модель – default, phone и 4K дают разные корректные числа.
  • Подбирайте модель под то, где смотрит зритель; никогда не смешивайте модели в одном сравнении.
  • Модель phone даёт более высокие оценки, потому что маленький далёкий экран прячет артефакты.
  • Bootstrap-модели VMAF дают 95%-й доверительный интервал – используйте его, чтобы проверять малые разрывы.
  • Выбор пулинга важен: среднее прячет плохие секунды, которые гармоническое среднее и перцентили вытаскивают.
  • Всегда храните покадровую трассу; она локализует, где клип ломается, чего сводка не может.

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

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

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