【照片動動動起來】Google 跟柏克萊用 Python 寫出全新讓靜態圖 2D 轉 3D 的無痛方式!

【為什麼我們要挑選這篇文章】現在的 Facebook 貼文偶爾會看到那種非常有立體感的圖案吧?那是利用雙鏡頭的景深效果製造而成的,角度有限。這次柏克萊大學跟 Google 合作,只要輸入幾張靜態照片,就能直接變成多視角的 3D 影像,是不是很神奇?(責任編輯:鍾佳瑀)

本文經 AI 新媒體量子位(公眾號 ID:QbitAI)授權轉載,轉載請聯繫出處

作者:量子位

看到這張恐龍化石的動態圖片,你肯定會認為是用影片截出來的吧?

然而真相卻是——完全由靜態圖片生成!

沒錯,而且還是 不用 3D 建模 的那種。

這就是來自柏克萊大學和 Google 的最新研究: NeRF,只需要輸入 少量靜態圖片 ,就能做到多視角的 逼真 3D 效果

還需要專門說明的是,這項研究的程式碼和數據,也都已經開源。你有想法,盡情一試。

靜態圖片,合成逼真 3D 效果

我們先來看下 NeRF,在合成數據集(synthetic dataset)上的效果。

可以看到,這些生成的對象,無論旋轉到哪個角度,光照、陰影甚至物體表面上的細節,都十分逼真。就彷彿是拿了一台錄影設備,繞著物體一周錄了視頻一樣。

正所謂沒有對比就沒有傷害,下面便是 NeRF 分別與 SRN、LLFF 和 Neural Volumes 三個方法的效果比較。

不難看出,作為對比的三種方法,或多或少的在不同角度出現了模糊的情況。

而 NeRF 可謂是做到了 360 度 無死角高清 效果。

接下來是 NeRF 的 視點相關 (View-Dependent)結果。

通過固定攝像機的視點,改變被查詢的觀看方向,將視點相關的外觀編碼在 NeRF 表示中可視化。

NeRF 還能夠在複雜的遮擋下,展現場景中詳細的幾何體。

還可以在現實場景中,插入虛擬對象,並且無論是「近大遠小」,還是遮擋效果,都比較逼真。

當然,360 度捕捉真實場景也不在話下。

神經輻射場(neural radiance field)方法

這樣出色的效果,是如何實現的呢?

首先,是將場景的體積表示優化為向量函數,該函數由位置和視圖方向組成的連續  5D 坐標定義。具體而言,是沿相機射線採樣 5D 坐標,來合成圖像。

而後,將這樣的場景表示參數化為一個完全連接深度網路(MLP),該網路將通過 5D 坐標信息,輸出對應的顏色和體積密度值。

通過體積渲染技術將這些值合成為 RGB 圖像。

渲染函數是可微分的,所以可以通過最小化合成圖像和真實圖像之間的殘差,優化場景表示。

需要進一步說明的是,MLP 使用 8 個完全連接層(ReLU 激活,每層 256 個通道)處理輸入,輸出 σ 和 256 維特徵向量。然後,將此特徵向量與攝像機視角連接起來,傳遞到 4 個附加的全連接層(ReLU 激活,每層 128 個通道),以輸出視點相關的 RGB 顏色

NeRF 輸出的 RGB 顏色也是空間位置 x 和視圖方向的 5D 函數。

這樣做的好處可以通過對比來體現。可以看到,如果去掉視點相關,模型將無法重現鏡面反射;如果去掉位置編碼,就會極大降低模型對高頻幾何形狀紋理的表現能力,導致渲染出的外觀過於平滑。

另外,針對高分辨率的複雜場景,研究人員還進行了兩方面的改進。

其一,是 輸入坐標的位置編碼 ,可以幫助 MLP 表示高頻函數。

其二,是 分層採樣 。用以更高效地採樣高頻表示。

GitHub 程式碼開源

目前,NeRF 項目的程式碼已經在 GitHub 上開源。

程式碼主要基於 Python 3,還需要準備的一些庫和框架包括:TensorFlow 1.15、matplotlib、numpy、imageio、configargparse。

優化一個 NeRF

研究人員表示,優化 NeRF 只需要一個 GPU 就可以完成,時間方面,需要花費幾個小時到一兩天(取決於分辨率)。

而從優化的 NeRF 渲染圖像,大約只需要 1~30 秒時間。

