0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FFmpeg によるインターレース解除の比較 - 全フィルタをVMAF/SSIM/PSNRで実測

0
Last updated at Posted at 2026-09-19

はじめに

本記事は、FFmpeg(full-build版)がサポートするインターレース解除(deinterlace)フィルタの性能を、実動画を用いて比較・検証したものです。

PT3等でTV録画した映像 1080i や、過去アーカイブの 480i 素材を 60p へ戻す際に「結局どのフィルタが一番良いのか?」という問いに、SSIM / PSNR / VMAF / 処理速度の4軸で比較・検証したものです。

本記事の対象は 60i (30i) → 60p の純粋なデインターレースのみです。元が24p (23.98p) のアニメ・映画等の素材は対象外とします。詳細は後述「本記事の対象外」を参照。
本記事は ffmpeg 9.0.1-full_build (gyan.dev) を前提としています。通常ビルドでは HWフィルタが含まれない場合があります。

対象読者

  • TS録画したインターレース動画をインタレース解除したい方
  • FFmpegで bwdif と yadif のどちらを使うか迷っている方
  • QSV / CUDA / Vulkan / D3D12VA の違いを実測値で知りたい方

環境・前提条件

PC-1 (Desktop): Windows 11 26200 / Ryzen 7 9800X3D / RTX 5060 Ti 16GB / 64GB RAM
PC-2 (Laptop): Windows 11 26200 / Core i7-1280P (iGPU Iris Xe) / 32GB RAM
FFmpeg: 9.0.1-full_build - https://github.com/GyanD/codexffmpeg/releases
Python: 3.12.13 / 3.14.7 (計測用)
VMAF: libvmaf model=vmaf_v0.6.1

素材は全て yuv420p progressive の 60p y4m を 30i にインターレース化したものを使用しています。

ID 素材 解像度 内容
SRC1 OpenCV生成 output_1280x720_60fps 1280x720 60p 自作Pythonスクリプト生成、黄/青三角高速移動
SRC2 big_buck_bunny_1080p60_fast 1920x1080 60p Xiph.org Bunnyを60fps化、高速パン多
SRC3 sintel_trailer_1080p60_fast 1920x1080 60p Xiph.org Sintelを60fps化、映画的

SRC1 の出力イメージ

output_320x180_5fps.gif

上記は SRC1出力イメージ

SRC1 の生成方法

SRC1 output_1280x720_60fps_yuv420p.y4m は、 gen_movie.py で生成した完全合成素材です。インターレース解除の弱点である「高速移動する斜めエッジ」の再現性を厳密に測るため作成しました。

仕様

解像度: 1280x720 / 60fps / 3600フレーム (60秒) / yuv420p
出力: output_1280x720_60fps_yuv420p.y4m (y4mパイプ経由)
依存: Python 3.10+ / OpenCV (cv2) / numpy / ffmpeg (PATH上)
  • 黄三角: 画面外周を矩形周回。高さ200pxの正三角形 (辺 ~230.9px)。1周目は 200px/s、周回ごとに +200px/s 加速 (2周目 400px/s, 3周目 600px/s...)。L_y = 2*(W+ H) を周回距離として計算
  • 青三角: 45度斜め移動 (0,620) -> (620,0) を往復。1往復目は 150px/sから開始し、往復ごとに+50px/s加速。片道距離 620*sqrt(2) ≈ 876.8px

三角形は cv2.fillConvexPoly で BGR(黄: 0,255,255 / 青: 255,0,0) で塗りつぶし、OpenCVのBGR24フレームを subprocess.Popen で ffmpeg にパイプしています。

生成コマンドの中身

# gen_movie.py 抜粋 - ffmpegパイプ部分
ffmpeg_cmd = [
    "ffmpeg", "-y",
    "-f", "rawvideo", "-pix_fmt", "bgr24",
    "-video_size", f"{WIDTH}x{HEIGHT}",
    "-framerate", str(FPS),
    "-i", "-",
    "-c:v", "rawvideo", "-pix_fmt", "yuv420p",
    "-f", "yuv4mpegpipe",
    OUTPUT_FILE,
]
proc = subprocess.Popen(ffmpeg_cmd, stdin=subprocess.PIPE)
# ... 3600フレームを frame.tobytes() で書き込み

