TECHNICAL NOTE · NEURAL RENDERING × CAD

NURBS 曲面から標本化した点群を
NeRF で近似する

関連研究の整理と、付属デモ(nerf_nurbs_pointcloud.html)の手法・描画精度 / 2026 年 9 月 29 日

要旨

CAD で使われる NURBS 曲面は形状を厳密な式で表すが、写実的な描画や学習には向かない。一方、NeRF(Neural Radiance Fields)は空間の各点の密度と色を返す連続関数をニューラルネットで表し、任意視点の画像を合成できる。本稿ではまず、点群と NeRF を結び付ける研究と、CAD・NURBS をニューラル表現と結び付ける研究を整理する。続いて、付属デモが採用した「NURBS → 有理ベジエ分解 → 面積一様な点群 → 多視点画像 → ハッシュ格子 NeRF」という手順を式とともに説明し、実測した精度を示す。同じマグカップ形状で比べると、学習に使っていない視点の PSNR は、学習画像 64 px のとき 26.9 dB、192 px のとき 32.2 dB だった(いずれも 3,000 ステップ)。

1背景:NURBS と NeRF

NURBS(Non-Uniform Rational B-Spline)は、制御点 Pij、重み wij、ノット列から曲面を定める表現で、円・球・トーラスなどの二次曲面も重みを使えば正確に表せる。曲面上の点は次の有理式で与えられる。

S(u,v)=∑i,jNi,p(u)Nj,q(v)wijPij∑i,jNi,p(u)Nj,q(v)wij

NeRF は、位置 x から密度 σ と色 c を返す関数 Fθ を学習し、画素ごとに光線に沿って積分して画像を作る。離散化した形は次のとおりで、δ は光線上の刻み幅、Ti はそこまでの透過率である。

C=∑i=1NTiαici+TN+1cbg,αi=1−e−σiδ,Ti=∏j<i(1−αj)

NURBS は「正確だが離散的な操作が多い」表現、NeRF は「近似だが連続で微分可能」な表現である。NURBS から点群を経由して NeRF を作ると、CAD 形状を学習ベースの描画・生成・再構成の枠組みに載せられる。その代わり、元の式が持っていた厳密さは近似誤差に置き換わる。この交換がどの程度の誤差で成り立つかを見るのが、本稿の後半の主題である。

2用語と学習のしくみ

以降の節で使う用語を先に説明する。あわせて、NeRF の「学習」が何を入力にして、どれだけの量を使うのかを具体的に示す。

2.1 MLP(多層パーセプトロン)

最も基本的な形のニューラルネットワークである。数値の組を入力し、「重みを掛けて足し合わせ、少し曲げる(非線形関数を通す)」処理を何段か繰り返して、数値の組を出力する。各段の計算ユニットをニューロンと呼び、入力と出力の間にある段を隠れ層と呼ぶ。

本デモの MLP は、空間の 1 点について「そこにどのくらいの濃さで、何色の物があるか」を答える関数である。重み(調整できる数値)を変えると関数の形が変わり、学習とはこの重みを目的に合うよう調整することを指す。

位置(x, y, z) ハッシュ格子16 レベル × 2 特徴= 32 個の数値 補間 ⋮⋮ 密度 σ物があるか 赤 R 緑 G色 青 B 入力 32 個 隠れ層 64 個 重み付き和 → ReLU 重み付き和
図 1高精細設定のネットワーク構成。丸はニューロン、線は重みを表し、線は一部だけを描いている。隠れ層の各ニューロンは入力 32 個に重みを掛けて合計し、負なら 0 にする(ReLU)。重みの数は MLP 部分で約 2,400 個、ハッシュ格子部分で約 840 万個あり、学習ではこれらすべてを調整する。

2.2 Adam(最適化アルゴリズム)

重みをどう調整するかを決める方法の名前である。霧の中で、足元の傾きだけを頼りに谷底を探す状況を想像するとよい。勾配は足元の傾きで、各重みをどちらへ動かせば誤差が減るかを表す。最も単純な方法(勾配降下法)は、傾きの向きに一定の歩幅で進む。Adam はこれに 2 つの工夫を加える。

m←0.9m+0.1g,v←0.99v+0.01g2,θ←θ−ηm^v^+ε

g は勾配、θ は重み、η は学習率(歩幅の基準)で、m̂, v̂ は学習の初期に平均が小さく偏るのを補正した値である。細かな調整をしなくても安定して学習が進むため、深層学習で最も広く使われている。デモの「学習率」のスライダーは η にあたる。

2.3 PSNR(ピーク信号対雑音比)

