NeRFを用いた点群生成の試み

はじめに

 今回はNeRFと呼ばれる手法を紹介する。これは、複数枚の画像から任意視点の画像を生成するアルゴリズムである。さらに、本手法の中で学習される「輝度場(Radiance Field)」を利用し点群生成を試みる。

NeRFとは

 NeRFと言う単語はNeural Radiance Fieldの略語であり、日本語に訳すと「ニューラル輝度場」である。NeRFは以下の2点を実行する。

  • 輝度場を複数枚の画像を用いてニューラルネットワークで学習する。
  • 輝度場を用いて任意視点の画像を生成する。

  • 2020年に本手法が発表されると多くの研究者に注目され、その派生研究が広く行われるようになった。ここではアルゴリズムの概略を説明する。

    概略

     本手法で扱う場は、座標(r_n)を指定すれば、その場所における1つのベクトルv_nが定まるような空間内の物理量のことである(下図左)。これは物理学に現れるベクトル場に相当する。

    NeRFでは上の右図のように、空間座標r_nを入力するとその点におけるベクトルv_nを出力するようなネットワークを学習する。ベクトルv_nは、色(R,G,B)と密度(\sigma)から構成される4次元ベクトルである。下図(元論文から引用)は、NeRFが任意視点の画像を生み出すまでの大まかな手順である。

    1. 複数枚の画像を用意する。画像にはカメラの内部パラメータ(焦点距離)と画像ごとに異なる外部パラメータ(変換行列)も付随している。
    2. これらの画像とカメラパラメータを用いて輝度場を学習する。空間内の各点における色(R,G,B)と密度(\sigma)を予測できるようになる。
    3. ボリュームレンダリングを行うことにより任意の視点から見た画像を生成する。

    こちらのページで論文著者らのデモを見ることができる。

     ここからは、さらに詳細な説明を行う。下図は画像と物体の関係を示したものである。

    空間内にはカメラ座標系と世界座標系が存在する。前者はカメラごとに(視点ごとに)変化する座標系であり、後者は全カメラに共通する絶対座標系である。この2つの座標系はカメラの内部パラメータ(焦点距離)と外部パラメータ(変換行列)を用いて行き来できる。焦点oからz軸正の方向に焦点距離fだけ離れた場所に、xy平面に平行な平面(画像となる平面)が置かれる(図の赤枠)。これを画像平面と呼ぶことにする。赤丸は画像平面上の点である。物体後方から焦点に向かう光線(緑線)と画像平面との交点uが画像の一部をなす色を与える。また、焦点oから緑線方向の単位ベクトル(黄色線)をdとおくと緑線上の座標rr(t)=o+tdと書くことができる。ここでtは緑線上で定義される0以上の実数である。t=0のときr(0)=oとなる。先の説明で輝度場の入力を位置座標rとしたが正確に言うと、単位ベクトルdも入力として加わる(下図参照)。

    上図の輝度場を複数枚の画像を用いて学習するには、輝度場が画像を作り出すメカニズムを理解する必要がある。ここで使われるロジックはボリュームレンダリングである(下図参照)。

    画像上の点uにおける色C(u)は光線上の色を積分したものである。

    (1)    \begin{align*} C(u)=\int_{t_n}^{t_f}dt\;T(t)\;\sigma\left(r(t)\right)\;c\left(r(t),d\right) \end{align**}

    積分範囲は図のようにr(t_n)からr(t_f)までの範囲である。この範囲はあらかじめ決めておく。c(色)と\sigma(密度)は輝度場が出力する値であり、Tは次式で計算される量である。

    (2)    \begin{align*} T(t)=\exp{\left(-\int^{t}_{t_n}ds\;\sigma\left(r(s)\right)\right)} \end{align*}

    ここで、式(2)の意味を考えてみる。

    上図において物体の存在しない部分では\sigma=0であり、物体の存在する部分では\sigma\neq0となる。位置r(t)が物体の内部に入れば入るほど、T(t)の値は小さくなる。これは、式(1)に戻って考えると、位置r(t)における色cの寄与が小さくなることを意味している。
     式(1)を用いれば画像を構成することができるので、予測した画像が実際の画像と近くなるにように学習させることができる。NeRFではきれいな画像を実現するためさらに工夫が施されているが、その内容については割愛する。興味があれば元論文を見てほしい。

    実験

     論文著者らのコードはここにあるが、今回は別の人が実装したこちらのコードを利用した(大変分かりやすいコードである)。私が実際に計算したコードはこちらに置いた。実験に使用したデータセットはこちらの「synthetic_scenes.zip」である。このデータセットに含まれる「shoe」データを使用した(下図はサンプル画像)。これらはCG画像である。

    データセットには、カメラの内部パラメータ(焦点距離)と、画像ごとに異なるカメラの外部パラメータ(変換行列)が付属する。画像枚数は479枚である。学習のあと視点をz軸周りに回転させ、学習時に存在しない視点の画像を生成させることができた(下図参照)。

    点群生成

     上の実験結果を見る限り、輝度場は上手く学習されているようである。ここから先は私の思い付きだ。輝度場は任意の座標における色と密度を生成できるので、空間を細かいグリッドに分割したくさんの格子点を発生させ、各格子点における色と密度を算出すれば点群が作れるのではないか。密度\sigmaがある値以上になる点だけを拾うと次の結果を得た。

    見事に点群(色付き)ができている。つまり、画像とカメラパラメータから点群を生成できたことになる。

    まとめ

     今回は今流行りのNeRFの元論文を紹介し、それを用いて点群生成を試みた。詳細な考察はこれからである。今後やりたいことは以下である。

  • 最近の論文で提案されている手法(NeRFを改善した手法)を取り入れる。
  • 今回のデータセットはCG画像である。実際の物体を撮影したデータセットで試す。
  • 参照文献

  • 元論文
  • 論文著者らのデモサイト
  • 論文著者らのコード
  • 今回参照したコード
  • 今回実装したコード
  • Kumada Seiya

    Kumada Seiya

    仕事であろうとなかろうと勉強し続ける、その結果”中身”を知ったエンジニアになれる

    最近の記事

    • 関連記事
    • おすすめ記事
    • 特集記事

    アーカイブ

    カテゴリー

    PAGE TOP