実行方法

pip install opencv-python numpy
python gen_movie.py
# -> output_1280x720_60fps_yuv420p.y4m が生成される (約 1.9GB相当の非圧縮y4m)

この素材は、移動速度が既知であるため、理論上のSSIMが最も高くなりやすく、フィルタの純粋な補完性能差が出やすいです。実際の計測でも bwdif で SSIM 0.993〜0.999 を記録しました。

インターレース化コマンド(TFF固定):

ffmpeg -hide_banner -i inFile.y4m -vf "interlace=scan=tff:lowpass=complex" -c:v ffv1 -level 3 -flags +ildct+ilme outFile_ffv1.mkv

idet フィルタで TFF 95-100% を確認済み。日本の地上波 1080i を想定しています。

本記事で想定するインターレース画像

テレビ放送の1080i (TFF: Top Field First) を想定します。60iのビデオカメラ素材、スポーツ中継、バラエティ等の「完全インターレース」素材が対象です。

本記事の対象外 - 24pアニメ/映画は逆テレシネが正解

本記事は、素動画がアニメや映画等の 24fps (23.98fps) Progressive の素材は対象外とします。

その理由は、アニメや映画が地上波で放送される際に行われる「テレシネ」と、純粋なインターレースでは処理が根本的に異なるためです。

なぜ対象外か? - テレシネと逆テレシネ

  • 純粋な60i (本記事の対象): 撮影時点で60枚/秒の異なる瞬間がフィールドに記録されている。例: ビデオカメラ、スポーツ中継。→ デインターレース (bwdif等) で60pに戻すのが正解。
  • 24p→60i変換された素材 (対象外): 元は24枚/秒のプログレッシブ。放送用に 2:3プルダウン (テレシネ) で 60i に変換されている。例: 映画、TVアニメ、ドラマ。フィールドを単純に60p化すると、本来24pだった動きが不自然に補間され、カクつきや画質劣化を招く。

アニメや映画の場合は、デインターレースではなく 逆テレシネ (Inverse Telecine, IVTC) を用いて 60i → 24p に戻すのが正解です。FFmpegでは以下のフィルタを使用します。

# 逆テレシネの例 (24pに戻す)
ffmpeg -i input_60i.mxf -vf "fieldmatch=order=tff:combmatch=full,decimate" -r 24000/1001 output_24p.mp4

# または pullup
ffmpeg -i input_60i.mxf -vf "pullup,softskip" -r 24000/1001 output_24p.mp4
  • fieldmatch + decimate: 2:3プルダウンのパターンを検出し、重複フィールドを削除して24pに戻す。最も高精度。
  • pullup: 古くからの定番。アニメのテレシネ解除で実績多数。

本記事で使用している SRC2 big_buck_bunny / SRC3 sintel_trailer は、元は24p作品ですが、評価用に敢えて setpts=24/60*PTS で60p化した上で30i化しているため、純粋な60i素材として扱っています。実際の24p作品を60i放送から復元する場合は、上記の逆テレシネを使用してください。

まとめ:

  • ビデオ由来の60i → bwdif等で60p化 (本記事)
  • フィルム/アニメ由来の24p→60i → fieldmatch/decimateで24pに戻す (本記事対象外)

本記事の評価結果を24p素材に適用すると、逆に画質が低下しますのでご注意ください。

インターレースとは

1. 元画像 (Progressive)

実写系は 60(59.94)fps、アニメ/映画系は 24(23.98)fps を想定します。
プログレッシブでは1フレームに全ラインが存在します。

01BeforeInterlace.gif

プログレッシブ原画のイメージ

2. インターレース化

交互に表示される奇数フィールド(赤)と偶数フィールド(青)を時間差で記録する方式です。本来は交互に表示されるものを、静止画として同時表示すると櫛状のギザギザ(コーミング)が見えます。

02.AfterInterlace.gif

インターレース化イメージ: 奇数ラインと偶数ラインで時刻が異なる

フレーム 奇数ライン(赤) 偶数ライン(青)
奇数フィールド 表示 非表示
偶数フィールド 非表示 表示

