泥沼・追記長文化:QSVEncCのSSIMにまつわるあれやこれや(SkyLakeやRTX2060でテストしてみた。同じ値になるときが正解かもしれない)

日記 > PC

SSIMってどこで差が出るんだろうというお話。
実装とか演算がどうのこうのっていう話ではないです。
HWエンコーダーに同じデータが渡っていれば同じ結果になると!当たり前ですが。
※ソースによって変わるのでデコード関係かなと思いますが…。
※TSやVFR、あとオプションを多めにエンコーした何かがちょっと怪しい動き。

SSIMのテスト。QSVEncのSSIMとFFMpegのSSIMの話があったのでよし俺も!って感じで。

SkyLakeのエンコーダー

H.265のエンコード/デコードはできるけど、main10プロファイルには対応してない。
そんな世代のQSVです。

■ 環境準備。QSVは6.03

・バイナリはGitHubから入手

Releases · rigaya/QSVEnc
QSVによる高速エンコードの性能実験. Contribute to rigaya/QSVEnc development by creating an account on GitHub.

・最終的なバッチファイル。(途中いろいろ修正しながらですが)

set QSV64_PATH=D:\Amatsukaze\_bin\QSVEncC_lastest_x64\QSVEncC64.exe
set OUTPUT_PATH=%~n1_ICQ25

%QSV64_PATH% --avsw --icq 25 -c hevc --audio-copy --ssim -i "%~1" -o "%OUTPUT_PATH%.mp4" --log "%OUTPUT_PATH%.log"

pause

ffmpeg -i "%~1" -i "%OUTPUT_PATH%.mp4" -filter_complex ssim -f null -

pause
■ いやらしいデータを食わせてみる

ソースのデコードされたフレームの影響によるのだろうと素人考えで原因を絞ってその周辺でテストする。
がっつりやばそうな「hevc/h.265のmain10-10bitのFHD動画」を元ファイルにしてエンコードしてみる。
Amatsukazeを使って放送波の実写リゾート案内24分をNVENCでKFMのVFRエンコードしたもの。
えっと、先にいっておきますが、上記の通り、SkylakeのWDVは10bitエンコードできないので8bitになります。

SSIMは悪くなって当たり前なので小手調べというか、そんな感じで(笑)

・元ファイルは1.71GB、ICQ23で1.84GB、ICQ25で1.43GB(サイズを得減らすには微妙な数値になった^^;)

・ICQ23の場合
あれ、フレームレートが・・・見なかったことにしよう(?_?)エ?

QSV-SSIMフレームレートが違う割にいい数値が出てる。
ssim/psnr: SSIM YUV: 0.983168 (17.738523), 0.981767 (17.391519), 0.981614 (17.355068), All: 0.982675 (17.613322), (Frames: 74225)
FFMPEG-SSIM
[Parsed_ssim_0 @ 00000143d2dcc9c0] SSIM Y:0.371493 (2.016902) U:0.699250 (5.217938) V:0.688240 (5.061791) All:0.478910 (2.830877)
test_org_ICQ23.txt
test_org_ICQ23.log

・ICQ25の場合
QSV-SSIM
ssim/psnr: SSIM YUV: 0.979266 (16.833151), 0.978488 (16.673197), 0.978363 (16.648118), All: 0.978986 (16.774882), (Frames: 74225)
FFMPEG-SSIM
[Parsed_ssim_0 @ 00000135624a8dc0] SSIM Y:0.372251 (2.022142) U:0.699400 (5.220112) V:0.688388 (5.063862) All:0.479466 (2.835506)
test_org_ICQ25.txt
test_org_ICQ25.log
※あくまで参考値ですm(__)m

きっと何かが間違ってる(笑)

■ 見てる人でも再現できそうなデータで…

「電影少女 -VIDEO GIRL MAI 2019- 第1話」を借りてテスト。

サービス終了のお知らせ


