
今回はカメラ姿勢情報を用いずに写真のみからNeRF(Neural Radiance Fields)の3次元表現を獲得する手法について紹介します。
NeRF[1]とは、ニューラルネットワークを用いてNovel View Synthesis(NVS)というタスクを解く手法になります。NVSは、あるシーンについて多視点から撮影した画像群を教師データとして、別の新しい視点から見た画像を生成するタスクになります。NeRFはこのタスクにおいて、シンプルなMLPを利用しながら非常にリアルな画像の生成を可能としたため、現在注目を集めています。しかし、オリジナルNeRFの学習では撮影された画像それぞれに対して、撮影しているカメラの情報が必要となります。このカメラ情報を推定するためには、COLMAP[2][3]等の別の推定器を利用する必要がありました。それに対し、最近では事前のカメラ情報推定を行うことなくNeRFを学習させる手法が提案されています。本記事では、NeRFの前提となるカメラ情報について触れながら、事前のカメラ情報推定を必要としないNeRFの学習について紹介します。
NeRF
まず前提となっているNeRFについて以降で簡単に紹介しますが、詳細は以前のブログ記事をご覧ください。NeRFでは画像に映るシーンを、空間における座標(x, y, z)とカメラの光線方向 \phi を入力として、その座標における色(r, g, b)と物体の密度 \sigma を出力するニューラルネットワークの関数として表現します(図1)。各座標に対して色/密度を対応づけたものを輝度場を呼びます。

カメラパラメータ
冒頭で述べた通り、NeRFの学習にはカメラの撮影情報が必要となります。カメラの撮影情報のことを以降では「カメラパラメータ」と呼びます。ここではカメラパラメータの種類や内容についてピンホールカメラモデルを例に紹介します。座標系
まず、カメラ撮影に関わってくる座標系について整理します。 カメラ撮影では、画像座標とカメラ座標、世界座標の3つの座標系が関わってきます。- 画像座標 (u, v): ピクセルを単位とする画像の座標に当たり、被写体を含む撮影対象の空間がこの座標平面上に画像として投影されます。
- カメラ座標 (x_c, y_c, z_c): カメラの焦点を原点として、画像平面や被写体を周囲に配置した座標です。
- 世界座標 (x_w, y_w, z_w): 計測機器の基準など何かしらの基準によって、カメラや画像平面、被写体を配置した座標です(図2)。 NeRFモデルの入力となるのは、この座標系での情報になります。

内部パラメータ
内部パラメータは画像座標とカメラ座標の関係を表すもので、焦点距離と画像中心が含まれます。画像中心は名前の通り画像平面のピクセル単位の中心です。焦点距離は、画像中心から焦点までの距離です。カメラの焦点距離をf、画像の縦横ピクセルサイズをW, H、画像中心を c_x, c_yとし、簡単にするために画像平面や焦点、被写体の一部をz軸上に配置した場合、それぞれの関係は以下の図3のように表せます。

