本記事はNTTドコモ Advent Calendar 2023の21日目の記事です。
TL;DR
- Blenderを導入し、お好みのカメラ配置で画像をレンダリングし、データセットを作成
- 3D Gaussian Splattingを導入し、作成したデータセットで学習
- nerfstudioを導入し、3D Gaussian Splattingの学習結果を、任意のカメラの軌道に従ってレンダリングした動画を作成
はじめに
こんにちは。NTTドコモ サービスイノベーション部の下山です。 業務では三次元再構成技術に関する研究開発を行っています。
三次元再構成に関しては、2020年に登場したNeRF(Neural Radiance Fields)という手法が注目を集めており、 私も2022年の入社以来、NeRFを中心に研究開発を行っていました。 ところが、2023年に発表された3D Gaussian Splattingという手法が大変インパクトのあるもので、 NeRFの代替手法として注目を集めています。 本記事では、3D Gaussian Splattingの動かし方について、データセットの作成から学習結果のレンダリングまでを通して解説します。
三次元再構成とは
三次元再構成とは、画像から写っている物体や環境の三次元形状を推定する技術です。 これは、三次元モデルから画像を描画する、コンピュータグラフィックス(CG)におけるレンダリングの逆問題とも言えるものであり、インバースレンダリングとも呼ばれています。
近年では三次元シーンをニューラル場として表現するNeRF(Neural Radiance Fields)という手法が盛んに研究されています。 NeRFでは、ニューラルネットワークで表現した三次元シーンをレンダリングし、実際に撮影された画像との誤差を最小化することで、三次元シーンを推定します。
3D Gaussian Splattingとは
3D Gaussian Splattingは2023年に発表された三次元再構成手法であり、 NeRFと同様にレンダリング結果と実際の画像との誤差を最小化することで三次元シーンを推定します。 NeRFと異なるのは、三次元シーンをニューラル場ではなく、3D Gaussianの集合として表現する点です。 何もない空の空間からもサンプリングしボリュームレンダリングを行うNeRFと異なり、不要な計算を省くことができるため、NeRFよりも高速なレンダリングが可能になっています。
Blenderによるデータセットの作成
NeRFの検証では、Blnederを用いて作成されたsynthetic NeRF datasetが有名です。 このデータセットはNeRFの論文の著者らによって公開されたものであり、NeRFのプロジェクトページからダウンロードすることができます。
しかし、提供されているデータセットは、ランダムなカメラ位置から3Dモデルをレンダリングしたものになっており、自分に必要なカメラ位置の画像が含まれているとは限りません。 そこで、提供されているBlenderの3Dモデルを用いて、自前でレンダリングを行いデータセットを作成することにします。
Blenderのインストール
まずは、Blenderをインストールします。 公式サイトからインストーラをダウンロードし、インストールを行います。 配布されている3Dモデルをそのまま用いるため、Blenderの細かい設定や操作方法については割愛します。
2023年11月14日にBlender 4.0がリリースされています。本記事の内容はBlender 3.6、Blender 4.0のどちらでも動作することを確認しています。
Blenderファイルのダウンロード
先ほどのNeRFのプロジェクトページからDataをクリックするとデータセットが格納されたGoogle Driveのフォルダが開きます。
このフォルダからblend_files.zip
をダウンロードし、解凍します。
今回はLEGOのデータlego.blend
を使用します。
Blenderでのレンダリング
先ほどダウンロードしたlego.blend
のアイコンをダブルクリックすると、Blenderが起動し、LEGOの3Dモデルが表示されます。
Scripting
タブを開くと、NeRFの著者らによって用意された、レンダリングのためのPythonスクリプトが表示されます。
これをそのまま使っても良いのですが、デプスマップの出力を行うための記述なども含まれているため、今回はこちらの記事で紹介されている、不要な部分を削除したPythonスクリプトをベースに用います。
上記の記事で紹介されているスクリプトではカメラ配置がランダムになっていますが、これは下記のようにお好みのカメラ配置に変更することができます。
下記の例では、地球儀の北半球にカメラを配置するとみたときに、緯度方向にv_views
等分、経度方向にh_views
等分した位置にカメラを配置しています。
# 変更前 for i in range(VIEWS): # Random Camera Rotation camera_parent.rotation_euler = np.array([np.random.uniform(np.pi / 12, np.pi / 2), 0, np.random.uniform(0, 2 * np.pi)]) # 変更後 for i in range(v_views): for j in range(h_views): # Camera Rotation camera_parent.rotation_euler = np.array([np.pi / 2 / v_views * i, 0, 2 * np.pi / h_views * j])
用意したスクリプトを実行するには、Blenderの上部にあるタブ一覧から「+」>「全般」>「スクリプト作成」
を選択し、
+新規
ボタンを押して、先ほど用意したスクリプトを貼り付けます。
その後、スクリプト実行
ボタンを押すと、レンダリングが開始されます。
3D Gaussian Splattingの学習
基本的には公式のリポジトリにあるREADMEに従って進めていきます。 環境としてはWindows11での動作を確認しています。 またハードウェア要件として24GB以上のVRAMを搭載したGPUが必要と書かれていますが、16GB程度のGPUでも学習は可能です。
必要なツール類のインストール
3D Gaussian Splattingを動作させるにあたって必要なツール類は下記の通りです。
- Visual Studio(2022では動作しないケースもあるのでその際は2019を使う。今回は2022で実施。)
- CUDA Toolkit 11.8
- Conda
Visual Studioは公式サイトからインストーラをダウンロードし、インストールを行います(2022の場合)。2019の方はこちらからダウンロードできます。
インストールの際にオプションとして「C++によるデスクトップ開発」を選択してください。
またC:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.37.32822\bin\Hostx64\x64\cl.exe
をシステム環境変数のPathに追加する必要があります。
CUDA Toolkitは公式サイトからダウンロードし、インストールを行います。画面の指示に従ってOSやGPUに合わせたバージョンを選択してください。
Anacondaも公式サイトからインストーラをダウンロードし、インストールを行います。インストールが完了したらAnaconda Promptを開き下記のコマンドを実行します。
SET DISTUTILS_USE_SDK=1
このコマンドはWindowsの場合のみ必要で、DISTUTILS_USE_SDKを設定しないと、Visual Studioのコンパイラが見つからないというエラーが発生します。
3D Gaussian Splattingのクローンと仮想環境の作成
適当なディレクトリで3D Gaussian Splattingのリポジトリをクローンします。
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
クローンしたリポジトリのディレクトリに移動し、仮想環境を作成します。
conda env create --file environment.yml
3D Gaussian Splattingを実行
自前で撮影したデータセット(≠Blenderで作成したデータセット)を用いる場合はCOLMAPを用いてカメラパラメータを推定する必要がありますが、今回はBlenderで作成したデータセット(カメラパラメータが既知)を用いるため、COLMAPは不要です。先ほどBlenderで出力した画像は下記のようなディレクトリ構造になっているはずです。
Dataset ├── train │ ├── 000000.png │ ├── 000001.png ├── transforms_train.json
上記のDataset
のパスを指定して下記のコマンドを実行し、学習を行います。
python train.py -s C:\hoge\Dataset
学習後は公式のビューワーを用いて学習結果を確認することができます。
学習結果は57d2e075-4
のようなランダムな文字列のディレクトリに保存されています。
公式のREADMEで紹介されている下記のコマンドでは、利用の環境によっては表示される画面のサイズがおかしくなることがあります。
viewers\bin\SIBR_gaussianViewer_app.exe -m output\57d2e075-4
その際は、利用の環境(手元の環境では4Kモニターを使用)に合わせて下記のようなコマンドを実行することで解決することがあります。
viewers\bin\SIBR_gaussianViewer_app.exe -m output\57d2e075-4 --rendering-size 3840 2160
しかしこのビューワで結果を確認するのは、パッと結果を確認するには良いのですが、 操作方法が独特(ゲームなどでよくあるWASDキーでの操作とは少し異なる)で難しく、 また確認結果を動画として保存し資料として残すことができません(PCの画面録画だとビューワのUIなどが映り込んでしまう)。そこで、下記のような手順で、学習結果を動画として保存することができるnerfstudioを導入します。
nerfstudioによる学習結果の動画作成
nerfstudioはNeRFの学習および学習結果の確認を行うためのオープンソースソフトウェアです。 また最近、nerfstudioからフォークして3D Gaussian Splattingの学習結果の確認も行えるようにしたものが登場しており、今回はこちらを使って学習結果を確認したいと思います。
必要なツール類のインストール
導入の手順はnerfstudioのHPに従って進めていきます。 CUDAや、condaなどは先ほどインストールしたものをそのまま使います。
仮想環境の作成
まずは仮想環境を作成します。
conda create --name nerfstudio python=3.8 conda activate nerfstudio python -m pip install --upgrade pip
依存パッケージのインストール
CUDAに対応したPyTorchをインストールします。 その前に既にインストールされているPyTorchをアンインストールします。
pip uninstall torch torchvision functorch tinycudann
そしてCUDAに対応したPyTorchをインストールします。
pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --extra-index-url https://download.pytorch.org/whl/cu118
続いてCUDA extenstionsをインストールします。
conda install -c "nvidia/label/cuda-11.8.0" cuda-toolkit
最後にtiny-cuda-nnをインストールします。
pip install ninja git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
nerfstudioのインストール
pipを用いてGaussian Splattingに対応したnerfstudioとsubmodulesをインストールします。
git clone -b gaussian_splatting --recursive https://github.com/yzslab/nerfstudio.git cd nerfstudio pip install plyfile==0.8.1 pip install ./submodules/diff-gaussian-rasterization pip install ./submodules/simple-knn
nerfstudioの実行
Gaussian Splattingの学習結果のディレクトリを指定して下記のコマンドを実行しnerfstudioのビューワを起動します。
python nerfstudio\scripts\gaussian_splatting\run_viewer.py --model-path GAUSSIAN_TRAINING_OUTPUT_MODEL_DIR
実行に成功すると、下記のような画面が表示されるので、リンクをブラウザに貼り付け、ビューワを起動します。
ビューワの右側にあるメニュー画面から「RENDER」を選択し、カメラ設定の画面を表示します。
「ADD CAMERA」を押し、カメラを追加し、カメラの軌道を設定します。
カメラの軌道を設定したら「EXPORT PATH」を押し、camera_path.jsonを出力しダウンロードします。 最後に、このcamera_path.jsonを下記のコマンドで指定して、動画をレンダリングします。
python nerfstudio\scripts\gaussian_splatting\render.py camera-path --model-path GAUSSIAN_TRAINING_OUTPUT_MODEL_DIR --camera-path-filename YOUR_CAMERA_PATH_FILE.json --output-path YOUR_OUTPUT_MP4_FILE.mp4
これにより、指定したカメラの軌道に従ってレンダリングした動画を作成することができます。 ビューワを手動操作して録画するよりも安定したカメラの軌道で動画を出力することができるため、資料として残すような際にはこのような方法を用いることを個人的にはお勧めします。
※動画はMP4で出力されますが、ブログに掲載する都合上GIFに変換しています。
おわりに
本記事では3D Gaussian Splattingの動かし方について、データセットの作成から学習結果のレンダリングまでを通して解説しました。 3D Gaussian SplattingはNeRFの代替手法としても注目を集めており、今後も研究が進んでいくことが期待されます。 この記事を読んだ方が、実際に手を動かして3D Gaussian Splattingを試してみるきっかけになれば幸いです。