Gaussian Splattingは、SIGGRAPH 2023で発表されたプロジェクトです。
複数枚の写真からその空間のあらゆるところから見たビューを補間します。
同じ技術にNeRFがありますが、これの欠点を補った理論のようです(アルゴリズムはまだ未調査)。
NeRFの問題は、かなり大雑把な書き方ですが大きく以下の2点があります。
- トレーニング時間がかかる
- 最終的な空間の復元で解像度不足 (なんだか眠い)
GitHubのリポジトリはこちらになります。
https://github.com/graphdeco-inria/gaussian-splatting
今回はGaussian Splattingを試す流れをまとめることにしました。
CUDA11.8とAnaconda3を使います。
GoProで撮影した動画を使ってウォークスルーするまでを行います。
検証環境
- OS : Windows 10
- Mem : 64 GB
- GPU : NVIDIA RTX A5000 (24GB VRAM)
環境構築前に確認
ビルドでは以下が必要になります。
- CUDA 11.8 (デフォルトの11.6は未確認)
- Phython >= 3.8
- Visual Studio 2019
CUDA 12では動作しないとのこと。
必要なハードウェア
- CUDAが使えるGPU (NVIDIA社製のGPU)
- GPUのVRAM 24GB以上 (RTX 4090以降 ?)
readmeによると、VRAMについては少ない容量でも使用できるように調整可能なようです。
必要なツールをインストール
最終的に必要になるものを先に列挙します。
- CUDA環境 (ここでは11.8)
- Visual Studio 2019
- Anaconda 3
以下はあったほうがいいツール。
- ffmpeg (GoProの動画から静止画を取り出す)
- COLMAP (魚眼の写真をPINHOLEカメラのゆがみがない画像になるように変換)
- ImageMagick (COLMAPと一緒に使う。実際は使わないで済むかも)
Visual Studio 2019のインストール
以下よりVS2019を探してインストールします。
https://visualstudio.microsoft.com/ja/vs/older-downloads/
CUDAのインストール
「CUDAをインストール (Windows)」にまとめました。
ここではCUDA 11.8を使います。
以下にインストールされました。
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8
Anaconda3をインストール
Python環境や各種パッケージをGaussian Splatting専用に分けて管理しておきたいため、Anaconda3を使います。
「[Python] Anaconda」にまとめました。
ffmpegをインストール
ffmpegは動画のフォーマット変換/サイズ変更/切り取りなど、動画を編集するためのコマンドラインツールです。
よりダウンロードします。
以下にインストールしました。
かなり前から使ってるのでバージョンが古いままです。
K:\WinApp\ffmpeg-20180113
PATHを通してコマンドラインで使います。
COLMAPのインストール
COLMAPは、複数の写真からカメラ位置や向きを推定します。
三次元復元ではよく使われます。
NeRFのプロジェクトでもよく使われているようです。
なお、CUDA対応版を使用するようにしてください。
「COLMAP-3.8-windows-cuda.zip」を以下に展開しました。
K:\WinApp\COLMAP\COLMAP-3.8-windows-cuda
ImageMagickをインストール
画像処理のツール。
https://imagemagick.org/index.php
"ImageMagick-7.1.1-15-Q16-HDRI-x64-dll.exe"をダウンロードしました。
K:\WinApp\ImageMagick-7.1.1-Q16-HDRI
なお、インストーラにより環境変数のPATHにImageMagickの実行ファイルのあるフォルダを自動で追加されます。
これ以降は主にAnaconda上の作業になります。
Anaconda上でGaussian Splattingの環境構築
Windowsのスタートアップメニューから[Anaconda3]-[Anaconda Prompt]を選択してコマンドラインを起動します。
ここでcondaのバージョンを確認しておきましょう。
conda --version
"conda 23.7.3"と表示されました。
Gaussian SplattingのソースコードをClone
Gaussian SplattingのソースコードはGitHubからCloneしてくるため、その環境のためのフォルダに移動します。
"K:\WinApp\GaussianSplatting"で作業することにしました。
cd K:\WinApp\GaussianSplatting
git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive
別リポジトリを参照するネスト構造になっているため、GitHubからzipをダウンロードした場合は正しくビルドできません。
必ずcloneで取得するようにしてください。
environment.ymlの編集
readmに通りにビルドしようとすると、いくつかのエラーが出ました。
参考までにメモっておいたエラー出力を記載しておきます。
Pip subprocess error:
error: subprocess-exited-with-error
× python setup.py bdist_wheel did not run successfully.
│ exit code: 1
╰─> [57 lines of output]
No CUDA runtime is found, using CUDA_HOME='C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8'
running bdist_wheel
running build
running build_py
creating build
creating build\lib.win-amd64-cpython-310
creating build\lib.win-amd64-cpython-310\diff_gaussian_rasterization
copying diff_gaussian_rasterization\__init__.py -> build\lib.win-amd64-cpython-310\diff_gaussian_rasterization
running build_ext
K:\WinApp\anaconda3\envs\gaussian_splatting\lib\site-packages\torch\utils\cpp_extension.py:359: UserWarning: Error checking compiler version for cl: [WinError 2] 指定されたファイルが見つかりません。
warnings.warn(f'Error checking compiler version for {compiler}: {error}')
Traceback (most recent call last):
File "<string>", line 2, in <module>
File "<pip-setuptools-caller>", line 34, in <module>
File "K:\WinApp\GaussianSplatting\gaussian-splatting\submodules\diff-gaussian-rasterization\setup.py", line 17, in <module>
setup(
この場合、"No CUDA runtime is found"としてCUDAの環境が見つからないと出ています。
ですが、CUDAはインストール済み、各種dllのあるフォルダもPATHに指定済みです。
この原因は、Gaussian Splattingビルドで使用するpytorchがCPU版でインストールされていたというのが原因でした。
「指定されたファイルが見つかりません。」のメッセージ。
clがない、と指摘されました。
これはC/C++コンパイラをビルド時に使用しているから、という理由のようです。
VS2019の実行環境のパスが必要です。
後、ninjaがないというのも出ていました。これのビルド時に単純にninjaがないだけ。
以上より、まずはcondaへのインストールに必要なものが記載されている"environment.yml"を編集していきます。
ここで、CUDAのバージョンを11.8にする、Python 3.8.10にする、としました。
name: gaussian_splatting
channels:
- pytorch
- nvidia
- conda-forge
- defaults
dependencies:
- plyfile=0.8.1
- python=3.8.10
- pip=22.3.1
- pytorch=2.0.0
- torchaudio=2.0.0
- torchvision=0.15.0
- cudatoolkit=11.8
- tqdm
- ninja
- pip:
- submodules/diff-gaussian-rasterization
- submodules/simple-knn
channelsに"- nvidia"を追加。
これにより、pytorchはGPU版が使われます。
後、Python 3.8.10をインストールするように変更しました。
CUDA 11.8を使うため、
https://pytorch.org/get-started/previous-versions/
より、DUDA 11.8で使用するpytorch/torchaudio/torchvisionのバージョンを確認します。
パッケージ | バージョン |
---|---|
CUDA | 11.8 |
pytorch | 2.0.0 |
torchaudio | 2.0.0 |
torchvision | 0.15.0 |
"cudatoolkit=11.8"はtorchの下に移動しました(順番によりGPU版がインストールされないこともあるかもしれないので、念のため)。
"ninja"を追加しました。
ビルド
"K:\WinApp\GaussianSplatting\gaussian-splatting"に移動します。
cd K:\WinApp\GaussianSplatting\gaussian-splatting
cl.exeの参照があるため、VS2019の実行ファイルのパスを通します。
デフォルトは以下を実行すればOKです。
64ビット版のビルドに必要な設定が行われます。
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
この後"cl"を指定して、コンパイラが検索できているのを確認します。
後はreadmeの通りに実行していきます。
以下でcondaの環境として"gaussian_splatting"が作成されます。
SET DISTUTILS_USE_SDK=1
conda env create --file environment.yml
これにより、"environment.yml"を元に必要なモジュールのインストールや各種ビルドが行われます。
これは少し時間がかかります。
もし、処理が失敗して"No CUDA runtime is found"が発生する場合は
set FORCE_CUDA="1"
set CUDA_VISIBLE_DEVICES=0
を実行してから再度"conda env create –file environment.yml"をすると解決する場合があります。
なお、再度ビルドする場合は一度gaussian_splatting環境を削除するほうが安全です。
condaの環境をbaseに戻して、失敗した"gaussian_splatting"を削除します。
conda deactivate
conda remove -n gaussian_splatting --all
成功すればインストールされた環境"gaussian_splatting"に移動します。
conda activate gaussian_splatting
pytorchがCUDA(GPU)版か確認する
pytorchがCUDA(GPU)版になっているか確認します。
"conda list"を実行します。
conda list
以下のようにcuda関連がnvidiaになっているのを確認。
cuda-cccl 12.2.128 0 nvidia
cuda-cudart 11.8.89 0 nvidia
cuda-cudart-dev 11.8.89 0 nvidia
cuda-cupti 11.8.87 0 nvidia
cuda-libraries 11.8.0 0 nvidia
cuda-libraries-dev 11.8.0 0 nvidia
cuda-nvrtc 11.8.89 0 nvidia
cuda-nvrtc-dev 11.8.89 0 nvidia
cuda-nvtx 11.8.86 0 nvidia
cuda-profiler-api 12.2.128 0 nvidia
cuda-runtime 11.8.0 0 nvidia
cudatoolkit 11.8.0 h09e9e62_12 conda-forge
pytorchでcudaのテキストがあるのを確認。
pytorch 2.0.0 py3.8_cuda11.8_cudnn8_0 pytorch
pytorch-cuda 11.8 h24eeafa_5 pytorch
pytorch-mutex 1.0 cuda pytorch
これでCUDA版のPytorchになっています。
念を押して、Pythonを使ってpytorchがCUDAを使用しているか確認します。
"K:\WinApp\GaussianSplatting\gaussian-splatting"に"test_version.py"というテキストファイルを作成。
以下のように記載しました。
import torch
print(torch.__version__)
print(torch.cuda.is_available())
print(f"GPU Count = {torch.cuda.device_count()}")
これをAnaconda上のコマンドラインで実行します。
python test_version.py
以下のように出力されました。
torch.cuda.is_available()がTrueの場合はpytorchでCUDAが使用できます。
2.0.0
True
GPU Count = 1
これでGaussian Splattingを使う環境が整いました。
後は、使用するときにAnacondaのコマンドラインで"conda activate gaussian_splatting"としてからコマンドを実行すればOKです。
GoProの動画から静止画を切り出し
Anacondaのコマンドラインはそのままにしておき、新たにコマンドプロンプトを開きそこで作業します。
さて、学習させる素材を撮りましょう。
GoProを使って3840×2160ピクセルの動画を撮りました。
撮影は、周囲全体を死角が出ないようにこまめに撮り尽していきました。
全体で5分19秒の動画になりました。
GoProは少し魚眼になるため、ゆがみがあります。
Gaussian Splattingでは、これをゆがみのない状態に補正する必要があります。
以下は補正後の画像。
この補正は後々COLMAPを使って行います。
さて、次にffmpegを使って動画から静止画を切り出します。
ffmpegは"K:\WinApp\ffmpeg-20180113"にインストールしたものとします。
set PATH="C:\WinApp\ffmpeg-20180113\bin";%PATH%
としてパスを通します。
GoProで撮影した動画を"GH010065.MP4"とします。
配置したフォルダにcdで移動します。
inputフォルダを作成し、以下を実行します。
mkdir input
ffmpeg -i GH010065.MP4 -r 2 input/image_%05d.jpg
これは動画から2fpsで静止画をinputフォルダに出力していきます。
GH010065.MP4
[input]
image_00001.jpg
image_00002.jpg
image_00003.jpg
...
のように画像が展開されます。
全部で640枚になりました。
ゆがみ補正とCOLMAPのデータセットを作成
Anacondaのコマンドラインに戻ります。
以下のように指定済みなのを確認しておいてください。
cd K:\WinApp\GaussianSplatting\gaussian-splatting
conda activate gaussian_splatting
Gaussian SplattingはCOLMAPのデータセットを受け取りトレーニングを行います。
このデータセットの作成は付属の"convert.py"で行うことができます。
先ほどの動画から静止画の出力で、以下のようなファイル構成になっています。
mp4はいらないので削除してもOKです。
[location]
GH010065.MP4
[input]
image_00001.jpg
image_00002.jpg
image_00003.jpg
....
以下を実行すると、COLMAPを使ったゆがみ補正とCOLMAPのデータセットの作成が行われます。
python convert.py --colmap_executable "K:\WinApp\COLMAP\COLMAP-3.8-windows-cuda\COLMAP.bat" -s [location]
–colmap_executableには、COLMAPをインストールしたフォルダの"COLMAP.bat"までをフルパス指定します。
-sには、[input]フォルダがあるフォルダをフルパスで指定します。
"K:/temp/nerf/data_01"に格納しているとすると、以下のように指定することになります。
python convert.py --colmap_executable "K:\WinApp\COLMAP\COLMAP-3.8-windows-cuda\COLMAP.bat" -s K:/temp/nerf/data_01
この作業はしばらく時間がかかります。
成功すると以下のように出力されます。
[location]
GH010065.MP4
[input]
image_00001.jpg
image_00002.jpg
image_00003.jpg
....
[images]
image_00001.jpg
image_00002.jpg
image_00003.jpg
[distorted]
[sparse]
database.db
[sparse]
[0]
cameras.bin
images.bin
points3D.bin
points3D.ply
[images]フォルダにゆがみを補正した画像が出力されます。
使用できない画像は削除されます。
合計631枚の画像となりました。
[sparse]がCOLMAPデータセットで使用するファイル。
カメラのデータ(位置、向き、ゆがみなど)がここに格納されます。
これらのファイルは消さないようにしてください。
[input]は消してもOKです。
これでトレーニングの前準備は完了です。
トレーニング
次にトレーニングを行います。
これは時間がかかります。
ですが、Gaussian Splattingはこの計算が速いというのが特徴です。
python train.py -s [location]
GPUのVRAMは20-22GBは使用していました。
たしかにVRAM 24GBは必要そうですね。
デフォルトでは1.6K解像度以上のものは縮小されるようです。
1時間ほどで計算が完了しました。
プログレスバーは2か所出ますが、1つめは100%まではいかないようでした。
ここの"Output Folder"の表記に出力先"output/3f025042-3"が見えます。
これを覚えておきます。
ビュワー : 結果を見る
結果を見るには専用のビュワーが必要です。
https://github.com/graphdeco-inria/gaussian-splatting#pre-built-windows-binaries
より、"Pre-built Windows Binaries"の"viewer.zip"をダウンロードして解凍。
"K:\WinApp\GaussianSplatting\viewers"に解凍したとします。
以下でパスを追加。
set PATH=K:\WinApp\GaussianSplatting\viewers\bin;%PATH%
"-m"の後にトレーニングで出力されたフォルダを指定します。
SIBR_gaussianViewer_app -m Output/3f025042-3
これでビュワーが開きました。
キーボードでウォークスルーできます。
カメラ移動。
キー | 役割 |
---|---|
A | 左移動 |
D | 右移動 |
W | 前進 |
S | 後退 |
Q | 視線を下げる |
E | 視線を上げる |
向きの転換。
キー | 役割 |
---|---|
J | 左に旋回 |
L | 右に旋回 |
I | 上を向く |
K | 下を向く |
U/O | 視線方向を軸に旋回 |
これを動画にすると以下のようになりました。
これは2倍速にしていますが、常に60fpsを保っているのを確認できます。
これでGaussian Splattingをローカルで使えるようになりました。
たしかにトレーニングが速く、結果も良好でくっきりしている印象ですね。
NeRFは年々進化していってるので1年前はこうだったけど今はこうだ、という驚きがあります。
今後どのように成長していくのか楽しみです。