奇数(偶数)フィールドでは偶数(奇数)ラインが欠損するため、原理的に非可逆です。インターレース解除はこの欠損ラインをどう補完するかの競争になります。

インターレース解除とは

欠損したラインを周辺情報から推定し、60i -> 60p に戻す処理です。

FFmpegでは大きく分けて2つの動作があります。

  • bob (60p倍速): 1フィールドから1フレームを生成。30i -> 60p。bwdif=mode=1 や yadif=mode=1 が該当。動きが滑らか
  • weave / 30p固定: 2フィールドを合成して1フレーム。30i -> 30p。w3fdif, kerndeint が該当。フレームレート半分

本検証では is_doubled=True (60p出力可能) をメインランキングとしています。

FFmpegがサポートするインターレース解除(deinterlace)フィルタ一覧

ffmpeg -hide_banner -filters | findstr deinterlace と ffmpeg -h filter=xxx で検出できる full-build版の全フィルタです。

ffmpeg -hide_banner -filters と ffmpeg -h filter=xxx で検出できる full-build版の全フィルタです。PC-1(Desktop)で10種、PC-2(Laptop)で9種が利用可能でした。

CPUフィルタ群 (6種)

フィルタ名 概要・アルゴリズム 60p倍速 長所 短所 推奨用途 代表的オプション
bwdif Bob Weave Deinterlacing Filter。FFmpeg 3.x以降のデファクト。3フィールド(前/現/次)を使い、動き検出 + エッジ方向補間 (ED) + 時間的チェックを組み合わせる。mode=1で1フィールド→1フレームのbob、 mode=0で2フィールド合成。 ○ mode=1 全素材で最も安定。SSIM/VMAFバランスが最高。エッジが綺麗。 CPU負荷は中。4K60pでは重い。 迷ったらこれ。品質重視のCPU処理。 bwdif=mode=1:parity=tff:deint=all
yadif Yet Another Deinterlacing Filter。MPlayer由来の定番。空間チェック (周辺ラインの差分) + 時間チェック (前後フィールド) + エッジ方向補間の3段階。bwdifより古いが高速。 ○ mode=1 非常に高速、実績豊富。アニメのちらつきに強い。 bwdifよりエッジがやや甘い。高速移動でジャギー残り。 大量バッチ処理、リアルタイム性重視。 yadif=mode=1:parity=0:deint=0
w3fdif Weston 3 Field Deinterlacing Filter。BBC Westonスーパーが開発。時間方向に3フィールドの周波数分離 (filter=simple/complex) で動き検出。 × 30p固定 (仕様) 静止画部分の解像感保持が優秀。CPU最速クラス (Laptopで972fps)。 60p化できない。動きの激しい部分でボケ。 監視カメラ等、動きが少ない30p素材。 w3fdif=filter=complex:deint=all
kerndeint Donald Graft作の適応的カーネルデインターレーサ。threshで動き閾値、sharpでシャープ、twowayで両方向補間。 × 30p固定 閾値調整でアニメの線を綺麗に残せる。昔のDVDリッピング定番。 30p固定、パラメータが職人芸。実写では破綻しやすい。 レトロ素材、アニメDVDの30p化。 kerndeint=thresh=10:map=0:order=0:sharp=0:twoway=0
nnedi Neural Network Edge Directed Interpolation。2009年発表の浅いMLP (多層パーセプトロン) によるエッジ方向予測。nsize=s8x6〜s32x4の近傍ピクセルから16〜64個のニューロンで補間方向を推定。nnedi3_weights.bin (約2MB) が必要。 ○ だが重い 静止画の斜めエッジ補間は理論上最強。 浅いNNで時代遅れ、時間情報なし、学習データがアニメ寄り、60p bobで時間的破綻。最遅 (Laptop SRC2で11fps, 1248秒)。 静止画超解像の前処理、研究用。実用非推奨。 nnedi=weights=...:field=tff:deint=all:nsize=s32x4:nns=64:qual=fast
estdif Edge Slope Tracing Deinterlacing Filter。エッジの傾きを追跡して補間方向を決める。rsで探索範囲。 ○ mode=field エッジ追跡が得意、対角線のギザギザ抑制。 計算量が多い割にVMAFが低い。rs=2で激遅。 斜め線が多いCG素材の実験。 estdif=mode=field:parity=tff:deint=all:rs=1

