25
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

高品質な3DGSを行う方法 powerd by デジタル・フロンティア

Last updated at Posted at 2025-03-31

自己紹介

名城大学理工学研究科メカトロニクス工学専攻修士2年のAsterです.
現在デジタルフロンティア様にて,NeRF・3DGS検証業務を行っています.検証の目的は,将来的に実写映像作品に3DGSを活用できないか検討することで,今回の検証はそのための第一歩となります.
2023年5月から約2年間行ってきた3DGS検証に関して記事にしました.
ぜひ見てくだされば嬉しいです.


※本記事に記載されている情報は,著者および関係者の知識と経験に基づいて提供されているものであり,正確性や完全性を保証するものではありません.記事の内容に基づくいかなる行動も,読者自身の責任で行ってください.また,技術や規格は常に進化しており,この記事の情報は執筆時点のものであることをご了承ください.最新の情報を確認するためには,公式ドキュメントや信頼できる情報源を参照することをお勧めします.

3次元再構成までの一連の流れ

NeRF/3DGSを用いて,新たな角度からの画像を生成する手順は以下のとおりです.

  1. 撮影(Input Images): 物体をさまざまな角度から撮影し,複数の画像を取得する
  2. カメラの位置・姿勢の推定(Structure from Motion: SfM): 撮影した画像から,カメラの位置と向きを推定する
  3. NeRF/3DGSの学習 : 画像と推定したカメラの情報を用いて,NeRFまたは3D Gaussian Splatting(3DGS)を学習させる
  4. 3Dシーンの再構成と新たな視点の生成 : 学習したRadiance Fieldsを用いて,3Dシーンを再構成し,任意の視点からの画像を生成する

スクリーンショット 2025-03-13 17.21.37.png

NeRFや3DGSの概要については,前回記事にしたこちらの記事をご覧ください.

2025年3月時点での高品質な3次元再構成をする手順

本手順では,撮影した画像から3D再構成を行い,最終的に映像として出力するまでのプロセスを説明します.Reality CaptureやPostShotを活用し,高品質な3Dモデルを生成し,After EffectsやUnreal Engine(UE5.4/5.5)で可視化・編集を行うことで,リアルな映像表現を実現します.
この方法が現段階で最も高品質な3次元再構成が出来ます.

  1. 撮影
    物体やシーンをさまざまな角度から撮影する。

  2. カメラ位置の推定・Point Cloudの取得(Reality Capture)
    Reality Captureを使用して、撮影画像からカメラの位置・姿勢を推定し、ポイントクラウド(Point Cloud)を生成する。

  3. 3DGSの学習(PostShot 3DGS-MCMC)
    PostShotの3DGS-MCMCを用いて、取得したポイントクラウドを基に3D Gaussian Splatting(3DGS)の学習を行う。

  4. ノイズ除去(PostShot)
    PostShotを使用して、学習データのノイズを除去し、品質を向上させる。

  5. 可視化(PostShot Plugin + After Effects / UE5.4 or 5.5)
    PostShotのプラグインを用いて、After Effects または Unreal Engine 5.4 / 5.5 にインポートし、可視化を行う。

  6. 映像出力
    可視化したデータをレンダリングし、最終的な映像として出力する。

Reality Captureによるカメラ位置・姿勢推定とPoint Cloudの出力方法

Reality Captureについて

Reality Capture は、写真やレーザースキャンデータを基にして、高精度なフォトグラメトリを行えるEpic Gamesから出されているソフトウェアです。
RealityCaptureを使って、カメラ位置・姿勢推定とPoint Cloudを出力します。
Epic Game Launcherからダウンロードできます。

image.png

Reality Captureによるカメラ位置・姿勢推定方法

Reality Captureを開くとこのような画面になります。
image.png

今回はAlignmentのみを行います。
今回は、名古屋駅の画像Dataを使用して、説明していきます。
枚数が多いと学習が長引いてしまうため、少なめの画像Dataで学習をしています。

左上のAdd imagery のInputs / Folder を選択して、カメラ位置・姿勢推定を行いたいDataを選択しましょう。
Inputsは、画像をそのまま選択。Folderは画像が入っているFolderを選択することが出来ます。
image.png

選択すると以下のように画像の枚数が出てきます。
image.png

次に,Task BarからAlignmentを選択し、Settingsを選択しましょう.
image.png

カメラ位置・姿勢推定の設定を行うことが出来ます。

image.png

基本下のパラメータを調整していますが、最初は、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を押しましょう。
すると、カメラ位置・姿勢推定が始まります。終わるのを待ちましょう。
image.png

カメラ位置・姿勢推定が終わると、以下のようにカメラの位置にカメラのオブジェクトが生成されます。
また、Point Cloudも生成されます。

