はじめに
スマホで撮影した動画から3DGSを作成する際、映り込んでしまった人物が「影のような存在」として3Dモデルに残ってしまう問題に直面しました。
この記事では、マスク処理を使って人物を除去する3つの方法を試行錯誤した記録をまとめます。
まだ始めたばかりなので間違っているかもしれませんが、参考になれば幸いです。
ちなみに私の3DGSのワークフローや環境は以下の記事に書いています。(スマホ動画撮影 → ffmpegで切り出し → COLMAP → LichtFeld Studioで3DGS生成)
方法1:アルファ画像を作成して使う
ffmpegで動画から切り出した画像に対して、人物など消したい部分を特定し透過させ、LichtFeld Studioに読み込ませる方法です。
Step1:アルファ画像の作成
こちらのGUIツールを使ってみました!Mask2Formerを使っているようです。
WinRARで解凍してくださいとありますが、7-Zipでも解凍できました。
ツールを起動すると、以下のようなインターフェースが表示されます。
デフォルト設定で書き出すと、きれいに人物が透過されました。
気づいた点:
- 空の塗りつぶしは不要
- バッグなど持ち物も一緒にマスクする必要あり
下記画像は人物だけにした場合で、バッグが残ってしまっています
Step2:COLMAPでの処理
Step1で出力された画像をそのままCOLMAPに書けます。
ただし、COLMAPからのUndistortion出力時にアルファ部分が黒に塗りつぶされてしまいます。
このままだとLichtFeld Studioでアルファマスクとして認識できず、人物が黒いもやとして残ってしまいます。
解決策:COLMAP出力の画像を置き換える
そこで以下の手順を試しました。
- アルファ画像でCOLMAPを実行
- 出力されたCOLMAP結果の中の
imagesフォルダ内の画像(アルファ部分が黒くなっている)を、元のアルファ画像群に置き換える - LichtFeld Studioで読み込んでトレーニング
Step3:LichtFeld Studioでの処理
LichtFeld Studioで読み込む際の設定は以下の通りです。
- Mask Mode: 無視
- アルファマスク: ON
結果:
足元に少し黒いものが残っていますが、おおむねきれいに人物を消すことができました。
人物ありデータとの比較:
注意点:Mask Modeは「無視」を選択
間違えてMask Modeを「セグメント」にすると、人物がいた奥の領域が透明になってしまいました(下記は背景を黄緑にして分かりやすくしています)。
「無視」に設定すると、ちゃんと背景が埋まります。
セグメントモードはマスクを残したい部分(オブジェクトなど)にかけて、それのみを残す場合に使われるようです。
詳しくは公式のYouTubeが分かりやすいです。
方法2:白黒マスク画像を作成して使う
白黒のマスク画像を作成し、COLMAPとLichtFeld Studioの両方でマスク情報を活用する方法です。
Step1:白黒マスク画像の作成
こちらのツイートをまねして、方法1のStep1で使ったBoothのソフトを改変することにしました。
AIに頼んで機能追加できました。
これで白黒マスク画像が作成できました。黒い部分(人物)がマスクされ、白い部分が残ります。
参考:360度画像の場合
360度画像の特定領域を白黒化する場合は、以下のツールも使えるかな~と思います(今回は使用していません)
Step2:COLMAPでマスク適用
人物が映っている元の画像群をCOLMAPで読み込み、feature extractionのmask_pathに白黒マスク画像のフォルダパスを指定します。
あとは通常通りCOLMAPを実行してください。
Step3:LichtFeld Studioでの処理
出力されたCOLMAPのフォルダに、マスク画像をmasksという名前で追加します。
LichtFeld Studioで読み込むと、マスク画像が認識されていることが確認できます。
画像サイズの問題と解決策
最初、画像サイズが合わずインポートに失敗しました。
調べたところ、COLMAPでUndistortionを実行するたびに画像サイズが微妙に変わっていました。
- 今回COLMAPにインプットした画像:2169x3897
- COLMAPから出力されたimages:2161x3883
解決策として、COLMAP出力もマスク画像もすべて1920x1080に統一しました。
私はLichtFeld Studioでの処理の時、メモリの関係でMaxWidthをいつも1920に下げていましたが、どのみちマスクを使う場合はLichtFeld StudioでMaxWidthなどをいじらない方が良いようなので、この方法で問題ありませんでした。
このように、画像を選んでMを押すと、マスクが適用されているか画像ごとに確認できます。
トレーニング時の設定:
- Mask Mode: 無視
- アルファマスク: OFF
結果:
人物をきれいに消すことができました!
方法3:塗りつぶして使う
マスクするのではなく、人物を消してAIの力で塗りつぶしてしまう方法です。
Step1:アルファ画像の作成
人間の部分を塗りつぶすのに、アルファ画像を入力とできるので、方法1のStep1と同じように人間部分を抜いたアルファ画像を作成してください。
Step2:塗りつぶし処理
diffusers(イマイチ)
有名なStable Diffusionを使って部分塗りつぶし(inpainting)をしてみます。
Stable DiffusionにはPythonから扱えるdiffusersライブラリ、GUIのStable Diffusion WebUI、ノードで操作できるComfyUIなどがあるようです。
500枚ほど処理する必要があるため、バッチ処理しやすそうなdiffusersを試してみました。
Clineに構築を頼んで実行しましたが、あまりきれいに消えませんでした。
問題点:
- 人物がいた部分に看板などが生成されることがある
- 不自然な補完が多い
良くてもこのレベル:
設定を変えればよくなるのかもしれませんが、あまり深くためしていません。
参考:Stable Diffusion WebUI
ツールによって結果が変わるのかよくわかりませんが、Stable Diffusion WebUIのinpaintingの例を見ても、あまりきれいな結果ではありませんでした。
Stable Diffusion WebUIでも、バッチ処理で大量の画像も処理できるようですが、環境構築に手間取ったため今回は試していません。
LaMa
塗りつぶしに特化しているモデルです。
思ったほどきれいではありませんが、変なものが生成されずに塗りつぶすことができました。
ぼやっとしている部分が塗りつぶした人物です。
Step3:COLMAPとLichtFeld Studioでの処理
LaMaで塗りつぶした画像を通常通りCOLMAPとLichtFeld Studioで処理します。
結果:
3DGSでもぼやっと表示されてしまいました。塗りつぶしの品質がそのまま反映されます。
まとめ
3つの方法を試した結果、方法2:白黒マスク画像を使う方法が最もきれいな結果となりました。
| 方法 | メリット | デメリット | 結果の品質 |
|---|---|---|---|
| 方法1:アルファ画像 | 手軽に試せる | COLMAPで画像の置き換えが必要 | ⭐⭐⭐⭐ |
| 方法2:白黒マスク画像 | 最もきれい、COLMAPでも活用可 | LichtFeld Studio前に画像サイズの調整が必要 | ⭐⭐⭐⭐⭐ |
| 方法3:塗りつぶし | COLMAPとLichtFeld Studioでの操作がシンプル | 画像処理に時間がかかる、AIによって品質が変わる | ⭐⭐⭐ |
もちろん、塗りつぶしツールの精度を上げれば、方法3もより良い結果が得られる可能性があります。
同じ課題に直面している方の参考になれば幸いです!



