ハードウェアフィルタ群 (8種)

カテゴリ フィルタ名 概要・アルゴリズム 60p倍速 長所 短所 要件
NVIDIA CUDA bwdif_cuda bwdifのCUDA移植。scale_cudaと連携。アルゴリズムはCPU版と同一だがGPUで並列化。 ○ CPU版と同画質でGPU%13%と省電力。602fps。 VRAMコピー overhead、NVIDIA必須。 CUDA, -hwaccel cuda
yadif_cuda yadifのCUDA移植。 ○ 最速クラス、CPU負荷激減。 同上、yadif画質。 CUDA
Vulkan bwdif_vulkan bwdifのVulkan移植。NVIDIA/AMD/Intelで動作。今回総合No.1 (VMAF 86.15)。 ○ ベンダー非依存、今回最高VMAF。 ドライバ依存、Winで稀にVK_ERROR_DEVICE_LOST。 Vulkan
Intel QSV deinterlace_qsv Intel Media SDK固定機能。エッジを平均化するスムージング系。mode=1: bob, mode=2: advanced △ mode=2で倍速試行 SSIM最強 (0.996174)。CPU%24%と低消費電力。 VMAFが低い (70.9) スムージングでディテール消失。Desktopでは不可 (iGPU ID mismatch)。 QSVランタイム
vpp_qsv Video Post Processing QSV。QSVの後継API。deinterlace=2:rate=fieldでbob。deinterlace_qsvと同エンジンだがドライバ経路が異なる。 ○ deinterlace_qsvと同SSIM、若干高速。 同上、VMAF低。旧deint/field_rateはffmpeg 9.0.1で廃止。 QSV
D3D12VA deinterlace_d3d12va Windows D3D12 Video Acceleration。GPUベンダーのドライバ実装に依存。 ○ GPU効率最高、CPU%14%と最低。 実装差異が大きい: RTX(d3d12va)でVMAF 72.1 vs iGPUで79.6と4pt差。 Windows + D3D12
VAAPI deinterlace_vaapi Linux VAAPI。Intel/AMDのオープンソースHWデインターレーサ。 ○ rate=field Linuxで省電力。 Windowsでは利用不可。今回未計測。 Linux
OpenCL yadif_opencl yadifのOpenCL移植。 ○ 汎用GPUで動作。 ドライバ不安定、今回環境では未検出。 OpenCL

参考: https://ffmpeg.org/ffmpeg-filters.html#bwdif / https://ffmpeg.org/ffmpeg-filters.html#yadif / https://github.com/dubhater/vapoursynth-nnedi3

評価方法

素材動画(60p) ⇔ インタレース解除(60p or 30p) の動画間で VMAF/SSIM/PSNRで実測

計測コマンド設計

ffmpeg -hide_banner -benchmark -i interlaced.mkv -i original.y4m -filter_complex ^
 "[0:v]set_params=field_mode=tff,bwdif=mode=1:parity=0:deint=all[deint]; ^
  [deint]split=3[for_ssim][for_psnr][for_vmaf]; ^
  [for_ssim][1:v]ssim=stats_file=SRC1_bwdif_ssim.log:stats_version=2[e1]; ^
  [for_psnr][1:v]psnr=stats_file=SRC1_bwdif_psnr.log[e2]; ^
  [for_vmaf][1:v]libvmaf=log_fmt=json:log_path=SRC1_bwdif_vmaf.json:model=version=vmaf_v0.6.1:feature=name=psnr|name=float_ssim[e3]" ^
 -map "[e1]" -f null - -map "[e2]" -f null - -map "[e3]" -f null -
  • set_params=field_mode=tff でフィールド順を強制
  • 出力は -f null - で捨てるためディスク枯渇しない
  • psutil でCPU、pynvml でGPU使用率を500msサンプリング

評価指標:

指標 意味
SSIM All 構造的類似度。エッジが綺麗だと上がる
PSNR All 画素単位の誤差。純粋なピクセル忠実度
VMAF Netflix開発の知覚的品質モデル。人間の目に近い
fps / rtime 処理速度
CPU% / GPU% 負荷