2 枚の画像がどれだけ一致しているかを表す数値で、単位は dB(デシベル)である。画素値を 0〜1 として、全画素の誤差の二乗の平均(MSE)から次の式で求める。

PSNR=10log101MSE[dB]

値が大きいほど一致している。10 dB 上がるごとに MSE は 1/10 になる。

PSNR平均的なずれ見た目の目安
20 dB約 10%はっきり違う
26.9 dB約 4.5%本デモの 64 px 学習。輪郭のぼけが分かる
32.2 dB約 2.5%本デモの 192 px 学習。かなり近い
40 dB約 1%ほぼ見分けがつかない

「平均的なずれ」は、画素値の二乗平均平方根誤差を最大値に対する割合で表したもの(10−PSNR/20)である。PSNR は画素ごとの差しか見ないため、人の目に目立つ輪郭のずれと、目立たない全体の色のずれを区別しない点に注意が要る。

2.4 Node.js を使った理由

Node.js は、JavaScript をブラウザの外(コマンドライン)で実行するためのソフトウェアである。デモを使うのに Node.js は必要なく、ブラウザだけで動く。開発中の検証にだけ使った。理由は次の 3 つである。

2.5 学習の入力と、その量

学習で入力するのは、点群を描いた画像と、その画像を撮ったカメラの位置・向きの組である。点群の座標そのものを NeRF のネットワークに入れることはしない。各画素には、色(RGB)、不透明度(物体か背景か)、深度(カメラからの距離)の 3 種類の値がある。

設定点群学習画像画素の総数1 ステップの光線3,000 ステップで見る画素
標準4 万点24 枚 × 64×6498,304256約 77 万(全画素の約 7.8 周分)
高精細25 万点48 枚 × 192×1921,769,4721,024約 307 万(約 1.7 周分)
参考:元の NeRF 論文の合成データ—100 枚 × 800×8006,400 万4,096—

1 回の学習(1 ステップ)は次の順に進む。

  1. 全学習画像からランダムに画素を選ぶ(標準 256 個、高精細 1,024 個)。
  2. 選んだ画素ごとに、カメラからその画素を通る光線を空間に飛ばす。
  3. 光線上の何か所かで MLP に密度と色を尋ね、式(ボリュームレンダリング)で積み重ねて、その画素の色を予測する。
  4. 予測した色と、学習画像の本当の色との差(誤差)を計算する。
  5. 誤差が減る向きに、Adam で全部の重みを少しずつ動かす。

これを数千回繰り返すと、どの方向から見ても学習画像と矛盾しない「空間の密度と色の分布」ができる。その結果、学習画像にない視点の画像も描けるようになる。点群の形状を直接使うのは、補助として「占有グリッド」(点がない空間を飛ばす)と「深度教師」(予測した距離が正しいかを確かめる)を ON にしたときだけである。

学習画像を増やすと描画精度は上がるが、それに応じて学習時間も延びる。ブラウザで動かせる規模に収めるため、本デモは元の論文より 1〜2 桁小さい画素数で学習している。

3関連研究

調査結果について:ウェブ検索の範囲では、「NURBS から標本化した点群を NeRF で近似する」手順そのものを主題とした論文は特定できなかった。この考え方は、下表の二つの系統が交わるところに位置する。特定の論文を念頭に置いている場合は、題名が分かればその論文に合わせて本節を書き直せる。

点群を NeRF に結び付ける研究

論文点群の使い方要点
Point-NeRF
Xu ほか, CVPR 2022
特徴ベクトル付きの点群そのものを放射輝度場の表現に使う光線上の標本点で近傍の点の特徴を集約して密度と色を求める。点の刈り込みと追加で外れ値や欠損を補い、NeRF と同等の画質を約 30 倍短い学習時間で得る。
Points2NeRF
Zimny ほか, Pattern Recognition Letters 185, 2024
色付き点群からハイパーネットワークで NeRF の重みを直接生成ShapeNet(車・椅子・飛行機)で、各物体 2,048 点の色付き点群と、200×200 の画像 50 枚を使う。生成した重みを初期値にすると、NeRF の学習が速く収束する。
Depth-supervised NeRF(DS-NeRF)
Deng ほか, CVPR 2022
SfM で得た疎な点群の深度を追加の損失に使う少ない視点でも形状が崩れにくく、学習も速くなる。本デモの「深度教師」はこの考え方に対応する。
Near-surface sampling
Yoo ほか, Neural Processing Letters, 2024
深度から作った点群で物体表面の位置を推定し、その近くだけを標本化光線あたりの標本数を約 1/4 に減らしても元の NeRF と同等の画質を得る。本デモの「占有グリッド」はこれに近い。

