我在 NeRF 中折騰自動探索式三維重建的心得
寫在前面:
最近我在研究三維重建方向,深切感受到 NeRF (Neural Radiance Fields) 在學術界和工業界都備受矚目。以往三維重建通常要依賴繁瑣的多視圖幾何管線(比如特征匹配、深度估計、網格融合等),或者需要依靠激光雷達 / RGB-D 傳感器才能得到可觀的三維數據。但 NeRF 出現后,給三維重建帶來了革命性的思路:它直接用一個多層感知機(MLP)來隱式建模場景位置和方向與顏色、密度的映射關系,再配合可微分的體渲染公式,就能端到端地重建出精準且逼真的場景。
然而,NeRF 往往默認已經有一批“采集好”的圖像,訓練時并不考慮如何采集這些圖像。一旦缺乏足夠且有效的多視圖信息,NeRF 也很難重建出理想效果。
所以在本文里,我想分享的核心想法是:如果我們能主動控制相機的運動軌跡,怎樣才能高效、全面地探索場景,從而讓 NeRF 重建的質量更優?
用 NeRF 做三維重建時,如何自動選擇拍攝視角?——我的探索嘗試
為什么要關心相機視角?
大家可能都知道,NeRF(Neural Radiance Fields) 這種用神經網絡來做三維重建的方法很火,它能在一批圖像的驅動下,隱式地學習場景的幾何和外觀,然后渲染出各種新視角圖像。但問題是,如果拍攝視角不夠好,或者數據采集做得比較隨意,就算再強大的 NeRF 也很難得到完整、清晰的重建。所以我就想:既然相機可以移動,那能不能自動規劃相機的運動,讓它去“看”最需要看的地方?這樣既能節省拍攝成本,也能讓 NeRF 獲得更準確的三維模型。于是,就折騰出了下面這套“自動探索式”三維重建方法的思路。
一、總體想法
1. 大方向
- 一開始,用少量隨機拍攝到的圖像先訓練出一個初步的 NeRF;
- 然后讓相機(例如無人機或者機器人上的攝像頭)自動探索:
- 根據當前 NeRF 的“模型不確定性”評估哪些位置、哪個角度拍攝更有價值;
- 規劃相機的運動路徑,讓它飛過去拍攝;
- 將新獲得的圖像再增量更新到 NeRF 中;
- 如此循環,直到我們的 NeRF 足夠“自信”,或者時間 / 資源耗盡。
2. 為啥要不確定性?
NeRF 其實暗含了一個體密度(也可以理解為“有沒有東西”)的分布,某些區域如果模型還沒看清,就會有比較大的“熵”(表明不確定度高)。如果在這些區域多來幾張照片,模型就能對它更確定,進而讓重建更加精準和全面。
二、用“熵”來衡量哪些視角值得拍
1. 信息增益的概念
我們可以把相機的某個視角記為 V V V,然后把這個視角可以“看到”的所有光線統稱為 R ( V ) R(V) R(V)。如果 NeRF 在這些光線上不太確定,那就說明這個視角能帶來“新知識”。用熵函數 H H H 描述不確定度的話,信息增益可以用下面這個公式來表示:
Gain ( V ∣ F ) = ∑ r ∈ R ( V ) ∫ n e a r f a r H ( σ F ( r ( t ) ) ) d t \text{Gain}(V \mid F) = \sum_{r \in R(V)} \int_{near}^{far} H\bigl(\sigma_F(r(t))\bigr)\, dt Gain(V∣F)=r∈R(V)∑?∫nearfar?H(σF?(r(t)))dt
這里, σ F ( r ( t ) \sigma_F(r(t) σF?(r(t) 是 NeRF 對光線上某點密度的估計; H ( p ) = ? p log ? p ? ( 1 ? p ) log ? ( 1 ? p ) H(p) = -p \log p - (1-p)\log(1-p) H(p)=?plogp?(1?p)log(1?p) 是二值分布的熵。當 p ≈ 0.5 p \approx 0.5 p≈0.5 時熵最大,也就代表不確定性最高。
2. 時間衰減
在實際探索中,我們希望在早期階段多挖掘信息,因此讓早期視角的增益更“值錢”,可以給它加一個時間衰減系數 1 / i 1/i 1/i:
Gain ( V i ∣ F ) = 1 i ∑ r ∈ R ( V i ) ∫ n e a r f a r H ( σ F ( r ( t ) ) ) d t \text{Gain}(V_i \mid F) = \frac{1}{i} \sum_{r \in R(V_i)} \int_{near}^{far} H\bigl(\sigma_F(r(t))\bigr)\, dt Gain(Vi?∣F)=i1?r∈R(Vi?)∑?∫nearfar?H(σF?(r(t)))dt
這樣,在最初幾次探索時,相機會更加積極地尋找那些不確定性高的區域進行拍攝;后面如果想要精修細節,也可以再繼續拍,但貢獻權重逐漸變低。
三、讓相機別亂走——用“表面趨勢場”來規劃運動
1. 為什么要表面趨勢?
如果一個場景的某些位置變化劇烈(比如物體的邊緣或拐角處),就需要多看看;如果一片平坦空曠,可以“快步路過”。為此,我們構造了一個“表面趨勢場” g ? ( x ) \vec{g}(x) g?(x) ,讓它告訴相機:哪些地方表面變化快,值得多花點時間拍。
2. 趨勢場怎么定義?
我們想要某個函數 Φ ( x ) \Phi(x) Φ(x) 來表示“距離表面有多遠”。在傳統 3D 里,這類似“有符號距離場 (SDF)”。NeRF 里可以用“體密度”在光線終止處做一個期望估計,得到一個近似的距離分布:
Φ ( x ) ≈ ∫ n e a r f a r d ? σ F ( r ( d ) ) d d \Phi(x) \approx \int_{near}^{far} d \,\cdot\, \sigma_F(r(d)) \, dd Φ(x)≈∫nearfar?d?σF?(r(d))dd
然后對 Φ \Phi Φ 做梯度,就能獲得
g ? ( x ) = ? Φ ( x ) = ( ? Φ ? x , ? Φ ? y , ? Φ ? z ) . \vec{g}(x) = \nabla \Phi(x) =\left( \frac{\partial\Phi}{\partial x}, \frac{\partial\Phi}{\partial y}, \frac{\partial\Phi}{\partial z} \right). g?(x)=?Φ(x)=(?x?Φ?,?y?Φ?,?z?Φ?).
如果 ∥ g ? ( x ) ∥ \|\vec{g}(x)\| ∥g?(x)∥ 很大,就意味著這里的表面變化劇烈,需要重點關注。
如何理解這條公式
Φ ( x ) ≈ ∫ n e a r f a r d ? σ F ( r ( d ) ) d d \Phi(x) \approx \int_{near}^{far} d \,\cdot\, \sigma_F\bigl(r(d)\bigr)\,\mathrm{d}d Φ(x)≈∫nearfar?d?σF?(r(d))dd
- 這里的 d d d 表示沿光線從近端 n e a r near near 到遠端 f a r far far 的 深度 (或者距離)。
- σ F ( r ( d ) ) \sigma_F\bigl(r(d)\bigr) σF?(r(d)) 可以理解為 NeRF 模型對光線 r r r 在深度 d d d 處的“體密度”或“占據概率”預測。
如果我們把 σ F \sigma_F σF? 看作對“物體在深度 d d d 附近出現的可能性”進行加權的函數,那么:
- 當 σ F ( r ( d ) ) \sigma_F\bigl(r(d)\bigr) σF?(r(d)) 較大時,就意味著在深度 d d d 左右有更高概率遇到場景表面;
- 將深度 d d d 與該處的密度相乘,并在整個可見深度范圍內積分,相當于在所有深度上做一個加權平均,得到“光線可能終止(與表面交匯)的期望深度”。
因此, Φ ( x ) \Phi(x) Φ(x) 可以近似表示“場景表面在哪兒”。在此基礎上,還可以對其做梯度計算,用來估計表面的趨勢或幾何結構,并將這些信息應用于相機路徑的規劃和優化。
3. 在時間上也要優化
現在我們不只選“空間上的拍攝點”,還想決定多久拍一次、運動速度如何。于是把相機軌跡離散成一系列 t j , v j t_j, v_j tj?,vj? 控制點,目標是讓相機盡量垂直于表面趨勢運動,同時時間分配要平滑。可以寫成一個優化問題:
{ t j , v j } 1 : m = arg ? min ? { t j , v j } ∑ j = 1 m ? 1 ∫ t j t j + 1 ∥ v j ? g ? ( p ( t ) ) ∥ 2 d t + λ ∑ j = 1 m ( Δ t j ) 2 \{t_j, v_j\}_{1:m} = \arg\min_{\{t_j, v_j\}} \sum_{j=1}^{m-1} \int_{t_j}^{t_{j+1}} \bigl\| v_j \cdot \vec{g}(p(t)) \bigr\|_2 \, dt \;+\; \lambda \sum_{j=1}^{m} (\Delta t_j)^2 {tj?,vj?}1:m?=arg{tj?,vj?}min?j=1∑m?1?∫tj?tj+1?? ?vj??g?(p(t)) ?2?dt+λj=1∑m?(Δtj?)2
并滿足
∑ j = 1 m Δ t j = T , p ( t j ) = v j . \sum_{j=1}^m \Delta t_j = T, \quad p(t_j) = v_j. j=1∑m?Δtj?=T,p(tj?)=vj?.
這里, Δ t j = t j + 1 ? t j \Delta t_j = t_{j+1} - t_j Δtj?=tj+1??tj?表示第 (j) 段運動時間, l a m b d a \\lambda lambda 是平滑系數。如果軌跡跟表面走得“太平行”,就會被懲罰;而太頻繁地加減速,也會被懲罰。
四、在線更新 NeRF,別讓模型忘掉以前的地方
1. 滑動窗口思路
每次拍到新圖像,我們都把它放進一個緩存 ( B ) 中。如果緩存超了,就丟掉最老的數據(或者做優先級篩選)。然后每來一張圖,就利用它做一點梯度更新:
Θ n + 1 = Θ n ? η ? Θ L ( I n , V n ; Θ n ) , \Theta_{n+1} =\Theta_n - \eta \nabla_\Theta \mathcal{L}\bigl(I_n, V_n; \Theta_n\bigr), Θn+1?=Θn??η?Θ?L(In?,Vn?;Θn?),
這里 Θ \Theta Θ 是 NeRF 參數, η \eta η 是學習率。
2. 避免遺忘
如果相機一直在某個局部區域晃悠,緩存里就全是這個局部的圖像。久而久之,模型可能把其他區域的記憶“遺忘”了。
為此,我們引入一個重建置信度 C Ω ( x ) = exp ? ( ? H ( σ F ( x ) ) ) C_\Omega(x) = \exp(-H(\sigma_F(x))) CΩ?(x)=exp(?H(σF?(x)))。如果熵大,置信度就低,表示當前點的重建不夠好。相反,熵小就代表模型在那兒挺確定了。
那對每張圖像,衡量一下它覆蓋了多少“低置信度”區域,把這個結果當做采樣權重:
w ( I i ) = 1 ∣ R ( V i ) ∣ ∑ r ∈ R ( V i ) ∫ n e a r f a r [ 1 ? C Ω ( r ( t ) ) ] d t . w(I_i) =\frac{1}{|R(V_i)|} \sum_{r \in R(V_i)} \int_{near}^{far} \bigl[\,1 - C_\Omega(r(t))\bigr] \, dt. w(Ii?)=∣R(Vi?)∣1?r∈R(Vi?)∑?∫nearfar?[1?CΩ?(r(t))]dt.
數值大的圖,說明它拍到了更多不確定區域,也就更值得在訓練中多出現。這樣可以平衡:已經很熟悉的地方,別再重復占用太多訓練迭代;而欠探索區域的圖像要多參與訓練。
另外,還可以周期性地復位緩存,回到歷史所有數據,讓模型整體都再刷一遍,防止完全遺忘老地方。
五、實驗情況與一些發現
-
合成場景:在模擬環境里,我們控制無人機在一個大盒子里亂飛,比較不同策略:
- 隨機飛;
- 固定速度向前飛;
- 貪心只看單步“下一視角增益”;
- 以及我們的“綜合時空優化”策略;
結果顯示,我們的方法在渲染質量和覆蓋率上都顯著更高。在相同的拍攝步數下,能覆蓋更多有效區域,也重建得更精細。
-
真實場景:在一些公開的三維重建數據集(如 Tanks & Temples, ScanNet)上,也把已有圖像視為“可能拍攝到的潛在位置”,再模擬我們的探索算法。我們的自動探索在大規模、復雜環境中更能顯出優勢,尤其是室內場景遮擋多,需要更聰明地選擇角度。另外,我們的增量式訓練在資源占用上還算可控,沒有比傳統離線訓練方式高太多。
-
采樣分布可視化:如果畫一張俯視圖,會看到隨機或者固定路線的拍攝,分布要么太散,要么只在少數地方。而我們的策略在前期先快速掃一遍全局,然后在幾何細節多的地方慢下來細拍。最終形成一條既兼顧覆蓋,又兼顧細節的曲線。
六、還有哪些不足?
- 暫時只考慮靜態場景:如果場景里有動態人物、非剛體形變等,就需要更復雜的動態 NeRF,定義不確定性也會更棘手;
- 沒和語義任務結合:現在只考慮了幾何信息增益,如果還想做目標檢測 / 語義分割,就要把語義不確定性也加進來;
- 相機內參等因素:我們主要在優化“相機位姿”,沒考慮鏡頭焦距、曝光等更多可調參數;
- 需要進一步的持續學習方法:雖然用了緩存和加權采樣,但在超長時間的探索中,如何讓模型一直保持對過去的記憶,還是一個難題。
七、總結
整體而言,讓相機主動探索,在 NeRF 等隱式表示下做三維重建,能顯著提升建模的速度和精度。這背后其實是一個很有潛力的研究方向:把主動視覺和神經場景表示結合起來,不再被動地“等數據”,而是“主動去找數據”。
如果未來和機器人、無人機技術緊密結合,那么在陌生環境中,機器人就能自己知道去哪兒拍、怎么拍,快速學到一份高保真的 3D 場景模型。對自動駕駛、VR/AR、環境監測等領域都大有幫助。
參考一些前沿成果:
- Mildenhall et al. “NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis”
- Barron et al. “Mip-NeRF”
- Müller et al. “Instant Neural Graphics Primitives”
非常期待這個方向能吸引更多研究和應用,也歡迎大家討論和分享自己的想法!