評価結果

1. Desktop (RTX 5060 Ti) 総合ランキング - 3素材平均

VMAFを最重要視した総合ランキングです。

Rank Filter Avg SSIM Avg VMAF SRC2 fps HW 備考
1 bwdif_vulkan 0.984016 86.15 604 vulkan 総合No.1
2 bwdif 0.983989 76.88 562 cpu CPU最強・最速クラス
3 bwdif_cuda 0.983680 85.22 602 cuda PSNR高め
4 yadif 0.983644 75.04 554 cpu バランス
5 yadif_cuda 0.983468 83.64 604 cuda コスパ良
6 nnedi 0.982972 75.21 70 cpu 最遅、画質利得微小
7 w3fdif 0.982428 75.65 600 cpu 最速クラスだが30p参考
8 estdif 0.981789 74.22 84 cpu 遅い
9 deinterlace_d3d12va 0.981149 72.19 607 d3d12va GPU効率最高
10 kerndeint 0.949556 80.67 255 cpu 30p参考値のみ

Desktopの最高速度は bwdif@SRC1 2932fps。HWフィルタは全て 600fps前後で頭打ちですが、CPU負荷が 90%→13%に激減します。

2. Laptop (i7-1280P iGPU) QSV結果 - SSIMの罠

Source Filter SSIM All PSNR All VMAF FPS CPU%
SRC1 deinterlace_qsv 0.998978 28.81 61.96 108 24%
SRC1 vpp_qsv 0.998978 28.81 61.96 220 20%
SRC1 bwdif 0.993529 29.40 73.31 550 51%
SRC2 deinterlace_qsv 0.995037 44.61 77.83 69 34%
SRC2 vpp_qsv 0.992818 57.60 70.50 106 46%
SRC2 bwdif 0.972575 38.38 73.91 124 46%

QSVはSSIM観点で最強 (avg 0.996) ですが、VMAFではCPU系(bwdif, w3fdif)に負けます。

これはQSVのスムージング特性によるものです。

  • SSIMはエッジ構造が整うと上がる → QSVの平滑化で上昇
  • PSNRは画素MSE → 平滑化で微小誤差が累積し低下
  • VMAFはディテール損失を減点 → 人間は「滑らか」だがVMAFは「ぼやけ」と判断

つまり 「QSV=高精細」ではなく「QSV=滑らか」。用途で使い分けが必要です。

3. 速度 vs 画質 トレードオフ

SRC2 (big_buck_bunny 14315frames) での実測:

Filter Desktop FPS Laptop FPS 倍率 is_doubled
bwdif 562 124 4.5x True
yadif 554 102 5.4x True
nnedi 70 11 6.4x True
estdif 84 27 3.1x True
deinterlace_d3d12va 607 82 7.4x True

nnediはDesktopで204秒、Laptopで約660秒かかり、画質利得は0.001以下。コスパは最悪でした。

4. VMAF vs SSIM 相関分析 - 2次元散布図

SSIM All (x軸) と VMAF (y軸) の相関を可視化しました。

4.1 全フィルタ×全ソース統合 (Laptop 27点)

vmaf_ssim_all_NOTE10TH.png

  • Pearson r = 0.017 (ほぼ無相関)
  • 青: SRC1 (幾何学)、橙: SRC2 (Bunny)、緑: SRC3 (Sintel) で色分け
  • 3つのクラスタが明確に分離: SRC1は低VMAF (61-74) / 高SSIM (0.978-0.999)、SRC3は高VMAF (80-92) / 高SSIM (0.95-0.996)、SRC2は中間 (62-80)
  • 重要: 同一SSIMでもVMAFが20ポイント以上ばらつく。SSIMだけで品質を語れない証拠

4.2 素材別散布図

SRC1 (generative_triangle) - Pearson r = -0.698 逆相関
vmaf_ssim_SRC1_NOTE10TH.png

幾何学模様では deinterlace_qsv / vpp_qsv が SSIM 0.9989で最右端だが VMAFは61.9で最下端。逆に kerndeint (30p参考値) が SSIM最低 0.978だがVMAF 74で最高。SSIMが上がるほどVMAFが下がる逆相関 が発生。これはQSVのスムージングがSSIMを押し上げるがVMAFはディテール損失として減点するため。

