NeRF开篇
NeRF、NeRF SLAM、Active SLAM系列
本人最近粗略看了一些基于NeRF的工作,原本學習的是SLAM方向,發現有一些NeRF和SLAM結合的工作,并且由于NeRF的地圖效果實在給人較好的可視感受,故想要研究一番,并且上研后組內的方向有想向Active SLAM方面做,故也有所涉及。
* 以下觀點都是我個人的見解,不正確指出望能批評指正,也是一個獲得反饋學習的過程
NeRF、SLAM簡述
首先在分析主流工作之前先簡述一下NeRF、SLAM的概念。
SLAM
?SLAM(Simultaneous Localization And Mapping,同時定位與地圖構建),正如字面意思,能夠同時完成自身定位和地圖構建,這里我們主語可以選用機器人,就是一個機器人如何在未知的環境中通過傳感器的輸入完成定位、建圖,并且兩者是相輔相成的,精確的定位能夠保證地圖的優良性,而反之地圖的完美又能夠使得傳感器數據的匹配更加準確從而獲得更加精確的定位。
?在我剛上本科的時候好像還是一個比較小眾的方向,但是最近幾年乘著自動駕駛的快車已經飛速開卷了,但實際上大家還是在卷精度,真正落地的應用,可能還是掃地機器人、餐廳送餐等,總體來說在實現真正的自動駕駛、取代外賣物流等工作還有很長一段路要走,倒是礦廠自動駕駛挖掘機落地還比較快(主要是日常生活環境太復雜了,主要是人)。
NeRF
NeRF(Neural Radiance Field,神經輻射場)是一種以基于光場理論的環境隱式表達。
因為NeRF的輸出不是常規SLAM中的地圖,二維的Cartographer生成的是二維柵格地圖、ALOAM等激光SLAM生成的是點云地圖、ORB-SLAM2生成稀疏點云、Droid SLAM稠密點云(基于學習的端到端,吊打ORBSLAM3,這就是4張3090的魅力嗎,但是建的圖也驚艷到我了)[藍色直接跳轉Github]
好的,撤回來說NeRF,NeRF的輸入是相機的世界坐標 x,y,zx,y,zx,y,z,朝向 θ\thetaθ、?\phi?,共5D輸入,然后輸出是該個相機位姿下的圖像,怎么樣是不是很抽象?所以并沒有所謂的幾何空間點的表達,一切都隱式地在神經網絡里面了。
輻射場這里指的是光輻射,之前所過NeRF是基于光場利用的,當光線和空間中的粒子接觸的時候總會有一部分被吸收、一部分被反射、一部分是物體自己發出的輻射(這里我可能不對光和輻射進行嚴格區別),其中概念也和計算機圖形學中輻射場立體渲染有關,而NeRF則是一種簡化的表達,將空間中的任意一個點都給定一個密度值density 記 σ\sigmaσ,它也有自己的顏色color 記 c=(r,g,b)c=(r,g,b)c=(r,g,b)。
然后依照相機模型,我們可以直觀理解一下相機成像,是光線照射到相機成像CMOS/CCD(感光元器件),然后在生成像素。因此正是知道了相機的位置和朝向,從而通過針孔相機模型其實知道每個像素對應于空間中的一條射線的位置,這樣就可以通過將射線上的點密度值density
、顏色值color ,進行積分(離散就是累加)得到像素的值,從而生成一張完整的圖像,而通過對密度值density進行積分(求和)就可以得到深度圖了。
不搞個視頻我怕你們不學了
NeRF的基礎學習
接下來是我在從零了解NeRF過程中收集的一些學習資料,希望能夠給大家帶來一些幫助,我也剛開始了解這個方向幾個星期,希望不要誤人子弟,哈哈哈
原生NeRF
NeRF的誕生就是ECCV 2020的一篇Paper吧。
- 新世界的大門:http://arxiv.org/abs/2003.08934
- Github:https://github.com/bmild/nerf
- Pytorch版本:https://github.com/yenchenlin/nerf-pytorch
教程資料
-
chi80講述NeRF原理,視頻分辨率很低但是講的還ok
-
完整材料
-
知乎上的講的還不錯
-
NeRF參數講解
-
體渲染
代碼實踐
Tutorial for NeRF
地址:Medium(不登錄反而能看)
個人記錄針對上面教程的記錄:
?marching cubes是一個生成3D mesh的算法,從NeRF網絡恢復3D模型所用的方法
?3D數據的表達形式:從3D voxels到點云到SDF
?傳統三維構建的共同缺點:
???相機:耗時和需要大量數據
???雷達:昂貴
???人工建模
???對于高反射物體、“網狀”物體,如灌木叢和鏈狀柵欄,或透明物體,都不適合大規模掃描。
???影響模型精度:stair-stepping effects and driff
概念
?光場,其用不同方向觀測角度下的光線掃描三維空間中的每個點,分別有五個變量x=(x,y,z)x =(x,y,z)x=(x,y,z)、d=(θ,?)d=(\theta ,\phi)d=(θ,?)(分別是空間中點的三維坐標和光線的角度)
為什么只有兩個變量,因為在空間中一個點定下來之后,就是經緯度的問題了,不像是描述位姿。
?NeRF基于光場(light/radiance fields)。NeRF則是構建從光場的5D空間描述,到4D空間的映射(顏色,強度density),c=(R,G,B),σc=(R,G,B),\sigmac=(R,G,B),σ。density可以理解為光線在五維空間中被截斷的likehood,比如遮擋。
NeRF的標準范式:F:(x,d)→(c,σ)F:(x,d) \rightarrow (c,\sigma)F:(x,d)→(c,σ)
?在生成式場景重建課題(generalized scene reconstruction)中,給定相機位姿和圖像,還有許多SFM系列算法: COLMAP, Agisoft Metashape, Reality Capture, or Meshroom
NeRF的幾個過程
數據處理
?通過給定位姿和圖像,構建射線,通過對射線進行采樣生成數據點,采用Coarse-to-fine的方式,先均勻分段,然后對每個段進行隨機采樣,這樣就用 r=o+tdr = o + tdr=o+td 來表示每一個采樣點,就是 r=(x,y,z)r = (x,y,z)r=(x,y,z),其中方向 d=(θ,?)d=(\theta ,\phi)d=(θ,?) 就是每個相機坐標的原點和 vc=[0,0,?1]v_c=[0,0,-1]vc?=[0,0,?1] 經過 TwcT_{wc}Twc? 轉到世界坐標下,注意這里不需要加上 vov_ovo? ,因為只是代表一個朝向
Axes3D.quiver(X,Y,Z,U,V,W,/,length=1,…)
X,Y,Z是箭頭的起點坐標,U,V,V是箭頭的方向組成
注意OpenGL和COLMAP數據之間的坐標系問題
https://blog.csdn.net/OrdinaryMatthew/article/details/126670351
分層采樣:
?是對每個均分的bin區間通過均勻分布的形式進行采樣,這里好像還可以通過逆深度進行表示,主要是在射線中,near到far進行分段
模型構建
?通過采樣獲得初始數據后,就利用NeRF來構建5D到4D的映射,網絡架構如下:
注意這里的PositionEncoder不僅僅是60,還會包含原來的3各個維度,即L=10L=10L=10的時候(cos,sin),編碼后維度:3*20+3
○ PositionEncoding:
NeRF的優勢
?● 直接數據驅動
?● 場景的連續表達
?● 隱式考慮物體特性:specularity高光,roughness粗糙度
?● 隱式表達光感
A overview of NeRF
不同類型的NeRF工作
?A litany of papers have since sought to expand the functionality of the original with features such as few-shot and one-shot learning[2, 3], support for dynamic scenes[4, 5], generalizing the light field into feature fields[6], learning from uncalibrated image collections from the web[7], combining with LiDAR data[8], large-scale scene representation[9], learning without a neural network[10], and many more. For some great overviews of NeRF research, see this great overview from 2020 and another overview from 2021 both by Frank Dellaert.
?SLAM學術界的泰斗,Frank Dallaert(https://dellaert.github.io/),gtsam的作者,也開始轉行研究NeRF,可見NeRF的價值和對視覺SLAM的意義。Frank大佬寫了一系列NeRF相關文章的綜述。
?● https://link.zhihu.com/?target=https%3A//dellaert.github.io/NeRF/
?● https://link.zhihu.com/?target=https%3A//dellaert.github.io/NeRF21/
?● https://link.zhihu.com/?target=https%3A//dellaert.github.io/NeRF22/
*上面來源:基于神經輻射場的(NeRF-based) SLAM 綜述
第一次先分享這么多吧,后續還會單獨更新一個專欄,分別對NeRF的論文進行歸納整理
總結
- 上一篇: java的幂等性处理
- 下一篇: 小白也能读懂的 ZigBee 3.0 简