自由研究

Instant NeRF(instant-ngp)で遊んだのでフォトグラメトリーと比較する

投稿日:

最近グラフィックボードを買って、CUDA環境を手に入れたのでかねてから興味のあったNeRFを試してみました。
そんな中で、フォトグラメトリーとの似ているところ、違うところが見えてきたので紹介したいと思います。

前置きのおまけ:環境構築と使い方

まずは公式のGitHubを見てほしいです。ほとんどのことはここに書いてあります。
よくわからない場合、日本語の資料としてInstant NGP (NeRF) のセットアップ方法
初心者による初心者のためのInstant NGP(NeRF) 備忘録が詳しいです。
使い方もこれらのページにある通りですが、少々実体と異なるので説明すると、主に3フェーズ(+1)に分かれます。

フェーズ1 フォルダの準備をする

まず、作業用のフォルダを作ります。なんでもいいです。instant-ngpのフォルダとは関係ないところで良いです。
さらにその下にimagesフォルダを作って、学習対象の写真を置いておきます。
例えば、instant-ngpをCドライブ直下に置いて、C:\testフォルダを作業用にするには以下のような感じ。

--C:
   |-instant-ngp
   |  |-build
   |  |-scripts
   |  :
   |-test
      |-images

そして、この作業用フォルダ(C:\test)をカレントにして作業します。

フェーズ2 COLMAPを使ってデータセットを作る

instant-ngpフォルダ内のscripts\colmap2nerf.pyを使うと、特定のフォルダの画像を使ってNeRF用のデータセットを作成できます。
C:\testをカレントにして実行するので、コマンドプロンプトなら以下のような感じ。
C:\test> python c:\instant-ngp\scripts\colmap2nerf.py --colmap_matcher exhaustive -–run_colmap
オプションは色々ありますが基本的にこれで良いです。
実行すると、カレントフォルダ(C:\test)にtransform.jsonというファイルができます。
この、transform.jsonと写真ファイルがデータセットです。

フェーズ3 Instant NeRFで学習する

instant-ngpフォルダ内のbuild\testbed.exeを使うと、アプリケーションが起動してNeRFの学習が始まります。
これもC:\testがカレントなら、
C:\test> C:\instant-ngp\build\testbed.exe --scene .\
で良いです。
なお、ヘッドレスモード(GUIを使わずに学習だけさせるモード)を使いたい場合、build\testbed.exeではなく、scripts\run.pyを使います。
C:\test> python c:\instant-ngp\scripts\run.py --mode nerf --scene c:\test\ --save_snapshot c:\test\base.msgpack --n_steps 100000
などとすると、10万ステップ学習して、その結果をbase.msgpackに保存してくれます。この学習結果はGUIでもLoad Snapshotから再利用できます。

フェーズ3+1 映像を出力する

GUIの画面をキャプチャして映像化しても良いですが、公式でmp4を出力する方法があります。こちらのほうが時間をかけてレンダリングできる分、出力が綺麗です。
まずGUIでカメラワークを設定してbase_cam.jsonを出力しておく必要があります(ここは省略します。頑張ってください)。
その後、
C:\test> python c:\instant-ngp\scripts\run.py --mode nerf --scene c:\test\ --load_snapshot c:\test\base.msgpack --video_camera_path c:\test\base_cam.json --video_n_seconds 15 --video_fps 24 --width 1920 --height 1080
などとすると、1920×1080で24fpsの動画が出力されます。

本編:フォトグラメトリーとの比較

フォトグラメトリーと同じところ

そもそも、NeRFは撮影位置の特定が済んでいる写真から3D空間を再現するAI技術であって、撮影位置を特定するのはデータセットの準備フェーズであり、狭い意味ではNeRFではありません。
「写真の撮り方が悪くてデータセットが上手く作れない」ことがあるのはフォトグラメトリーと共通です。
また、小物の撮影などはどちらも得意とするところで、精度良く再現できます。

NeRFがフォトグラメトリーより優れているところ

