embeddedなブログ

組み込みシステムに関することや趣味に関することをダラダラと書いていきます(^^)

Gaussian SplattingをWindows (Visual Studio 2022) の環境で動作させる

2024-05-26 11:16:13 | Windows Embedded Standard

Gaussian SplattingとNeRFは、両方とも3次元のシーンを再構築するための手法ですが、そのアプローチにはいくつかの機能的な違いがあります。

まず、Gaussian Splattingは、複数の画像からの情報を使用して3Dシーンを再構築します。これは、画像から得られる2Dの情報を3Dにマッピングする方法で、一般的にはSfMを用いてこれらのマッピングするための情報を取得します。この手法では、各画像のピクセルが3D空間上の位置に関連付けられ、その位置における情報が集約されます。これにより、比較的低い解像度の画像からでも、高品質な3Dモデルを生成することができます。

一方、NeRFは、ニューラルネットワークを使用してシーンをモデリングします。NeRFは、シーン内の各点に対して密な情報を生成し、その情報を使用してシーンをレンダリングします。これにより、非常に詳細な3Dモデルを生成することができますが、計算コストが高く、大規模なシーンには適していません。

Gaussian Splattingのアドバンテージは、比較的低い解像度の画像からでも高品質な3Dモデルを生成できることです。また、計算コストがNeRFよりも低いため、大規模なシーンにも適しています。一方、NeRFのアドバンテージは、非常に詳細な3Dモデルを生成できることですが、計算コストが高く、大規模なシーンには向いていません。

要するに、Gaussian Splattingは効率的で大規模なシーンに適しており、NeRFは詳細な再構築が必要な場合に適しています。

今回は、このGaussian SplattingをWindows 11 + Visual Studio 2022 の環境で動作させる手順について説明します。また、SfMの実行については、Gaussian SplattingのGitHubページに記載されているチュートリアルなどでも、ほぼ全てCOLMAPでSfMを実行した結果を用いる説明ばかりなので、ここでは一般的に業務でよく用いられているAgisoft社のMetashapeを使ってSfMを実行する手順について説明します。

