自己紹介
名城大学理工学研究科メカトロニクス工学専攻修士2年のAsterです.
現在デジタルフロンティア様にて,NeRF・3DGS検証業務を行っています.検証の目的は,将来的に実写映像作品に3DGSを活用できないか検討することで,今回の検証はそのための第一歩となります.
2023年5月から約2年間行ってきた3DGS検証に関して記事にしました.
ぜひ見てくだされば嬉しいです.
※本記事に記載されている情報は,著者および関係者の知識と経験に基づいて提供されているものであり,正確性や完全性を保証するものではありません.記事の内容に基づくいかなる行動も,読者自身の責任で行ってください.また,技術や規格は常に進化しており,この記事の情報は執筆時点のものであることをご了承ください.最新の情報を確認するためには,公式ドキュメントや信頼できる情報源を参照することをお勧めします.
3次元再構成までの一連の流れ
NeRF/3DGSを用いて,新たな角度からの画像を生成する手順は以下のとおりです.
- 撮影(Input Images): 物体をさまざまな角度から撮影し,複数の画像を取得する
- カメラの位置・姿勢の推定(Structure from Motion: SfM): 撮影した画像から,カメラの位置と向きを推定する
- NeRF/3DGSの学習 : 画像と推定したカメラの情報を用いて,NeRFまたは3D Gaussian Splatting(3DGS)を学習させる
- 3Dシーンの再構成と新たな視点の生成 : 学習したRadiance Fieldsを用いて,3Dシーンを再構成し,任意の視点からの画像を生成する
NeRFや3DGSの概要については,前回記事にしたこちらの記事をご覧ください.
2025年3月時点での高品質な3次元再構成をする手順
本手順では,撮影した画像から3D再構成を行い,最終的に映像として出力するまでのプロセスを説明します.Reality CaptureやPostShotを活用し,高品質な3Dモデルを生成し,After EffectsやUnreal Engine(UE5.4/5.5)で可視化・編集を行うことで,リアルな映像表現を実現します.
この方法が現段階で最も高品質な3次元再構成が出来ます.
-
撮影
物体やシーンをさまざまな角度から撮影する。 -
カメラ位置の推定・Point Cloudの取得(Reality Capture)
Reality Captureを使用して、撮影画像からカメラの位置・姿勢を推定し、ポイントクラウド(Point Cloud)を生成する。 -
3DGSの学習(PostShot 3DGS-MCMC)
PostShotの3DGS-MCMCを用いて、取得したポイントクラウドを基に3D Gaussian Splatting(3DGS)の学習を行う。 -
ノイズ除去(PostShot)
PostShotを使用して、学習データのノイズを除去し、品質を向上させる。 -
可視化(PostShot Plugin + After Effects / UE5.4 or 5.5)
PostShotのプラグインを用いて、After Effects または Unreal Engine 5.4 / 5.5 にインポートし、可視化を行う。 -
映像出力
可視化したデータをレンダリングし、最終的な映像として出力する。
Reality Captureによるカメラ位置・姿勢推定とPoint Cloudの出力方法
Reality Captureについて
Reality Capture は、写真やレーザースキャンデータを基にして、高精度なフォトグラメトリを行えるEpic Gamesから出されているソフトウェアです。
RealityCaptureを使って、カメラ位置・姿勢推定とPoint Cloudを出力します。
Epic Game Launcherからダウンロードできます。
Reality Captureによるカメラ位置・姿勢推定方法
Reality Captureを開くとこのような画面になります。
今回はAlignmentのみを行います。
今回は、名古屋駅の画像Dataを使用して、説明していきます。
枚数が多いと学習が長引いてしまうため、少なめの画像Dataで学習をしています。
左上のAdd imagery のInputs / Folder を選択して、カメラ位置・姿勢推定を行いたいDataを選択しましょう。
Inputsは、画像をそのまま選択。Folderは画像が入っているFolderを選択することが出来ます。
次に,Task BarからAlignmentを選択し、Settingsを選択しましょう.
カメラ位置・姿勢推定の設定を行うことが出来ます。
基本下のパラメータを調整していますが、最初は、Defautのままカメラ位置・姿勢推定を行い、推定結果がいまいちの場合、変えてやっています。
- Max Features per image: 40:000 (default 20,000)
- Image Overlap: Low (RC uses the full image to extract features)
- Image Downscale: 2 (by default, I use 3)
- Force component rematch: Yes
- Preselector presets: 20,000 (default 10,000)
- Detector sensitivity: High or Ultra(if ISO for photos is 100). For more noisy photos (when ISO is much higher) use Medium
- Last resort — Merge georeference components: Yes (only if your photos have GPS tags in them, ie, a drone). However this can introduce bad misalignments
設定を行ったら、Align Imagesを押しましょう。
すると、カメラ位置・姿勢推定が始まります。終わるのを待ちましょう。
カメラ位置・姿勢推定が終わると、以下のようにカメラの位置にカメラのオブジェクトが生成されます。
また、Point Cloudも生成されます。
Reality Captureによるカメラ位置・姿勢推定結果とPoint Cloudの出力方法
次に、カメラ位置・姿勢の推定結果をcsvファイルとして出力するのと、Point Cloudをplyファイルとして出力します。
まず初めに、カメラ位置・姿勢推定結果をcsvファイルとして出力します。
Task BarからWorkflowに戻り、右のほうにあるOutputからExportを選択しましょう。
この画面から、
「Internal/External camera parameters」を選択しましょう。
選択したら、保存先を決めたら下記のような画面に代わります。
そのままOKを押すと、カメラ位置・姿勢推定結果が保存されます。
次に、Point Cloudをplyファイルとして出力します。
Task BarからAlignmentを選択し、Exportの中の「Point Cloud」を選択しましょう。
選択したら、保存先を決めたら下記のような画面に代わります。
そのままOKを押すと、Point Cloudが保存されます。
これで、カメラ位置・姿勢推定結果とPoint Cloudの出力が完了しました。
今回使った画像データ群とカメラ位置・姿勢推定結果とPoint Cloudを使用して、3DGSを行っていきます。
PostShotによる3DGS
Postshotについて
PostShotは、NeRF・3DGSを生成・使用するためのエンドツーエンドのアプリです。
アプリをダウンロードするだけでNeRF・3DGSを作成できるため、環境構築が必要ありません。
Postshotは、シームレスなワークフローに統合されたNeRFと3DGS技術を使用して、高速でメモリ効率の高い学習を提供します。
学習する際に、Cloudにあげる必要がなく完全にLocalで学習を行えます。
システム要件は、Windows 10以降、Nvidia GPU GeForce RTX 2060、Quadro T400/RTX 4000以上となります。
3DGSをやるために、PostshotのHPからアプリをダウンロードしましょう。
Postshotによる3DGSの学習方法
右上のImportで、学習したいDataを選択することが出来ます。
ここで選択するDataは「画像Data群」・「カメラ位置・姿勢推定結果」・「Point Cloud」の3つです。
選択すると、このような画面が出てきます。
この画面になってからでも、fileをDropすることで、Dataを追加できます。
まず、下記の「Image Selection」では、すべての画像Dataを使うのか、良い画像Dataのみを使うのかを選択することが出来ます。
Use Best Imagesを選んでいる場合は、以下のように使う最大枚数を設定できます。
次に、「Radiance Field Profile」では、「Splat3」・「Splat MCMC」・「Splat ADC」を選択できます。それぞれ特徴が違いますので、試してみてください。
次に、「Downsample Images」では、横の解像度を下げるかどうかを選択できます。Defaultが1600となっています。解像度が高いまま、学習をしてしまうと、学習が長引いてしまったり、過学習してしまい、思った以上にノイズが乗ってしまったりするため注意しましょう。
次に、「Max Splat Count」では、Splatの数の上限を設定できます。
こちらに関しても、ただ多くすればいいというわけでもなく、生成した3dgsの範囲などによって、調整しないといけません。
次に、「Anti-Aliasing」では、anti-aliasing処理をするかどうかを選択できます。
次に、「Start Training」では、すぐに学習を始めるかどうかを設定できます。
次に、「Stop Training after」では、学習回数を設定できます。
チェックを外すと、学習回数の上限を設定しないようにできます。
これらが、一般的な設定になりますが、最初は、Defaultのまま学習をしてみて、ノイズが乗ったり、思った以上に品質がよくない場合は、調整するような感じでいいと思います。
Importをすると、このようにもやがかかった感じから始まります。
この途中で、Max Splat Countを変更したりもできます。状況に応じて、変化させましょう。
PostShotでの編集方法
PostShotでは、Splatの編集をすることが出来ます。
次の赤枠のButtonを押すと原点の表示・非表示を切り替えできます。
次の赤枠のButtonを押すと点群の表示・非表示を切り替えできます。
次の赤枠のButtonを押し、Viewerを右クリックすると表示された円の中のGaussianを選択できます。
この方法だと選択した中のGaussianが下のようにすべて選択されます。
次の赤枠のDelete Buttonを押すとすべてのGaussianが削除されます。
CTRL+マウスホイールで奥行きを設定でき、次のように一部を削除できます。
次の画像は、奥行きを設定し、木を削除しました。
周りのGaussianには影響なく、綺麗に消せていることがわかります。
このように,学習した3DGSデータを編集することで、より高品質な3DGSのデータを作れます。
編集が終わったら、ファイルを保存しておきましょう。「.psht」ファイルとして保存されます。このファイルを使って、Unreal EngineやAfter Effectに可視化させていきます。
Unreal Engine への導入方法
次にPostShotのデータをUnreal Engineで映像を出力します。Postshotは、統合されたレンダリングと合成のために、Unral Engineに3DGSをImportできます。
※ 現在は、Unreal Engine 5.4と5.5に対応しています。
Postshotをダウンロードする際に、「Install Unreal Engine 5.4/5.5 Plugin」にチェックが入っているか確認しておきましょう。
次にUnreal Engine5.4/5.5を開き、編集→Plugin設定により、PostshotのPluginにチェックが入っていることを確認してください。
もし、チェックが入ってない場合、チェックをして、一度Unreal Engineを再起動してください。
これにより,Unreal EngineでPostshotを可視化させることが出来ます。
次に、Postshotのファイルをコンテンツブラウザの中にドラッグ&ドロップしましょう。
すると、PostshotProjectAssetが追加されます。
次に、追加されたファイルをSceneにドラッグ&ドロップしましょう。
このようなエラーが出た場合、PostshotのVersionとUE PluginのVersionが違うと出てしまうので、Pluginを消して、もう一度入れる必要があります。
Pluginの消し方は、Marketplace内にPostshot Pluginが入っているので、そのPluginを削除します。
Pluginを消したら、もう一度exeファイルから、ダウンロードすれば、エラーがなくなります。
エラーがなくなり、PostshotProjectAssetをScene内にドラッグ&ドロップすると、以下のように可視化することが出来ます。
これで、Unreal Engineにて、可視化できるようになりました。
After Effectへの導入方法
次にPostShotのデータをAfterEffectで映像を出力します。Postshotは、統合されたレンダリングと合成のために、Adobe After Effectsに3DGSをImportできます。
Postshotをダウンロードする際に、「Install After Effects Plugin」にチェックが入っているか確認しておきましょう。
追加した平面レイヤーを右クリックしてください。
右クリックしてエフェクト->Jawset->PostShotを追加してください。
Postshotを追加したら、平面レイヤーのエフェクトコントロールからSElect Fileをクリックしてください。
クリックしたらPostShotのファイル(pshtファイル)を選択してください。
PostShotのファイルを選択すると次のようにViewerを見ることができます。
カメラ位置姿勢の変更方法は次の図の3つの方法で変更できます。
任意の位置姿勢にカメラを移動させたら、Keyframeを打ちます。
複数のKeyframeを打って、再生するとカメラ位置姿勢が移動し、それに合わせて3DGSのViewerも更新されます。
Keyframeの指定が終わったら、書き出しをしましょう。ファイル->書き出し->レンダーキューに追加します。
これにより指定したKeyframeに沿った映像を出力できます。
実例
実際にこの2年間で撮影したDataを3DGSしたものは以下の通りです。
- 名古屋駅(昼)
- 名古屋駅(夜)
- ゴールデン街
- 東京駅
- 名城大学ホール
- 東京国際フォーラム
現状の課題
現状の課題として、以下の課題があります。
- 撮影方法の問題
- 真横から見たときに、Detailが甘くなる
- カメラ推定が上手く行かない可能性がある
- 同じような床面が続く場合、床面にもやがかかる
- 3DGS側の問題
- リライティングが出来ないため、天候に左右される
- 時間による色の変化が起きる
- 草木のDetailが甘い
- 路駐されている車などずっと止まっているものがあると、それが反映されてしまう
以下の画像のように、真横から見たときに、Detailが甘くなることがあります。これは、入力画像Dataとして、真横からの撮影が出来ていないのが原因となります。
しかし、以下の画像のように、真横からとっても、カメラ位置・姿勢推定がうまく行かないときがあります。
これは、同じようなものが続く場所であると起きてしまうことが多いです。そのため、同じような場所が続く場合は、よりオーバーラップを意識して撮影することが必要です。
次に、以下の画像のように、入力画像の建物の色が違ったり、反射が変わっていたりすると、ノイズが乗ることがあります。
次に、以下の画像のように、同じような床面が続いてしまうと、床面よりも少し上にPoint Cloudが出力されてしまい、もやがかかってしまうことがあります。
次に、このように路上駐車されている車があると、そのまま反映されてしまい、不必要なものが写り込んでしまうことがあります。
まとめ
3DGSは、現実に近い空間を生成することが可能になっており、実写映像作品に取り入れる未来が近くなってきています。まだ、さまざまな課題がありますが、条件をしっかりと見極めて、撮影場所を決めることで、高品質な3DGSを行うことができます。
また、3DGSの進歩は早いため、このような課題も解決されていくと思っています。
そのため、アンテナを張って、情報収集を行い、すぐに実践していくことが非常に重要になります。
今後も3DGSに関しての最新情報を広めていけたらと思いますので、是非応援よろしくお願いします。