FILMによる動きの大きいフレーム間の高品質な補間(Frame interpolation)

この記事では、FILMによって、連続したビデオフレームとは異なるような差分の大きいフレーム間でも滑らかに補間する方法を紹介します。

FLIMとは

FILM(Frame Interpolation for Large Motion)は、画像間、特に動きの大きい画像間を滑らかに補間するための手法です。

まずは、イメージをつかむために、公式プロジェクトページのサンプル動画をご覧ください。

かなり自然に補間されています。

続いて、フレームワークの概要です。

FILMは、2枚の画像から特徴量を抽出するFeature Extraction、画像間のピクセルレベルの対応関係を推定するFlow Estimation、補間イメージを生成するFusionの3要素で構成されています。

従来手法との大きな違いは、「高い解像度における大きな動きは、低い解像度における小さな動きと同視できる」という直感的な仮定のもの、スケールを下げながら生成される特徴量ピラミッド間において重みを共有することにより、スケールに依存しない動きの推定を可能にした点にあります。

この仕組みにより、FILMは比較的小さな動きだけでなく、大きな動きに対しても最良の補間結果を実現しています。

デモ

それでは、Google Colaboratoryを使って実際に実行していきます。

なお、記事内で紹介したコードをすべて含むノートブックは、以下のリンクから直接参照することができます。

Open In Colab

環境設定

はじめに、画面上部のメニューから、「ランタイム」、「ランタイムのタイプを変更」と進み、「ハードウェアアクセラレータ」を「GPU」に変更しておきます。これにより、推論時にGPUを利用することができます。

※ 2022年10月よりGoogle Colaboratoryの料金プランがこちらの内容に変更されました。ご利用の際はご注意ください。

続いて、リポジトリのクローン、ライブラリのインストール・インポート、学習済みモデルのダウンロードを行います。

import os
from pathlib import Path

# リポジトリのクローン
if not Path('./frame-interpolation').exists():
    !git clone https://github.com/pytti-tools/frame-interpolation

# ライブラリのインストール・インポート
try:
    import frame_interpolation
except ModuleNotFoundError:
    %pip install -r ./frame-interpolation/requirements_colab.txt
    %pip install ./frame-interpolation

# 学習済みモデルのダウンロード
share_id = '1GhVNBPq20X7eaMsesydQ774CgGcDGkc6'
local_path = '/content'
if not (Path(local_path) / 'saved_model').exists():
    !pip install --upgrade gdown
    !gdown --folder {share_id}

次に、推論対象の画像をアップロードします。任意のフォルダを作成し、画像を格納しておきます。

frames_dir = 'frames'
!mkdir -p $frames_dir

モデル設定

パラメータを設定します。アップロードしたフレーム数を n、recursive_interpolation_passesを kとすると、補間後のフレーム数は 2^k (n-1) -1となります。output_videoを有効にすると、output_video_fpsに従って動画が出力されます。

recursive_interpolation_passes = 1
output_video = True
output_video_fps = 30

推論

補間を実行します。frames_dir下に結果が保存されます。

from loguru import logger

logger.info("Beginning interpolation...")

if output_video:
    !python -m frame_interpolation.eval.interpolator_cli \
            --model_path ./saved_model \
            --pattern {frames_dir} \
            --fps {output_video_fps} \
            --output_video
else:
    !python -m frame_interpolation.eval.interpolator_cli \
            --model_path ./saved_model \
            --pattern {frames_dir} \

logger.info("Interpolation comlpete.")

まずはサンプル画像に対する結果です。入力はこちらの2枚です。

補間結果がこちら。

言われてもまったく気づかないレベルで自然に補間されていることが分かります。

次に、Stable Diffusionで生成した画像を以下の記事の方法で動画化し、動画の離れた2フレーム間を対象として試してみます。

入力フレームはこちらの2枚です。

結果がこちら。

こちらも割と自然に繋がっているのではないでしょうか。

色々な用途に使えそうです。

参考文献

FILM: Frame Interpolation for Large Motion