動作させる環境には下記がインストール済みの前提です。

  • Anaconda
  • Visual Studio 2022 (PytorchのビルドにC++コンパイラが必要)
  • Cuda Toolkit v11.8 (無ければこちらで入手: https://developer.nvidia.com/cuda-11-8-0-download-archive)
  • Metashape Professional (Pythonスクリプトを実行する必要があるためProfessionalエディションが必要)

では、実際の環境構築の説明に入ります。まず、anaconda promptを起動します。カレントフォルダは C:¥gitを前提とします。GitHubからGaussian Splattingをクローンします。

git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 

クローンしたフォルダC:\git\gaussian-splattingに移動します。

Visual Studio 2022のコンパイラが使えるよう環境変数を設定します。下記はVisual Studio 2022 Enterpriseの場合ですが、それぞれの環境に応じたフォルダにインストールされているvcvars64.bat を実行してください。

"C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvars64.bat"

次に c:\git\gaussian-splatting\environment.yml を下記のように編集します。赤文字の行が更新または追加した行です。

name: gaussian_splatting
channels:
  - pytorch
  - nvidia
  - conda-forge
  - defaults
dependencies:
  - cudatoolkit=11.8
  - plyfile
  - python=3.11.7
  - pip=22.3.1
  - pytorch=2.2.2
  - pytorch-cuda=11.8
  - torchaudio=2.2.2
  - torchvision=0.17.2
  - tqdm
  - ninja
  - pip:
    - submodules/diff-gaussian-rasterization
    - submodules/simple-knn

下記コマンドを実行して Gaussian Splatting のAnaconda環境 "gaussian_splatting"を構築します。

SET DISTUTILS_USE_SDK=1
conda env create --file environment.yml

C++のビルドもこの処理で実行され、私の環境で10分以上の処理時間が必要でした。環境構築の途中で失敗したときは、念のため下記コマンドで一度作成途中の環境を削除します。

conda remove -n gaussian_splatting --all 

無事に環境構築が完了したら、下記コマンドでAnaconda環境 "gaussian_splatting"を有効にします。

conda activate gaussian_splatting 

次に、Metashapeにて写真のアライメントまでを実行してタイポイントを生成します。今回の解説では、Metashapeの開発元であるAgisoft社が提供しているBuildingというサンプル画像を使わせていただきました。サンプル画像はこちらからダウンロードが可能です。

タイポイントが生成出来たら、Metashape形式のデータをGaussian Splattingで処理可能なCOLMAP形式に変換するために、ここからMetashape用のスクリプト export_for_gaussian_splatting.py をダウンロードします。

ダウンロードしたら、Metashapeでスクリプトをメニューに登録します。Metashapeメニューで [Tools]-[Run Script] を実行して、スクリプトとして先ほどダウンロードした export_for_gaussian_splatting.py を指定します。引数は空白のままとします。

[OK]をクリックすると、[Scripts]メニュー項目がMetashapeのメニューに追加されます。追加されたメニューから [Scripts]-[Export Colmap project (for Gaussian Splatting)] を実行します。

特に設定は変更せず、デフォルトのままで[Export]をクリックします。エクスポートするフォルダを指定します。ここでは C:\NeRF\Building にエクスポートしました。

以上でMetashapeによる処理は終了で、ここからは再びAnacondaのgaussian_splatting環境に戻ります。

下記コマンドでGaussian Splattingの学習を実行します。

python train.py -s C:\NeRF\Building -r 1 

学習が開始されると、下記のように出力先フォルダ名が表示されます。このフォルダ名は後程、ビューアで結果を表示する際に使用します。

Output folder: ./output/d85be0ea-c 

完了までの出力結果が下記です。完了までなんと18時間程度もかかりました。GPUのメモリ容量が推奨で24GBに対して私の環境は4GBしかなかったのが大きな要因かと思います。。。

Optimizing
Output folder: ./output/d85be0ea-c [03/05 18:30:15]
Tensorboard not available: not logging progress [03/05 18:30:15]
Reading camera 1/50C:\Users\yoossh\anaconda3\envs\gaussian_splatting\Lib\site-packages\PIL\TiffImagePlugin.py:890: UserWarning: Corrupt EXIF data.  Expecting to read 2 bytes but only got 0.
  warnings.warn(str(msg))
Reading camera 50/50 [03/05 18:30:15]
Loading Training Cameras [03/05 18:30:15]
Loading Test Cameras [03/05 18:30:17]
Number of points at initialisation :  16179 [03/05 18:30:17]
Training progress:  23%|████████▊                             | 7000/30000 [1:07:51
[ITER 7000] Evaluating train: L1 0.05927184596657753 PSNR 20.15763282775879 [03/05 19:38:10]

[ITER 7000] Saving Gaussians [03/05 19:38:10]
Training progress: 100%|██████████████████████████████████████| 30000/30000 [17:53:20<00:00,  2.15s/it, Loss=0.0704310]

[ITER 30000] Evaluating train: L1 0.025319642946124078 PSNR 26.258248519897464 [04/05 12:23:41]

[ITER 30000] Saving Gaussians [04/05 12:23:41]

Training complete. [04/05 12:23:46]

上記のように「Training complete」と表示されれば学習が無事に完了です。

ここからは学習した結果を表示するための手順です。結果を表示するために、ビューアをここからダウンロードします。ダウンロードしたファイルを C:\git\gaussian-splatting\SIBR_viewers に解凍しました。

下記のように学習の出力先フォルダ名を指定してビューアを実行します。

.\SIBR_viewers\bin\SIBR_gaussianViewer_app.exe -m ./output/d85be0ea-c 

以下のように結果が表示されれば成功です。

今回、GPUメモリ不足もあり、Buildingの画像解像度を50%に縮小してMetashapeの処理をしたため、精度が落ちてしまったことが原因か、上図はきれいに表示された一部で、ほとんどの角度からは下図のようにかなり崩れてしまいました。やはり、Gaussian SplattingなどNeRFを実行するにはかなり高価なGPU環境がまだ必要そうです。

以上で今回のGaussian Splattingに関する解説を終了します。

 

 


最新の画像もっと見る