SRC2 (big_buck_bunny) - Pearson r = 0.607 正相関
vmaf_ssim_SRC2_NOTE10TH.png

高速パンが多いBunnyでは w3fdif が VMAF 80.18でトップ、SSIMは0.97と中位。bwdif は SSIM 0.972だがVMAF 73.9と低め。kerndeint が左下に外れ値 (SSIM 0.915, VMAF 62.2)。動きの激しい実写ではSSIMとVMAFがやや正相関。

SRC3 (sintel_trailer) - Pearson r = -0.370 弱い逆相関
vmaf_ssim_SRC3_NOTE10TH.png

映画的で粒子感があるSintelでは bwdif が VMAF 92.0で最高、SSIM 0.985と中位。deinterlace_qsv が SSIM 0.9967で最右端だがVMAF 91.28と2位。vpp_qsv が SSIM 0.9967で同等だがVMAF 80.25と最下位に沈む。同じSSIMでもQSV系のドライバ差でVMAFが11pt違う。

4.3 相関関係の考察

観点 結果 解釈
全体相関 r=0.017 無相関 SSIMとVMAFは別物。片方だけでの評価は危険
SRC1幾何学 r=-0.698 強い逆相関 エッジが単純な素材では、スムージングでSSIMは上がるがVMAFは「ボケ」と判定して下がる
SRC2実写高速 r=0.607 正相関 複雑な実写では、構造保持 (SSIM) が知覚品質 (VMAF) にも寄与
SRC3映画 r=-0.370 弱逆相関 粒子・フィルムグレインがある素材では、SSIMの微細な差がVMAFでは大きく増幅

運用への示唆: VMAF 90以上を狙うなら bwdif 系、SSIM 0.996以上をカタログスペックで見せたいなら deinterlace_qsv。どちらを優先するかで推奨フィルタが180度変わる。

Desktop側の散布図も同様傾向 (全ソース r=-0.356, SRC2 r=-0.921) で、HWフィルタ bwdif_cuda/vulkan はDesktop SRC3でSSIMは測定不可だがVMAF 85-86と高得点を記録。CPU版と同等以上の知覚品質をGPUで実現している。

参考: Desktop側散布図

vmaf_ssim_all_K101.png

Desktop全ソース: SRC1青 70-74, SRC2橙 69-83, SRC3緑 76-84 に分離。Pearson r=-0.356

5. Desktop vs Laptop 詳細比較 - 処理時間とCPU使用率

summary_Desktop.csv と summary_Laptop.csv から、同一フィルタのPC間比較を抽出しました。

Source Filter Desktop FPS Laptop FPS Desktop rtime(s) Laptop rtime(s) Desktop CPU% Laptop CPU% FPS倍率
SRC1 bwdif 126 550 28.6 6.5 12.0% 51.3% 0.2x
SRC1 yadif 120 659 30.0 5.5 15.8% 44.1% 0.2x
SRC1 w3fdif 123 972 29.2 3.7 14.3% 37.5% 0.1x
SRC1 nnedi 103 85 34.9 42.2 19.1% 38.7% 1.2x
SRC2 bwdif 51 124 283.3 115.4 16.1% 46.0% 0.4x
SRC2 nnedi 32 11 453.9 1248.2 32.2% 37.7% 2.9x
SRC3 bwdif 54 161 23.4 7.8 14.6% 57.5% 0.3x
SRC3 yadif 53 210 23.7 6.0 14.8% 56.7% 0.3x
  • Desktop (Ryzen 7 9800X3D) はデスクトップ向けにベンチマークが低く出る: benchmark の rtime はCPU時間ではなく実時間を測るため、Desktopの fps 表示は低いが実際の elapsed は短い。LaptopはCPU%が40-60%と高く、Desktopは12-19%と低い。これはDesktopが16コアで余力があり、Laptopが14コア(6P+8E)でフルロードに近いため
  • 最速はLaptop w3fdif SRC1で972fps: 720pの幾何学模様は軽い。最遅はLaptop nnedi SRC2で11fps / 1248秒 (20分48秒)
  • CPU%最低はDesktop deinterlace_d3d12va SRC1で9.9%: D3D12VAはGPUにオフロードできている証拠。Laptop同フィルタは14.4%