運行如下程式碼可以獲取生成 Lego 數據集和 LLFF Fern 數據集:

bash download_example_data.sh

若想優化一個低解析度的 Fern NeRF:

python run_nerf.py —config config_fern.txt

在經過 200 次迭代之後,就可以得到如下效果:

若想優化一個低解析度的 Lego NeRF:

python run_nerf.py —config config_lego.txt

在經過 200 次迭代之後,就可以得到如下效果:

開始渲染

運行如下程式碼,為 Fern 數據集獲取經過預訓練的高分辨率 NeRF。

bash download_example_weights.sh

渲染程式碼,在 render_demo.ipynb 中。

另外,你還可以將 NeRF 轉換為網格,像這樣:

具體示例,可以在 extract_mesh.ipynb 中找到。還需要準備 PyMCubes、trimesh 和 pyrender 包。

關於作者:三位青年才俊

這篇論文的研究團隊,來自加州大學柏克萊分校、Google 研究院和加州大學聖地亞哥分校。

共同一作有三位。

Ben Mildenhall,本科畢業於斯坦福大學,目前在柏克萊電氣工程與計算機科學系(EECS)助理教授吳義仁(Ren Ng)門下讀博。致力於計算機視覺和圖形學研究。

Pratul P. Srinivasan,同樣為柏克萊 EECS 在讀博士,師從吳義仁和 Ravi Ramamoorthi。

Matthew Tancik,前面兩位作者的同門,本碩畢業於 MIT。除了專注於計算機成像和計算機視覺研究外,他還是一位攝影愛好者。

1 個 GPU 就能完成優化,優化後渲染又只需要 1-30 秒,如此方便又效率的項目,還不快來試試?

One More Thing

最後,還想介紹個這方面有意思的研究。NeRF 確實強,但在輸入上還需要多張照片……

那麼有沒有方法, 一張圖片 就能玩 3D 效果呢?問就有。

之前,Adobe 的實習生就提出了一個智能景深算法,單張 2D 圖片秒變 3D。讓我們感受下效果。

也是很有大片既視感了。

而最近,同樣是單張 2D 圖片變 3D,台灣清華大學的研究人員,在 老照片 上玩出了新花樣,論文入選 CVPR 2020。

你看看女神奧黛麗·赫本,看看畢加索,看看馬克吐溫:

感覺以後看照片——搖一搖更有感覺啊。再來看看「登月」、「宇航員和民眾握手」照片裸眼 3D 效果:

頗有點身臨其境之感。

與此前介紹過的 Adobe 的算法(後台加鏈接)類似,這一 3D 圖像分層深度修復技術的核心算法,同樣有關上下文感知修復:

初始化並切割分層深度圖像(LDI),使其形成前景輪廓和背景輪廓,然後,僅針對邊緣的背景像素進行修補。從邊緣「已知」側提取局部上下文區域,並在「未知」側生成合成區域(如下圖 c 所示)。

說起來,對於個人視頻製作者、遊戲開發人員,以及缺乏 3D 建模經驗的動畫公司來說,這類技術的成熟,可謂「福音」。

通過 AI 技術,讓 3D 效果的實現進一步簡化,這也是 Facebook、Adobe 及微軟等公司紛紛投入這方面研究的原因所在。

最後,這個項目的程式碼也開源了……

稿子還沒寫完,我就準備好一系列「雪藏」已久的照片要試試了。

這也是最近看到最酷的 3D 圖片方面的突破了。

資源傳送門 論文主頁GitHub

(本文經 AI 新媒體 量子位 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈2D 变 3D,视角随意换,神还原高清立体感,还是不用 3D 建模的那种 | 代码数据开源  〉,首圖來源: 截自量子位  。)

你可能感興趣

◊ 【內附資源】Adobe 工程師開發只用「一張圖」就能訓練 GAN 的機器學習技術
◊ 【內附教學】唐鳳愛用的「番茄鐘工作法」,教你用 Python 幾分鐘製作!
◊  微軟工程師推出 Python 零基礎課程,用 10 分鐘的短片讓你輕鬆上手!


鴻海、BenQ 如何做好企業數位轉型? 報名 11/5 (四) AWS 企業高峰論壇,匯聚各產業轉型領先者,掌握產業、技術實戰經驗!

點關鍵字看更多相關文章: