[FILM] 動かしながらざっくり理解するフレーム間の中間画像生成

2022年2月17日木曜日

Artificial Intelligence

本記事では、FILM: Frame Interpolation for Large Motionと呼ばれる機械学習手法を用いて、フレーム間の中間画像を生成する方法を紹介します。

アイキャッチ
出典: google-research/frame-interpolation

FILMとは

FILM: Frame Interpolation for Large Motionとは、2022年2月にGoogle Researchより論文発表された2つの入力画像から複数の中間フレームを合成するフレーム補間アルゴリズムです。

上図をご覧いただくとイメージしやすいかと思いますが、FILMは2つの入力画像が与えられると、
その間を自然に繋ぐ画像を予測し合成します(フレーム補完)

従来手法では、複数のネットワークを使用して最適化、深度推定を行い、フレーム合成専用の個別のネットワークを使用していました。 この手法では、深度のground-truthを必要としていました。

FILMでは、すべてのスケールで重みを共有し、フレームのみからトレーニング可能なマルチスケール特徴抽出器によって区別される単一の統合ネットワークを提案しています。また、鮮明なフレームを合成するために、特徴マップ間の相関差を測定するグラム行列損失を使用してネットワークを最適化しています。

論文中では、Xiphラージモーショションベンチマークの最先端の方法よりも優れており、知覚損失を使用する方法と比較した場合、Vimeo-90K、Middlebury、およびUCF101でより高いスコアを達成していると言及されています。

出典: google-research/frame-interpolation

デモ(Colaboratory)

それでは、実際に動かしながらFILMのフレーム補完を行っていきます。
ソースコードは本記事にも記載していますが、下記のGitHubでも取得可能です。
GitHub - Colaboratory demo

また、下記から直接Google Colaboratoryで開くこともできます。
Open In Colab

なお、このデモはPythonで実装しています。
Pythonの実装に不安がある方、Pythonを使った機械学習について詳しく勉強したい方は、以下の書籍やオンライン講座などがおすすめです。

環境セットアップ

それではセットアップしていきます。 Colaboratoryを開いたら下記を設定しGPUを使用するようにしてください。

「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更

はじめに、GitHubからソースコードを取得します。

%cd /content/

!git clone https://github.com/google-research/frame-interpolation frame_interpolation


%cd /content/frame_interpolation
# Commits on Jan 14, 2023
!git checkout 69f8708f08e62c2edf46a27616a4bfcf083e2076

FILMの動作に必要なライブラリをインストールします。
requirement.txtをそのままpip installすると推論時にエラーになるためColaboratoryにインストールされていないライブラリのみインストールします。

%cd /content/frame_interpolation

!pip install apache-beam==2.48.0 mediapy==1.1.8
!apt-get install ffmpeg
!pip install --upgrade gdown

以上で、環境のセットアップ完了です。

学習済みモデルのセットアップ

論文発表元から公開された学習済みモデルを使用します。
gdownでプログラム上からColaboratory環境に直接ダウンロードします。

%cd /content/frame_interpolation
!mkdir pretrained_models

!gdown https://drive.google.com/drive/folders/131_--QrieM4aQbbLWrUtbO2cGbX8-war -O ./pretrained_models --folder
!gdown https://drive.google.com/drive/folders/1gKgBfCQyOeweALLf7YAzWqh3ZkPgu5e5 -O ./pretrained_models --folder

1枚の中間画像生成

それでは、さっそく中間画像を生成してみましょう。
まず、2つの入力画像から中間画像を1フレーム分のみ生成してみます。

%cd /content/frame_interpolation

!python3 -m eval.interpolator_test \
     --frame1 ./photos/one.png \
     --frame2 ./photos/two.png \
     --model_path ./pretrained_models/Style/saved_model \
     --output_frame ./photos/middle.png

結果は以下の通りです。
frame1, frame2の中間画像middleが生成されました。

中間1フレーム生成

複数枚の中間画像生成

次に、中間画像となるフレーム画像を複数枚生成し、フレーム画像をつなげて動画を作成します。
まず、入力画像となる2枚のフレーム画像を動画から切り出します。

%cd /content/frame_interpolation/
!mkdir -p videos/frames
%cd videos

from google.colab import files

uploaded = files.upload()
uploaded = list(uploaded.keys())
file_name = uploaded[0]

本記事では、Pixabay様の動画を使用させていただきます。

Colaboratoryにアップロードした動画をフレーム画像に切り出します。

%cd /content/frame_interpolation/videos

!ffmpeg -i {file_name} /content/frame_interpolation/videos/frames/frame_%d.png

切り出したフレーム画像の1フレーム目と、15フレーム目をモデルに入力して、中間フレームを生成させてみます。

# frame_1からframe_15の中間フレームを補完させる
!rm -rf /content/frame_interpolation/videos/target_frames
%cd /content/frame_interpolation/videos
!mkdir target_frames
!cp frames/frame_1.png target_frames
!cp frames/frame_15.png target_frames

使用するフレーム画像は以下の通りです。

入力フレーム画像

上記フレーム画像の中間フレーム画像を生成します。

%cd /content/frame_interpolation

!python3 -m eval.interpolator_cli \
     --pattern "/content/frame_interpolation/videos/target_frames" \
     --model_path ./pretrained_models/Style/saved_model \
     --times_to_interpolate 6 \
     --output_video

結果は以下の通りです。

複数枚の中間フレーム補完

非常に自然にフレーム間を繋げていることが確認できます。

まとめ

本記事では、FILMを用いてフレーム間の中間画像を生成する方法をご紹介しました。
2枚の写真から動画を生成したり、一部が欠損している昔の動画の復元などに活用できそうですね。
これを機に機械学習に興味を持つ方が一人でもいらっしゃいましたら幸いです。

また本記事では、機械学習を動かすことにフォーカスしてご紹介しました。
もう少し学術的に体系立てて学びたいという方には以下の書籍などがお勧めです。ぜひご一読下さい。


また動かせるだけから理解して応用できるエンジニアの足掛かりに下記のUdemyなどもお勧めです。

参考文献

1.  論文 - FILM: Frame Interpolation for Large Motion

2. GitHub - google-research/frame-interpolation

AIで副業ならココから!

まずは無料会員登録

プロフィール

メーカーで研究開発を行う現役エンジニア
組み込み機器開発や機会学習モデル開発に従事しています

本ブログでは最新AI技術を中心にソースコード付きでご紹介します


Twitter

カテゴリ

このブログを検索

ブログ アーカイブ

TeDokology