2018年5月28日 星期一

對於 Image Processing 未來的一些猜想

5月底了, 去年 Blog 重新開張後希望每月至少能維持一篇
今日來談談 NN 在 ISP 功能上個人粗淺的認識以及應用的可能

個人在剛投入影像處理對於 ISP 懵懵懂懂的時候看到了 FlexISP 這篇 paper
要了解其論述必須先了解在晶片中處理照相功能的 ISP 為一個 multiple-stages 的硬體

也就是每張拍出來得到的照片, 在其源頭都是特定的 CFA (Color Filter Array) 序列, 再經過上述一連串的步驟所產生出來, 而常用的 CFA 格式為 Bayer Format.

在 FlexISP 中最重要的觀念是相當基本的: 每一級的處理程序在過程中都會產生數值偏差

因此 FlexISP 的核心思想是去建構自 Source 到 Bayer 間最後結果每一階段的數理 Model, 合併後透過線性條件限制的方式取得反向計算的解, 即可將 ISP 中多級的計算, 一次性地套用在輸入的影像上, 產生較少誤差的結果:

而甚至在 Google HDR+ 的論文中亦有與其的比較(而也算有趣的是, 因為 Google HDR+ 演算與硬體架構不搭, 所以後處理上實作了 Software ISP,  這點可以閱讀其論文內容), 儘管 FlexISP 的計算量驚人, 然而結果也的確相當出色 (請注意第二行衣服的細節, FlexISP 是與 Ground Truth 最接近的):

FlexISP 證明了一件事情 - 傳統的多級 ISP 處理方式依然有著相當大的進步空間, 而這空間即是傳統 ISP 多級的處理方式自己所產生的, 因而原則上處理的步驟要儘可能地減少.

在近日個人又注意到 CVPR 2018 的一篇論文 - Learning to See In the Dark
其使用了 Convolution Network 來作為 ISP 的角色, 並且在極端的暗景下與 DSLR 比較各自的輸出結果, 其運作的方式如下:


而 RAW, DSLR 輸出與其結果比較如下:
結果相當吸引人, 而這只是論文中提供的一組, 另外建議去提供的聯結點看 "Additional material" 來看更多的比較圖.

在將 FlexISP 與上圖的比較圖相較後, 應能夠將該 ConvNet Model 視為一暗景所特製的 ISP, 而其數理意義上該 Model 做的事等同於去近似在 FlexISP 中欲以各級數理模型疊加影響所反推的函數.

儘管目前有著相當多的 Deep Learning Accelerator (DLA), 然而或許該探究的是, 這樣的 Network 是否可能真的硬體化成為 NN-based ISP?
在 Learning to see in the dark 該論文中, 其預設使用的 NN  為 U-Net , 下圖為 U-Net 的架構:

U-Net 官方的 model size 為 89MB, 其所使用的 Convolution 最大為 3x3, 而對於 tile-based 來說, 應需要 3 條 line buffer (ring buffer), 其他會需要的是擺放各階段的 kernel, 若以 16b 計, 以上述的最 critical 的 stage 需要 1024*3x3*1024 * 2 = 18 MB, 因此事實上不做一些特別處理還是不容易硬體化.

然而若延遲性許可,  frame-based 的處理, 那麼一般 DLA 即可套用在這樣的應用情境上(畢竟使用者為了極端的情況得到較佳的照片是願意等的), 當然這僅只是以 U-Net 作舉例, 設計上還能搭配不同場景適用的 Model 或是 network, 甚至 cascade/parallel network 來達到不同的目的, 而或許當這些針對 ISP 功能的所設計的 NN 有著顯著的優勢(其實 ISP 的 tuning 很花時間), 儘管以 Network 方式實作 ISP 特定功能的論文近年不少(eg: DeepISP , 這並不是創新的想法, 而且愈來愈多), 然而單純以單一 network/model 來取代, 而缺乏系統化與參數調整的考量都不會是 ISP 實務上會考量的架構, 然而手機/監視應用/汽車產業在急遽追求影像成像品質的今日, 基於 NN 的處理方法或許是個不可避免必然的趨勢, 然而這仰賴 ISP 相關工作者與 ML/DL 工作者高度的合作, 那麼在 ISP 中內嵌 DLA 或許是未來可以預見的事?

在 ARM 平台上使用 Function Multi-Versioning (FMV) - 以使用 Android NDK 為例

Function Multi-Versioning (FMV) 過往的 CPU 發展歷程中, x86 平台由於因應各種應用需求的提出, 而陸陸續續加入了不同的指令集, 此外也可能因為針對市場做等級區隔, 支援的數量與種類也不等. 在 Linux 平台上這些 CPU 資訊可以透過...