画像や動画から人物の切り抜きができる「Matting」について初心者向けに紹介します。

今回はRobust Video Mattingの公式チュートリアルに沿って実装してみましょう。

実際に画像や動画から人物の切り抜きを試していきます。

Google colabを使用して簡単に実装することができますので、ぜひ最後までご覧ください。

今回の目標

・Robust Video Mattingの概要を学ぶ

・Robust Video Mattingの実装方法を学ぶ

・オリジナル画像と動画から人物切り抜きしてみる

Matting技術とは

画像や動画から前景を抽出し、背景と分離するタスクをAlpha Mattingと言います。

画像から前景のAlpha値を抽出する処理をMattingと呼び、 Alpha値を各画素に持つ画像をAlpha Matteと言います。

Matting技術により、グリーンバック等の特殊な撮影環境でなくても背景と全景を分離することができるようになります。

Robust Video Matting (RVM)とは

今回紹介するRobust Video Matting (RVM)は2021年8月に公開された、軽量なMattingのモデルです。

公式のデモGIFを紹介します。

引用:https://github.com/PeterL1n/RobustVideoMatting

Nvidia GTX 1080TiGPUで76FPSの4K104FPSのHDを処理できる性能を誇ります。

ビデオの時間情報を活用するために反復アーキテクチャを使用し、マット品質の大幅な改善を実現しています。

トライマップや背景画像などを必要としないため、既存の人間のマットアプリケーションに広く適用できます。 

Robust Video Matting (RVM)の導入

それでは早速、Robust Video Mattingを使用するための準備をしていきましょう。

ここからはGoogle colabを使用して実装していきます。

なお、以下のボタンからコードをコピーして使用していただくことも可能です。

Open In Colab

from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive
!git clone https://github.com/PeterL1n/RobustVideoMatting
%cd RobustVideoMatting

次に必要なライブラリをインストールします。

!pip install -r requirements_inference.txt

これでRobust Video Mattingを使用する準備が完了しました。

次に学習済モデルを用意します。

!wget https://github.com/PeterL1n/RobustVideoMatting/releases/download/v1.0.0/rvm_mobilenetv3.pth

合わせてデモ用の動画も用意します。

!gdown https://drive.google.com/uc?id=1I0v72-hNlK1hm9q1OwyaATUYApXpotS6 -O input.mp4

以上で準備が完了しました。

Robust Video Matting (RVM)を実行

それでは早速チュートリアルを実行してみましょう。

まずは先ほどダウンロードしたモデルを読み込みます。

import torch
from model import MattingNetwork

model = MattingNetwork('mobilenetv3').eval().cuda()
model.load_state_dict(torch.load('rvm_mobilenetv3.pth'))

いよいよRobust Video Mattingを実装します。

引数についていくつか紹介します。

まずは input_source=’input.mp4′ で入力動画を指定します。

次に出力する動画のファイル名を指定します。

それぞれの動画は出力結果で確認をしてみましょう。

output_type=’video’ は動画で出力するか、画像として出力するかを選択できます。

画像で出力を選択するとフレームごとの画像が出力されますので、ドライブの容量に注意しましょう。

from inference import convert_video

convert_video(
    model,
    input_source='input.mp4',
    output_type='video',
    output_composition='com.mp4',
    output_alpha="pha.mp4",
    output_foreground="fgr.mp4",
    output_video_mbps=4,
    downsample_ratio=None,
    seq_chunk=12,
)

#input_source:入力動画
#output_type:"video"か"png_sequence"を選択(png_sequenceとすると画像が出力される))
#output_composition:Matting動画
#output_alpha:Mask動画
#output_foreground:前景予測動画
#output_video_mbps:動画のmbpsを指定
#downsample_ratio:ハイパーパラメータの調整有無を指定
#seq_chunk:一度にnフレームを処理する

処理が終わると、元動画と同じ場所に結果の動画が出力されます。

オリジナル動画で人物切り抜きしてみる

つづいてオリジナル動画で人物切り抜きしてみましょう。

まずは動画を用意しましょう。

今回はこのフリー動画を使用します。

動画が用意できたら先ほどと同様に実行しましょう。

動画名は変更しても問題ありません。

from inference import convert_video

convert_video(
    model,
    input_source='input2.mp4',
    output_type='video',
    output_composition='com2.mp4',
    output_alpha="pha2.mp4",
    output_foreground="fgr2.mp4",
    output_video_mbps=4,
    downsample_ratio=None,
    seq_chunk=12,
)

先ほどと同様に動画が保存されました。

以下のようにオリジナル動画からでもマスク動画を作成することができました。

参考までに出力されたそれぞれの動画は以下の通りまとめています。

マスク画像を出力する

最後に画像出力する方法を紹介します。

output_typeを’png_sequence’とすることで画像出力されます。

フレームごとの画像が出力されるため、データ数が膨大となりますのであらかじめフォルダを作成しておきましょう。

画像出力とする際は、output_composition,output_alpha,output_foregroundを出力先とします。

from inference import convert_video

!mkdir output_composition
!mkdir output_alpha
!mkdir output_foreground

convert_video(
    model,
    input_source='test_input2.mp4', 
    output_type='png_sequence',
    output_composition='output_composition',
    output_alpha="output_alpha",
    output_foreground="output_foreground",    
    output_video_mbps=4,
    downsample_ratio=None,
    seq_chunk=12,
)

無事に画像が出力されました。

参考にそれぞれの画像を掲載します。

まとめ

最後までご覧いただきありがとうございました。

今回はRobust Video Mattingで高解像度動画からリアルタイムで人物切り抜きを試してみる方法を紹介しました。

簡単にMattingを実装することができましたね。

なお、 このブログでは他にもMattingする技術も紹介していますので、ぜひご覧ください。

コメントを残す