x_c' = \frac{f}{z_c}x_c
y_c' = \frac{f}{z_c}y_c
u = f_x\frac{x_c}{z_c} + c_x
v= f_y\frac{y_c}{z_c} + c_y
s \left[\begin{array}{c} u \\ v \\ 1 \end{array}\right] = \left[\begin{array}{ccc}f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array}\right] \left[\begin{array}{c} x_c \\ y_c \\ z_c \end{array}\right]
sは画像座標のz座標を1に固定するためのものであり、z_cと等しくなります。式中の以下の部分はカメラ行列Kと呼ばれます。K = \left[\begin{array}{ccc}f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{array}\right]
反対に、NeRF等のように生成する画像のピクセル座標(u, v)をカメラ座標(x_c, y_c, z_c)に変換する場合は、x_c = \frac{1}{f_x} (u - c_x)
y_c = - \frac{1}{f_y} (v - c_y)
z_c = -1
外部パラメータ
外部パラメータとは、カメラ座標と世界座標の関係(変換)を表すものでした。外部パラメータには、カメラの回転(Rotation)と移動(Translation)が含まれます。カメラ座標 (x_c, y_c, z_c) から世界座標 (x_w, y_w, z_w) への変換は、カメラ座標に回転行列をかけたものを並行移動させることで実現できます。つまり、回転を \mathbf{R} \in \mathbb{R}^{3 \times 3} 、移動を\mathbf{T} \in \mathbb{R}^3とおくと、以下の式で表現できます。\left[\begin{array}{c} x_w \\ y_w \\ z_w \\ 1 \end{array}\right] = \left[\begin{array}{ccc|c} & & & \\ & \mathbf{R} & & \mathbf{T} \\ & & & \\ \hline 0 & 0 & 0 & 1 \\ \end{array}\right] \left[\begin{array}{c} x_c \\ y_c \\ z_c \\ 1 \\ \end{array}\right]
なお、 \mathbf{R}と \mathbf{T}からなる変換行列の形で定義される変換のことはSE3な変換と呼び、その内の \mathbf{R}のみで定義される変換(回転)はSO3な変換と呼びます。上記の式における4行4列のSO3な行列をカメラのポーズ(姿勢)行列と呼びます。カメラの回転
回転の表現にはいくつかの種類があります。ここでは代表的な回転行列と回転ベクトルについて説明します。回転行列
回転の表現として、一般的に用いられるものの一つに、回転行列があります。3次元の回転行列は3行3列の行列で表現されます。例えば、z軸を中心に\thetaの角度だけ回転させた場合の回転行列は以下のようになります。\mathbf{R} = \left[\begin{array}{ccc} \cos\theta & -\sin\theta & 0 \\ \sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \\\end{array}\right]
前述のカメラ座標から世界座標への変換における\mathbf{R}も回転行列の形を取っていました。回転行列は、座標変換が行列の積で行われるため、変換前後の座標の対応関係が分かりやすいです。一方で、回転行列は表現としては冗長なため、より冗長性のない回転表現として回転ベクトルが用いられることもあります。回転ベクトル
回転ベクトル \mathbf{\omega} \in \mathbb{R}^3 は、ベクトルの大きさ|\mathbf{\omega}|が回転の角度\thetaを表し、正規化されたベクトル\frac{\mathbf{\omega}}{\theta}が回転の軸を表します。回転ベクトルと回転行列はロドリゲスの公式と呼ばれる以下の公式をもとに相互に変換することができます。以下の式では、回転ベクトルを回転行列に変換することができます。\frac{\mathbf{\omega}}{\theta} = \mathbf{\phi} = \left[\begin{array}{c} r_0 \\ r_1 \\ r_2 \end{array}\right]
\mathbf{\hat\phi} = \left[\begin{array}{ccc} 0 & r_2 & r_1 \\ r_2 & 0 & r_0 \\ r_1 & r_0& 0 \end{array}\right]
\mathbf{R} = \mathbf{I} + \frac{\sin(\theta)}{\theta}\mathbf{\hat\phi} + \frac{1-\cos(\theta)}{\theta^2}(\mathbf{\hat\phi})^2
カメラの移動
カメラの移動 \mathbf{T} \in \mathbb{R}^3 は名前の通り、カメラ座標から世界座標へのものの移動になります。 カメラ座標系でカメラは原点に存在していたので、\mathbf{T}そのものが世界座標におけるカメラの位置になります。 同様に、カメラ座標でカメラの周囲に配置していたレンズ平面や被写体は、回転後に移動ベクトルを加算することで世界座標へと変換されます。カメラパラメータによる座標変換とNeRF
NeRFにおけるレンダリングのように、焦点から画像の各ピクセルに向けた光線上で積分を行う場合、世界座標系での計算となるため、光線の始点であるカメラ焦点と光線の方向は世界座標系の値で得る必要があります。学習に使う画像は、画像座標系上のピクセルに色の情報が付与されたものなので、画像座標からカメラ座標、カメラ座標から世界座標という順番で変換することになります。世界座標における画像平面の(i, j)位置の座標を \mathbf{p_{ij}} \in \mathbb{R}^3 とすると、焦点の位置は \mathbf{T} なので、焦点から \mathbf{p_{ij}} へ向かう視線は以下のようになります。\mathbf{d_{ij}} = \frac{\mathbf{p_{ij}}-\mathbf{T}}{|\mathbf{p_{ij}}-\mathbf{T}|}
この視線ベクトル \mathbf{d_{ij}} を伸ばした先に画像1ピクセルに映る色の情報が存在していると考えられます。視線ベクトルを延長した範囲からサンプリングした各座標に対して、ニューラルネットワークを用いて色と密度を求めることで、微分可能なレンダリングが可能になるわけです。カメラのパラメータを用いないNeRF
以降では、事前のカメラパラメータ推定を行わずにNeRFの3次元表現を獲得する手法について紹介します。NeRF--
NeRF--[4]は、カメラの内部パラメータ(焦点距離)と外部パラメータ(回転、移動)の最適化をNeRFの学習と同時に行う手法になります。具体的には、カメラのパラメータも全てニューラルネットワークのパラメータとして扱います。これまで見てきた通り、カメラパラメータによる座標変換は全て行列計算で表現できるため、NeRF学習の損失をそのまま逆伝播させることができます。図4はNeRF--学習の流れになります。
c_x = \frac{W}{2}, c_y=\frac{H}{2}
図5は、正面向きに撮影した多視点画像データ(LLFFデータセット[5])についてNeRF--の再現実装を用いて学習したものになります。
BARF
BARF[6](Bundle-Adjusting Neural Radiance Fields)はNeRF--と同時期に発表された手法で、カメラの内部パラメータは既に分かっているものとして、外部パラメータのポーズ行列推定/修正を行うモデルになります。BARFでは、NeRF--で行なっていたロドリゲスの公式による回転ベクトル変換は行わず、4行4列のポーズ行列を直接推定します。前述の通り、ポーズ行列そのものは冗長な表現なのですが、NeRFで用いられている位置エンコーディング(Positional Encoding)の扱いを工夫することで最適化できるようにしています。NeRFでは、空間の高周波な情報を利用するため、ニューラルネットワークへの入力であるレンダリングの光線方向dとレンダリング光線上のサンプル点xに対して位置エンコーディングと呼ばれる変換を行います。位置エンコーディングは以下の式で表されます。
\gamma(\mathbf{x}) = [\gamma_0(\mathbf{x}), \gamma_1(\mathbf{x}),…, \gamma_{L-1}(\mathbf{x})] \in \mathbb{R}^{6L}
\gamma_k(\mathbf{x}) = [\cos(2^k\pi\mathbf{x}), \sin(2^k\pi\mathbf{x})] \in \mathbb{R}^6
位置エンコーディングよりも後段のニューラルネットワークのみを学習するオリジナルNeRFの画像生成では、この位置エンコーディングが重要な役割を果たしていました。しかし、位置エンコーディングよりも前段にあるカメラパラメータまで誤差の逆伝播が必要になるカメラパラメータ推定では問題が起こります。位置エンコーディングの勾配は以下の式のようになり、勾配が 2^k\pi だけ増幅されてしまいます。\frac{\partial \gamma_k(\mathbf{x})}{\partial \mathbf{x}} = 2^k\pi[-\sin(2^k\pi\mathbf{x}), \cos(2^k\pi \mathbf{x})]
kは周波数帯の区分と考えられるため、kの大きな部分、つまり高周波な部分ほど勾配が増幅されることになります。このように位置エンコーディングの周波数帯によって勾配の大きさが変化することがカメラパラメータ推定を不安定にしているとして、BARFではそれを改善する方法を提案しています。具体的には、学習の経過に応じて位置エンコーディングに以下のような重みをつけてフィルタします。\gamma(\mathbf{x}) = [\mathbf{x}, \gamma_0(\mathbf{x}), \gamma_1(\mathbf{x}),…, \gamma_{L-1}(\mathbf{x})] \in \mathbb{R}^{3+6L}
\gamma_k(\mathbf{x}; \alpha) = w_k(\alpha)[\cos(2^k\pi\mathbf{x}), \sin(2^k\pi\mathbf{x})] \in \mathbb{R}^6
w_k(\alpha) = \begin{cases} 0 & \alpha < k \\ \frac{1}{2}(1-\cos((\alpha-k)\pi)) & 0 \leq \alpha-k < 1 \\ 1 & \alpha-k \geq 1 \end{cases}
位置エンコーディングの\alphaは0からLまでの値を取り、論文では全体で2000epochの学習スケジュールの内400epoch(\alpha=0)から800epoch(\alpha=L)までの間で線形に変化させています。これは、学習初期にはサンプル座標xや光線方向dといった低周波成分のみを使い、学習が進むに連れて位置エンコーディングの高周波成分を含めて使うフィルタになっています(図6)。学習経過によって複雑な信号をフィルタする方法のことを、論文ではcoarse-to-fine registrationと呼んでいます。オリジナルNeRFのレンダリング方法にもcoarseとfineという2種類の方法がありますが、これとは別のものです。
実験
これまでに紹介したNeRF--やBARFの手法には、それぞれ制限がありました。NeRF--では概ね同じ向きでの撮影、カメラ移動の少なさといった制限があり、BARFでは360度様々な視点からの撮影であってもCOLMAP推定パラメータに一定のノイズを加えた範囲からの復元程度という制限でした。特にBARF論文におけるノイズの与え方は一定であり、どの程度の範囲まで対応できるのかが不明瞭であるため、今回は他モデルも含めてカメラパラメータ推定可能な範囲を調べる実験を行いました。比較するモデルは以下の4条件としました。
- 回転行列推定
- NeRF PE条件: 位置エンコーディングにオリジナルNeRFのものを利用
- BARF条件: 位置エンコーディングにBARFを利用
- 回転ベクトル推定
- NeRF--条件: 焦点距離・画像中心をCOLMAP推定値で固定したNeRF--
- BARF--条件: NeRF--条件の位置エンコーディングをBARFに変更
データセットにはDeepVoxelsデータセット[7]のGreekというデータを利用しています。このデータはNeRF--の紹介で利用したLLFFデータセットとは異なり、1つのシーンを様々な位置・角度で撮影したもので、より最適化の難しいデータセットだと考えられます。
まずはBARF論文と同様、角度が分散14.9度、移動が分散0.26となるように正規分布からサンプリングしたノイズを加えた場合について、カメラ姿勢推定結果の相対誤差とカメラプロット、生成画像を確認します。姿勢の誤差については、必ずしもCOLMAPと同じ基準で推定できるとは限らないため、RPG Trajectory Evaluation[8]というツールを利用して相対的な誤差を求めています。カメラのプロットと各評価指標について表1にまとめます。なお、カメラプロットについては、見やすさのために画像平面の縦横サイズを半分にし、撮影点も479件中20件をサンプルとして取り出しています。
カメラプロット | 平均回転誤差 | 平均移動誤差 | |
ノイズ | ![]() | 0.576 | 1.053 |
NeRF PE | ![]() | 0.466 | 0.687 |
NeRF-- | ![]() | 0.321 | 0.439 |
BARF | ![]() | 0.301 | 0.434 |
BARF-- | ![]() | 0.162 | 0.255 |
すべてのモデルである程度のカメラポーズ最適化ができていることがわかります。しかし、生成した画像(表2)をみると、NeRF PE条件では物体をレンダリング出来ていないフレームが確認できます。なお、画像は正解データ上で同じ撮影点にあたるフレームをスタートとして撮影点を回転させながらレンダリングしています。
手法 | NeRF PE | NeRF-- | BARF | BARF-- |
生成GIF | ![]() | ![]() | ![]() | ![]() |
NeRF PE条件とBARF条件を比較することで、BARFの位置エンコーディングには大きく二つの役割があることが分かります。一つ目はニューラルネットワーク上のカメラパラメータへの誤差逆伝播を安定させ位置ズレ修正を効果的にする役割です。二つ目は、学習初期に低周波成分のみを使うことでレンダリングに余裕を持たせ、大規模なポーズ修正が行われてもレンダリングに影響が出ないようにする役割です。 NeRF PE条件とBARF条件との生成画像比較で見られる差から後者の影響が確認できます。
NeRF--もNeRF PE条件よりも良い最適化が行えています。回転の情報をモデル内部で回転ベクトルとして保持しておくことで、回転行列を直接推定する場合よりも不要なパラメータ更新が減り、効果的に学習できていることが分かります。
BARF--条件では、BARF条件やNeRF--条件よりも更に精度が改善されています。単純な手法の掛け合わせであっても、BARFにおける位置エンコーディングマスクとNeRF--における回転ベクトルのそれぞれの役割が異なっているため、有効であったと考えられます。 特に、NeRF--条件では生成画像の品質に大きな問題が見られないことから、BARF手法がポーズ修正を効果的にしていることが確認できます。
カメラポーズ推定・レンダリングの両方ができたNeRF--、BARF、BARF--の3条件について、ポーズに加えるノイズを1.5倍(回転角度で分散約22.5度、移動ベクトルで分散0.39)として再度学習を行いました。特にBARF--については、BARF論文の設定で他2手法よりも精度的な余裕があったため、より強いノイズからの復元が期待できそうです。その結果が表3の通りです。
カメラプロット | 平均回転誤差 | 平均移動誤差 | |
ノイズ | ![]() | 0.819 | 1.273 |
NeRF-- | ![]() | 0.665 | 1.035 |
BARF | ![]() | 0.477 | 0.790 |
BARF-- | ![]() | 0.433 | 0.709 |
カメラのプロットではBARF--だけはある程度ポーズ修正ができていそうです。誤差の数値でいえばBARFも近いので、ここでも生成GIFを比較してみます(表4)。
手法 | NeRF-- | BARF | BARF-- |
生成GIF | ![]() | ![]() | ![]() |
BARFとBARF--のどちらの条件でも、生成画像ではレンダリングミスはさほど見られません。BARFのカメラプロットが大きくズレている理由として、元のノイズが大きかったために最適化する際の座標の基準が変わった可能性や、プロットのサンプル取得時に差の大きなものが固まった可能性などが考えられます。
しかし、いずれにしても相対的な回転誤差が0.40以上、移動誤差が0.70以上であり、一つ目の実験で描画がうまくいかなかったNeRF PE条件に近い結果となっているため、1.5倍ノイズからの復元が限界のようです。実際にBARF条件、BARF--条件について2倍ノイズからの復元実験も行いましたが、どちらのモデルでもレンダリングミスが発生し始めていました。
以上から現在の手法では、回転角度の分散22.5度、移動の分散0.39程度の正規分布からのサンプリングノイズを修正するのが限界であり、実用上はBARF論文の設定である回転15度、移動0.26程度のノイズが見込まれる場合に利用するのが現実的だと考えられます。
まとめ
今回は、NeRFの派生手法について、事前にカメラパラメータ推定を行うことなくNeRFモデルを学習可能な手法の調査と実験を行いました。カメラパラメータ推定を含むモデルでは色と密度\sigmaに加え回転、焦点位置、焦点距離の全てが未知な状態で辻褄を合わせることになるため、各パラメータの初期値に依存しやすいです。理想は撮影位置や角度に影響されず様々な視点からの撮影が可能となることですが、現時点ではまだ難しいようです。
現状の活用方法としては、画像のみからの一貫したNeRF表現の獲得というよりかは、前段のCOLMAPなどで推定誤差が発生した場合に頑健なパイプラインとしての活用が主になりそうです。今回の記事では対象としませんでしたが、最近ではカメラのレンズ歪みを考慮してカメラ姿勢誤差も修正できるSCNeRF[9](Self-Calibrating Neural Radiance Fields)という手法も提案されており、カメラ姿勢推定の後処理としても期待ができる技術だと思います。今後仮に撮影視点に関する問題を解決するような手法が出た場合、自己位置推定とマップ作成の同時最適化ができる一貫した手法として、SLAM技術への応用も期待できます。
ALBERTでは、様々な専門的バックグラウンドを持つリサーチャー・アナリストを募集しています。詳しくは採用ページをご覧ください。
参考文献
- Ben Mildenhall, Pratul P. Srinivasan, Matthew Tancik, Jonathan T. Barron, Ravi Ramamoorthi, Ren Ng: “NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis”, Proc. ECCV 2020.
- Schönberger, Johannes Lutz and Frahm, Jan-Michael: “Structure-from-Motion Revisited”, Proc. CVPR 2016.
- Schönberger, Johannes Lutz and Zheng, Enliang and Pollefeys, Marc and Frahm, Jan-Michael: “Pixelwise View Selection for Unstructured Multi-View Stereo”, Proc.ECCV 2016.
- Zirui Wang and Shangzhe Wu and Weidi Xie and Min Chen and Victor Adrian Prisacariu: “NeRF--: Neural Radiance Fields Without Known Camera Parameters”, arXiv preprint arXiv:2102.07064, 2021.
- Ben Mildenhall and Pratul P. Srinivasan and Rodrigo Ortiz-Cayon and Nima Khademi Kalantari and Ravi Ramamoorthi and Ren Ng and Abhishek Kar: “Local Light Field Fusion: Practical View Synthesis with Prescriptive Sampling Guidelines”, ACM Transactions on Graphics (TOG), 2019.
- Lin, Chen-Hsuan and Ma, Wei-Chiu and Torralba, Antonio and Lucey, Simon: “BARF: Bundle-Adjusting Neural Radiance Fields”, Proc. ICCV 2021.
- Sitzmann, Vincent and Thies, Justus and Heide, Felix and Niessner, Matthias and Wetzstein, Gordon and Zollhöfer, Michael, “DeepVoxels: Learning Persistent 3D Feature Embeddings”, Proc. CVPR 2019.
- Zhang, Zichao and Scaramuzza, Davide: “A Tutorial on Quantitative Trajectory Evaluation for Visual(-Inertial) Odometry”, Proc. IEEE 2018.
- Yoonwoo Jeong, Seokjun Ahn, Christopehr Choy, Animashree Anandkumar, Minsu Cho, and Jaesik Park Park: “Self-Calibrating Neural Radiance Fields”, Proc. ICCV 2021.
The post カメラパラメータを用いないNeRFの学習 first appeared on ALBERT Official Blog.