TECHNICAL NOTE · NEURAL RENDERING
NeRF と 3D Gaussian Splatting(3DGS)は、どちらも多視点画像から 3 次元の見え方を学び、新しい視点の画像を合成する。画素の色を「半透明の層を手前から重ねる」同じ式で決める点は共通だが、空間の表し方と、その式の計算の向きが逆である。NeRF は空間を連続関数として持ち、画素から光線をたどって関数に問い合わせる。3DGS は空間を多数のガウシアン(ぼかした楕円体)として持ち、それらを画面へ投影して重ねる。同じ NURBS 形状・同じ学習画像で比べると、学習に使っていない視点の PSNR は 3DGS が上回り(64 px 学習で 26.9 → 28.5 dB、192 px 学習で 32.2 → 36.2 dB)、192×192 の 1 枚の描画は 746 ms に対して 57.2 ms だった。一方、1 ステップの学習時間は 3DGS の方が長い。
どちらの手法も、画素の色 C を、奥行き方向に並んだ半透明の要素を手前から順に重ねて決める。
αi は i 番目の要素の不透明度、ci はその色、Ti は手前の要素を通り抜けて届く光の割合(透過率)である。この式は微分できるので、どちらの手法も「描いた画像と学習画像の誤差を逆伝播して、中身を少しずつ直す」という同じ枠組みで学習できる。入力も同じで、画像と、それを撮ったカメラの位置・向きの組である。付属の 2 つのデモは、同じ NURBS 形状・同じ点群・同じ学習画像を使っているので、違いは手法だけにある。
違うのは、式に入る「要素」が何か、そしてそれをどう集めるかである。NeRF では光線上の標本点が、3DGS ではその画素に重なるガウシアンが要素になる。
| NeRF | 3DGS | |
|---|---|---|
| 表現 | 位置 (x, y, z) を入れると密度 σ と色 c を返す連続関数。ニューラルネットの重みの中に暗黙的に入っている | 空間に置いた多数のガウシアン(ぼかした半透明の楕円体)の一覧。形が値として明示的に存在する |
| 1 要素が持つ値 | 要素という単位はない。デモではハッシュ格子の特徴と MLP の重みが全体で共有される | 位置 3・大きさ 3・回転 4・不透明度 1・色 3 の 14 個(本家は視点で変わる色のため色に 48 個を使い計 59 個) |
| 値の数(デモ・標準) | 788,292 | 162,148(11,582 個 × 14) |
| 値の数(デモ・高精細) | 8,390,980 | 567,070(40,505 個 × 14) |
| 空いている空間 | 密度が 0 に近い値として、どこでも問い合わせられる | ガウシアンが無い=何も無い |
| 形の編集 | 難しい(重みと形の対応が分からない) | しやすい(ガウシアンを動かす・消すだけ) |
同じ式を計算するのに、NeRF は画素から空間をたどり(後ろ向き)、3DGS は空間から画素へ投影する(前向き)。この向きの違いが、描画速度の差の大部分を生む。
同じ条件(64 px の学習画像で 1,000 ステップ学習したモデル、同じ視点)で、1 枚を描く時間を測った。どちらも CPU の JavaScript(1 スレッド)での値である。
| 描画解像度 | NeRF | 3DGS | 速度比 |
|---|---|---|---|
| 64×64 | 90 ms | 13.8 ms | 7 倍 |
| 128×128 | 319 ms | 31.6 ms | 10 倍 |
| 192×192 | 746 ms | 57.2 ms | 13 倍 |
| 256×256 | 1,316 ms | 106.1 ms | 12 倍 |
NeRF の描画時間は画素数にほぼ比例し、1 画素あたり数個〜数十個の標本点でネットワークを計算する。3DGS はガウシアンごとに 1 回投影し、あとは足し算なので、7〜13 倍速い。デモでも、NeRF 版は画面を 1 行ずつ描き進めるのに対し、3DGS 版は視点を回すと 1 枚まるごと描き直せる。本家の 3DGS は GPU 上で、画面を小さなタイルに分けて並列に処理し、1080p で毎秒 30 枚以上の実時間描画を実現している。
NeRF は連続関数なので、学習画像より細かい解像度で描いても、単にぼけた画像になる。3DGS では事情が違う。描画時には各楕円に一定のぼかし(0.3 画素²)を加えるが、この量は画素単位で決まっている。64 px で学習したガウシアンは、このぼかし込みで大きさが合うように調整される。それを 192 px で描くと、ぼかしが物体の上で 1/3 の幅になるので、どのガウシアンも学習時より小さく描かれ、物体の輪郭が内側に縮み、取っ手のような細い部分が痩せる。学習中の解像度と描く解像度の違いで見え方が変わるこの問題は、Mip-Splatting [4] が指摘したものである。デモでは、表示時のぼかしを学習画像の画素幅に合わせて補正した。
どちらも「描く → 誤差を測る → 誤差を逆伝播 → Adam で値を直す」を繰り返す。違いは、1 回の学習で何を描き、誤差がどこへ流れ、何が直されるかにある。
| 項目 | NeRF(デモの設定) | 3DGS(デモの設定) |
|---|---|---|
| 初期値 | 乱数。点群は不要 | 点群の点を初期位置にする(色・法線も使える)。本家は写真から推定した点群を使う |
| 1 ステップで描くもの | 全学習画像からランダムに選んだ 256 画素(高精細 1,024) | 学習画像 1 枚をまるごと |
| 損失 | 色の二乗誤差+深度の誤差(重み 0.05) | 色の絶対誤差(L1)。本家はこれに構造類似度(SSIM)を加える |
| 直す値 | MLP の全重み+ハッシュ格子の通過した場所 | 画像に写ったガウシアンの 14 値 |
| 学習率 | 全体で 1×10⁻²、3 万ステップで 1/10 へ | 値の種類ごとに別(位置 1.6×10⁻⁴、大きさ 5×10⁻³、回転 10⁻³、不透明度 2.5×10⁻² など)。位置だけ 1/100 へ下げる |
| 構造の変化 | 無し | 密度制御で個数が増減(標準設定で 8,000 → 約 11,600 個) |
| 点群の使い方 | 補助のみ:空の空間を飛ばす占有グリッド、深度の確認 | ガウシアンの初期位置そのもの |
| 1 ステップの時間(64 px) | 17.1 ms | 26.1 ms |
| 1 ステップの時間(192 px) | 105.8 ms | 187.1 ms |
1 ステップの時間は 3DGS の方が長い。これは 1 回で画像を丸ごと描くためで、1 ステップで見る画素数は NeRF の 16 倍(64 px)〜36 倍(192 px)ある。その分、少ないステップで画質が上がる(第 5 節)。本家の 3DGS は GPU 上で 3 万ステップを数十分で学習し、画質で並ぶ Mip-NeRF 360(学習に丸 1 日以上かかる)より大幅に短い時間で済むと報告されている。
もう一つの違いは、構造が変わるかどうかである。NeRF は最初に決めた格子とネットワークの大きさのまま、中身の値だけを直す。3DGS は、画面上の位置の勾配が大きいガウシアンを「表現が足りない場所」とみなし、小さければ複製、大きければ 2 つに分割する。ほぼ透明になったものは削除する。
マグカップ形状で、学習に使っていない同じ視点を 192×192 で描き、点群を面として描いた正解画像と比べた。3DGS は表示時のぼかしを学習画素幅に補正している。
| 学習画像 | NeRF の 3,000 ステップ | 3DGS が同じ画質に届くまで | 3DGS の 3,000 ステップ |
|---|---|---|---|
| 64 px | 26.9 dB ・ 51 秒 | 750 ステップ ・ 20 秒 | 28.5 dB ・ 78 秒 |
| 192 px | 32.2 dB ・ 317 秒 | 500 ステップ ・ 94 秒 | 36.2 dB ・ 561 秒 |
時間は、それぞれの 1 ステップの時間 × ステップ数で求めた(Node.js、1 スレッド、評価の時間を除く)。1 ステップは重いが、NeRF が 3,000 ステップかけて届く画質に、3DGS は NeRF の 3〜4 割の時間で届く。
| こういうとき | 向いている手法 | 理由 |
|---|---|---|
| 視点を動かしながら実時間で見たい | 3DGS | ネットワーク計算が無く、投影して重ねるだけで描ける |
| 正確な点群がある(NURBS・CAD・レーザー計測) | 3DGS | 点をそのまま初期位置に使え、学習の立ち上がりが速い |
| 点群が無い、または粗い | NeRF | 画像だけから学習でき、初期値に頼らない |
| 学習時と違う解像度・距離で描く | NeRF(3DGS なら Mip-Splatting 等の対策が必要) | 連続関数なので、ぼけるだけで形は縮まない |
| 保存容量を小さくしたい | NeRF | 本家 3DGS は数百万個 × 59 値で数百 MB になりやすい |
| 形を編集・合成したい | 3DGS | ガウシアンを直接動かせる |
| 面の位置を正確に求めたい | どちらも不向き。NeuS [5] や 2DGS [6] | NeRF は密度の薄い層、3DGS は重なった楕円体で面を表すため |
NURBS から標本化した点群を入力にする今回の課題では、点群が正確で雑音も無いので、3DGS の「点群から始める」性質が素直に活きる。実測でも、同じ学習画像・同じステップ数で 3DGS が NeRF を上回った。ただし、どちらも見た目を再現する手法であり、元の NURBS 曲面との形状誤差を小さくすることは直接の目的にしていない。形状の一致まで評価したい場合は、面を明示的に扱う手法と組み合わせる必要がある。