CAD・NURBS をニューラル表現に結び付ける研究

論文CAD・NURBS の使い方要点
CAD-NeRF
Wen ほか, Frontiers of Computer Science
CAD モデルを検索し、NeRF の密度の初期化とカメラ姿勢の初期化に使う姿勢の分からない 3〜9 枚の画像から NeRF を再構成する。ShapeNet の 9 視点で PSNR 21.9 dB を報告。
NeuroNURBS
Fan ほか, arXiv 2411.10848, 2024
NURBS の制御点・重み・ノットを直接符号化する表現学習UV 格子で曲面を近似する従来法と比べ、学習時の GPU メモリを 86.7%、立体の保存容量を 79.9% 削減。

本デモの基盤は、元の NeRF [1] と、多重解像度ハッシュ格子による高速化 Instant-NGP [2] である。点群の使い方は DS-NeRF [3] と Near-surface sampling [6] に近い。Point-NeRF [4] のように点群そのものを表現に組み込む方式は採っていない。

4デモの処理の流れ

NURBS 曲面制御点・重み・ノット 有理ベジエパッチ同次座標の制御網 点群位置・法線・色 学習画像RGB・不透明度・深度 NeRF の学習ハッシュ格子 + MLP ノット挿入 面積比で標本化 円盤で描画 色の二乗誤差 占有グリッド48³〜128³ セル 深度教師λ = 0.05 新しい視点の描画ボリュームレンダリング 空セルを飛ばす 点群の深度 学習済み
図 2黒の経路が NeRF の本来の学習(画像だけから学ぶ)。青の経路は点群の形状情報を直接渡す補助で、占有グリッドは標本点の選別に、深度は追加の損失に使う。どちらもデモ上で ON/OFF できる。

5各段階の手法

5.1 NURBS から有理ベジエパッチへ

各ノット値の重複度が次数 p に達するまでノットを挿入すると、NURBS 曲面は多項式区間ごとの有理ベジエパッチに分かれる(The NURBS Book のノット挿入 [9])。挿入は同次座標 (wx, wy, wz, w) 上の線形補間で行うので、形は一切変わらない。パッチ上の点は、同次座標で de Casteljau 法を適用してから w で割って求める。この部分は添付のスライス断面ビューアのコードをそのまま使っている。

5.2 面積に比例した一様サンプリング

パラメータ空間で一様に点を取ると、球の極のように引き伸ばしの強い部分に点が集まる。そこで各パッチを 6×6(パッチが 60 枚を超える形状では 4×4)に分割して三角形の 3D 面積を求め、面積に比例して三角形を選ぶ。三角形の内部では、重心座標

(1−r1,r1(1−r2),r1r2),r1,r2∼U(0,1)

で (u, v) を決め、その点を厳密な有理ベジエ式で評価する。三角形は選ぶ確率の計算にだけ使うので、点そのものは常に曲面上にある。法線はパラメータ方向の差分の外積で求め、極のように縮退する点ではパラメータを内側へずらして求め直す。点の色は「曲面ごとの色 × (0.3 + 0.7 |n·l|)」で、光源方向 l を固定したランバート陰影である。この色は視点によって変わらない。

5.3 学習画像の生成

点群を原点中心・半径 0.95 の球に収まるよう正規化し、半径 3.3 の球面上にフィボナッチ格子でカメラを並べる(画角 40°)。各点は、点の平均間隔 s = √(面積 / 点数) を半径とする円盤として Z バッファ描画し、面が隙間なく埋まるようにする。2×2 の超標本化で平均を取り、RGB・被覆率(不透明度)・深度の 3 種類の画像を作る。NeRF が見るのはこの画像だけで、点群の座標を直接は学習しない。

5.4 NeRF のネットワーク

Instant-NGP [2] と同じ多重解像度ハッシュ格子で位置を符号化する。レベル l の格子解像度は Nl = ⌊16·bl⌋ で、b は最細レベルが指定値(256〜2048)になるよう決める。格子点の数が表サイズ T 以下のレベルでは格子点をそのまま並べ、それより細かいレベルでは次のハッシュで表を引く。

h(x,y,z)=(x⊕2654435761y⊕805459861z)modT

各レベルで周囲 8 格子点の 2 次元特徴を三線形補間し、全レベルを連結した 2L 次元のベクトルを MLP(隠れ層 1 層、幅 64、ReLU)に入れる。出力 4 値のうち、密度は σ = exp(o0)、色は c = sigmoid(o1..3) とする。点の色が視点によらないので、視線方向は入力しない。

5.5 損失と勾配

