Frame Interpolation
フレーム補間は、既存のフレーム間に新しいフレームを合成し、フレームレートの向上やスローモーションの作成を実現します。フロー、カーネル、生成モデルを用いる手法を解説します。
フレーム補間は、ビデオフレーム補間(VFI)とも呼ばれ、動画内の既存の2フレームの間に新しいフレームを合成するコンピュータービジョンのタスクです。各フレーム間に1フレームを挿入するとフレームレートが2倍になり、30 FPSの映像を60 FPSにできます。複数フレームを挿入すれば、通常の映像からスローモーションを作成できます。時間方向の解像度を高めるもので、時間における超解像に相当します。最後のフレーム以降を外挿する動画予測とは異なり、既存フレーム間の空白だけを埋めます。
フレーム補間の仕組み#
2つのフレームを平均すると、動いたものが二重に見えるゴーストが発生します。オプティカルフローを使う手法では、まず2フレーム間で各ピクセルがどのように動くかを示すオプティカルフローを推定します。次に、各フレームをその動きに沿って目標時刻まで移動させ、2つの結果をブレンドします。難しいのはオクルージョンです。歩行者が移動して初めて見える背景領域は片方のフレームにしか存在しないため、ディープラーニングモデルのSuper SloMoなどは、出力ピクセルがどちらのフレームに由来するかを決める可視性マップも予測します。
OpenCVのFarnebackオプティカルフローを使えば、実際の映像で効果を確認できます。このコード例では、3フレームの中央を除外し、前後のフレームから再構成したうえで、両手法をピーク信号対雑音比(PSNR)で評価します:
import cv2
import numpy as np
# Read three consecutive frames of people walking and hold out the middle one
cap = cv2.VideoCapture("https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov")
f0, f1, f2 = (cap.read()[1] for _ in range(3))
g0, g2 = (cv2.cvtColor(f, cv2.COLOR_BGR2GRAY) for f in (f0, f2))
# Estimate dense optical flow in both directions between the outer frames
flow02 = cv2.calcOpticalFlowFarneback(g0, g2, None, 0.5, 3, 15, 3, 5, 1.2, 0)
flow20 = cv2.calcOpticalFlowFarneback(g2, g0, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Warp each outer frame halfway along its flow, then average the two warps
h, w = g0.shape
grid = np.dstack(np.meshgrid(np.arange(w), np.arange(h))).astype(np.float32)
warp0 = cv2.remap(f0, grid - 0.5 * flow02, None, cv2.INTER_LINEAR)
warp2 = cv2.remap(f2, grid - 0.5 * flow20, None, cv2.INTER_LINEAR)
middle = cv2.addWeighted(warp0, 0.5, warp2, 0.5, 0)
# Score both against the real middle frame: flow interpolation vs. plain blending
blend = cv2.addWeighted(f0, 0.5, f2, 0.5, 0)
print(f"Blend: {cv2.PSNR(blend, f1):.1f} dB, flow interpolation: {cv2.PSNR(middle, f1):.1f} dB")出力はBlend: 22.3 dB, flow interpolation: 29.5 dBです。各フレームを動きの半分だけ移動させると、除外したフレームを平均化より7.2 dB高い精度で再構成できます。ベンチマークも同じ方法でモデルを評価します。Vimeo-90Kのトリプレットセットには、中央フレームをモデルが予測する必要がある3フレームのクリップが73,171本含まれており、PSNRとSSIMで測定します。
学習ベースの補間手法#
- フローベースのネットワーク:Super SloMo(2018)は2フレーム間の任意の時刻に対するフローと可視性を予測します。RIFE(2022)は中間時刻のフローを直接推定し、Super SloMoやDAINより4~27倍高速に動作します。
- カーネルベースのネットワーク:SepConv(2017)は出力ピクセルごとに分離可能な畳み込みカーネルを予測し、2つの入力フレームのパッチに適用します。これにより、動きの推定とブレンドを1ステップで行います。
- 大きな動きに対応するモデル:GoogleのFILM(2022)は特徴ピラミッドの各スケールで重みを共有します。そのため、細かいスケールでの大きな動きを、粗いスケールで学習した小さな動きと同様に扱えます。また、フレームのトリプレットのみで学習します。
- 生成モデル:LDMVFI(2024)などの拡散ベースの補間モデルは、入力2フレームを条件として潜在表現をデノイズし、ピクセルをワープするのではなく中央フレームを生成します。
- イベントベースの補間:Time Lens(2021)は、イベントカメラが2フレーム間で記録した輝度変化を追加します。この情報から、フレーム間の実際の動きを把握できます。
実際のアプリケーション#
- ゲームのフレーム生成:NVIDIA DLSS Multi Frame Generationは、GeForce RTX 50 Series GPUでレンダリング済みフレームごとに最大5つの生成フレームを挿入します。生成フレームごとに次のレンダリング済みフレームが必要となるため、レイテンシが増加します。
- 動画編集:編集ソフトは標準的な映像からスローモーションを作成し、24 FPSまたは30 FPSの動画を60 Hzや120 Hzのディスプレイ向けに変換します。これは、テレビがモーションスムージングとして適用するものと同じ動きの補間です。
- アニメーション:補間モデルは手描きのキーフレーム間の絵を生成します。また、動画生成モデルは、指定された2つのフレームで始まり終わるクリップ全体を生成できます。
物体追跡では、同じ考え方をピクセルではなく位置に適用します。物体が数フレーム隠れたあとに再び現れると、UltralyticsのOC-SORTトラッカーは追跡モード(tracker="ocsort.yaml")で見失ったフレームの仮想ボックスを線形補間し、カルマンフィルターに通して再処理します。これにより、物体を次のYOLO26検出に対応付ける際に使う速度推定を修正します。










