記事ディレクトリ
NeRF 研究ノート
概要:
-
再構成: 現在利用可能なさまざまな角度からの 2 次元画像に基づいて 3 次元オブジェクトを再構成します。
MLP ネットワークを使用してシーン表現を学習し、入力ソース画像に対応する 3 次元空間座標とカメラ アングルを実現します ( x , y , z , θ , ϕ ) ( x、y、z、\theta、\phi) (x,y,z、θ、ϕ);出 ( R , G , B , σ ) (R,G, B,\sigma) (R,G、B、σ) 、それぞれ RGB カラー値とボクセル密度を表します。
-
トレーニングとレンダリング: ボリューム レンダリングは、予測された 2D イメージを生成します。
- カメラ レイをシーンに通過させ、サンプリングされた 3D ポイントのセットを生成します。
- これらの点とそれに対応する 2D 視線方向は、ニューラル ネットワークへの入力として使用され、色と濃度の出力セットが生成されます。
- 古典的なボリューム レンダリング技術を使用して、これらの色と濃度を 2D 画像に蓄積します。
- 予測された 2D 画像とグラウンド トゥルース画像の間で L2 損失が計算され、MLP が最適化されます。
全体的なプロセスは次のとおりです。
1 導入プロセス
1.1 カメラパラメータ: さまざまな角度からの写真から入力データを取得する方法
プロセスの概要:
-
データの前処理
-
一連の画像が与えられた場合、colmap ソフトウェアを使用して外部パラメータと内部パラメータを取得します。
-
次に、上記の Colmap 形式を llff 形式に変換すると、パラメータは 17 個 (外部パラメータ 12 個、内部パラメータ 3 個、範囲表現 2 個) になります。
-
-
入力
- 画像面内の特定の位置を取得し (対応する実際のピクセル値は既知です)、カメラ位置に接続された線が光線を形成します。まず、カメラ座標系で光線を取得します。光線方向ベクトルを計算し、外部パラメータ逆行列(c2w)を使用してワールド座標系に変換します。
- 3 次元位置パラメータを取得するために最も近い距離と最も遠い距離内の n 点をサンプリングし、n 個の 5 次元ベクトルを形成することが入力となります。
追加の知識ポイント:
-
同次座標系
点が無限遠にある場合、この点の座標は (∞, ∞) (\infty,\infty) になります。(∞,∞)、ユークリッド空間ではこれは無意味になります。同次座標を使用すると、遠近法空間上の無限遠点で平行線が交差し、無限点の表現が実現します。
つまり、同次座標は N+1 次元を使用して N 次元の座標を表します。
追加の変数 w を 2D デカルト座標の末尾に追加して、2D 同次座標を形成できます。したがって、デカルト座標系の点 ( X , Y ) (X, Y) (X,Y)在齐次坐标里面变成了 ( x , y , w ) (x,y,w) (x,y,w),并且有:
X = x w ; Y = y w X=\frac{x}{w};Y=\frac{y}{w} バツ=でx ;そして=でy
たとえば、デカルト座標系の (1,2) は、同次座標系では (1,2,1) と表現できます。点 (1,2) が無限遠に移動すると、デカルト座標系では座標系 座標では ( ∞ , ∞ ) (\infty,\infty) となります。(∞,∞) の場合、その同次座標は (1,2,0) と表されます。この場合、「 ∞ \infty ∞" は無限遠点を表します。また、方向ベクトルの同次座標の 4 次元は 0 に等しく、点座標の 4 次元は 1 に等しいことに注意してください。
-
カメラ座標系:
3D 空間点とカメラ平面間のマッピング関係を確立するために、複数のカメラ間の相対関係を定義します。ローカルカメラ座標系。以下の図は、一般的な座標系定義の習慣を示しています。
-
カメラの内部パラメータと外部パラメータ
-
カメラの外部パラメータ
カメラの外部パラメータは 4x4 行列 M で、その機能はワールド座標系の点を変換することです P w or l d = [ x , y , z , 1 ] P_{ワールド}= [x,y,z,1] Pwまたはld =[x,y,z、1] 变换到相机坐标系 P c a m e r a = M P w o r l d P_{camera}=MP_{world} Pcamera =MPwまたはld 次に。カメラの外部パラメータをワールド対カメラ (w2c) マトリックスとも呼びます。 NeRF は主にカメラの外部パラメータの逆行列である Camera-to-World (c2w) マトリックスを使用し、その機能はカメラ座標系の点をワールド座標系に変換することです。
c2w 行列の値は、カメラ座標系の方向と原点を直接表します。
-
カメラの内部パラメータ
カメラの内部パラメータ行列は、カメラ座標系の 3D 座標を 2D 画像平面にマッピングします。ここでは、ピンホール カメラを例として、カメラの内部パラメータ行列 K を導入します。
内部パラメータ行列 K には 4 つの値が含まれます。fx と fy はカメラの水平方向と垂直方向です。焦点距離(理想的なピンホール カメラ、fx=fy)。焦点距離の物理的な意味は、カメラの中心から撮像面までの距離であり、長さはピクセル単位で測定されます。 cx と cy は、カメラの光学中心に対する画像原点の水平および垂直オフセットです。 cx、cy は、画像の幅と高さの 1/2 で近似できる場合があります。実際の使用では、内部パラメータには 3 つの値のみが記録されます。 (F, H, W) (F,H, W) (F,は、W)
-
-
コルマップからllffへ:
由imgs2poses.py来实现
-
3D 空間光線を構築する方法
まず、3D ピクセルの x 座標と y 座標は 2D 画像座標 (i, j) から光学中心座標 (cx, cy) を引いたもので、z 座標は実際には焦点距離 f になります (像面とカメラの中心の間の距離は、焦点距離 f) です。したがって、 ( i − c x , j − c y , f ) − ( 0 , 0 , 0 ) = ( i − c x , j − c y , f として光線の方向ベクトルを取得できます。 ) (i-c_x,j-c_y,f)-(0,0,0)=(i-c_x,j-c_y,f) (i−cx 、j−cy 、f)−(0,0、0)=(i−cx 、j−cy 、f) はベクトルなので、ベクトル全体を焦点距離 f で割って Z 座標を正規化できます。 get ( i − c x f , j − c y f , 1 ) (\frac{i-c_x}{f},\frac{j-c_y}{f},1) (fi−cx 、fj−cy 、1)
参考:NeRF コード解釈 - カメラ パラメータと座標系変換 - Chen Guanying の記事 - Zhihu
1.2MLP
由 ( x , y , z , θ , ϕ ) (x,y,z,\theta,\phi) (x,y,z、θ、ϕ)到 ( R , G , B , σ ) (R,G,B 、\シグマ) (R,G、B、σ)由MLP来完成,结构如下:
其中 ( θ , ϕ ) (\theta,\phi) (θ,ϕ)カラー値にのみ影響し、密度には影響しません σ \sigma σ なのでこの構造を採用しています。
1.3 ボリュームレンダリングと離散化
画像上の各ピクセルに対して、まずカメラのポーズに基づいて光線を生成し、次に光線に基づいて [ t n , t f ] [t_n,t_f] [tn 、tf ]之间等分成n份进行取样:
t i 〜 U [ t n + i − 1 N ( t f − t n ) , t n + i N ( t f − t n ) ] (1) t_i\sim\mathcal{U}\bigg[t_n+\frac{i-1}{N}(t_f-t_n),t_n+\frac{i}{N}( t_f-t_n)\bigg] \tag{1} ti 〜U[tn +N私−1 (tf −tn )、tn +Ni (tf −tn )](1)
その後の 2D 画像上の位置の色は散布可能です:
C ^ ( r ) = ∑ i = 1 N Ti ( 1 − exp ( − σ i δ i ) ) c i 、ここで T i = exp ( − ∑ j = 1 i − 1 σ j δ j ) (2) \hat{C}(\mathbf{r})=\sum\limits_{i=1}^N T_i(1-\exp(-\sigma_i\delta_i))\mathbf{c} _i,\text{where}T_i=\exp\left(-\sum\limits_{j=1}^{i-1}\sigma_j\delta_j\right) \tag{2} C^(r)=i=1∑N Ti (1−exp(−σi di ))ci 、どこTi =経験値(−j=1∑i−1 pj dj )(2)
このようにして、画像内の各ピクセルの色を取得できます。 。
詳細なプロセスは、ボリューム レンダリング式の導出で確認できます。
1.4 最適化のポイント
-
定義
γ ( p ) = ( sin ( 2 0 π p ) , cos ( 2 0 π p ) , ⋯ , sin ( 2 L − 1 π ) . p ) , cos ( 2 L − 1 π p ) ) (3) \gamma(p)=\left(\sin\left(2^0\pi p\right),\cos\left(2^0) \ pi p\right),\cdots,\sin\left(2^{L-1}\pi p\right),\cos\left(2^{L-1}\pi p\right)\right) \タグ{3}γ(p)=(罪(20πp)、コス(20πp)、⋯、罪(2L−1πp)、コス(2L−1πp))(3)
入力値のフーリエ級数分解を実行して、抽出を容易にします。次元の特徴を考慮すると、ニューラル ネットワークはより良い結果を達成します。其中, L = 10 L=10 L=10用于 ( x , y , z ) (x,y,z) (x,y,z)三个坐标值, L = 4 L=4 L=4用于方向向量 γ ( d ) \gamma(\mathbf{d}) γ(d)
-
階層的なボリュームサンプリング
2 つのサンプリング (粗いサンプリングと細かいサンプリング) を実行します。
-
最初の粗い均一サンプリング ( N c N_c Nc = 64)、式 (3) を使用して色を表現し、形式を少し変更します:
C ^ c ( r ) = ∑ i = 1 N c w i c i , w i = T i ( 1 − exp ( − σ i δ i ) ) (4) \hat{C}_c(\mathbf{r})=\sum\limits_{i=1}^{N_c}w_ic_i,w_i=T_i( 1-\exp(-\sigma_i\delta_i))\タグ{4} C^c (r)=i=1∑Nc でi ci 、でi =Ti (1−exp(−σi di ))(4)
これにより、各サンプリング ポイントの重みが得られます。之后进行归一化: w ^ i = w i / ∑ j = 1 N c w j \hat{w}_i=^{w_i}/\sum_{j=1}^{N_c}w_j で^i =でi /∑j=1Nc でj 、区分的一定確率密度関数 PDF として表されます。
-
2 回目のファイン サンプリングでは、最初のサンプリングで取得した PDF に対して逆変換サンプリングが実行されます ( N f = 128 N_f=128 Nf =128)、合計サンプリング ポイント ( N c + N f N_c+N_f Nc +Nf ) ネットワークをトレーニングして C ^ f ( r ) \hat{C}_f(\mathbf{r}) を取得します。C^f (r)
トレーニングはサンプリングの完了後に実行されます。損失関数は次のとおりです:
L = ∑ r ∈ R [ ∥ C ^ c ( r ) − C ( r ) ∥ 2 2 + ∥ C ^ f ( r ) − C ( r ) ∥ 2 2 ] \mathcal{L}=\sum\limits_{\mathbf{r}\in\mathcal{R}}\left[\left\|\hat{ C}_c (\mathbf{r})-C(\mathbf{r})\right\|_2^2+\left\|\hat{C}_f(\mathbf{r})-C(\mathbf{ r}) \right\|_2^2\right] L=r∈R∑ [ C^c (r)−C(r) 22 + C^f (r)−C(r) 22 ]
最終的なレンダリングは C ^ f ( r ) \hat{C}_f(\mathbf{r}) < から行われますが、 /span>C^f (r),但我们也最小化了 C ^ c ( r ) \hat{C}_c(\mathbf{r}) C^c (r) 損失により、粗いネットワークからの重み分布を利用できるようになります。ネットワーク上でサンプルを配布します。 -
参考資料と資料
[1]:NeRF: ビュー合成のためのニューラル放射フィールドとしてのシーンの表現
[2]:NeRF コード解釈 - カメラ パラメーターと座標系変換 - Chen Guanying の記事 - Zhihu
[3]:「グラフィック初心者」にも優しいNeRF原則を徹底解説