1 ステップごとに、ランダムな視点・画素から光線を 256〜1,024 本選ぶ。背景色は光線ごとに乱数で決め、正解画像もその背景色と合成する。こうすると、背景色に頼って不透明度をごまかす解が選ばれなくなる。損失は色の平均二乗誤差に、不透明な画素だけで深度の二乗誤差(重み 0.05)を足したものである。勾配はすべて手で導出して実装した。密度に対する勾配は、後ろの標本点の寄与の累積和 Si を持ちながら光線を逆向きにたどって計算する。

∂C∂σi=δ(Ti+1ci−Si),Si=∑j>iTjαjcj+TN+1cbg

最適化は Adam(β = 0.9, 0.99)で行う。学習率は 1×10−2 から 3 万ステップかけて 1/10 まで下げる。ハッシュ表は、そのステップで勾配が付いた要素だけを更新する。これで表を 218 まで大きくしても、1 ステップの費用は光線数に比例したままになる。

5.6 点群の形状情報の使い方

占有グリッド:点を含むセルと、その周囲(点の間隔の 1.5 倍以上)を「占有」とし、それ以外のセルでは標本点を取らない。グリッドの解像度は学習画像の解像度に合わせて 48³〜128³ に変える。光線あたりの実際の標本数は、刻み数 128〜384 に対して 3〜10 点程度まで減る。深度教師:学習画像の深度と、NeRF の期待深度 ΣTiαiti の差を損失に加える。どちらも OFF にすれば、画像だけから学習する通常の NeRF になる。

6描画精度と速度

6.1 幾何と勾配の検証

項目方法結果
NURBS 評価(Python 版)Rhino の openNURBS の PointAt / NormalAt と 500 点ずつ比較誤差 ≤ 1.8×10⁻¹⁵
点の位置(JS 版)半径 1.5 の球・トーラス上の点と、式から求めた距離の差≤ 1.3×10⁻⁷
法線(JS 版)球上の点で、法線と半径方向の内積1.000000
一様性球上 5 万点の z 座標を 10 区間に分けた度数(均一なら各 5,000)4,834〜5,130
面積の推定点を選ぶ確率に使う面積(6×6 分割)の真値との差−1.0〜−1.4%
逆伝播(色)全パラメータ種別で数値微分と比較(最大相対誤差)5.3×10⁻⁴
逆伝播(色+深度)同上9.9×10⁻⁴

JS 版の点の誤差は、座標を 32 ビット浮動小数で保存したことによる丸め誤差の大きさである。面積の推定が 1% ほど小さいのは粗い三角形分割のためだが、これは選ぶ確率がわずかに偏るだけで、点の位置には影響しない。逆伝播の誤差も 32 ビット演算の精度の範囲に収まっている。

6.2 学習画像の解像度と画質

マグカップ形状(本体と取っ手の 2 曲面)で、学習画像 64 px の標準設定と 192 px の高精細設定を比べた。評価には、学習に使っていない視点(方位角 0.9 rad、仰角 0.45 rad)を 192×192 で描いた画像を使う。正解は点群を円盤で描いた画像で、どちらも白背景で合成して PSNR を求めた。

正解:点群を円盤として描いた192ピクセルの画像
正解(点群 25 万点の描画, 192 px)
64ピクセルで学習したNeRFを192ピクセルで描いた画像
NeRF(64 px 学習)
26.9 dB
192ピクセルで学習したNeRFを192ピクセルで描いた画像
NeRF(192 px 学習)
32.2 dB
64ピクセルの学習画像の1枚
64 px 学習画像の 1 枚(拡大表示)
64ピクセル学習の誤差マップ
誤差 ×4(64 px 学習)
192ピクセル学習の誤差マップ
誤差 ×4(192 px 学習)
図 3学習に使っていない視点での比較(3,000 ステップ後)。上段は正解と 2 つの NeRF、下段は 64 px の学習画像と誤差マップ。64 px で学習した NeRF は、学習画像の画素より細かい輪郭の情報を持たないため、192 px で描いても縁がぼける。誤差マップは RGB の絶対誤差の平均を 4 倍して表示しており、白いほど誤差が大きい。誤差は主に輪郭と、本体と取っ手のつなぎ目に集中している。
24 26 28 30 32 34 0 500 1,000 1,500 2,000 2,500 3,000 学習ステップ PSNR(dB) 64 px 学習 26.9 192 px 学習 32.2
図 4学習ステップ数と、学習に使っていない視点の PSNR(250 ステップごとに評価)。64 px は早く立ち上がるが、25〜27 dB の間を上下したまま頭打ちになる。192 px は 1 ステップが約 6 倍重いものの、1,000 ステップ前後で 64 px の到達点を上回る。
設定点数学習画像パラメータms/ステップPSNR
標準(64 px)40,00024 × 64²788,2922226.9 dB
高精細(192 px)250,00048 × 192²8,390,980約 13032.2 dB

