# Zip-NeRF 論文解讀 (一) ## 前言 Zip-NeRF這篇論文是由Barron提出的最新作品,結合了之前的SOTA Mip-NeRF360 以及 Instant NGP的優點,達到在不影響quality的前提下,training speed相比於Mip360提升22倍。 在閱讀Zip-NeRF之前,推薦先理解Mip-NeRF360以及iNGP的概念。在此就先簡述一下兩者的概念: ### Mip-NeRF360 首先,mip360延續了mip-nerf的sampling method,將原本在ray上取點的sample方式改為用很多段frustum代表sampling的範圍。又因為不可能計算一段frustum中所有的點的positional encoding後的值,所以mip-nerf採用了一種approximate的方式去近似(假設每一個frustum的分佈是multi-variant gaussian distribution),通過簡單的算式得到一個frustum內的所有point的expectation of encoded frustum。(這個部分的詳細推導可以去看mip-nerf原文) ![](https://hackmd.io/_uploads/SkTZ6AYEn.png) 其次,mip360更新的另一個部分是將mip-nerf的coarse-to-fine model中的coarse model修改為proposal model。雖然coarse和fine model都使用了同一套weight(訓練效率增加),但是在coarse階段並不用預測object color,只需要輸出volumetric density(object在當前位置的機率)即可。因此,mip360提出proposal model取代原本的coarse model,進而只輸出volumetric density。 ![](https://hackmd.io/_uploads/S1wQaRYV3.png) ### Instant NGP ![](https://hackmd.io/_uploads/S1PV6AtEh.png) > L=2 代表有兩種頻率的feature,N1代表grid level=1時每條邊上有N1個grid Sample方式同樣是在ray上做找點做sampling,但是 encoding的方式改為grid-based hash encoding。所謂grid-based就是將整個空間劃分成很多個grid,每一個grid有八個頂點,每一個頂點上都對應一個hash code的值。假設現在一條ray射過某一個point,那麼這個點的feature value就會interpolated by other 8 grid vertexes with hash values. iNGP的貢獻主要就是training 速度大幅加快,而其中一個原因就是使用了hash encoding的方式instead of positional encoding。 那麼以上就是在zip-nerf當中會用到的關於mip360以及iNGP的觀念,詳細的部分仍然需要看原文才能了解。 ## Zip-NeRF Zip-NeRF的目的是為了結合iNGP以及mip360的優點,達到又快又好的訓練結果。然而,如果僅僅只是將mip360中positional encoding的方式換成iNGP的hash encoding則會出現兩種問題: 1. Spatial Aliasing 2. Z-aliasing ### Solution to Spatial Aliasing 首先想要解決aliasing有兩個方向,1)增加sample rate 2)降低圖片中的高頻分量(高頻分量失真特別有可能出現在遠處的物件,因為sample rate(resolution)不足導致aliasing)。 這兩個方向分別對應兩個方法: 1. multisampling 2. down-weighting #### Multisampling Zip-NeRF為了將iNGP融合進mip360,首先需要和mip-nerf一樣對整個frustum採樣,同樣因為沒有辦法將所有frustum內部的點的hash encoding積分,所以zip-nerf首先假設整個frustum是由很多isotropic gaussian組成的(這裡可以對照mip-nerf中的假設frustum是一個multivariate gaussian distribution,同樣都是為了方便計算frustum體積內的所有point encoding的積分)。 具體的sample方法是作者自創針對這種cone的方式 - - - - 只在frustum的spiral上進行採樣(Multisampling)。 ![](https://hackmd.io/_uploads/rkk96CtVn.png) > 從左下角的切面圖可以發現越靠近start point的部分,採樣越密集。 > ![](https://hackmd.io/_uploads/r16jT0tEh.png) > Point coordinates on the spiral 上圖中的公式代表在spiral上採樣的座標,t代表在ray上相對start pint的距離,n代表採樣的數量,m代表spiral的圈數,r·代表在當前位置上frustum垂直ray做切面的半徑。 ![](https://hackmd.io/_uploads/SkJ-0CFEh.png) 在實作時,將sample point 的座標值當作isotropic gaussian的mean,並且將rt當作標準差。 >至於為什麼可以只採樣在spiral上? 這裡就要提到作者在設計中的trick,他們在設計loss function的時候加入了一項weight decay - - - - 所有hash code的值的平方的平均趨近於0(見下圖公式),也就是說在同一個grid當中,整個體積內的point encoding的期望值為0。因此,只要是被frustum整個包裹住的grid的期望值就是0,而剩下有期望值的部分只需要計算被spiral切過的不完整的grid即可。 ![](https://hackmd.io/_uploads/B1rsRAKV2.png) > weight decay on hash code for each grid 最後在結束multisampling之前,想簡單說明一下我對isotropic gaussian的解讀。 >文中提到:The anisotropic subvolume is first converted into a set of points that approximate its shape, and then each point is assumed to be an isotropic Gaussian with some scale. This isotropic assumption lets us approximate the true integral of the feature grid over a sub-volume by leveraging the fact that the values in the grid are zero-mean. 針對這個部分的isotropic假設,作者是將每一個sample在spiral上的點當作是一個isotropic gaussian並且根據在ray上的遠近給予不同的標準差and mean value。至於這麼做的理由,我目前的想法是frustum內部其實是有很多isotropic gaussian的點組成的只不過那些點的encoding expectation值為0,所以沒有必要採樣。 #### Down-weighting 之前提到為了解決aliasing的問題可以從兩個方面下手,其中一個部分就是針對high frequency signal做pre-filter,也就是將高頻分量過濾(降低)。在zip-nerf中的具體作法是針對每一個sample point設計對應的weight,weight和feature相成得到最後的MLP input。 接下來讓我們觀察一下這個weight,n_l代表不同grid level下的grid個數(n_l越大代表的越高頻的採樣,每個grid size就越小) - 標準差越大 - - 在相同grid level下,越遠的sample down-weighting 程度就越大。 - n_l越大 - - 在相同距離下,越高頻的encoding結果 down-weighting 程度就越大。 ![](https://hackmd.io/_uploads/ryZbJy5Nh.png) 從結論上來看不難發現這個weight的目的就是讓越遠或者是越高頻的signal down-weight越多,以達到解決aliasing的效果。 ![](https://hackmd.io/_uploads/HJubkkcVh.png) > input calculated by multiplying weight and encoded feature 最後,將同一個frustum中所有的weighted feature取mean就可以得到在特定grid level下的encoded expectation。至於同一個grid level,不同frustum之間的feature要怎麼合併:我猜測應該是類似iNGP,將不同frustum再相同level 下的feature相加後,根據不同的grid level 做concatenate,最後再喂給MLP。 ![](https://hackmd.io/_uploads/HJtmJJ9E2.png) >trilerp代表trilinear interpolate # 結尾 文章內容實在太多qq,關於z-aliasing的部分留到下一篇再討論。