Robust Video Mattingによる背景透過
背景が緑一色の動画を作成できれば あとはアマレコVRのクロマキー合成により自動背景透過と同様の効果が得られます。
アマレコVRの自動背景透過は 固定カメラ、安定した照明、適度に被写体が動くなどかなり使用できる条件が限られますが、
RVMでは画像に映っている人物を検出する方式のため、背景が動いていてもほぼ影響無く幅広いシーンでの活用が期待できます。
・Robust Video Matting
https://github.com/PeterL1n/RobustVideoMatting
・RVM使用例
https://www.youtube.com/watch?v=VL-0K6HjhvQ
■テスト
次のサンプル動画(640x360)を上記使用例に沿ってRVMで処理
https://pixabay.com/ja/videos/%E3%82%AF%E3%83%AA%E3%82%B9%E3%83%9E%E3%82%B9-x-%E7%B7%9A%E3%83%9E%E3%82%B9-%E5%86%AC-57916/
作成された動画
http://www.amarectv.com/download/2180763146santa.mp4
アマレコVRへ簡易クロマキー合成を実装し試した結果はこのようになります。

■課題
被写体が緑になる(曖昧な部分を半透明にするため?)
RVMの方で完全な透明か不透明の2値で処理してほしい
輪郭が緑になったり背景にできる影などはアマレコVRの方で何とかできるかもしれませんが
被写体内部まで緑になってしまうのは辛い
VR動画の左右の画像で異なる結果となってしまう
右眼に映る人は服着ているけど、左眼は服が透明になってしまうケースがある
■精度
RVMのデモとして公開されている動画と比べ
私のところで作成できたものはひどい結果のように見えます。
python、pytorch、RVMいずれも初めてなので私が上手くできていない可能性が
高いと思われますので上記サンプル動画をRVMで処理してもっとうまくできるよ
というのがありましたら アドバイス頂けるとありがたいです。
(うまく処理できている結果を見せていただければ もう少し頑張ってみようと思います)
- 関連記事
-
- アマレコVR Ver2.1.1 パススルー実験版 アルファ2 公開
- アマレコVR パススルー実験版 アルファ3 予告 VRonVR
- アマレコVR Ver2.1.2 VRonVR 試作版 公開
- アマレコVR アルファ3 進捗
- アマレコVR Ver2.1.3 アルファ3 VRonVR 公開
- アマレコVR Ver2.1.4 画像解析処理による背景透過 試作版 公開
- アマレコVR Ver2.1.5 アルファ5 背景透過試作版 第二弾 公開
- Robust Video Mattingによる背景透過
- アマレコVR Ver2.1.7 アルファ7 画像処理完成版 公開
- Meta Quest ファイルマネージャ系アプリを使ったアマレコVRのインストール
- Meta Questで60fpsの動画を再生した場合について
- Meta Quest Hand Tracking 2.0 ハントラ精度向上
- アマレコVR Ver2.2.0概要
- アマレコVR ver2.1.8 for Pico4 動作確認版
- アマレコVR Ver2.2.0 ベータ版 公開
trackback
コメントの投稿
No title
すでに把握されているかもしれませんが、緑の2値化はpythonのスクリプトをちょっと書き換えれば可能です。
inference.pyの135行目の com = fgr * pha + bgr * (1 - pha)
を例えば
com = fgr * (pha >= 0.5)+ bgr * (pha < 0.5)
みたいな感じで閾値判定させるのが簡単だと思います(閾値は0~1の間)
閾値は、被写体内部を消しすぎないよう0.1ぐらいの低めの設定がよさそうです。
2値処理だと境界が多少荒くなると思いますので、アマレコ側でご実装いただける場合は何らかのスムージングが望ましいかもです。
(単色緑をピックアップ->ぼかしフィルタ->アルファ値として透過処理)
RVM側で--output-alphaオプションにより、アルファ値の動画を出力できるので、
そのアルファ値動画を本編動画と同時にリアルタイムに読み込んで透過処理、のような方法もありかもでしょうか。
もしくはアマレコVRの独自フォーマットとして、L/R/アルファを並べた動画に対応、とかも良さげです。
(勝手なことをばかり言ってすみません。。)
精度としては、得手不得手はありそうですが(サンタ動画はかなり難易度高そうです・・)、
自分の手持ちの動画は、デモ動画同等とは言えないまでも、実用的なレベルで判定できてる感じします。
体の一部が消去することはありますが、被写体の動きが激しい時も、静止状態に近い時も、比較的安定して検出できてる印象です。
自分のほうでは、アマレコVR Ver2.1.5 アルファ5で効果を確認するため、
1) RVMにより、手持ちのVRサンプル動画の背景色を目立ちにくい白で塗りつぶし(115行目のRGB値を[255,255,255])
2) その後、アマレコVRで再生。自動背景透過処理をオン(ぼかし時間0、閾値大)
3) 塗りつぶした単色背景がアマレコ透過処理によりいい感じに消されることを期待
で検証してみましたが、VR映像の人物実在感が非常に高まり、大変衝撃を受けました。正直未来を感じました。
背景色の白が被写体輪郭で少し残るので、被写体が発光してる感じに見えるのが若干残念ですが、
色指定で透過処理ができるようになると、どんなVR体験ができるか非常に楽しみです。。。
背景透過についてはRVM以外のアルゴリズムもあるようなので、時間ができたらほかのものも試してみたいと思います。
Re: No title
RVMの根本的なこととして
「こういう画像を人物として認識してください」と登録する(AIに覚えてもらう)作業が必要でしょうか?
githubから入手できるデータは基本的なもの(モデル?)なので
私が扱いたい動画の内容と合わない場合もありうるのかなと思っています。
しゅうさんの方では そういった作業込みで良い結果が出ているのでしょうか?
それともgithubから入手できるデータのみで上手くできているのでしょうか。
https://twitter.com/i/status/1458166464339484677
これくらいまで出来たらと夢見てしまいます。
アマレコVR Ver2.1.6 クロマキー合成テスト版
http://www.amarectv.com/download/AmaRecVR216a6.zip
メイン画面設定の画像処理メニューから「クロマキー合成」を選択してください。
クロマキー合成を選択すると 同じメニューからクロマキー合成のパラメータを設定できます。
背景色
RVMの初期背景色は青緑に該当します。
背景色自動でも使えますが、赤い服を着た人がカメラへ近づいて画面全体が赤くなると
背景色が赤と判断されてしまう場合があります。
背景閾値
背景色と近い色を透明にする際の閾値です。
低いと背景に影があった場合に 影が見えてしまいます。
高いと被写体の一部が透明になってしまいます。
輪郭サイズ
輪郭部から背景色を除いて半透明にする領域を設定します。
No title
twitterの動画ぐらいの品質であれば十分出せると思います。
見栄え良いですが、拡大・スロー再生してみると、時々足先とか手先が消えていて、自分の環境と同じぐらいの品質です。
自分も同じ動画でちょっと試してみました→ https://imgur.com/a/EtRlaYX
以下のサイトでもRVM検証されてる方いますが、自分の環境でも同程度の精度だと思います。
http://cedro3.com/ai/rvm/
基本的にはgithubで提供してる学習済みモデルをそのまま使えば大丈夫で、自分含め他の方も提供されてるモデルをそのまま使ってると思います。
自分の動画のコンテンツにがっちり最適化したモデルが欲しい場合には、提供モデルを初期値に追加データを学習させてファインチューニングしてあげると良さそうですが、そこまで試してる人は今のところ作者以外はいないと思います。
データを用意するのが大変なので、時間があるときに検証してみたいです。
Re: No title
憂鬱でしたが、提供されているモデルを使用しているとのことで再び試してみました。
ビートセーバーのプレイ動画
部屋のシーンは同じようにうまくできました。
RVMで初めて実用的な結果が得られホッとしました。
スクリプトのアルファ値
教えていただいた箇所で意図した結果がえられました。
指摘されている通り輪郭の整形が必要ですね。
Re: Re: No title
画像処理でクロマキー合成を選択していない状態でメインプレイヤーの次のファイルを再生すると
メインプレイヤーが使えなくなる
クロマキー合成のテストと割り切って常にクロマキー合成を有効にした状態で使って下さい。
No title
テスト版の一部不具合についても情報提供まことにありがとうございます。
VR動画をRVMで背景判定する際は、左右の絵で別々のモデルで処理させた方が若干良い結果得られました。
fgr, pha, *rec = model(src[:,:,:,0:int(H/2),:], *rec, downsample_ratio)
fgr2, pha2, *rec2 = model2(src[:,:,:,int(H/2):H,:], *rec2, downsample_ratio) ←これを追加するイメージです。
VR動画だと一般の平面動画に比べて、被写体の一部が時々消える頻度は若干高い気がします。Python側でどうにか改善を試みたいところです(具体的なアイデアはまだないですが・・)
テスト版のご提供・不具合のご連絡まことにありがとうございます。
テスト版でVR動画を試したところ、時代の最先端を感じました。今は別ツールのRVM変換のひと手間はありますが、期待に近い結果で、ひと手間かける価値は十分あると感じました。
今でも非常にすばらしい動作ですが、改良点とすればやはりRVMアルファ2値化による輪郭部分の見栄えでしょうか。
(2値化により輪郭が荒くなる&境界部分は色が混ざり若干背景色が残る)
RVM出力のアルファ値動画を本編動画と同時に読み込み、そのアルファ値をもとに透過処理するのが見栄えとしては現状ベストな気がしますが、二つの動画で同期をとるのはやはり難しそうな感じでしょうか。。
Re: No title
なるほど そんな使い方ができるんですね 今度試してみます。
輪郭処理、二値化、アルファチャンネル
まずはRVMを二値で処理して、あとはアマレコVR側の輪郭処理をもう少し
上手くできないか試みたいと思います。
最終的には、RVMの処理で輪郭部だけアルファ値を使って背景色を乗せられたら
いいなと思っています。それをアマレコVR側で読み取れれば理想ですね。
この方向で考えています。
オリジナル画像とアルファマットを並べて一つの動画に仕上げる案は
仕組みとしては確実ですね
他の案でどうにもならなかった場合の奥の手と思っています。
別々の動画2つを再生するのは、おっしゃる通り同期をとるのが困難と思われますので
無理としましょう。