Mip-NeRF演算法思想。
Paper explanation Mip-NeRF360 and BlockNeRF
一、NeRF 的缺點
所有采樣點都是:光心+畫素中心的射線確定的,如果給定的影像解析度比較低,那麼每個畫素會很大,中心點是不足以代表整個畫素的顏色的;這會導致 NeRF 鋸齒化太嚴重的問題(邊緣不是直接從白到黑,而是慢慢漸變)。anti-aliasing
二、Mip-NeRF 的主要創新點
正方形寫程式碼不好寫,所以把畫素作為一個圓形。那麼就從取樣點變成了介於兩個取樣圓形之間的錐臺(frustums);為了加速計算,內部使用高斯分佈進行模擬,作為 \(c_i\) 和 \(\sigma_i\) 的值。
除了錐臺這個方法外,還有種 sample per pixel 方法,也就是一個畫素取很多的點進行 ray tracing 取樣。效果肯定好,但是計算量翻倍太高,而錐臺這個方法平衡了效果和計算量。
一個錐臺中,所有 3D 點的 positional encoding 的結果,求期望後,作為 MLP 函式的輸入。而且這個結果是和物理上的簡諧運動相關。
當施加外力後,最後的結果有個衰減項:\(e^{-x}\)。
只在一個尺度下訓練,可以同時在最大、最小尺度都取得很好的效果。
三、Mip-NeRF360
Mip-NeRF360
沒法把 Mip-NeRF 的取樣方式直接套用在 360° 上:Mip-NeRF 中物體距離相機的距離是大致一樣,所以可以控制取樣點的範圍,但是 360° 引入了很遠的背景,但我們不知道背景的距離,並且也不能把 bound 設為一個很大的值。
創新一:
把超出一定範圍的高斯分佈(橢圓形表示)進行壓縮,保證它們在指定半徑內部,雖然形狀不同,但仍保有原來的資訊,不會影響最後的渲染。
創新二:取樣點的取法不同:
原來的 NeRF 進行了兩段式取樣,並且 MLP 是 8 層,同時得到顏色和密度;而 Mip-NeRF 使用改良的 4 層 MLP 只得到 \(\sigma\) 的分佈,加快這個過程。
創新三:讓 \(\sigma\) 分佈趨近於 uni-model(只有一個高點)這樣的分佈。
四、Block NeRF
範圍太大了,沒法用同一個 DNN 進行訓練,人為切分成多個 Block,以某個點為圓心的圓。
重疊區域,引入了 visualbility 圖,確定該相信哪張影像。
白天-黑夜的訓練:引入 NeRF in the wild 的思路,引入了 appearence embeding 向量,控制輸出白天 or 黑夜的結果。
位置太大,導致 colmap 估計的位姿不準,導致銜接處有割裂感。除了訓練顏色和密度外,還會訓練位姿,使其更準確。
這個演算法沒有提供 Depth 圖,可能並不能證明真正學習到了深度,只是單純的重現了圖片。