2022年2月9日

数式を使わずにやさしく解説するNeRF: Neural Radiance Fields


NeRF: Representing Scenes as Neural Radiance Fields for View Synthesisは2020年を代表する深層学習関連の論文の一本であることは間違いないでしょう。もう2022年も2月に差し掛かっていますが、いまさらながら、NeRFの論文を読んだので、初見の際にわかりづらかったところを解説してみます。

NeRFでできること

NeRFは、100枚程度の画像データから、そのシーンの三次元形状を復元し、新しい視点からの画像を生成します。以下の動画を再生していただければわかるように、かなり自然な新視点画像生成が行えます。学習に使うのは画像だけなので、写真を撮るだけで現実のシーンにも適用できます。

NeRFには以下のような制約があります。

  • シーンは静的でなければならない
  • 何らかの手法を使って各画像の外部カメラパラメーターを求めておかなければならない
  • 複数のシーンを同じネットワークに学習させることはできない

これらの制約は、原理的なものではありません。例えば、外部カメラパラメーターを推定しながら学習を進める、みたいな後続研究もあります。

学習時にシーンの三次元形状を復元しているので、(学習に時間がかかるという問題はありますが)、単なる新視点画像生成だけでなく、対象となるオブジェクトの三次元形状をコンピューター上に再現することもできます。応用範囲が広そうな技術ですね。

NeRFにおける問題の定式化

シーンを三次元オブジェクトと読み替えたほうがわかりやすい気がするので、以下では一旦、そのように読み替えてみます。

多くの3Dゲームでは、三次元オブジェクトは複数のポリゴンと、その上に貼られたテクスチャとして表現されます。しかし、三次元オブジェクトの表現方法はポリゴンだけではありませんよね。NeRFでは、三次元オブジェクトをニューラルネットワークのモデルパラメーター(本記事ではニューラルネットワークの学習対象となるパラメーターをモデルパラメーターと表現して、ニューラルネットワークへの入力パラメーターと区別することにします)として表現します。

座標が入力である

ここが一番のつまづきポイントだと思われますので、もう少し具体的な話に触れましょう。3次元空間上における関心座標をx,y,zx,y,zとし、その座標におけるカメラ方向をθ,ϕ\theta, \phiと書くことにします。これらのパラメーターはすべて実数です。この5次元ベクトルを入力とし、密度と色の4次元を出力するMLP(Multi Layer Perceptron)を学習する、というのがNeRFにおける基本コンセプトです。

つまり、ある座標の色が知りたいなーと思ったら、学習後のNeRFのモデルに座標(とカメラ方向)を入力すると、色(と密度)が返ってきます。

これは、2回書きたくなるくらい大事なところです。

ボリュームレンダリングによる画像化

NeRFでは、ある座標が物体表面なのかどうかはわかりません。代わりに、その座標での物体の密度を返します。原論文の表現(volume density)に倣って密度と表記はしますが、単位面積当たりの質量のことではなく、不透明度と考えたほうが、わかりやすいかもしれません。返ってきた色と密度の情報を使ってボリュームレンダリングを行い、画像を生成します。

ボリュームレンダリングは論文中では積分を用いたちょっとごちゃごちゃした式で表現されていますが、実装上は、カメラから対象空間に飛ばした線分に沿って、各座標での色を、密度に応じて足し合わせていきます。その際、各座標までの不透明度の和によって重み付けを行います。具体的には、各座標とカメラを結ぶ線分の間に、密度が大きな点が存在すると、その後ろの座標のレンダリング結果に対する寄与率が減衰されます。例えば、線分上に密度が大きな点が2つ存在した場合、カメラに近い方の点の色が大きな寄与率を持ちますが、カメラから遠い方の点の色も、レンダリング結果に多少は寄与することになります。

レンダリングを微分可能な操作だけで行うために、あえてこのような手法が取られています。

なぜボリュームレンダリングが必要になるのか

ボリュームレンダリングが必要になる理由は、NeRFの問題設定と関係しています。NeRFでは学習データは画像なので、座標を入力してその座標の色を返すようなニューラルネットワークを、直接は学習できません。そこで、ボリュームレンダリングを使って三次元オブジェクトを画像としてレンダリングし、得られた画像と、学習データ中の画像とを比較して損失関数を計算します。上述の通り、このボリュームレンダリングの操作は微分可能ですので、論文中ではニューラルレンダリングとも呼ばれています。

NeRFを学習して得られたニューラルネットワークのモデルパラメーターの中には、対象となる三次元オブジェクトの情報が入っているし、取り出すことができます。学習に使うデータは画像だけで、三次元オブジェクトの情報は直接は与えていませんので、NeRFの学習を進めるうちにニューラルネットワーク自体が三次元オブジェクトの形状の情報を自然に復元した、ということになります。定式化としては納得できるのですが、これが実際に学習できるとは、ニューラルネットワークはすごいなぁ、と小学生みたいな感想を述べたくなります。

その他の工夫

疲れてきたのでアイデアだけ雑に紹介しておきます。

  • Positional Encoding: 入力座標の情報を高次元に散らばらせる。これがないと高周波情報をなかなか学習してくれないそうです。
  • 階層的ボリュームサンプリング: 品質を保ったまま計算量を削減するために、Coarse NetworkとFine Networkの2種類を使います。Coarse Networkを使って、重点的に光線をサンプリングする領域を選択します。

感想

一旦問題設定を理解してしまうと、とても自然に見えてきて、私も、段々と、なにがわからなかったのかがよくわからなくなってきてしまっていますが、初見の際には

  1. DNNへの入力は画像ではなく三次元座標である
  2. シーン情報を学習し、DNNのパラメーターに埋め込む

の2つの部分が理解が難しかったように記憶しています。

これらのアイデアは、他にも色々と面白い応用が考えられそうな気がします。例えば、[2109.14406] Neural Knitworks: Patched Neural Implicit Representation Networks は、二次元画像のblind super resolution、denoising等にこれらのアイデアを応用し、denoisingにおいてdeep image priorをおおむね上回る性能を達成したと報告しています。(ノイズレベルが低い場合はdeep image priorの方が良い結果であったようです。)

Self Q and A

Q: 陰関数とNeRFにはどう関係があるの?

A: DNNへの入力を座標にするというアイデアは陰関数表現から来ていそうだけれども、その程度の薄い関係しかなさそうです。陰関数のことは一旦忘れましょう。

Q: 入力が三次元空間の座標になるということは、一度に一つのシーンしか学習させられないの?

A: そうです。別のシーンを表現したい場合はゼロから学習させ直しです。いくつか改善の方向性が考えられると思いますが、個人的には、学習を高速化するためにパラメーター初期化に工夫を行う手法が興味深いです: Learned Initializations for Optimizing Coordinate-Based Neural Representations

Further Readings

動画への応用撮影条件が異なる様々な画像を用いたreconstructionなど、様々な後続研究が出てきています。興味が湧いた人は後続研究も調べてみてください。

さいごに

LeapMindでは、NeRFに興味がある方もそうでない方も、様々な職種で採用活動を実施しております。特に機械学習、深層学習が得意なエンジニアを強く募集しておりますので、興味がある方はぜひ一度LeapMindの採用ページから応募してみてください。いきなり採用面接は怖い、という人はカジュアル面談から始めることもできます(もちろん、カジュアル面談の後に、実際に選考プロセスを進めない、という選択も可能です。そのためのカジュアル面談ですので。)