image.png

Reality Captureによるカメラ位置・姿勢推定結果とPoint Cloudの出力方法

次に、カメラ位置・姿勢の推定結果をcsvファイルとして出力するのと、Point Cloudをplyファイルとして出力します。
まず初めに、カメラ位置・姿勢推定結果をcsvファイルとして出力します。
Task BarからWorkflowに戻り、右のほうにあるOutputからExportを選択しましょう。
image.png

すると下記のような画面になります。
image.png

この画面から、
「Internal/External camera parameters」を選択しましょう。
選択したら、保存先を決めたら下記のような画面に代わります。
image.png

そのままOKを押すと、カメラ位置・姿勢推定結果が保存されます。

次に、Point Cloudをplyファイルとして出力します。
Task BarからAlignmentを選択し、Exportの中の「Point Cloud」を選択しましょう。
選択したら、保存先を決めたら下記のような画面に代わります。
image.png
そのまま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の学習方法

Postshotを立ち上げるとこのような画面になります。
image.png

右上のImportで、学習したいDataを選択することが出来ます。
image.png

ここで選択するDataは「画像Data群」・「カメラ位置・姿勢推定結果」・「Point Cloud」の3つです。
選択すると、このような画面が出てきます。
image.png
この画面になってからでも、fileをDropすることで、Dataを追加できます。

image.png

まず、下記の「Image Selection」では、すべての画像Dataを使うのか、良い画像Dataのみを使うのかを選択することが出来ます。
image.png

Use Best Imagesを選んでいる場合は、以下のように使う最大枚数を設定できます。
image.png

次に、「Radiance Field Profile」では、「Splat3」・「Splat MCMC」・「Splat ADC」を選択できます。それぞれ特徴が違いますので、試してみてください。
image.png

次に、「Downsample Images」では、横の解像度を下げるかどうかを選択できます。Defaultが1600となっています。解像度が高いまま、学習をしてしまうと、学習が長引いてしまったり、過学習してしまい、思った以上にノイズが乗ってしまったりするため注意しましょう。
image.png

次に、「Max Splat Count」では、Splatの数の上限を設定できます。
こちらに関しても、ただ多くすればいいというわけでもなく、生成した3dgsの範囲などによって、調整しないといけません。

image.png

次に、「Anti-Aliasing」では、anti-aliasing処理をするかどうかを選択できます。
image.png

次に、「Start Training」では、すぐに学習を始めるかどうかを設定できます。
image.png

次に、「Stop Training after」では、学習回数を設定できます。
チェックを外すと、学習回数の上限を設定しないようにできます。
image.png

これらが、一般的な設定になりますが、最初は、Defaultのまま学習をしてみて、ノイズが乗ったり、思った以上に品質がよくない場合は、調整するような感じでいいと思います。
Importをすると、このようにもやがかかった感じから始まります。
この途中で、Max Splat Countを変更したりもできます。状況に応じて、変化させましょう。

image.png
このように徐々に再構成されていきます。
image.png

最終的な再構成結果はこのような形で出ました。
image.png

PostShotでの編集方法

PostShotでは、Splatの編集をすることが出来ます。

次の赤枠のButtonを押すと原点の表示・非表示を切り替えできます。
PostShot-Origin.PNG

次の赤枠のButtonを押すと点群の表示・非表示を切り替えできます。
PostShot-PointCloud.PNG

次の赤枠のButtonを押し、Viewerを右クリックすると表示された円の中のGaussianを選択できます。
PostShot-SimpleEdit.PNG

この方法だと選択した中のGaussianが下のようにすべて選択されます。
PostShot-SimpleEdit-1.PNG

次の赤枠のDelete Buttonを押すとすべてのGaussianが削除されます。
PostShot-Delete.png

PostShot-SimpleEdited.PNG

次の赤枠のButtonを押すと消す奥行きを設定できます。
PostShot-DepthEdit.PNG

CTRL+マウスホイールで奥行きを設定でき、次のように一部を削除できます。
PostShot-DepthEdit-1.PNG

次の画像は、奥行きを設定し、木を削除しました。
周りのGaussianには影響なく、綺麗に消せていることがわかります。
PostShot-DepthEdited.PNG

このように,学習した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」にチェックが入っているか確認しておきましょう。

image.png

次にUnreal Engine5.4/5.5を開き、編集→Plugin設定により、PostshotのPluginにチェックが入っていることを確認してください。
もし、チェックが入ってない場合、チェックをして、一度Unreal Engineを再起動してください。
これにより,Unreal EngineでPostshotを可視化させることが出来ます。

image.png

