Zip-NeRFを読んだメモ

 主な工夫は2点

  • Instant-NGPにMip-NeRFの円錐での光線キャスティングを組み込んだ
  • Mip-NeRF360で導入したproposal MLPの学習損失に良くないところがあったので改良した

工夫1. Instant-NGPへの円錐光線キャスティング導入

 前提として、まずMip-NeRFでやっていたことを再確認する。Mip-NeRFでは、光線がいくつかの区間の分割される。光線から円錐が伸びていくと考えると、分割された区間それぞれでは円錐台があると考えられる。この円錐台をガウス分布で近似する。Original-NeRFでは位置エンコーディング三角関数で行っており、三角関数ガウス分布の積の形式については解析的に積分値が計算できる。それを分割された区間の表現として用いると、遠いほど高周波成分が打ち消されることになり(ちゃんと計算したことはないけどそうらしい)、位置だけでなくスケール情報を含んだ表現となって、アンチエイリアスに貢献する。

 Instant-NGPだとガウス分布と位置エンコーディングの積形式を解析的に計算することができないことが問題となる。そのため

  1. まず円錐台を再現できるような形で点をマルチサンプリングする
  2. 各点を中心とした小さい等方的ガウス分布を考える
  3. Instant-NGPのボクセル特徴量からガウス分布の被覆量を考慮して重みづけする

として、スケールを考慮する。

(1) マルチサンプリング

 各分割区間について、正面から見たとき六芒星のようになる形をベースとして、それを学習中はランダムに回す、テスト時は固定の回し方で点をサンプリングする。

Figure 3

 論文を読んでいてSupersamplingとMultisamplingという用語が出てきて混乱したが、コンピュータグラフィックスの分野でそれぞれそういう手法があるらしい。雑な理解では、Supersamplingは全体のシーンを高解像度でレンダリングするのに対し、Multisamplingはエッジや境界部分のみを高解像度でサンプルすることでアンチエイリアシングをするといったところ。

 Mip-NeRFの光線について、光線の中心からの距離を tとする。円錐なので tにおける円の半径は係数を \dot{r}として \dot{r} tである。区間 \left[ t _ 0, t _ 1 \right) について考える。一つの区間について6点をサンプリングする。それぞれの角度は

 
\boldsymbol{\theta} = \left[ 0, \frac{2 \pi}{3}, \frac{4 \pi}{3}, \frac{3 \pi}{3}, \frac{5 \pi}{3}, \frac{\pi}{3} \right]

となる。前半3つで正三角形、後半3つでそれとは逆向きの正三角形という感じ。各点の奥行きは、円錐の底面に近い方へ若干シフト・スケーリングさせる。

 円周上とのものだと外すぎるので、 \sqrt{2}で割ってちょっと中央に寄せる。結局、光線の中心から見ると6点は

にあると考える。光線の平行と垂直方向について、これらの平均と分散はもとのMip-NeRFで考える円錐台を近似するガウス分布の平均と分散に一致する。

 そして、これらの各点を中心として小さい等方的ガウス分布を考える。分散は、 \alphaをハイパーパラメータとして \sigma _ j = \alpha \dot{r} t / \sqrt{2}と決める。実験では \alpha = 0.5としている。

 これらの各6点について、Instant-NGPの各レベルでクエリとして与えて特徴量を計算する。このとき、Instant-NGPでtrilinear補間をする立方体セルについて、各点の等方的ガウス分布がそのセルに収まる量に反比例するように各スケールの特徴量を重み付けする。これはつまり、ガウス分布が補間されるセルより遥かに大きい場合、その補間された特徴量は信用できないと考えるということになる。

 具体的には、Instant-NGPでのレベル lでのスケールを n _ lとしたとき、ガウス分布がセルの中心にあると考えて、 [ -1/(2n), 1/(2n) ] の立方体にどれだけ確率があるかを考える。erf関数を使って積分値を考えていくと、結局重みは w _ {j, l} = \mathrm{erf}(1 / \sqrt{8 \sigma _ j ^ 2 n _ l ^ 2})となる。これを使って各レベルの特徴量を計算する

 
f _ l = \mathrm{mean} _ j \left( w _ {j, l} * \mathrm{trilerp}(n _ l * x _ j; V _ l) \right)

工夫2. Z-エイリアス対策

 こっちは若干本題とは関係なさそうで、Mip-NeRF360で導入したやつの修正という感じなので軽めに。

 Mip-NeRFでproposal MLPを導入し、それはNeRF MLPからオンライン蒸留をして学習するが、その損失関数がステップ関数で作られているのでエイリアスが生じることが実験からわかった。これに対処するために、ステップ関数を矩形パルスで畳み込んで滑らかにする。

 ちょっとここは話が難しくてよくわからなかった。まだproposal MLPの形式すら実装していないので、それをやってから帰ってくることにする。ここの変更によって距離のNormalize化処理も特殊なものを使わないといけないらしいので、とにかく話が複雑になっていく。これだけ複雑になるとproposal MLPを使うのがちょっとためらわれる気もする……。

所感

 思ったより直感的でない謎の値の導入があったりして、実装が大変そうに思える。Instant-NGPにMip-NeRF要素を盛り込んだ部分と、proposal MLPというMip-NeRF360で提案した部分が混在していて、論文の話題が一つにまとまっていない印象もある。

 綺麗でない手法だと実装するモチベーションがやや落ちるが、Mip-NeRF部分の方は理屈からしてもある程度は妥当性がありそうな気もするのでそこだけ取り出して実装というのを考えても良いのかもしれない。しかし普通のInstant-NGPとは、区間自体から特徴量を求めるということになって実装が大きく変わりそう。それだけの実装でも結構かかりそうな雰囲気。その前にもっとやるべき実装があるかもしれない。

 あと実験で「mip-NeRF 360 + iNGP」という謎の手法と比較しているが、その2つの手法は単純に組み合わせられないからこの論文みたいなことをしているのでは? この比較手法がなにをしているのかがわからなかった。