6. 色成分別 SSIM 分析 - ssim_y が最も高いフィルタは?

summary_NOTE-Laptop.csv の ssim_y / ssim_u / ssim_v を比較しました。

全体平均 (9フィルタ平均)

Filter Avg ssim_y Avg ssim_u Avg ssim_v 特徴
deinterlace_qsv 0.9956 0.9970 0.9978 Y/U/V全て最強。特にV成分が0.9978で色保持完璧。スムージングで色ずれなし。
vpp_qsv 0.9956 0.9970 0.9978 同上
bwdif 0.9797 0.9914 0.9938 Yが0.9797でCPU勢トップ。U/Vは0.991以上と色保持良好。
yadif 0.9792 0.9914 0.9938 bwdifと同等。Yが僅かに低い。
nnedi 0.9787 0.9903 0.9927 Yが0.9787とbwdifに0.001負け。Uが0.9903と色で劣る。
w3fdif 0.9777 0.9904 0.9932 Yが低め、U/Vは健闘。
kerndeint 0.9354 0.9739 0.9819 Yが0.935と大きく劣る。輝度エッジ保持が苦手。

解釈

  • ssim_yが最も高い=輝度エッジ保持が得意: QSVを除けば bwdif (0.9797) がトップ。黄三角のエッジがギザギザにならない
  • ssim_u/vが高い=色の滲みが少ない: QSVが0.997と圧倒的。CPU勢では yadif がUで0.9914と僅差でトップ。青黄の色境界が綺麗
  • SRC2でYが落ちる: Bunnyの高速パンでは全フィルタでYが0.96-0.97まで低下。U/Vは0.98-0.99と高い。つまり 輝度の高周波がインターレース解除で失われやすい。人間の目はYに敏感なので、VMAFが下がる主因
  • kerndeintはYが弱い: SRC2でssim_y 0.889と他が0.96なのに0.88と大きく劣る。閾値ベースのカーネルでは高速動きの輝度を追従できない

考察と運用提言

品質面

  1. VMAF基準なら bwdif 系が最強: bwdif_vulkan (86.15), bwdif_cuda (85.22), yadif_cuda (83.64) がSRC3で頂点
  2. CPUオンリーなら bwdif > w3fdif > yadif の順。従来の信仰通り bwdif が安定
  3. nnedi, estdif は遅い割にVMAFが低いため非推奨
  4. deinterlace_d3d12va は実装差異が大きい。同じフィルタ名でも RTXとiGPUでVMAFが4ポイント違う

なぜ「ニューラルネットワーク活用の最先端フィルタ nnedi」が bwdif / yadif に負けるのか?

nnediは2009年に発表された当時は画期的でしたが、2026年の視点では以下の理由で実用的なインターレース解除では劣勢です。今回の計測でも Laptop平均 SSIM 0.982972 (5位) / VMAF 80.69 (5位) / FPS 11-85と、品質・速度ともに中位以下でした。

1. アーキテクチャが浅すぎる - 現代の深層学習ではない

  • nnedi3は 入力近傍 8x6〜32x4ピクセル、隠れ層 16〜64ニューロン、出力 2値 (エッジ方向) の多層パーセプトロン (MLP)。パラメータ数は数千〜数万
  • 現代の ESRGAN / Real-ESRGAN (数百万〜数千万パラメータ) と比較すると2桁小さい。2009年当時は「ニューラルネットワーク」と呼ばれたが、今で言う「小さなMLP」
  • 活性化関数はシグモイド系、学習は当時のCPUで数日。表現力が不足し、複雑な実写テクスチャを学習できない

2. 学習データがアニメ・静止画に偏っている

  • nnedi3の重み nnedi3_weights.bin は、主にアニメの線画や静止画のエッジを学習。BunnyやSintelのような実写・3DCGのモーションブラー、被写界深度、フィルムグレインは学習データにほぼ含まれない
  • 結果として 幾何学模様 SRC1では ssim_y 0.9936とbwdifを上回る が、実写SRC2では ssim_y 0.9616とbwdif 0.9643に負ける。アニメでは強いが実写では弱い

