Что такое метрики и для чего они нужны

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

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

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

Всех перечисленных случаев можно было бы избежать если бы при выборе битрейта для кодека мы воспользовались некими математическими формулами, которые бы позволили исключить субъективное мнение и позволили бы правильно выбрать подход к кодированию видео. А факторов в кодировании приходится учитывать много, основные это тип кодека, режим кодирования, размер битрейта. В итоге получается, что кодирование это функция нескольких переменных f(x1, x2, x3,…, xn). И чтобы получить наилучшее значение этой функции на нашем видео мы должны руководствоваться некими правилами, которые подскажут нам, как выбрать параметры кодирования x1…,xn чтобы получить максимально близкий к идеальному результат без тыкания пальцем в небо.

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


PSNR
Простейшая формула для PSNR (картинки с Википедии)
Глядя на такие формулы начинаешь чувствовать себя не очень уютно, конечно кроме тех, кто работает ежедневно с вещами из матанализа и алгебры. Но пугаться не стоит, программировать нам ничего не надо, кто-то уже позаботился о разработке кода для использования такой метрики. Здесь я ее привел только для того чтобы бало понятно, что чтоит за выражением метрика. Посмотрим на примере, как работают метрики.

Допустим, у нас есть изображение, мы его как-то обработали и получили другое изображение, а теперь мы хотим понять насколько сильно изображения различаются.


metrika1
Оригинальное изображение

metrika1_compressed_50
Jpeg сжатие 50

В данном случае отличие этого изображения от оригинала по метрике PSNR составляет: 33.58 (чем ближе к 100 тем меньше различий то есть сильнее сходство с оригиналом).


metrika1_compressed_15
Jpeg сжатие 15 (PSNR=30,RMSE=2055)

То есть, как бы получается, что PSNR не увидела здесь сильных различий, хотя невооруженным взглядом видно, что здесь просто «все не в дугу».

Но кроме метрики PSNR существует еще много разных метрик. Например, по метрике RMSE мы имеем значение 2055 (чем ближе к 0, тем меньше различий), а это уже интереснее. Получается, что для данной картинки метрика RMSE дает значения с большей степенью наглядности, с этой метрикой мы видим, что сжатие 15 в 1.5 раза сильнее отличается от оригинала, чем jpeg 50.

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

Ладно, хватит теорий и давайте перейдем к делу. Как же все-таки использовать эти метрики и приобщиться к миру грандов, которые выкладывают на форумах заумные графики с метриками и спорят на многих страницах, какие же кодеки лучше и какой битрейт предпочтительней 🙂
Я приведу 3 способа с помощью которых можно оценить различия между исходным и обработанным (перекодированным) видео.

Способ N1

Для вычислений различия между кадрами исходного и закодированного видео будем использовать программу ImageMagick. Разложим оба наши ролика на кадры с помощью бесплатной программы ffmpeg:

ffmpeg -i sample3.avi -f image2 file1-%d.png
ffmpeg -i sample3.mp4 -f image2 file2-%d.png

В итоге в рабочей папке появятся отдельные кадры в виде PNG файлов.

videoframes

Затем, используя программу compare из бесплатного пакета ImgeMagick, мы сравним кадры из исходного и перекодированного видео. Результат сравнения будем складывать в файл cmp_psnr.txt. Следующий скрипт сравнивает изображения с использованием метрики PSNR.

@echo off 
FOR /L %%F IN (1,1,270) DO ( 
compare file1-%%F.png file2-%%F.png tmp.png 
compare -metric PSNR file1-%%F.png file2-%%F.png tmp.png 2>> cmp_psnr.txt echo. >> cmp_psnr.txt 
)

Содержимое файла cmp_psnr.txt после попарного сравнения всех кадров:

31.5679 
28.6328 
30.5415 
28.7298 

Затем импортируем этот файл в Excel и строим график:

ImageMagickPSNR

По мнению метрики PSNR мы видим, что исходное и закодированные фрагменты видео не сильно различаются (PSNR в районе 30) и только на кадрах 180 и 270 есть различия, скорей всего там было движение и кодек просто не справился, упростив видео до пресловутых квадратов, указывающих на недостаток битрейта.

Способ N2

Ffmpeg имеет встроенные средства для сравнения двух видео. Следующая команда сравнивает sample3.avi (исходное видео) и sample4.avi (перекодированное видео) по метрике SSIM. Результаты покадрового сравнения выводятся в файд ssim.txt.

ffmpeg -i sample3.avi -i sample3.mp4 -lavfi "ssim=stats_file=ssim.txt" -f null -

Содержимое файла ssim.txt:

n:1 Y:0.965770 U:0.957836 V:0.982533 All:0.968713 (15.046334)
n:2 Y:0.927766 U:0.953085 V:0.980309 All:0.953720 (13.346081)
n:3 Y:0.958540 U:0.952529 V:0.979677 All:0.963582 (14.386830)
n:4 Y:0.930579 U:0.952131 V:0.979846 All:0.954185 (13.389958)
n:5 Y:0.955785 U:0.956012 V:0.980844 All:0.964214 (14.462850)

График сравнения двух видеороликов по метрике SSIM:

ffmpegSSIM

Способ N3

Сравнение нескольких видео с использованием сторонних программ. Например, программа из МГУ MSU Video Quality Measurement Tool. Отличная программа с простым и интуитивным интерфейсом. Для сравнения использует большое количество метрик. Можете выбрать любую по вкусу. На выходе дает различия по каждому кадру и по видео в целом. Не нужно создавать никакие скрипты просто скачиваете, устанавливаете и запускаете. Интерфейс интуитивно понятен, выбираем видео1, видео2, тип метрики и сравниваем.


msu1
Основное окно программы

msu2
Список доступных метрик

msu3
Результат сравнения

Выводы

Конечно же существуют и другие способы сравнения изображения с помощью метрик, например с использованием программы Avisynth. Целью было дать базовое понятие метрики, что это такое и как это использовать. В данной статье приводятся способы сравнения при помощи бесплатных инструментов, как в Linux, так и в Windows.

Почитать еще