InstantNeRFで任意画像から3D再構成をするまでの流れメモ

NVIDIA InstantNeRF (InstantNGP) の環境セットアップと,
自身で用意した画像群を使った3D再構成をするフローのメモ.

基本的に公式リポジトリのセットアップ手順そのまま.
github.com

セットアップ

実行環境

WIndows10 64bit
RTX 3070

Requirementsのセットアップ

CUDA

"v10.2 or higher"
11.7 をインストール.
developer.nvidia.com

CMAKE

"v3.21 or higher"
3.24.0-rc5 をインストール.
インストーラによる system Path へのCMAKEパス追加 は true とした.
自分で追加する場合は環境変数Pathに "C:\Program Files\CMake\bin" あたりを追加する.
cmake.org

Python

"3.7 or higher"
自身の環境のAnacondaに 3.9 が含まれていたので改めてインストールはせず.

Python Modules

公式リポジトリの requirements.txt をローカルにダウンロード.
このtxtに必要なモジュールが記述されているのでpipでPython環境にインストール.
https://github.com/NVlabs/instant-ngp/blob/master/requirements.txt

pip install -r requirements.txt
OptiX

"7.3 or higher"
7.5 をインストール.
インストール後に以下の環境変数が設定されていなければ手動で追加する.
変数名 "OptiX_INSTALL_DIR"
値 "C:\ProgramData\NVIDIA Corporation\OptiX SDK バージョン番号"
developer.nvidia.com

InstantNgpのビルド

リポジトリの取得

適当なディレクトリにcloneする.

git clone --recursive https://github.com/nvlabs/instant-ngp
ビルド

cloneしたinstant-ngpディレクトリでCMAKEによるビルドを実行.

cmake . -B build
cmake --build build --config RelWithDebInfo -j
サンプルを実行

ビルドが成功したらサンプルが実行できるか確認する.
instant-ngpディレクトリでコマンドラインからnerf/foxサンプルを実行.

.\build\testbed.exe --scene .\data\nerf\fox
NeRF_Fox_Sample

狐のNeRFシーンサンプルのリアルタイム学習が確認できる.

3D再構成の準備

NeRFの学習には画像毎のカメラ姿勢情報が必要.
COLMAPを利用することで画像群からカメラ姿勢を推定することができ, NeRFの学習に利用できるようになる.
InstantNgpでは colmap2nerf.py というスクリプトが提供されており, COLMAPで推定したカメラ姿勢情報をNeRF向けに変換できる.
詳細は以下の公式tipsの「Preparing new NeRF datasets」を参考.
github.com

COLMAP

ダウンロード

COLMAP公式から pre-build binaries リンクを辿ってビルド済みバイナリを取得.
今回は COLMAP-3.7-windows-cuda.zip をダウンロードして適当なディレクトリに展開.
colmap.github.io

環境変数Pathへの追加

環境変数PathにCOLMAPディレクトリを追加する.
(colmap2nerf.pyでCOLMAP.batを参照するため)

3D再構成

新規に用意した画像群でInstatnNeRFを学習する.
簡単のために画像データは instant-ngp ディレクトリの data/nerf 下に新規にディレクトリを作成するものとする.

画像ファイルの準備

instant-ngp/data/nerf/new_data ディレクトリを作成.
instant-ngp/data/nerf/new_data/images ディレクトリを作成.
instant-ngp/data/nerf/new_data/images に画像群をコピー.

COLMAPによる画像群カメラ姿勢推定

instant-ngp/data/nerf/new_data ディレクトリでコマンドラインからcolmap2nerf.pyを実行してカメラ姿勢情報を生成する.

python [path-to-instant-ngp]/scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16

これで画像毎のカメラ姿勢情報を格納したtransforms.jsonなどが生成される.

InstantNeRFを実行

instant-ngpディレクトリでコマンドラインからnew_dataでNeRFを実行する.

.\build\testbed.exe --mode nerf --scene .\data\nerf\new_data

以上で新たに用意した画像群からカメラ姿勢推定情報を計算してInstantNeRFで再構成することができる.
現実で手頃な被写体がなかったので、ゲームのスクリーンショット画像群で試した例がこちら(ELDEN RING)
スクリーンショットからでもカメラ姿勢推定ができるCOLMAPの威力を見た...