3. 時間情報を全く使わない - イントラのみ

  • bwdif / yadif は 前後フィールドの時間情報 を使って動き検出と補間を行う。nnediは 現在のフィールド内の空間情報のみ で補間方向を推定する「イントラ」フィルタ
  • 60p bob動作では、偶数ラインを補間する際に前後の時間的整合性が取れず、高速移動物体でちらつきが発生。VMAFが時間的なちらつきを減点するため、VMAFが伸びない
  • 仕様書の is_doubled=True でも、実際は各フィールドを独立に拡大しているだけで、時間方向の補間ではない

4. FFmpeg実装の制限 - qual=fast と固定重み

  • FFmpegの nnedi は qual=fast 固定の簡易版。VapourSynth本家の nnedi3は qual=slow で高精度モードがあるが、FFmpegでは実装されていない
  • nsize=s32x4:nns=64 が最大だが、これは 32x4=128ピクセルの近傍から64ニューロン。現代の8x8〜16x16カーネルと比較すると異方的で、縦方向の情報が不足
  • 重みファイルが2009年から更新なし。シーン適応的な重み切り替えもない

5. 計算量が膨大で実用性が低い

  • 1ピクセル補間するたびにMLPの順伝播を実行。SIMD最適化も限定的
  • Laptop SRC2で 1248秒 (20分48秒)、SRC3で42秒。bwdifは115秒と42秒の差が10倍。GPU版も存在しない
  • 品質差は SSIMで0.003 (0.9725 vs 0.9697) と僅か。コスパが最悪

結論: nnediは「ニューラルネットワーク」という看板は最先端に見えるが、実態は2009年の浅いMLPで、学習データも古く、時間情報も使わず、FFmpeg実装も簡易版。現代の動き適応型フィルタ bwdif / yadif の方が、時間・空間・エッジの3軸でバランスが良く、実写では品質・速度ともに勝る。静止画の超解像前処理など、時間情報が不要な用途にのみ有用。

運用推奨マトリクス

ケース Desktop (dGPUあり) 推奨 Laptop (iGPUのみ) 推奨
A: 最高品質 (VMAF優先) bwdif_vulkan w3fdif / bwdif (VMAF 81/80)
B: コスパ重視 yadif_cuda deinterlace_d3d12va
C: 大量バッチ w3fdif (最速) yadif
D: QSV必須 (MDフィルタ連携等) - deinterlace_qsv (SSIMは最高)
避けるべき nnedi, estdif kerndeint (30p非倍速)

結論: 迷ったら bwdif=mode=1:parity=tff:deint=all を使っておけば間違いない。GPUがあるなら bwdif_vulkan or bwdif_cuda に置き換えるとCPU負荷が1/7になる。

コマンド例:

# CPU推奨 (60p)
ffmpeg -i input_1080i.mxf -vf "bwdif=mode=1:parity=tff:deint=all" -c:v libx264 -crf 18 -preset slow output_1080p60.mp4

# GPU推奨 (Vulkan)
ffmpeg -hwaccel vulkan -i input_1080i.mxf -vf "bwdif_vulkan=mode=1:parity=0:deint=all" -c:v libx264 output.mp4

# QSV環境 (SSIM重視)
ffmpeg -hwaccel qsv -i input_1080i.mxf -vf "vpp_qsv=deinterlace=2:rate=field" -c:v h264_qsv output.mp4

まとめ

  • 本記事は60i→60pの純粋なデインターレースのみを対象。24pアニメ/映画は fieldmatch+decimate による逆テレシネが正解であり対象外
  • 全17フィルタ中、実用的な60p倍速対応は bwdif, yadif, bwdif_cuda, yadif_cuda, bwdif_vulkan, estdif, deinterlace_d3d12va, deinterlace_qsv, vpp_qsv の9種
  • 客観品質 (VMAF) と主観 (SSIM) は一致しない。QSVはSSIMフェチ向け、VMAFはbwdif系が強い
  • 速度は w3fdif と d3d12va が最速、品質は bwdif_vulkan が最高。総合バランスも bwdif 系が優勝
  • 中間ファイルなしの filter_complex + -f null - 方式で、1TBのy4mを保存せずに評価可能

参考・引用

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?