ms/ステップは Node.js(1 スレッド)での平均で、評価の時間は除いている。ブラウザでは学習と描画が 2 つのスレッドで並行して動く。こちらの 2 コア環境では、標準設定で毎秒 28〜45 ステップ、高精細で毎秒約 5 ステップだった。

6.3 形状による違い(標準設定)

形状占有セル率標本点/光線PSNR(2,000 ステップ)
トーラス(有理)15.5%5.028.6 dB
マグカップ13.8%4.228.3 dB
主翼と胴体3.2%0.829.7 dB

評価は、学習に使っていない視点を 48×48 で描いたもの。飛行機は画面に占める面積が小さく、背景の画素が多いため PSNR が高めに出る。PSNR 30 dB は、画素値の二乗平均平方根誤差が最大値の約 3.2% にあたる。

7精度を決める要因と限界

学習画像の解像度。物体中心の距離で画素 1 個が覆う幅は 2·3.3·tan 20° / R で、R = 64 なら 0.0375、192 なら 0.0125 である(物体の直径は 1.9)。NeRF はこれより細かい変化を学ぶ手掛かりを持たない。解像度を上げると画質は上がるが、細部を埋めるのに必要な点数・ハッシュ表の大きさ・光線上の刻み数も合わせて増やす必要がある。

点群の密度。正解画像は点を円盤で描いたものなので、点が疎だと円盤の縁の凹凸が「正解」に入り込む。ここで示した PSNR は点群の描画との一致度であり、元の NURBS 曲面との距離ではない。曲面に対する形状誤差を測るには、NeRF の密度場から面を取り出して、元の曲面との Chamfer 距離などを求める必要がある。

面が「薄い層」になる。NeRF は面を密度の高い薄い層として表すので、輪郭が半透明になり、深度にもぼけが出る。面の位置そのものを精度よく求めたい用途では、符号付き距離関数(SDF)を学ぶ NeuS 系の手法の方が向いている。

視点に依存しない色。点の色が固定のランバート陰影なので、視線方向の入力は省いている。鏡面反射のような、見る向きで変わる質感は扱っていない。

計算資源。すべて CPU 上の JavaScript で動くため、192 px を超える解像度や多数の視点では学習に時間がかかる。WebGPU の計算シェーダに移せば、同じ手順で 1〜2 桁の高速化が見込める。

参考文献

  1. B. Mildenhall, P. P. Srinivasan, M. Tancik, J. T. Barron, R. Ramamoorthi, R. Ng. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. ECCV 2020. arXiv:2003.08934
  2. T. Müller, A. Evans, C. Schied, A. Keller. Instant Neural Graphics Primitives with a Multiresolution Hash Encoding. ACM Transactions on Graphics 41(4), 2022. arXiv:2201.05989
  3. K. Deng, A. Liu, J.-Y. Zhu, D. Ramanan. Depth-supervised NeRF: Fewer Views and Faster Training for Free. CVPR 2022. arXiv:2107.02791
  4. Q. Xu, Z. Xu, J. Philip, S. Bi, Z. Shu, K. Sunkavalli, U. Neumann. Point-NeRF: Point-based Neural Radiance Fields. CVPR 2022. arXiv:2201.08845
  5. D. Zimny, J. Waczyńska, T. Trzciński, P. Spurek. Points2NeRF: Generating Neural Radiance Fields from 3D Point Cloud. Pattern Recognition Letters 185, 8–14, 2024. doi:10.1016/j.patrec.2024.07.002
  6. H. B. Yoo, H. M. Han, S. S. Hwang, I. Y. Chun. Improving Neural Radiance Fields Using Near-Surface Sampling with Point Cloud Generation. Neural Processing Letters, 2024. arXiv:2310.04152
  7. X. Wen, X. Zhu, R. Yi, Z. Wang, C. Zhu, K. Xu. CAD-NeRF: Learning NeRFs from Uncalibrated Few-view Images by CAD Model Retrieval. Frontiers of Computer Science. arXiv:2411.02979
  8. J. Fan, B. Gholami, T. Bäck, H. Wang. NeuroNURBS: Learning Efficient Surface Representations for 3D Solids. 2024. arXiv:2411.10848
  9. L. Piegl, W. Tiller. The NURBS Book, 2nd ed. Springer, 1997.