1. 程式人生 > >閱讀論文《Deep Bilateral Learning for Real-Time Image Enhancement》

閱讀論文《Deep Bilateral Learning for Real-Time Image Enhancement》

   這是2017 siggraph的一篇論文,寒假boss讓我看這篇論文我沒怎麼看懂。最近在公司實習,發現該論文的成果已經移到手機端上了,效果還非常不錯。這裡我重新溫習了一下這篇論文,發現有許多可以借鑑的地方,是一篇非常不錯的論文,這裡重新敘述一下,談談我的理解。
   首先說一下這篇文章的整體思路,這篇文章對於影象增強的方法是,將影象首先做下采樣,繼續卷積下采樣幾次然後分別學習其全域性特徵和區域性特徵,並且結合之後再將其轉換到雙邊網格之中。此外,對輸入影象做仿射變換得到引導圖,並將其用來引導前面的雙邊網格做空間和顏色深度上的插值,恢復到和原來影象一樣大小。最後將得到的這個feature對原影象做仿射變換,得到輸出影象。也就是說,整個過程就是再學習最後的那個變換矩陣。整體架構圖如下所示:



   在Introduction裡,論文提出了其三個策略,分別是:
1. 將大部分的預測在低分辨的雙邊網格下進行,每個畫素包括的x,y維和第三維可以表示顏色功能,可以用來在對3D雙邊網格做slicing操作的時候考慮到輸入的顏色。
2. 學習輸入到輸出的變換過程,而不是直接學習輸出,因此整個結構學習的是一個仿射變換。
3. 雖然大部分的操作是在低分辨下進行的,但是損失函式最終建立在原來的解析度上,從而使得低分辨下的操作去優化原分辨下的影象。

   這篇文章主要是在先前的基礎上進一步改進的,包括聯合雙邊上取樣(JBU),這裡是通過將雙邊濾波器作用在高分辨的引導圖去產生區域性平滑但是也保留邊緣的上取樣;雙邊引導上取樣(BGU)則是引入了在雙邊網格里進行區域性仿射變換,再通過引導圖進行上取樣。這篇論文實際上就是將BGU裡的仿射變換操作通過網路進行學習。

   進入正題,網路主要學習低解析度下的仿射變換。影象增強不僅與影象區域性特徵有關,和影象的整體特徵也有關例如直方圖、平均亮度和場景類別(其實這裡它就是想消除artifacts,不加global消除不了)。因此這裡低分辨流的部分分成了區域性特徵和全域性特徵兩個路徑,最後融合成一個特徵用來代表仿射變換。而對於高分辨流,這裡主要的任務是在儘可能減少計算量的前提下,保留更多所需的高頻部分和邊緣資訊,這裡引入了雙邊網格里的slicing節點,該節點在引導圖的基礎上,在低解析度網格的仿射係數中執行與資料相關的查詢,從而實現上取樣恢復到和原解析度一樣大的變換,最後作用在每個畫素上並輸出作用後的結果。

低分辨的特徵提取

1.Low-level 特徵

   這部分沒什麼好說的,就是對影象進行下采樣,通過一系列stride=2的卷積來實現(實際操作是先將影象resize成256x256再做這個特徵下采樣的),公式如下:



上式中,式中,I=1,…,nS為每個卷積層的索引,c,c′為為卷積層的channels的索引.w′為卷積核權重矩陣,bi為bias.啟用函式σ採用ReLU,卷積時採用zero-padding。
   從這裡可以看出,影象實際上是縮小了2nS倍,這個nS有兩個作用,1.其驅動學習低分辨輸入和最後網格里仿射係數的學習,nS越大,網格就越粗糙;2.其控制預測結果的複雜度,更深的網路層數可以獲得更復雜更抽象的特徵。這裡論文設定nS為4,卷積核大小是3x3。使用這個特徵提取可以增強模型的表現力,如下圖所示(和去除這部分使用a hard-coded splatting operation對比):



2.區域性特徵

   上部分特徵進行進一步處理,通過nL=2的卷積層進一步提取特徵,這裡設定stride=1,也就是這部分解析度不再改變,同時通道數也不發生改變。所以加上前面的Low-Lebel那裡用到的卷積的話,總共是nL+nS層卷積,如果需要提高最後網格係數的解析度,可以通過減少nS同時增加nL來實現,這樣總層數不變,網路的表現力也不會變化。如果沒有區域性特徵,預測出來的係數會失去空間的位置資訊。

