腦補(bǔ)出新視角,一個(gè)統(tǒng)一的NeRF代碼庫(kù)框架已開(kāi)源
假設(shè)一個(gè)物體你看了幾張照片后,能想象出其它角度看上去的感覺(jué)嗎?人是可以做到的,我們能自行推測(cè)出沒(méi)見(jiàn)過(guò)的部分,或者說(shuō)沒(méi)見(jiàn)過(guò)的角度是什么樣的。模型其實(shí)也有辦法做到,給定一些場(chǎng)景圖片,它也能腦補(bǔ)出一些未見(jiàn)過(guò)角度的圖像。
渲染新視角,近來(lái)最引人矚目的就是 ECCV 2020 最佳論文榮譽(yù)提名的 NeRF (Neural Radiance Field)了,它不需要以前復(fù)雜的三維重建過(guò)程,只需要幾張照片及 拍攝該照片時(shí)相機(jī)的位置,就能合成新視角下的圖像。NeRF 驚艷的效果吸引了很多視覺(jué)方面的研究者,后續(xù)做出了一系列優(yōu)秀的工作。
但困難的地方在于,這樣的模型構(gòu)建起來(lái)比較復(fù)雜,目前也沒(méi)有一個(gè)統(tǒng)一的代碼庫(kù)框架來(lái)實(shí)現(xiàn)它們,這無(wú)疑會(huì)阻礙該領(lǐng)域的進(jìn)一步探索與發(fā)展。為此,OpenXRLab 渲染生成平臺(tái)構(gòu)建出高度模塊化的算法庫(kù) XRNeRF,幫助快速實(shí)現(xiàn) NeRF 類模型的構(gòu)建、訓(xùn)練與推理。
開(kāi)源地址:https://github.com/openxrlab/xrnerf
什么是 NeRF 類模型
NeRF 類任務(wù),一般指的是在已知視角下捕獲場(chǎng)景信息, 包括拍攝到的圖像,以及每張圖像對(duì)應(yīng)的內(nèi)參外參,從而合成新視角下的圖像。借助 NeRF 論文中的圖,我們能很清晰地理解這種任務(wù)。
選自 arxiv: 2003.08934。
NeRF 在收集圖像時(shí)會(huì)同時(shí)收集 5 維場(chǎng)景信息,即一張圖像對(duì)應(yīng)一個(gè)三維坐標(biāo)值及另外兩個(gè)光線輻射角度。這樣的場(chǎng)景會(huì)通過(guò)多層感知機(jī)建模為 Radiance Field,也就是說(shuō)該多層感知機(jī)將輸入三維坐標(biāo)點(diǎn)并映射為該點(diǎn)的 Density 和 RGB 顏色,從而利用體素渲染(Volume Rendering)將 Radiance Field 渲染為照片級(jí)的虛擬視角。
如上圖所示,通過(guò)一些圖片構(gòu)建 Radiance Field 后,就能生成新視角下架子鼓的圖像。因?yàn)?NeRF 并不需要顯式地進(jìn)行三維重建就能得到想要的新視角,所以它提供了一種基于深度學(xué)習(xí)的三維隱式表征范式,僅使用 2D 的 posed images 數(shù)據(jù)就能訓(xùn)練出包含 3D 場(chǎng)景信息的深度神經(jīng)網(wǎng)絡(luò)。
自 NeRF 之后,類 NeRF 的模型就層出不窮:Mip-NeRF 利用椎體而不是射線從而優(yōu)化精細(xì)結(jié)構(gòu)的生成效果;KiloNeRF 采用數(shù)以千計(jì)的微型多層感知機(jī)而不是單個(gè)大型多層感知機(jī),降低計(jì)算量,實(shí)現(xiàn)實(shí)時(shí)渲染能力;此外 AniNeRF 和 Neural Body 等模型從簡(jiǎn)短視頻幀中學(xué)習(xí)人體視角變換,得到很好的視角合成和驅(qū)動(dòng)效果;此外,GN’R 模型利用稀疏視角圖片與幾何先驗(yàn),實(shí)現(xiàn)不同 ID 間可泛化的人體渲染。
GN’R 提出的可泛化人體隱式場(chǎng)表征,實(shí)現(xiàn)的單模型人體渲染效果
為 NeRF 裝上輪子
盡管當(dāng)前 NeRF 類算法在研究領(lǐng)域具有非常高的熱度,但是畢竟屬于比較新的方法,所以模型實(shí)現(xiàn)上肯定是要麻煩一些的。如果是用 PyTorch 或 TensorFlow 這樣常規(guī)的框架,那就首先得找個(gè)相近的 NeRF 模型,再在其基礎(chǔ)上修改。
這樣做會(huì)帶來(lái)幾個(gè)明顯的問(wèn)題,首先即我們得完全讀懂一份實(shí)現(xiàn),才能在其基礎(chǔ)上改成我們想要的樣子,這一部分其實(shí)工作量還是不小的;其次因?yàn)椴煌撐牡墓俜綄?shí)現(xiàn)并不統(tǒng)一,對(duì)比不同 NeRF 類模型源碼時(shí)就會(huì)消耗比較大的精力,畢竟誰(shuí)也不知道某篇論文的訓(xùn)練過(guò)程中是不是有一些新穎的 Trick;最后如果沒(méi)有一套統(tǒng)一的代碼,驗(yàn)證新模型的新想法無(wú)疑會(huì)慢很多。
為了解決眾多問(wèn)題,OpenXRLab 為 NeRF 類模型構(gòu)造出一種統(tǒng)一的、高度模塊化的代碼庫(kù)框架 XRNeRF。
XRNeRF 實(shí)現(xiàn)了眾多 NeRF 模型,上手更為容易,可輕松復(fù)現(xiàn)相應(yīng)論文的實(shí)驗(yàn)結(jié)果。XRNeRF 將這些模型分成 datasets、mlp、network、embedder 和 render 這 5 個(gè)模塊。XRNeRF 的易用性在于,只需要通過(guò) config 機(jī)制即能組裝不同模塊而構(gòu)成完整模型,極其簡(jiǎn)單易用,同時(shí)也極大地增加了復(fù)用性。
在保證易用性的基礎(chǔ)上,同時(shí)還需要靈活性,XRNeRF 通過(guò)另一套注冊(cè)器機(jī)制,能定制化不同模塊的具體特性或?qū)崿F(xiàn),從而使 XRNeRF 解耦性更強(qiáng),代碼也更易于理解。
此外,XRNeRF 所有實(shí)現(xiàn)的算法都是采用 Pipeline 的模式,數(shù)據(jù)上的 Pipeline 讀取原始數(shù)據(jù),經(jīng)過(guò)一系列處理后獲得模型的輸入,模型的 Pipeline 則對(duì)輸入的數(shù)據(jù)進(jìn)行處理,獲得對(duì)應(yīng)的輸出。這樣的 Pipeline 將 config 機(jī)制與注冊(cè)機(jī)機(jī)制串起來(lái),組成了一個(gè)完整的架構(gòu)。
XRNeRF 實(shí)現(xiàn)了眾多核心 NeRF 模型,并通過(guò)如上三大機(jī)制將它們都串起來(lái),構(gòu)建出既易用又靈活的高度模塊化代碼框架。
XRNeRF 的核心特性
XRNeRF 是基于 Pytorch 框架的 NeRF 類 算法庫(kù),目前已經(jīng)復(fù)現(xiàn)了 scene 和 body 兩個(gè)方向的 8 篇經(jīng)典論文。相比直接建模,XRNeRF 在搭模型效率、成本和靈活性上都有顯著提升,而且有完善的使用文檔、示例和 Issue 反饋機(jī)制,概括來(lái)說(shuō),XRNeRF 的核心特性大概有以下 5 點(diǎn)。
1. 實(shí)現(xiàn)了眾多主流和核心的算法?
例如開(kāi)山之作 NeRF,CVPR 2021 Best Paper Candidate (NeuralBody)、ICCV 2021 Best Paper Honorable Mention (Mip-NeRF) 和 Siggraph 2022 Best Paper (Instant NGP)。
在實(shí)現(xiàn)了這些模型的基礎(chǔ)上,XRNeRF 還能保證復(fù)現(xiàn)效果和論文中的基本一致。如下圖所示,從客觀的 PSNR 和 SSIM 指標(biāo)來(lái)看,其能很好地復(fù)現(xiàn)原版代碼的效果。
2. 模塊化設(shè)計(jì)
XRNeRF 將整個(gè)代碼框架進(jìn)行了模塊化設(shè)計(jì),最大程度地提升了代碼的可復(fù)用性,便于研究者對(duì)現(xiàn)有代碼進(jìn)行閱讀和修改。通過(guò)分析現(xiàn)有的 NeRF 類模型方法,XRNeRF 設(shè)計(jì)的具體模塊流程如下圖所示:
模塊化的優(yōu)勢(shì)在于,假設(shè)我們需要修改數(shù)據(jù)格式,那只需要修改 Dataset 模塊下的邏輯,假設(shè)我們需要修改渲染圖像的邏輯,那就只需要修改 Render model 模塊。
3. 標(biāo)準(zhǔn)數(shù)據(jù)處理管線?
針對(duì) NeRF 類算法數(shù)據(jù)預(yù)處理較為復(fù)雜和多樣的問(wèn)題,XRNeRF 提供了一套標(biāo)準(zhǔn)數(shù)據(jù)處理流程。其由多個(gè)數(shù)據(jù)處理操作串行得到,僅需要修改 config 配置文件中的 data pipeline 部分,即可完成數(shù)據(jù)處理流暢搭建。
NeRF 配置數(shù)據(jù)流程部分。
XRNeRF 中已經(jīng)實(shí)現(xiàn)了多個(gè)數(shù)據(jù)集所需要的數(shù)據(jù)處理 op,只需要將這些 op 在 config 中按照順序定義好,即可完成數(shù)據(jù)處理流程的搭建。如果后續(xù)有新的 op 需要加入,也只需要在對(duì)應(yīng)文件夾中完成新 op 的實(shí)現(xiàn),即可一行代碼加入到整個(gè)數(shù)據(jù)處理流程當(dāng)中。
4. 模塊化網(wǎng)絡(luò)構(gòu)建方式?
XRNeRF 中的模型主要由 embedder、MLP 和 render model 組成,并通過(guò) network 連接,這幾者之間可以互相解耦,由此可以實(shí)現(xiàn)不同算法之間不同模塊的替換。
其中 embedder 輸入點(diǎn)的位置和視角,輸出 embedded 特征數(shù)據(jù);MLP 使用 embedder 的輸出作為輸入,輸出采樣點(diǎn)的 Density 和 RGB 顏色;render model 則輸入 MLP 的輸出結(jié)果,沿著射線上的點(diǎn)進(jìn)行積分等操作,從而獲得圖像上一個(gè)像素點(diǎn)的 RGB 值。這三大模塊再通過(guò)標(biāo)準(zhǔn)的 network 模塊連接就構(gòu)成了完整的模型。
自定義 network 模塊的代碼結(jié)構(gòu)。
5. 良好的復(fù)現(xiàn)效果?
支持最快 60 秒訓(xùn)練網(wǎng)絡(luò),30 幀每秒實(shí)時(shí)渲染,支持高清晰度、抗鋸齒、多尺度場(chǎng)景及人體圖像渲染。無(wú)論是從客觀的 PSNR 和 SSIM 指標(biāo)還是主觀的 demo 展示效果來(lái)看,XRNeRF 都能很好地復(fù)現(xiàn)原版代碼的效果。
XRNeRF 的使用
XRNeRF 框架看起來(lái)有非常好的特性,其使用起來(lái)也很簡(jiǎn)單便捷。比如說(shuō)安裝過(guò)程,XRNeRF 依賴的開(kāi)發(fā)環(huán)境還是比較多的,PyTorch、CUDA 環(huán)境、視覺(jué)方面的處理庫(kù)等等。但是 XRNeRF 提供了 Docker 環(huán)境,通過(guò) DockerFile 能直接構(gòu)建鏡像文件。
我們?cè)嚵艘幌?,相比一步步配置各種運(yùn)行環(huán)境與包,只需 docker build 一行命令的配置方式顯然要方便太多了。此外構(gòu)建 Docker 鏡像時(shí),DockerFile 里面配置了國(guó)內(nèi)鏡像地址,所以速度還是很快的,基本不用擔(dān)心網(wǎng)絡(luò)問(wèn)題。
在構(gòu)建完鏡像,并從該鏡像啟動(dòng)容器后,我們就能將項(xiàng)目代碼,以及數(shù)據(jù)都通過(guò) docker cp 命令傳到容器內(nèi)。不過(guò)也可以直接在創(chuàng)建容器時(shí)通過(guò) -v 參數(shù)直接將項(xiàng)目地址映射到容器內(nèi)部。不過(guò)這里需要注意的是,數(shù)據(jù)集是需要放到確定位置的(否則需要改 config 文件),例如 XRNeRF 項(xiàng)目下的 data 文件夾。
一般而言,下載完數(shù)據(jù)后,大概文件夾結(jié)構(gòu)如下圖所示:
現(xiàn)在,環(huán)境、數(shù)據(jù)與代碼三者都準(zhǔn)備好了,只需簡(jiǎn)短的一行代碼,就能執(zhí)行 NeFR 模型的訓(xùn)練與驗(yàn)證:
其中 dataname 表示數(shù)據(jù)目錄下的具體數(shù)據(jù)集,config 表示模型的具體配置文件。因?yàn)?XRNeRF 采用的是高度模塊化的設(shè)計(jì),其 config 使用字典來(lái)構(gòu)建,雖然乍一看可能會(huì)覺(jué)得有一點(diǎn)點(diǎn)繁瑣,但實(shí)際理解了 XRNeRF 的設(shè)計(jì)結(jié)構(gòu)之后,閱讀起來(lái)就非常簡(jiǎn)單了。
主觀看上去,config 配置文件(nerf_blender_base01.py)包含了訓(xùn)練模型所有必要的信息,優(yōu)化器、分布式策略、模型架構(gòu)、數(shù)據(jù)預(yù)處理與迭代等等,甚至很多圖像處理相關(guān)的配置也都包含在內(nèi)??偨Y(jié)來(lái)說(shuō),除了具體的代碼實(shí)現(xiàn),config 配置文件描述了整個(gè)訓(xùn)練、推理過(guò)程。
描述模型結(jié)構(gòu)部分的 Config 配置。
總的體驗(yàn)起來(lái),XRNeRF 從基礎(chǔ)的運(yùn)行環(huán)境搭建到最終執(zhí)行訓(xùn)練任務(wù)都是比較流暢的。況且通過(guò)配置 config 文件,或者實(shí)現(xiàn)具體的 OP,同樣也能獲得非常高的建模靈活性。相比直接使用深度學(xué)習(xí)框架建模,XRNeRF 無(wú)疑將減少大量的開(kāi)發(fā)工作,研究者或者算法工程師也能花更多時(shí)間在模型或任務(wù)創(chuàng)新上。
NeRF 類模型目前仍然是計(jì)算機(jī)視覺(jué)領(lǐng)域的研究重點(diǎn),XRNeRF 這樣統(tǒng)一的代碼庫(kù),就像 HuggingFace 的 Transformer 庫(kù)一樣能聚集越來(lái)越多的優(yōu)秀研究工作,聚集越來(lái)越多的新代碼與新想法。反過(guò)來(lái) XRNeRF 同樣也將極大地加快研究者對(duì) NeRF 類模型探索的腳步,便于將這一新領(lǐng)域應(yīng)用到新場(chǎng)景與新任務(wù)中,NeRF 的潛力也將由此加速展開(kāi)。