instant-ngpのセットアップ方法

# 0.　参考にした記事

①Instant NGPのセットアップ方法

https://lilea.net/lab/how-to-setup-instant-ngp/

- 全体的にサポートが手厚い．（特にインストール関連）


②Instant-ngpの構築方法は？| AI研究所

https://ai-kenkyujo.com/artificial-intelligence/instant-ngp-kouchiku/

- こちらもサポートは手厚い
- 構築～実行までのディレクトリ構造はここを真似た．

③初心者による初心者のためのInstant NGP備忘録

https://zenn.dev/sakiyama/articles/2f8610a0eb68ba


- ①のブログに対してコメントを入れるようなスタイル．
- 間違いやすい箇所，楽な方法を超シンプルに解説．あくまでも①ありき．

④Instant NeRFを試す環境を作る

https://www.technicalife.net/how-to-setup-instant-ngp-nerf/

- 見つけるのが遅かったからあまり使わなかったけど参考になる

⑤Instant NGPを動かしたメモ

https://zenn.dev/ikekou/scraps/65f27c8e28a5c0

- 最後の最後の躓きを解消してくれた救世主サイト．
- ありがちなエラーをまとめてくれているので，困ったときはこれ．


# 1．インストール

以下の記事がインストール関連の記事の中で最も参考になった．この記事の手順に従えば問題はない．

https://lilea.net/lab/how-to-setup-instant-ngp/


### ざっと必要なツール一覧
- Visual Studio 2019
- CMake
- CUDA Toolkit
- Optix
- git
- COLMAP

gitのインストールは以下の記事を参考にした．

https://ai-kenkyujo.com/artificial-intelligence/instant-ngp-kouchiku/

:::note info
- Path指定の際のEドライブではじまるものは，よく分からないがそのままやればいい．
- Path指定の際にバージョンの値が必要なものもあるので，そこだけ注意．
:::

# 2．構築

### 2-1.　ファイルのコピー
> C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\visual_studio_integration\MSBuildExtensions

の中のファイルを，以下のディレクトリにすべてコピー
>C:\ProgramFiles(x86)\MicrosoftVisualStudio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations


### 2-2.　npgディレクトリを作成，ngpディレクトリへ移動
- C:\Tutorial\ngpを作成
- Anaconda Promtで作成したngpディレクトリへ移動

### 2-3.　クローン
- クローンする 
```php
git clone –recursive https://github.com/nvlabs/instant-ngp
```
- クローンが完了したら，instant-ngpディレクトリへ移動．

### 2-4.　ビルド
以下のコマンドをDeveloper Command Promptで．
```php
cd C:\Tutorial\ngp\instant-ngp 
```

```php
cmake . -B build
```

```php
cmake –build build –config RelWithDebInfo -j 16 
```
jに続く値は「タスクマネージャー>パフォーマンス>CPU」からコア数を調べることが可能．私の場合はコア数=8．

### 2-5.　Python仮想環境構築
- Anaconda Promtで
```php
conda create -n ngp python=3.9
```
Remove existing environmentやProceedと出たら「y」と入力．

- ngpをアクティベート
```php
conda activate ngp
```

- パッケージを一括インストール
```php
pip install -r requirements.txt
```

### 2-6.　補足
- 2.5終了時にTutorial/ngp/instant-ngpにOpenEXR-1.3.2-cp39-cp39-win_amd64.whlがなかったら下からダウンロードして，instant-ngpのディレクトリ内に移動．

 https://download.lfd.uci.edu/pythonlibs/archived/OpenEXR-1.3.2-cp39-cp39-win_amd64.whl

- Anaconda Promptでpiexrをインストール
```php
pip install OpenEXR-1.3.2-cp39-cp39-win_amd64.whl
```

# 3．データセットの用意

### 3-1.　公式によるデータセット（ショベルカー）を使う場合
- 以下から保存する．
- Tutorial/ngp/instant-ngp/dataの直下にtoy_trackの名前で保存

https://drive.google.com/drive/folders/1J2tjCOoZeP-UTq3xsXS6WpTlc_yrzVuq

### 3-2.　自前のデータセットを使う場合
- instant-ngp/dataに保存

:::note warn
- 4K以下の解像度の画像であること
- 画像の枚数は最低でも50枚程度（少ないとモデルの精度悪化）
:::

### 3-3.　jsonファイルを作成
#### 3-3-1. 公式データセットの場合
Anaconda Promptで
```php
python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images data/toy_truck
```

#### 3-3-2.　自前データセットの場合
Anaconda Promptで
```php
python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images <image/path>
```
- 生成されたjsonファイルは，transforms.jsonの名前でinstant-ngpディレクトリに出力される
:::note info
- コマンド実行時にnumpyがないとエラーになった場合：pip install numpy
- コマンド実行時にcv2がないとエラーになった場合：pip install opencv-python
- 必要なものがインストールできたら，再度上記のコマンドを実行
:::

### 3-4.　ディレクトリを整理
- 推論に用いるデータセットがdata/toy_truck/data/toy_truckの中になるように整理
- instant-ngpフォルダにできたtransforms.jsonをdata/toy_truckに移動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939072/0639544a-0550-0f7b-760c-d19d28c630cc.png)

# 4．instant-ngpを実行
- Anaconda Promptで
```php
<path_to_your_ngp>\instant-ngp\build\instant-ngp.exe --scene data/<image_set_name>
```
```php:一例
C:\Tutorial\ngp\instant-ngp\build\instant-ngp.exe –scene data/test
```
# 5．データセットを入れ替えるとき or 再実行するとき
すべてAnaconda Promptで
```php
conda activate ngp 
```

```php
cd C:\Tutorial\ngp\instant-ngp
```
ここまでは共通．

データセットそのままの場合は以下の2つ．
```php
python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images data/toy_truck
```
```php
C:\Tutorial\ngp\instant-ngp\build\instant-ngp.exe –scene data/toy_truck
```



データセットを入れ替えた場合は以下の2つ．
```php:transforms.jsonを作成
python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images <image/path>
```
```php:実行
<path_to_your_ngp>\instant-ngp\build\instant-ngp.exe --scene data/<image_set_name>
```