急にNeRFに興味が出て調べていたところ、とても良い入門記事があり、
コードも公開されている
ので、これをもとに自分でも実装してみた。Pythonで書かれているものをPythonで写経するのは流石に面白みに欠けるので、LibTorchを使ってC++で実装した。
(実はC++に写経する前に、Jupyterから意味あるファイルごとに分割するためにPythonでも写経した。そこではNumpyで書いてある部分をいくらかPyTorchに置き換えてもいる。その方がそのままLibTorchに置き換えやすいので)
Pythonでの結果
1エポックしか学習を回していないのもあり、若干記事などで紹介されている例より細部が甘い。NeRFの学習は時々失敗する(損失が落ちなくなり、背景のみの真っ白な状態を学習をしている)こともあって、ちょっと安定性にかけるような印象は持った。
C++での結果
やっていることは一緒なので差分は本質的なところではないはず。学習が上手くいくとこれくらい細部も見える。輪郭が黄ばんでいるのは、ffmpegでgif化したときの影響で、元の画像ではそんなことはない。
所感
光線の座標変換やPyTorchでのランダムサンプリングなど、アルゴリズムというか実装というか、そういう部分での面白さも結構あった。ニューラルネット自体はとてもシンプルな構造なので、そういった方面についてあまり詳しくない人が入り口として試しにやってみるものとしてもそれなりに良いのではないか。
この先の発展としては、めちゃくちゃ学習が速いと噂のInstant-NGPに興味がある。
最終的にはSLAM方面への利用という方向性が気になり、
とかを読んでみたい。
ここのところなかなか良い題材が見つからなくて迷っていたが、NeRFはわりと感触が良い。もう少し追いかけてみたい。