讓相機自己決定拍哪兒!——NeRF 三維重建的主動探索之路

我在 NeRF 中折騰自動探索式三維重建的心得

寫在前面:
最近我在研究三維重建方向,深切感受到 NeRF (Neural Radiance Fields) 在學術界和工業界都備受矚目。以往三維重建通常要依賴繁瑣的多視圖幾何管線(比如特征匹配、深度估計、網格融合等),或者需要依靠激光雷達 / RGB-D 傳感器才能得到可觀的三維數據。

但 NeRF 出現后,給三維重建帶來了革命性的思路:它直接用一個多層感知機(MLP)來隱式建模場景位置和方向與顏色、密度的映射關系,再配合可微分的體渲染公式,就能端到端地重建出精準且逼真的場景。

然而,NeRF 往往默認已經有一批“采集好”的圖像,訓練時并不考慮如何采集這些圖像。一旦缺乏足夠且有效的多視圖信息,NeRF 也很難重建出理想效果。

所以在本文里,我想分享的核心想法是:如果我們能主動控制相機的運動軌跡,怎樣才能高效、全面地探索場景,從而讓 NeRF 重建的質量更優?


用 NeRF 做三維重建時,如何自動選擇拍攝視角?——我的探索嘗試

為什么要關心相機視角?
大家可能都知道,NeRF(Neural Radiance Fields) 這種用神經網絡來做三維重建的方法很火,它能在一批圖像的驅動下,隱式地學習場景的幾何和外觀,然后渲染出各種新視角圖像。但問題是,如果拍攝視角不夠好,或者數據采集做得比較隨意,就算再強大的 NeRF 也很難得到完整、清晰的重建。

所以我就想:既然相機可以移動,那能不能自動規劃相機的運動,讓它去“看”最需要看的地方?這樣既能節省拍攝成本,也能讓 NeRF 獲得更準確的三維模型。于是,就折騰出了下面這套“自動探索式”三維重建方法的思路。


一、總體想法