・ICQ25でテスト
QSV-SSIM
ssim/psnr: SSIM YUV: 0.990696 (20.313141), 0.990256 (20.112621), 0.990599 (20.268415), All: 0.990606 (20.271644), (Frames: 43276)
電影少女 -VIDEO GIRL MAI 2019-_第1話-6272765379001_ICQ25.log

FFMPEG-SSIM
[Parsed_ssim_0 @ 000002340fb5bd00] SSIM Y:0.916997 (10.809074) U:0.976979 (16.378682) V:0.977052 (16.392530) All:0.937003 (12.006818)
電影少女 -VIDEO GIRL MAI 2019-_第1話-6272765379001_ICQ25_ssim.txt

無難な数字が出てきたので終わりに・・・と、ここでやめたらうちのサイトの名が廃る!

■ QSVEncCでエンコードしたものを再エンコードしてみる

悪魔の所業。わかる人には何が原因かわかるかもしれないし…
私にはさっぱり意味不明。

QSV-SSIM
ssim/psnr: SSIM YUV: 0.993217 (21.685769), 0.992834 (21.447497), 0.993028 (21.566119), All: 0.993122 (21.625154), (Frames: 43276)
電影少女 -VIDEO GIRL MAI 2019-_第1話_ICQ25_ICQ25.log
FFMPEG-SSIM
[Parsed_ssim_0 @ 0000022d23cc3900] SSIM Y:0.993217 (21.685770) U:0.992834 (21.447497) V:0.993028 (21.566119) All:0.993122 (21.625154)
電影少女 -VIDEO GIRL MAI 2019-_第1話_ICQ25_ICQ25_ssim.txt

だいぶ近い数字が出ましたねぇ!てか同じだよ!何してんだか(笑)
これ、インタレシース使うと最初のmain10ソースと一緒でもうめちゃくちゃなんですわヘ(゚∀゚ヘ)アヒャ
SSIMの計算がどうのこうのっていう話じゃなくて、デコード後のどの段階のデータと比較するかとかいろいろありそうだなと。

