1.はじめに
通常、動画の背景を後で編集したい場合は、その動画を撮影するときに背景をグリーンバックにしますが、これは結構面倒です。そこで、今回ご紹介するのは、撮影済みの動画の背景をグリーンバックに変更するRVMという技術です。
*この論文は、2021.8に提出されました。
2.RVMとは?
下記が、RVM(Robust Video Matting)のアーキテクチャーです。大きく分けると3つの部分で構成されていて、エンコーダー(Encoder)、リカレントデコーダー(Recurent Decoder)、アップサンプラー(Upsampler)です。
エンコーダーは、人の検出用にMobileNetV3-Largeを使い、そして人の領域検出用にLR-ASPPモジュールを使うことで、特徴量を抽出します。
リカレントデコーダーは、設定した間隔毎にメモリープールに新たな情報を加え古い情報を削除するこことで、メモリープールに常に一定の情報を蓄えます。そのメモリープールの情報に対してConvGRUを使った反復メカニズムで予測精度を上げています。
アップサンプラーは、リカレントデコーダーと入力情報を統合してグリーンバックの動画を生成します。
それでは、早速動かして見ましょう。
3.コード
コードはGoogle Colabで動かす形にしてGithubに上げてありますので、それに沿って説明して行きます。自分で動かしてみたい方は、この「リンク」をクリックし表示されたノートブックの先頭にある「Colab on Web」ボタンをクリックすると動かせます。
まず、セットアップをおこないます。
1 2 3 4 5 6 7 8 9 10 |
# pytorchバージョン変更 ! pip install torch==1.8.0 torchvision==0.9.0 # ライブラリー・インストール ! pip install --quiet av pims # モデル構築 import torch model = torch.hub.load("PeterL1n/RobustVideoMatting", "mobilenetv3").cuda() # or "resnet50" convert_video = torch.hub.load("PeterL1n/RobustVideoMatting", "converter") |
次に、グリーンバックにしたい動画をアップロードします。次のブロックを実し、自分のPCに保存されているmp4動画を選択します。アップロードが完了すると、動画の名称が自動的にinput.mp4に変更されます。
まず、サンプル動画でやってみるので、とりあえず次のブロックはパスします。
1 2 3 4 5 6 7 |
import os from google.colab import files uploaded = files.upload() # Use colab upload dialog. uploaded = list(uploaded.keys()) # Get uploaded filenames. assert len(uploaded) == 1 # Make sure only uploaded one file. os.rename(uploaded[0], 'input.mp4') # Rename file to "input.mp4". |
それでは、サンプル動画input.mp4をダウンロードします。
1 2 |
import gdown ! gdown https://drive.google.com/uc?id=1I0v72-hNlK1hm9q1OwyaATUYApXpotS6 -O input.mp4 |
そして、動画をグリーンバックに変更します。グリーンバックにした動画は、com.mp4として保存されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
convert_video( model, # The loaded model, can be on any device (cpu or cuda). input_source='input.mp4', # A video file or an image sequence directory. downsample_ratio=None, # [Optional] If None, make downsampled max size be 512px. output_type='video', # Choose "video" or "png_sequence" output_composition='com.mp4', # File path if video; directory path if png sequence. output_alpha="pha.mp4", # [Optional] Output the raw alpha prediction. output_foreground="fgr.mp4", # [Optional] Output the raw foreground prediction. output_video_mbps=4, # Output video mbps. Not needed for png sequence. seq_chunk=12, # Process n frames at once for better parallelism. num_workers=1, # Only for image sequence input. Reader threads. progress=True # Print conversion progress. ) |
変換した動画を見てみましょう。
1 2 3 4 5 6 7 8 9 |
from IPython.display import HTML from base64 import b64encode mp4 = open('./com.mp4', 'rb').read() data_url = 'data:video/mp4;base64,' + b64encode(mp4).decode() HTML(f""" <video width="70%" height="70%" controls> <source src="{data_url}" type="video/mp4"> </video>""") |
完成度は割と高いと思います。それにしても撮影済みの動画をグリーンバックに変更できるのは便利ですよね。
(オリジナルgithub)https://github.com/PeterL1n/RobustVideoMatting
(twitter投稿)
cedro様
Sample Videoをダウンロードしても、「変換の実行」の[4] convert_video()の最後のコマンドのprogress=Trueでエラーとなります。どうしてでしょうか?
Masaru narazaki さん
今こちらで、やってみましたがエラーの再現が出来ませんでした。
考えられるのは、サンプルビデオのダウンロードが上手く行かなかったこと。
オプション2を再度実行し、ダウンロードされたことを確認してから、「変換の実行」を試してみて下さい。
cedro様
ありがとうございます。先刻、サンプルビデオ、自分のビデオを実行したところ、ともにうまく行きました。