Neural Radiance Fields (NeRF)
ニューラルラディアンスフィールド(NeRF)は、ポーズ情報付き写真で学習したニューラルネットワークに3Dシーンを記録し、カメラレイに沿ったボリュームレンダリングによって新しい視点を描画します。
ニューラル放射輝度場(NeRF)は、既知のカメラ位置から撮影した通常の写真群を使って学習され、任意の3D位置と視線方向を密度と色に対応付けるニューラルネットワークとして3Dシーンを表現します。ビューをレンダリングするには、各ピクセルを通るレイを投射し、レイ上の各点でネットワークに問い合わせ、ボリュームレンダリングで結果を合成します。そのため、学習済みNeRFではどのカメラでも撮影していない視点からシーンを表示できます。Ben Mildenhall、Pratul Srinivasan、Matthew Tancikらは、UC Berkeley、Google Research、UC San Diegoでこの手法を開発し、ECCV 2020で『NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis』として発表しました。NeRFは、メッシュベースのフォトグラメトリでは扱いにくい反射、薄い構造、半透明の素材を再現します。また、ニューラルレンダリング研究の波を引き起こし、Gaussian splattingへとつながりました。
Neural Radiance Fieldsの仕組み#
元祖NeRFは、畳み込みを使わない多層パーセプトロンです。エンコードされた3D位置を、各256チャネルの全結合層8層で処理し、ボリューム密度と256個の値からなる特徴ベクトルを出力します。この特徴ベクトルはエンコードされた視線方向と組み合わされ、さらに1層の128チャネル層を通ってRGB色を出力します。密度は位置のみに依存するため、ビュー間で形状の一貫性が保たれます。一方、色は方向にも依存するため、カメラの移動に伴って変化する鏡面ハイライトや反射を捉えられます。
ピクセルをレンダリングする際、NeRFは粗いネットワークでカメラレイに沿って64点をサンプリングし、粗いパスで密度が検出された場所からさらに128点をサンプリングして、すべての点を細かいネットワークで評価します。各サンプルは、不透明度と透過率(手前のサンプルを通過する光の割合)に応じて色に寄与し、それらの加重和がピクセル色になります。トレーニングでは、4,096本のレイのバッチについて、レンダリングしたピクセル色と撮影したピクセル色の二乗差を最小化します。カメラ姿勢は通常、COLMAPなどのStructure from Motionソフトウェアで取得します。あるシーンの学習には、NVIDIA V100 GPU上で100,000~300,000回のイテレーション、約1~2日を要しました。
生の座標を入力した単純なMLPは滑らかな関数を学習し、細部をぼかしてしまいます。そこでNeRFは、各座標を周波数を2倍ずつ変えたサインとコサインに変換します。位置には10周波数、方向には4周波数を使います。次のPyTorchコードは、位置エンコーディングの有無それぞれについて、縞模様の1D信号に同じネットワークを適合させます。
import torch
from torch import nn
torch.manual_seed(0)
# Color along one line through a scene, with fine detail such as a striped texture
x = torch.linspace(-1, 1, 512).unsqueeze(1)
target = torch.sin(12 * torch.pi * x) * torch.cos(3 * torch.pi * x)
# NeRF's positional encoding: sines and cosines of the coordinate at 10 doubling frequencies
freqs = 2.0 ** torch.arange(10) * torch.pi
encoded = torch.cat([torch.sin(x * freqs), torch.cos(x * freqs)], dim=1)
for name, inputs in (("raw coordinate", x), ("positional encoding", encoded)):
mlp = nn.Sequential(nn.Linear(inputs.shape[1], 256), nn.ReLU(), nn.Linear(256, 256), nn.ReLU(), nn.Linear(256, 1))
optimizer = torch.optim.Adam(mlp.parameters(), lr=1e-3)
for step in range(1000):
loss = ((mlp(inputs) - target) ** 2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f"{name}: mean squared error {loss.item():.4f}")raw coordinate: mean squared error 0.0870とpositional encoding: mean squared error 0.0000を出力します。信号の平均パワーは0.25です。生の座標を使うネットワークは、その約3分の1に当たる細かい縞模様を捉え損ねますが、エンコードされたネットワークは再現できます。
より高速で堅牢なNeRF#
- アンチエイリアシングと無限遠シーン: Mip-NeRFは無限に細いレイの代わりに円錐をレンダリングしてエイリアシングを除去します。Mip-NeRF 360はこれを無限遠まで広がる360°撮影に拡張します。
- 速度: NVIDIAのInstant NGPは、ネットワークの大部分を学習済み特徴のマルチ解像度ハッシュテーブルに置き換えます。これにより、トレーニング時間を数日から数秒または数分に短縮し、1920×1080のレンダリングを数十ミリ秒で行えます。
- 屋外で撮影された写真: NeRF in the Wildは、写真ごとの外観埋め込みと独立した一時的コンポーネントを追加するため、照明が変化し、通行人が写り込むインターネット上の写真コレクションからも、きれいにシーンを再構成できます。
- テキストから3Dを生成: DreamFusionは、2Dのテキスト画像生成拡散モデルから見たとき、あらゆる角度で妥当なレンダリングになるまでNeRFを最適化します。これにより、3Dのトレーニングデータを使わず、プロンプトから3Dオブジェクトを生成します。
NeRFと関連概念の比較#
- Gaussian splatting: シーンを数百万個の3Dガウス分布として明示的に保存し、ラスタライズします。ピクセルごとのネットワーク評価が不要なため、リアルタイムでレンダリングできます。2023年にはMip-NeRF 360と同等の品質を達成し、メモリー使用量が増える代わりに、多くのキャプチャーツールでNeRFに取って代わりました。
- フォトグラメトリ: 写真間の特徴を照合し、明示的なメッシュを構築します。メッシュはコンパクトで標準的な3Dソフトウェアで編集できますが、光沢のある面、透明な面、非常に薄い面の処理は苦手です。
- 深度推定: NeRFは副産物として深度マップを生成します。これは、各レイが停止する位置までの期待距離を表しますが、1つのシーンを撮影した、カメラ姿勢が分かっている多数の写真で最適化した後に限られます。単眼深度モデルは、単一画像から単一のフォワードパスで深度を予測します。
- 暗黙的ニューラル表現: NeRFは放射輝度と密度に特化した暗黙的ニューラル表現です。画像、形状、音声を連続関数として保存するネットワークも、同じ分類に含まれます。
撮影要件#
NeRFでは、一定の照明下にある静的なシーンを、正確なカメラ姿勢で、多数の重なり合う視点から撮影することを前提とします。元の論文では、合成オブジェクトごとにレンダリングした100ビュー、実際の前方視シーンごとに20~62枚の写真で学習しました。通行人や車など、撮影中に動くものは写真によって写ったり写らなかったりするため、最適化では半透明の「浮遊物」として表現されます。Ultralytics YOLO26のインスタンスセグメンテーションモデルは、各写真から人物や車両をマスクするため、それらのピクセルを通るレイをトレーニングから除外できます。
実際のアプリケーション#
- 映画とバーチャルプロダクション: 撮影した場所を再構成し、新しいカメラ経路からフォトリアルな背景やセットの参考映像としてレンダリングします。
- ロボティクスと運転シミュレーション: 記録した環境を再構成し、自動運転車やロボティクスのチームが、元の走行では通過しなかった位置からセンサー映像をレンダリングできるようにします。
- 製品ビジュアライゼーション: 商品を数十枚撮影するだけで、買い物客が自由に回転させて見られるインタラクティブなビューを作成できます。
- 地図: Google Mapsのイマーシブビューでは、Googleが施設ごとに約1時間かけて撮影したDSLR写真から、NeRFでレストランやカフェの内装を再構成しました。Mip-NeRF 360を基盤に、NeRF in the Wildの外観埋め込みとBlock-NeRFの露出条件付けを組み合わせ、厳選された飛行経路に沿ったインタラクティブな360°動画として提供しました。