3.全域性特徵

   全域性特徵也是對Low-Level的特徵進行進一步的發展,這裡讓G0:=SnS。它包括兩個stride=2的卷積層,再接著三個fc層,所以這裡的全域性特徵一共有nG=5層,當然這個fc層要求feature的大小是固定的,網路的輸入圖在提取特徵時已經Resize成256x256了,所以這裡不用考慮這個問題。
   全域性特徵具有的全域性資訊可以作為區域性特徵提取的先驗,如果沒有全域性特徵去描述影象資訊的高維表示,網路可能會做出錯誤的區域性特徵表示,從而出現如下圖的artifact:



4.融合和線性預測

   這裡使用一個逐點的放射變換去融合全域性特徵和區域性特徵,使用relu函式進行啟用,這裡其實就是仿射相加,如下式所示:



   這樣得到了一個16×16×64的特徵矩陣,將其輸入1×1的卷積層得到16×16大小,輸出通道是96的特徵:



   網路的引數圖如下所示:



將特徵作為雙邊網格

   上述得到的融合特徵可以作為第三維已經展開的雙邊網格:



   這裡d=8,也就是網格的深度,通過這個轉換,A可以看做是一個16x16x8的雙邊網格,每個格子有一個3x4的仿射顏色變換矩陣。這個轉換使得前面的特徵提取和操作都是在雙邊域中操作的,其對應於在x,y維上進行卷積,學習z和c維相互交融的特徵。因此前面提取特徵的操作也比使用3D卷積在雙邊網格中卷積更具有表現力,因為後者只能關聯z維。同時其也比一般的雙邊網格要有效,因為其只關注c維上離散化。總之,也就是通過利用2D卷積並將最後一層作為雙邊網格,可以用來決定2D轉換到3D的最優方式。

使用可訓練的slicing layer進行上取樣

   這一步是要將上一步的資訊轉換到輸入的高解析度空間,這步操作基於雙邊網格里的slicing操作,通過一個單通道的引導圖將A進行上取樣。利用引導圖g對A進行上取樣,是利用A的係數進行三次線性插值,位置由g決定:



   這裡的τ(.)=max(1|.|,0)表示線性插值,sxsy分別表示網格和全分辨原圖的高度和寬度比例,特別的,每個畫素都被分配了一個係數(這個係數應該是上面仿射變換的係數),其在網格里對應的深度由影象灰度值g(x,y)決定,也就是Ac[i,j,g[x,y]]。這部分有點難理解,個人理解是使用引導圖對網格進行插值,插值後每個畫素的深度是對應的引導影象素xd減去對應網格的深度(雖然這個深度是一個3x4的仿射變換,個人理解是對這個3x4矩陣的每個元素都做相同的操作,得到的也是一個3x4的大圖)。這裡的slicing使用OpenGL庫完成,通過這個操作使得輸出圖的邊緣遵循輸入圖的邊緣,達到保邊的效果,這個效應相對於反捲積來說更加明顯,如下圖所示。通過這個操作,可以將全分辨下複雜的操作轉換成許多簡單的區域性操作(也就是在每個網格對應影象的操作)。



實現全分辨的最終輸出

   後面的操作都是在全解析度下進行的了,對於輸入影象I,提取其特徵ϕ實現兩個作用:1,它們可以用來獲得引導圖g;2,可以用來給上述得到的全分辨區域性仿射模型做迴歸。

1.獲得引導圖的輔助網路

   這裡將引導圖的獲得通過下面的公式,也就是對原始影象三個通道操作後相加得到:



其中McT是一個3x3的顏色轉換矩陣,b和b’是偏置,以及ρc是一個分段線性的轉換模組,包括閾值tc,i和梯度ac,i,由16個relu啟用的單元相加得到:



   這裡的引數M,a,t,b,b’都是通過學習獲得的,值得一提是是ρ限定在[0,1]之間去避免學習到一個退化的引導圖。下面的兩個圖分別表示顏色轉換矩陣,以及使用學習得到的引導圖的效果:





2.獲得最終的輸出

   最後的輸出可以看做是對輸入特徵做仿射變換後的結果,如下式:



   這裡還對仿射變換時patch大小(這裡個人理解是每個網格對應的畫素範圍)的尺寸做了討論,尺寸較小時,效果也越好,但是速度較慢;尺寸較大時則正好相反。3D雙邊網格視覺化的結果如下,其中縱軸是深度d=8,目的是進行顏色取樣,橫軸是仿射變換對應的值,如下圖所示:



其他

   對比實驗及結果這裡不再寫了,這裡簡要說一下其限制。
1.可以通過對輸入圖做特徵進一步的提取特徵來增強其表達效果。例如一個網格里使用36個仿射變換系數作用在一個層級為3的高斯金字塔處理的輸入圖要比原始的bilateral效果更好,儘管速度會變慢,如下圖所示:



2.將該網路用在增強外的其他任務上,如色彩化、去霧、深度估計等效果較差,這是因為其有較強的假設即輸出是由輸入的區域性仿射變換得到的。