Gaussian Splattingを試す (Windows)

  • by

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は動画のフォーマット変換/サイズ変更/切り取りなど、動画を編集するためのコマンドラインツールです。

https://ffmpeg.org/

よりダウンロードします。

以下にインストールしました。
かなり前から使ってるのでバージョンが古いままです。

K:\WinApp\ffmpeg-20180113

PATHを通してコマンドラインで使います。

COLMAPのインストール

COLMAPは、複数の写真からカメラ位置や向きを推定します。
三次元復元ではよく使われます。

https://colmap.github.io/

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年前はこうだったけど今はこうだ、という驚きがあります。
今後どのように成長していくのか楽しみです。