次に、Postshotのファイルをコンテンツブラウザの中にドラッグ&ドロップしましょう。
image.png

すると、PostshotProjectAssetが追加されます。
image.png

次に、追加されたファイルをSceneにドラッグ&ドロップしましょう。
このようなエラーが出た場合、PostshotのVersionとUE PluginのVersionが違うと出てしまうので、Pluginを消して、もう一度入れる必要があります。
image.png

Pluginの消し方は、Marketplace内にPostshot Pluginが入っているので、そのPluginを削除します。
image.png

Pluginを消したら、もう一度exeファイルから、ダウンロードすれば、エラーがなくなります。
エラーがなくなり、PostshotProjectAssetをScene内にドラッグ&ドロップすると、以下のように可視化することが出来ます。
image.png

これで、Unreal Engineにて、可視化できるようになりました。

After Effectへの導入方法

次にPostShotのデータをAfterEffectで映像を出力します。Postshotは、統合されたレンダリングと合成のために、Adobe After Effectsに3DGSをImportできます。

Postshotをダウンロードする際に、「Install After Effects Plugin」にチェックが入っているか確認しておきましょう。
image.png

始めに、コンポジションを追加します。
new Comp.png

次に、平面レイヤーを追加します。
newFloor.png

追加した平面レイヤーを右クリックしてください。

image.png

右クリックしてエフェクト->Jawset->PostShotを追加してください。
addPostshot.png

Postshotを追加したら、平面レイヤーのエフェクトコントロールからSElect Fileをクリックしてください。
SelectFile.png

クリックしたらPostShotのファイル(pshtファイル)を選択してください。
loadPostShot.PNG

PostShotのファイルを選択すると次のようにViewerを見ることができます。
nagoyaLoad.PNG

次にカメラを追加します。
image.png

カメラ位置姿勢の変更方法は次の図の3つの方法で変更できます。
3DCamera.PNG

任意の位置姿勢にカメラを移動させたら、Keyframeを打ちます。
複数のKeyframeを打って、再生するとカメラ位置姿勢が移動し、それに合わせて3DGSのViewerも更新されます。
SetKeyFrame.png
EndKeyFrame.png

Keyframeの指定が終わったら、書き出しをしましょう。ファイル->書き出し->レンダーキューに追加します。
RenderQue.PNG

動画の出力先を指定してください。
OutputPath.png

出力先を設定したらレンダリングボタンを押してください
Rendering.png

これにより指定したKeyframeに沿った映像を出力できます。

実例

実際にこの2年間で撮影したDataを3DGSしたものは以下の通りです。

  • 名古屋駅(昼)

  • 名古屋駅(夜)

  • ゴールデン街

  • 東京駅

  • 名城大学ホール

  • 東京国際フォーラム

現状の課題

現状の課題として、以下の課題があります。

  • 撮影方法の問題
    • 真横から見たときに、Detailが甘くなる
    • カメラ推定が上手く行かない可能性がある
    • 同じような床面が続く場合、床面にもやがかかる
  • 3DGS側の問題
    • リライティングが出来ないため、天候に左右される
    • 時間による色の変化が起きる
    • 草木のDetailが甘い
    • 路駐されている車などずっと止まっているものがあると、それが反映されてしまう

以下の画像のように、真横から見たときに、Detailが甘くなることがあります。これは、入力画像Dataとして、真横からの撮影が出来ていないのが原因となります。
image.png

しかし、以下の画像のように、真横からとっても、カメラ位置・姿勢推定がうまく行かないときがあります。
これは、同じようなものが続く場所であると起きてしまうことが多いです。そのため、同じような場所が続く場合は、よりオーバーラップを意識して撮影することが必要です。

image.png

次に、以下の画像のように、入力画像の建物の色が違ったり、反射が変わっていたりすると、ノイズが乗ることがあります。
image.png

次に、以下の画像のように、同じような床面が続いてしまうと、床面よりも少し上にPoint Cloudが出力されてしまい、もやがかかってしまうことがあります。
image.png

次に、このように路上駐車されている車があると、そのまま反映されてしまい、不必要なものが写り込んでしまうことがあります。
image.png

まとめ

3DGSは、現実に近い空間を生成することが可能になっており、実写映像作品に取り入れる未来が近くなってきています。まだ、さまざまな課題がありますが、条件をしっかりと見極めて、撮影場所を決めることで、高品質な3DGSを行うことができます。
また、3DGSの進歩は早いため、このような課題も解決されていくと思っています。
そのため、アンテナを張って、情報収集を行い、すぐに実践していくことが非常に重要になります。

今後も3DGSに関しての最新情報を広めていけたらと思いますので、是非応援よろしくお願いします。

25
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?