2022年の春に NVIDIA が Instant NeRF を発表しました。撮影した画像データから、ディープラーニング技術を用いて短時間で 3D シーンを構成します。NeRF は Neural Radiance Fields の略です。
NeRF のページは https://www.matthewtancik.com/nerf です。詳しい内容を確認したい人はこちらのサイトを確認するとよさそうです。
この Instant NeRF を試すためのリポジトリが NVIDIA から公開されており、こちらの環境セットアップを行って試してみよう、というのが本記事の内容となります。
必要なもの
ソフトウェア
- Visual Studio 2019
- C++ 開発環境および CMake を追加しておくと良い
- CMake 3.21.0 を使用していました
- CUDA Toolkit 11.6
- Optix 7.5.0
- 開発者アカウント登録してのダウンロードが必要
- Python 3.9.12
ハードウェア
ハードウェアとして以下の環境で動かしていました。完全に動かすのは不可能かもしれませんが、そこそこはこの環境でも確認が出来ていると思っています。
- Windows10 64bit
- 32GB メモリ
- Geforce RTX 3060 Ti
- VRAM 8GB
セットアップ
Visual Studio のインストール、CUDA、 Optix についてはインストーラーがあるので詳細を割愛します。私は標準的な設定でインストールを行いました。
Optix の環境変数
環境変数で Optix の所在を設定しておくことが必要です。システムの環境変数として以下の通りに設定しました。
CMake
CMake はパスの通った状態にしておく必要があるので、設定しておきます。
インストーラーで設定してしまっても良いですし、インストールパス「C:\Program Files\CMake\bin」を環境変数 PATH に後で追加するでもよいです。
Python
Python は Anaconda から取得したものでインストールします。
あとで pyexr をインストールするため、https://www.lfd.uci.edu/~gohlke/pythonlibs/#openexr からファイル OpenEXR‑1.3.2‑cp39‑cp39‑win_amd64.whl をダウンロードしておきます。
ビルド
リポジトリの取得
instant-ngp リポジトリをクローンします。tortoiseGit を用いて取得するときには、次に示す画面の通り再帰的にチェックを入れておき、関連するモジュールも一緒に取得するようにしておきます。
ビルド
Visual Studio の開発者用のコマンドプロンプトを開きます。
クローンしたリポジトリの場所をカレントに移動して、cmake を実行します。このときの実行コマンドは以下の通りです。
cmake . -B build
続いて以下のコマンドを実行してアプリケーションのビルドを行います。”-j 8″ としているのは、論理 CPU が8コアなのでそれに合わせています。もしもっと多くのコアを持っている場合には増やしてもよいでしょう。
cmake --build build --config RelWithDebInfo -j 8
COLMAP の取得
https://github.com/colmap/colmap/releases/tag/3.7 から、COLMAP-3.7-windows-cuda.zip ファイルを取得して、適当なところに展開します。私の場合には instant-ngp をクローンした場所に配置しました。
この COLMAP のフォルダ (D:\workdir\COLMAP-3.7-windows-cuda) は環境変数 PATH に追加しておきます。
Python の仮想環境を作成
Anadonda のプロンプトを起動して、以下のコマンドを実行します。 NGP 用の環境を作成します。
conda create -n ngp python=3.9
conda activate ngp
続いて、カレントフォルダを instant-ngp リポジトリを取得した場所に変更します。
それから、以下のコマンドを実行して必要なパッケージをインストールします。
cd D:\workdir\instant-ngp
pip install -r requirements.txt
最後に 既に取得している pyexr パッケージをインストールします。パッケージが instant-ngp フォルダにコピーされているとして、以下のコマンドでインストールします。
pip install OpenEXR-1.3.2-cp39-cp39-win_amd64.whl
画像データの準備
instant-ngp/data フォルダの中に、任意のフォルダを作成して画像を配置します。
既にある nerf/fox データを使う場合には本ステップは不要で、実行のステップまで進んで下さい。
本家 https://www.matthewtancik.com/nerf のページから、データを取得できるのでこちらを利用します。自分で撮影したデータを使うのでも問題ありません。ここでは Lego で作成されたトラックの画像を使っていきます。
nerf_example_data.zip を取得すると、その中の nerf_synthetic\lego\train というフォルダがあります。以下に示すように instant-ngp/data/toy_truck フォルダにこれらの画像を配置します。
Anaconda Prompt にもどり、以下のコマンドを実行します。上書きしてよいか聞かれたときには Y を押して続行します。
python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images data/toy_truck
この処理は時間が掛かるのですが、以下のような画面になっていれば正常終了しています。もしエラーが出る場合には、画像の解像度は全て同じであるか、メモリ不足に陥ったりしていないか、あたりを確認するのも必要です。Python のモジュール不足が出た場合には、適宜追加してあげてください。
画像データが data/toy_truck/data/toy_truck フォルダの中になるように、フォルダを作成して移動します。そして、 instant-ngp フォルダに出来た transforms.json ファイルを data/toy_truck フォルダに移動します。
これらのファイル移動処理は手間ですが、忘れてしまうとこの先の起動で失敗してしまうので注意しましょう。
実行する
以下のコマンドを実行して学習の実行・データのプレビューを確認します。
build\testbed.exe --mode nerf --scene data/toy_truck
アプリケーションが起動して、しばらくすると以下に示すようなものが見えてくるはずです。マウスを操作してカメラを回転させ、どこかに表示されていないかを見てみるのもよいでしょう。
このビューワーでの操作はリポジトリにも記載されている説明を参照して下さい。
ムービーの出力
提供されているツールには、カメラを追加して、それらのカメラワークをムービーに出力する機能があります。先ほどのビューワーで、Camera Path と書かれたウィンドウを開くと、以下のように Add from cam のボタンがあります。カメラを移動して、このボタンを押し、カメラワークを作成していきます。
適当にカメラを追加していくと、以下のようにカメラのパスが表示されます。カメラワークの設定が終わったら、 Save ボタンを押して、これらの情報を保存しておきます。
これらのカメラワークで撮影したムービーデータを出力することができ、それを行うコマンドが以下の通りです。ここでは分割して記載していますが、入力は1行で行って下さい。
python scripts/run.py
--mode nerf
--scene data/toy_truck
--video_camera_path data/toy_truck/base_cam.json
--video_n_seconds 90
--width 1280 --height 720
このコマンドを実行すると、instant-ngp のフォルダにmp4 ファイルが出力されます。
まとめ
環境セットアップには下記のページを参考にしました。大変丁寧に記載されており、助かりました。
カメラの設定とムービーの出力について、古い情報がネット上に残っており手間取ったので本記事を作成しました。
コメント