1. 大方向

  1. 一開始,用少量隨機拍攝到的圖像先訓練出一個初步的 NeRF;
  2. 然后讓相機(例如無人機或者機器人上的攝像頭)自動探索
    • 根據當前 NeRF 的“模型不確定性”評估哪些位置、哪個角度拍攝更有價值;
    • 規劃相機的運動路徑,讓它飛過去拍攝;
    • 將新獲得的圖像再增量更新到 NeRF 中;
  3. 如此循環,直到我們的 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(VF)=rR(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 p0.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?rR(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

  1. 這里的 d d d 表示沿光線從近端 n e a r near near 到遠端 f a r far far深度 (或者距離)。
  2. σ 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=1m?1?tj?tj+1?? ?vj??g ?(p(t)) ?2?dt+λj=1m?(Δ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=1m?Δ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?rR(Vi?)?nearfar?[1?CΩ?(r(t))]dt.

數值大的圖,說明它拍到了更多不確定區域,也就更值得在訓練中多出現。這樣可以平衡:已經很熟悉的地方,別再重復占用太多訓練迭代;而欠探索區域的圖像要多參與訓練。
另外,還可以周期性地復位緩存,回到歷史所有數據,讓模型整體都再刷一遍,防止完全遺忘老地方。


五、實驗情況與一些發現

  1. 合成場景:在模擬環境里,我們控制無人機在一個大盒子里亂飛,比較不同策略:

    • 隨機飛;
    • 固定速度向前飛;
    • 貪心只看單步“下一視角增益”;
    • 以及我們的“綜合時空優化”策略;
      結果顯示,我們的方法在渲染質量和覆蓋率上都顯著更高。在相同的拍攝步數下,能覆蓋更多有效區域,也重建得更精細。
  2. 真實場景:在一些公開的三維重建數據集(如 Tanks & Temples, ScanNet)上,也把已有圖像視為“可能拍攝到的潛在位置”,再模擬我們的探索算法。我們的自動探索在大規模、復雜環境中更能顯出優勢,尤其是室內場景遮擋多,需要更聰明地選擇角度。另外,我們的增量式訓練在資源占用上還算可控,沒有比傳統離線訓練方式高太多。

  3. 采樣分布可視化:如果畫一張俯視圖,會看到隨機或者固定路線的拍攝,分布要么太散,要么只在少數地方。而我們的策略在前期先快速掃一遍全局,然后在幾何細節多的地方慢下來細拍。最終形成一條既兼顧覆蓋,又兼顧細節的曲線。


六、還有哪些不足?

  • 暫時只考慮靜態場景:如果場景里有動態人物、非剛體形變等,就需要更復雜的動態 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”

非常期待這個方向能吸引更多研究和應用,也歡迎大家討論和分享自己的想法!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/894826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/894826.shtml
英文地址,請注明出處:http://en.pswp.cn/news/894826.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

央行發布《貿易金融分布式賬本技術要求》,參考架構包括5部分

《銀行科技研究社》(作者 木子劍):2024年12月11日,中國人民銀行發布金融行業標準《貿易金融分布式賬本技術要求》(JR/T 0308-2024)(以下簡稱“《要求》”),當日實施。據悉,該文件的起草單位包括6大行和多家股份制銀行等。 《要求》規定了分布式賬本技術在貿易金融領域…

管理etcd的存儲空間配額

如何管理etcd的存儲空間配額 - 防止集群存儲耗盡指南 本文基于etcd v3.4官方文檔編寫 為什么需要空間配額? 在分布式系統中,etcd作為可靠的鍵值存儲,很容易成為系統瓶頸。當遇到以下情況時: 應用程序頻繁寫入大量數據未及時清理…

調用騰訊云批量文本翻譯API翻譯srt字幕

上一篇文章介紹了調用百度翻譯API翻譯日文srt字幕的方法。百度翻譯API是get方式調用,參數都放在ur中,每次調用翻譯文本長度除了接口限制外,還有url長度限制,而日文字符通過ur轉碼后會占9個字符長度,其實從這個角度來講…

Python aiortc API

本研究的主要目的是基于Python aiortc api實現抓取本地設備媒體流(攝像機、麥克風)并與Web端實現P2P通話。本文章僅僅描述實現思路,索要源碼請私信我。 1 demo-server解耦 1.1 原始代碼解析 1.1.1 http服務器端 import argparse import …

記錄 | WPF基礎學習Style局部和全局調用

目錄 前言一、Style1.1 例子1.2 為樣式起名字1.3 BasedOn 繼承上一個樣式 二、外部StyleStep1 創建資源字典BaseButtonStyle.xamlStep2 在資源字典中寫入StyleStep3 App.xaml中寫引用路徑【全局】Step4 調用三、代碼提供四、x:Key和x:Name區別 更新時間 前言 參考文章&#xff…

如果$nextTick內部拋出錯誤,如何處理?

如果 $nextTick 內部拋出錯誤,可以通過在回調函數中使用 try…catch 語句來捕獲和處理這些錯誤。由于 $nextTick 是異步執行的,因此錯誤不會直接影響到 Vue 的運行,但捕獲錯誤可以幫助你進行更好的錯誤處理和調試。 一、使用 try…catch 以下是如何在 $nextTick 中捕獲錯誤…

吳恩達深度學習——卷積神經網絡實例分析

內容來自https://www.bilibili.com/video/BV1FT4y1E74V,僅為本人學習所用。 文章目錄 LeNet-5AlexNetVGG-16ResNets殘差塊 1*1卷積 LeNet-5 輸入層:輸入為一張尺寸是 32 32 1 32321 32321的圖像,其中 32 32 3232 3232是圖像的長和寬&…

Spring Boot 自動裝配原理與優化實踐

在 Java 開發領域,Spring Boot 以其 “約定優于配置” 的理念,極大地簡化了 Spring 應用的開發和部署過程,成為了眾多開發者的首選框架。它通過自動裝配機制,讓開發者能夠快速搭建一個功能完備的應用,而無需進行繁瑣的…

【Uniapp-Vue3】z-paging插件組件實現觸底和下拉加載數據

一、下載z-paing插件 注意下載下載量最多的這個 進入Hbuilder以后點擊“確定” 插件的官方文檔地址: https://z-paging.zxlee.cn 二、z-paging插件的使用 在文檔中向下滑動,會有使用方法。 使用z-paging標簽將所有的內容包起來 配置標簽中的屬性 在s…

【B站保姆級視頻教程:Jetson配置YOLOv11環境(七)Ultralytics YOLOv11配置】

Jetson配置YOLOv11環境(7)Ultralytics YOLOv11環境配置 文章目錄 1. 下載YOLOv11 github項目2. 安裝ultralytics包3. 驗證ultralytics安裝3.1 下載yolo11n.pt權重文件3.2 推理 1. 下載YOLOv11 github項目 創建一個目錄,用于存放YOLOv11的項目…

第二天:系統從BIOS/UEFI到GRUB/bootloader的啟動過程

目錄 **一、BIOS/UEFI初始化階段****二、引導加載程序(GRUB)的啟動過程****1. BIOS模式下的GRUB分階段加載****2. UEFI模式下的GRUB加載** **三、操作系統內核加載與初始化****四、關鍵組件與配置文件****五、故障排查與恢復****總結**常見問題如何在UEF…

es官方go客戶端創建ik索引并進行查詢操作

es-go client引入gomod go get github.com/elastic/go-elasticsearch/v8latest連接es服務器(不經過安全校驗) cfg : elasticsearch.Config{Addresses: []string{"http://localhost:9200",}, } es, err : elasticsearch.NewClient(cfg) if err ! nil {pa…

【容器技術01】使用 busybox 構建 Mini Linux FS

使用 busybox 構建 Mini Linux FS 構建目標 在 Linux 文件系統下構建一個 Mini 的文件系統,構建目標如下: minilinux ├── bin │ ├── ls │ ├── top │ ├── ps │ ├── sh │ └── … ├── dev ├── etc │ ├── g…

【C語言系列】深入理解指針(5)

深入理解指針(5) 一、sizeof和strlen的對比1.1sizeof1.2strlen1.3sizeof和strlen的對比 二、數組和指針筆試題解析2.1 一維數組2.2 字符數組2.2.1代碼1:2.2.2代碼2:2.2.3代碼3:2.2.4代碼4:2.2.5代碼5&#…

標志的推理

下面的討論是我對《對編程實現擬人智能可行性的論證》這篇文章的“賦值與對象的標志”這一節的展開討論。 標志能夠使我們更好的思維(比如用輪廓標記物體對象,用興奮強度標記回憶情況等等)。有思維標志、信息標志,單純標志、組合…

【藍橋杯嵌入式】2_LED

1、電路圖 74HC573是八位鎖存器,當控制端LE腳為高電平時,芯片“導通”,LE為低電平時芯片“截止”即將輸出狀態“鎖存”,led此時不會改變狀態,所以可通過led對應的八個引腳的電平來控制led的狀態,原理圖分析…

Diskgenius系統遷移之后無法使用USB啟動

前言 本文用于記錄系統遷移中遇到的問題及解決方法,如有不對請指出,謝謝! 現象 使用DiskGenius進行系統遷移后,使用USB啟動失敗,反復在品牌logo和黑屏之間切換,期間還會在左上角顯示”reset system“報錯…

使用 Postman 進行 API 測試:從入門到精通

使用 Postman 進行 API 測試:從入門到精通 使用 Postman 進行 API 測試:從入門到精通一、什么是 API 測試?二、Postman 簡介三、環境搭建四、API 測試流程1. 收集 API 文檔2. 發送基本請求示例:發送 GET 請求示例代碼(…

Android Studio:Application 和 Activity的區別

Application 和 Activity 是 Android 中非常重要的兩個組件,它們分別負責不同的生命周期管理和應用的不同層次的操作。 Application 是應用級別的生命周期管理,它在整個應用運行時只有一個實例,負責應用的全局初始化和資源管理。Activity 是…

Mac本地體驗LM studio

博主很懶,不愛打字! 1、LM studio官網:LM Studio - Discover, download, and run local LLMs 2、下載DMG文件,安裝 3、使用vscode工具,commandshiftH【全局替換功能】,選擇目錄/Applications/LM\ Studio…