余談:
最初の比較のフレームレートが違うって事は、対になるフレームが違うわけで…言わずも…(^◇^;
どこかでなにかが違ってるんだろうなぁと。

■ 最後に?。SSIMじゃ画質は測れないという話?

FFMPEGでさらに半分のサイズにエンコードしてみた!
「test_org.mp4」は上のVideoGirlの1話。

ffmpeg -i “test_org.mp4” -c:v hevc_qsv -global_quality 25 -c:a copy “qsv.mp4”
ffmpeg -i “test_org.mp4” -i “qsv.mp4” -filter_complex ssim -f null –

[Parsed_ssim_0 @ 000001e30c81d080] SSIM Y:0.985985 (18.534138) U:0.987961 (19.194038) V:0.988273 (19.308216) All:0.986696 (18.760121)
20211002_ffmpeg_ssim.txt
h.264の1/4サイズでも結構いいSSIM値出てますね(笑)


ってところで、NVEncCもやらないといけない感じか(^◇^;

■ FFMpegでNVEnc?

ちょっと力尽きてきたので手抜きで・・・とりま、自分でやるでしょ?(笑)
指定が違うってエラー出てるけど、、、ノイズ捨てた後のデータを使っているだけあっていい数字が続く(笑)

ffmpeg -i “test_org.mp4” -c:v hevc_nvenc -global_quality 25 -c:a copy “nvenc.mp4”
ffmpeg -i “test_org.mp4” -i “nvenc.mp4” -filter_complex ssim -f null –

[Parsed_ssim_0 @ 0000023186106ec0] SSIM Y:0.988994 (19.583524) U:0.989821 (19.923147) V:0.990164 (20.071792) All:0.989327 (19.716970)
20211002_ffmpeg_ssim_nv.txt


■ 調子に乗ってNVEncCでも…

720pとはいえ、エンコード速度が軽く690fps超えとか目が覚めた!(笑)
QSVは54fpsがいいとこだ。QSVで時間かけてエンコードしてたことが無駄に感じてきたわ。自分に腹が立つ(笑)
オプション盛って、大体元サイズの1/4になる辺りで比較。q31で同じくらいかな。

手頃なバッチファイルをリネームしてと。

:NVEncC 5.39
set NVENC64_PATH=D:\Amatsukaze\_bin\NVEncC_lastest_x64\NVEncC64.exe
set OUTPUT_PATH=NEncC

set HEVC_OPT1=-c hevc --bref-mode each --ref 16 --lookahead 32
rem set HEVC_OPT2=--avhw --input-analyze 16 --gop-len 300 --bframes 4
set HEVC_OPT2=--input-analyze 16 --gop-len 300 --bframes 4
set HEVC_QP=--vbrhq 0 --vbr-quality 31

set HEVC_VPP=--ssim

%NVENC64_PATH% %HEVC_OPT1% %HEVC_OPT2% %HEVC_QP% %HEVC_VPP% --audio-copy -i "%~1" -o "%OUTPUT_PATH%.mp4" --log "%OUTPUT_PATH%.log"

pause

ffmpeg -i "%~1" -i "%OUTPUT_PATH%.mp4" -filter_complex ssim -f null -

pause

サクサクいこう。

ssim/psnr/vmaf: SSIM YUV: 0.988613 (19.435986), 0.989153 (19.646826), 0.989517 (19.795339), All: 0.988854 (19.528752), (Frames: 43276)
20211002_NVEncC_q31.log
[Parsed_ssim_0 @ 00000238ac682340] SSIM Y:0.988613 (19.435985) U:0.989153 (19.646824) V:0.989517 (19.795337) All:0.988854 (19.528751)
20211002_NVEncC_ssim.txt
前はNVEncCtoFFMpegのSSIM値が違っていたような気がするけど、今回は一致ヽ(*^。^*)ノ
昔違いはなんだ?と予想を立てていたが・・・ん?あれ?
まぁ、わらッとこう。きっとどこかで数値が合うようになっていたんだと思う。実際QSVはまだ差異が出てるわけだし、前はそのタイミングだったのだろう(笑)


ちなみに今回の検証の結果、Bframeを使うとSSIMの値は悪くなる!どどん!(また怒られそう)
Bフレ4→0にしたら、遅いし大きくなるし少しくらいSSIMが上がったところでいい事は無にもない感じ!
RTXというかTuring世代以降のNVEnc第7世代(TU117は第6世代hevcでインタレが使える最後のチップ?)はマクロブロックの探索粒度など改良が加わっているので、個人的にはBフレーム対応よりもこちらの暗部のゴーストブロック発生が抑えられることが、ビットレートを下げても破綻しにくくてRTX970から乗り換えた感じです。RTX2080貸してくれた同志に感謝ですなぁm(__)m
知らなかったらまだうだうだやっていたと思う。

ssim/psnr/vmaf: SSIM YUV: 0.989450 (19.767601), 0.988571 (19.420064), 0.988975 (19.576376), All: 0.989225 (19.675694), (Frames: 43276)
20211002_NVEncC_ssim_B0.log
[Parsed_ssim_0 @ 000001ac2ae0be80] SSIM Y:0.989450 (19.767600) U:0.988571 (19.420062) V:0.988975 (19.576374) All:0.989225 (19.675693)
20211002_NVEncC_ssim_B0


■ じゃぁ何をするとSSIMが変わるんだよ!と聞かれたら

それを人に聞くか?と答えましょう。(笑)
あなたの環境を僕は知らないのです!キリッ

と、20年前ならいう所ですが、中のおっさん少しは角が取れたのですよ。
ヒントくらいは差し上げます。ここまで読んだ暇人ですものね。何か得るものがあればいいけど。

このログの方法だと100%再現するので、あのあたりです!
20211002_NVEncC_q28_encode
ssim/psnr/vmaf: SSIM YUV: 0.982255 (17.509190), 0.986662 (18.749096), 0.987441 (19.010544), All: 0.983854 (17.919281), (Frames: 16528)
[Parsed_ssim_0 @ 0000022bad9e98c0] SSIM Y:0.833972 (7.798175) U:0.952935 (13.272994) V:0.957249 (13.690551) All:0.874345 (9.008203)
このくらい差が出ます。NVEncCのq28でエンコードしています。

答え(いうのかよ):
・とりあえず、TS(インタレ解除等があるソース)は差異が出ます。
・あとは、VFRソースで値が違うような気がします。

ちょっと長くなったので閉じますm(__)m
(あとで、TOPの方に結論書いておきます(~0~)ネムイ)


■ 追記:VFR ソースのエンコード

※この設定ではダメという話
・バッチファイルにVFRでエンコードした動画をドラッグドロップ

:NVEncC 5.39
set NVENC64_PATH=D:\Amatsukaze\_bin\NVEncC_lastest_x64\NVEncC64.exe
set OUTPUT_PATH=NVEncC_q28

set HEVC_OPT1=-c hevc --bref-mode each --ref 16 --lookahead 32
rem set HEVC_OPT2=--avhw --input-analyze 16 --gop-len 300 --bframes 4
set HEVC_OPT2=--input-analyze 16 --gop-len 300 --bframes 4
set HEVC_QP=--vbrhq 0 --vbr-quality 28

set HEVC_VPP=--ssim

%NVENC64_PATH% %HEVC_OPT1% %HEVC_OPT2% %HEVC_QP% %HEVC_VPP% --audio-copy -i "%~1" -o "%OUTPUT_PATH%.mp4" --log "%OUTPUT_PATH%.log"

pause

ffmpeg -i "%~1" -i "%OUTPUT_PATH%.mp4" -filter_complex ssim -f null -

pause

・YMSER6で見ると、フレーム数も長さも違ってる(´・ω・`)

ssim/psnr/vmaf: SSIM YUV: 0.990939 (20.428157), 0.991930 (20.931281), 0.992581 (21.296338), All: 0.991378 (20.643751), (Frames: 15746)
20211003_NVEncC_q28.txt
[Parsed_ssim_0 @ 000002767c0dba00] SSIM Y:0.972860 (15.663961) U:0.989613 (19.835020) V:0.990149 (20.065159) All:0.978534 (16.682462)
20211003_NVEncC_q28_ssim.txt

■ VFRだし・・・「–avhw –avsync vfr」を付けてみる

もう何が正しいのか訳が分からなくなってます(爆)

:NVEncC 5.39
set NVENC64_PATH=D:\Amatsukaze\_bin\NVEncC_lastest_x64\NVEncC64.exe
set OUTPUT_PATH=NVEncC_avsync

set HEVC_OPT1=-c hevc --bref-mode each --ref 16 --lookahead 32
set HEVC_OPT2=--avhw --avsync vfr --input-analyze 16 --gop-len 300 --bframes 4
set HEVC_QP=--vbrhq 0 --vbr-quality 28

set HEVC_VPP=--ssim

%NVENC64_PATH% %HEVC_OPT1% %HEVC_OPT2% %HEVC_QP% %HEVC_VPP% --audio-copy -i "%~1" -o "%OUTPUT_PATH%.mp4" --log "%OUTPUT_PATH%.log"

pause

ffmpeg -i "%~1" -i "%OUTPUT_PATH%.mp4" -filter_complex ssim -f null -

pause

ssim/psnr/vmaf: SSIM YUV: 0.990939 (20.428157), 0.991930 (20.931281), 0.992581 (21.296338), All: 0.991378 (20.643751), (Frames: 15746)
20211003_NVEncC_avsync.txt
[Parsed_ssim_0 @ 0000023d0c4b8880] SSIM Y:0.991788 (20.855680) U:0.992762 (21.403873) V:0.993412 (21.812295) All:0.992221 (21.090866)
20211003_NVEncC_avsync_ssim.txt

NVEncCの方が変わらないって言う事は、付けても付けなくても同じかな?と思いきや…
FFMPegの方がSSIM値が高くなってきましたね。なんだろなぁ(^◇^;


SSIM追いかけると泥沼にはまるってことです。
適当なところで切り上げましょう(^◇^;