圖像處理:從 bilateral filter 到 HDRnet
來自專欄光怪陸離
這算是一篇寫給自己看的筆記,所以記錄思路為主,對於其中涉及到的演算法細節不展開描述。
我一直對圖像降噪方面感興趣,在降噪這個事情上,幾種比較有效的演算法包括 bilateral filter、non-local means、BM3D。最近看到 Google 的 HDRnet 的工作,雖說這個工作與降噪並沒有直接的關係,但我發現其思路與 bilateral filter 有著千絲萬縷的聯繫。我對 HDRnet 背後的思路做了一個比較深入的調研,覺得作者在 bilateral filter 方面連貫的思路非常值得學習,正好趁此機會總結一下。
原始版本
Bilateral filter 算是比較早的濾鏡,但是生命力很強,其內在的思想比較深刻。原始的思路比較簡單,也很直觀:
這裡 代表圖像, , 是圖像上的坐標, 代表與位置相關的權重。一大類降噪演算法其實都可以歸結到這個公式,關鍵在於權重 的選擇。這裡,權重和兩個因素有關,一個是 , 兩點之間的距離,距離越遠權重越低;另一個是 , 兩點之間的像素值相似程度,越相似權重越大。對 bilateral filter 來說,權重定義如下:
這裡 表示高斯函數。原始版本的 bilateral filter 數據組織形式上能較有效地利用 data locality,效率較高。儘管如此,相比於早期其他 convolution based filter(比如 gaussian filter),計算量非常大,速度較慢。
PS. 這裡 bilateral filter 是直接利用像素值的差異來衡量 p, q 兩點之間的相似程度,如果換成兩個中心位於 p, q 的小 patch 來度量相似度,就是 non-local means 的核心思想了。
近似加速演算法
Durand 在 2006 年提出了近似加速演算法(參見:https://dspace.mit.edu/bitstream/handle/1721.1/34876/MIT-CSAIL-TR-2006-073.pdf )通過引入額外的維度,極大加速了計算過程。
下圖大致描繪了演算法思路:
核心的思想有三個:
- 將像素值作為一個額外維度,使得 weight 的計算轉變成在第三維度上的卷積,極大提高了 data locality 利用率
- 離散化,並用一個額外的 channel 記錄分母,作者稱其為 homogeneous coordinate(上面示意圖右側一列)
- 計算後使用 slicing 操作重新得到原數據空間的值
這三個思想給了後續進一步加速的空間。
承上啟下的過渡:Bilateral Grid
此後 Durand 進一步發展了這個思路,和 Jiawen Chen 一起做了優秀的工作,將空間域和像素值域都離散化、網格化,提出了 bilateral grid 數據結構,進一步加速了計算過程(參見:https://groups.csail.mit.edu/graphics/bilagrid/bilagrid_web.pdf ),這篇文章是承上啟下的一個工作,把之前引入額外維度這個動作背後的思想進一步挖掘深化,為後來的工作鋪平了道路。
在這個工作中,將之前提出的 fast approximate 演算法中的核心思想提煉出來,總結成一個新的數據結構 bilateral grid,並且發現很多操作都可以歸納到這個框架內。普通的 bilateral filter 如下圖所示:
利用這個數據結構還可以做很多其他的工作比如 local histogram equalization,如下圖所示:
可以看到對之前工作中核心思想的繼承和發展。
加速多種濾鏡的速度:BGU
Chen 和 Durand 在此基礎上繼續發展,利用 bilateral grid 的思想,加速其他濾鏡,做出了 Bilateral Guided Upsample (BGU) 這樣優秀的工作(參見:https://people.csail.mit.edu/hasinoff/pubs/ChenEtAl16-bgu.pdf )
由於很多複雜的濾鏡處理速度比較慢,一個很常用的解決思路是對原圖 downsample 之後做處理,然後用 upsample 得到處理結果。這裡 Kaiming He 的 guide filter 就是一個這種思路的很好的應用。而在 BGU 這個例子里,利用 bilateral grid 來做 downsample - upsample 的工作,使得效果更為出色。
其核心思想是:
- 任何濾鏡效果,在局部小區域內都可以看做是一個線性變換
- 利用 bilateral grid 可以從一個低解析度的圖上 slice 得到高解析度的結果
- upsample 針對的是變換係數,而不是直接針對像素。這樣對細節方面損失降低到最小
具體實現的步驟如下:
- 對原圖 downsample 得到一個小圖
- 在小圖上應用濾鏡
- 在小圖上劃分網格(bilateral graid),擬合每一個網格中的線性變換
- 線性變換的係數在網格間做平滑
- 利用這個網格,根據原始大圖在這個網格上做 slicing,得到高解析度的線性變換係數,進一步得到高解析度的結果
這裡有兩點比較重要,一是利用 bilaeral grid 做 slicing 來 upsample,二是用線性變換的係數做中間媒介,而不是直接 upsample 小圖,這樣得到的結果更為自然,大圖的細節損失很小。
集大成者:HDRnet
HDRnet 可以說是沿著 bilateral filter 這個思路的集大成者了。綜合運用了多種手段,與神經網路結合,使得表現力非常強大(參見:https://groups.csail.mit.edu/graphics/hdrnet/data/hdrnet.pdf )
這裡沿用文章中的一幅圖解釋一下他的核心思想:
這裡重點在右上角黃色背景的這個模塊,利用神經網路提取出一系列特徵,包括「低級特徵」、「局部特徵」和「全局特徵」。所有特徵綜合起來,得到一系列特徵圖。從這些特徵圖,進一步得到每一張特徵圖對應的局部線性變換(參見上一小節),並利用 bilateral grid 存下這些線性變換的係數;注意,這裡的係數對應的是 downsample 後的小圖。
在下面藍色的模塊中,首先得到一張「引導圖」,參照這個引導圖,在 bilateral grid 中做 sliceing 操作,得到大圖的 per pixel 的變換係數(參見上一小節,對係數 upsample)。最後 apply 這些係數,就得到變換後的輸出圖像。
我認為這個工作價值非常大,可以作為很多濾鏡的終極形態。有以下優點:
- 神經網路提取出一系列特徵,包含低級特徵、局部特徵、全局特徵。對於圖像處理來說,非常完整。考慮到人類攝影師修圖的過程,也無非考慮這幾方面的特徵,因此這個方法適用範圍非常廣。
- 神經網路強大的學習能力,可以學習非常複雜的變換;局部線性變換的假設,一定程度上防止了過擬合。這個方法魯棒性很好。
- 相比 BGU 在像素上做線性變換,這裡是在神經網路提取的特徵上做變換,結果更穩定,並且能 handle 極為複雜、非線性極強的變換形式(我猜測,比如可以學習某一個特定攝影師的修圖風格 ← 這種非常抽象很難定義的問題)
- 利用 bilateral grid 做 upsample,可以得到較高的質量,從而在前期可以放心做 downsample,一方面減少計算量加快計算速度,一方面也防止過擬合到一些局部細節上。
此外,從工程應用的角度,這個工作很大的一個現實意義在於,學習一些高耗時的操作,極大縮短計算時間,甚至可以讓一些複雜的濾鏡達到實時。
推薦閱讀:
※2017年歷史文章匯總|深度學習
※Path Aggregation Network for Instance Segmentation
※VS2017+OPENCV3配置
※LiGeoreference激光雷達解算軟體
※淺談深度學習的技術原理及其在計算機視覺的應用