とにかく、以下の要素に強いです。

  • 遠景(空や遠くのビルなど)の再現
    • フォトグラメトリーは、立体感が分からない程遠くにあるものはメッシュ化できません。一方NeRFは遠くのものでもある程度描画してくれます。
  • 水面・金属面の表現
    • 反射する物体や半透明な物体はNeRFの得意とするところです。フォトグラメトリーではこれらの立体化は困難です。
  • 草木のような細いものの再現
    • フォトグラメトリーだと細すぎるものが苦手で、木の枝が消えたり階段の手すりが消えたりというのがよくありますが、NeRFはこれらも得意です。
  • リアルな映像出力
    • 上記3つを含む空間について、リアルな映像を出力することに長けています。

NeRFがフォトグラメトリーより劣っているところ

以下の点で劣っていると感じました。

  • メッシュ(ポリゴン)の出力が弱い
    • 当たり前ですが、NeRFはメッシュを出力するための仕組みではないので、これは弱いです。
  • 生成物の再利用性が低い
    • フォトグラメトリーなら作った3Dモデルを3Dゲームの中に配置したりVRChatのワールドにしたりできます。現状NeRFは写真や映像出力が主で、このように再利用できる形での生成物は出力し辛いです。
  • 大規模データがほぼ扱えない
    • データを大規模にすると、学習に時間がかかるのはもちろんのこと、GPUのメモリ(VRAM)大量に消費します。VRAMが不足するとプログラムが終了して学習不可能になってしまいます。VRAMはGPUと分けて増設できないので、GPUの性能によってNeRFで学習できるデータの規模が決まります。公式のTipsでは、50~150枚程度の写真が最適としています。
  • 人の映り込みに弱い
    • フォトグラメトリーもNeRFも「写真に写っているものはすべて止まっている」という前提があります。しかし実際のところ屋外で撮影していると人が映り込むことは避けられません。フォトグラメトリーの場合はメッシュ化できない物体は消えるので、写り込んだ人は居なかったことになりますが、NeRFは全ての写真を完全に再現しようとするので、空間にゴミのようなものが多々浮かぶことになります。

総観

NeRFはあくまでも3D空間を再現して写真や映像を出力するための技術であり、3Dモデルを出力する技術ではない、と感じました。
3Dモデルを出力したい場合はフォトグラメトリーを使うべきで、また小物やぬいぐるみなどのフォトグラメトリーが得意なものはフォトグラメトリーの方が良いと思います。
一方で水面や空を含む風景の再現はとても強く、フォトグラメトリーではほとんど何も生成できないような風景でもNeRFなら綺麗に描画するので、こういった表現にはとても向いているようです。

おまけ:生成物の紹介

instant-ngpで生成したものをいくつか紹介します。

-自由研究

執筆者:

関連記事

no image

GW自由研究 – なぜ日本の路面電車は廃れたのか

路面電車と言えば古き良き昭和の乗り物、というイメージですよね。 広島や函館など、一部ではまだ運行が続いている路線もあるものの、それらは「昭和の臭いが残っている」というような扱いです。 以前ブラタモリで …

中華製のCO2モニターを買ったらCO2センサーが入ってなかった話

CO2モニターを買ったんですよCO2モニターを。 在宅勤務で締め切った部屋で働いているので、ちょっと気になったんで。 ↓これ。 で、数日使ってみたんですけどどうも怪しい。怪しすぎる。 換気の悪い部屋に …

no image

謎のアパレルブランド「電子女子」について

電子女子 ここに謎の新アパレルブランド「電子女子」がある。 今わかっているのはtwitterアカウントのみ。 2019/11/1現在、ツイート数は3つ。全部引用する。 Coming soon #電子女 …

no image

CDはなぜ音質が劣化するのか、あるいはしないのか

本編 デジタルデータとは CDに記録されているのはデジタルデータです。 デジタルデータとは、ごく簡単に言うと”0″と”1″で表現されたデータのことです。 …

no image

最近学んだ3D関連の用語のまとめ

趣味でフォトグラメトリーを始めて約2ヶ月。学んだ用語を個人的にまとめたいと思います。 本格的に知りたい人は各自ググってください。 フォトグラメトリ 広義には、写真を用いた測量技術全般のこと。 狭義には …