【論文導讀】毫秒級時間使影象清晰16倍,Facebook提出的DLSS演算法介紹
論文標題:
Neural Supersampling for Real-time Rendering
發表在:SIGGRAPH 2020
本文介紹 facebook 提出的 DLSS(深度學習超取樣)演算法,使渲染器在低解析度渲染,然後使用該演算法輸出高解析度影象。
文章的賣點是 4x4 的誇張的超取樣率,極大地優化了速度,而且質量也十分優秀。
演算法的一大特點是,為了處理 TAA 常見的鬼影問題,使用神經網路為過去幀賦予一個權重,透過該權重消除鬼影等 motion vector 常見問題。
演算法流程
整體流程,分為【特徵提取 - 放大 - motion vector 對齊 - 預測過去幀權重 - 重建】這五個步驟。
演算法流程:特徵提取網路
包含三層的 CNN,每一幀單獨處理,過去幀 share weight。
對於每一幀,用 color 和 depth 作為輸入,得到 8-channel 的網路輸出,與輸入 concat 作為最終的輸出 feature。所以網路輸出一共 12-channel 。
此處沒有 upsampling,也就是說還在低解析度。
演算法流程:時序重對映
此處只針對過去幀。這裡一共兩步:
對於過去幀的低解析度 feature ,使用零上取樣,對映到高解析度。所謂零上取樣,即對應位置放原畫素,其餘置零。
對於 motion vector,使用雙線性插值上取樣,對映到高解析度。
使用高解析度的 motion vector 對高解析度的 feature 進行 warp,使其對齊。
這裡的特別之處是:
為什麼要零上取樣?因為這樣網路可以知道哪些是非法值。
之前的方法都是先在低解析度 warp ,再放大到高解析度,該演算法為何要先放大再 warp?因為作者認為,
與其在低解析度重對映丟精度,不如在先把 motion vector 放到高解析度再重對映
。因為 motion vector 在大部分位置都是平滑的,所以雙線性插值不會帶來很大誤差。雖然會在邊界處帶來誤差,但作者認為相比帶來的優勢來說這不重要。這也是本文的 feature 之一。
一些中間值。能看出來經過零上取樣和 warp 之後會有明顯的摩爾紋,之後利用了神經網路去修復,讓它還原了
演算法流程:特徵重加權網路
該步驟是為了消除鬼影等問題,即對每一個過去幀計算一個權重再帶權累加。
網路結構還是三層的 CNN。
輸入:將所有的過去幀 warp feature 與當前幀的 RGB-depth feature 打包作為輸入。
輸出:網路需要預測權重,為每一個
過去幀
的逐畫素的權重(每個 pixel 是 0 到 10 的 value,這個 10 是超引數)。將預測的權重乘以每個對應的過去幀的 input feature(4-channel),作為最終的輸出。
演算法流程:重建網路
目前已有過去幀的對齊版本以及對應權重,我們想把它作為指導與當前幀一起重建出最終輸出。
所以這裡就是把當前幀的 feature 和重加權的過去幀的 feature 給 concat 起來,餵給網路,輸出當前幀的高解析度版本。網路使用的是普通的 U-Net。
作者這裡用了一個的 trick:轉換色彩空間。即重建時當前幀處於 YCbCr 空間內,Loss function 在轉換成 RGB 之前計算。該操作能最佳化 0。1 的 PSNR。
Loss
採用 pretrain 的 VGG-16 與 DSSIM 的加權和作為 loss。
實驗
對於時間,重建部分用 10 層 U-Net 確實比較慢,作者砍去了 50% 的 U-Net 引數,但是收效甚微,質量略有下降。這個實驗是在 Nvidia Titan V 上跑的 4x4 超取樣的 1080p,需要跑 20ms 左右。
文章還指出,得到一個 1600x900 的結果,需要先渲染 400x225 的影象然後 4x4 超取樣。直接渲染的時間是 140ms,渲染低解析度再超取樣的時間是 26。4+17。6=44ms ,最佳化至三倍效能。
對於質量,看起來十分不錯。作者比較了一些 SOTA 的超分辨工作,還有 Unreal 裡的 TAAU。
對於 motion vector 是先 warp 再放大還是先放大再 warp,還有對 feature 做零上取樣還是雙線性插值上取樣,作者做了實驗。